歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下的ssh和scp介紹

Linux下的ssh和scp介紹

日期:2017/2/28 16:25:21   编辑:Linux教程

SSH的簡單介紹

傳統的網絡服務程序,如:ftp、pop和telnet在本質上都是不安全的,因為它們在網絡上用明文傳送口令和數據,別有用心的人非常容易就可以截獲這些口令和數據。而且,這些服務程序的安全驗證方式也是有其弱點的,就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。所謂 “中間人”的攻擊方式,就是“中間人”冒充真正的服務器接收你的傳給服務器的數據,然後再冒充你把數據傳給真正的服務器。服務器和你之間的數據傳送被“中間人”一轉手做了手腳之後,就會出現很嚴重的問題。

SSH的英文全稱是Secure SHell。通過使用SSH,你可以把所有傳輸的數據進行加密,這樣“中間人”這種攻擊方式就不可能實現了,而且也能夠防止DNS和IP欺騙。還有一個額外的好處就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替telnet,又可以為ftp、pop、甚至ppp提供一個安全的“通道”。

最初SSH是由芬蘭的一家公司開發的。但是因為受版權和加密算法的限制,現在很多人都轉而使用OpenSSH。OpenSSH是SSH的替代軟件,而且是免費的,可以預計將來會有越來越多的人使用它而不是SSH。

SSH是由客戶端和服務端的軟件組成的,有兩個不兼容的版本分別是:1.x和2.x。用SSH 2.x的客戶程序是不能連接到SSH 1.x的服務程序上去的。OpenSSH 2.x同時支持SSH 1.x和2.x。

SSH的安全驗證機制

從客戶端來看,SSH提供兩種級別的安全驗證。

第一種級別(基於口令的安全驗證)只要你知道遠程服務器的用戶的帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器,可能會有別的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。

第二種級別(基於密匙的安全驗證)需要依靠密匙,也就是你必須在本地為自己創建一對密匙,並把公用密匙放在需要訪問的遠程服務器上。如果你要從本地連接到遠程的SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之後,先在你在該服務器上面的用戶的家目錄下尋找你的公用密匙,然後把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)並把它發送給客戶端軟件。客戶端軟件收到“質詢”之後就可以用你的私人密匙解密再把它發送給服務器。用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。

第二種級別不僅加密所有傳送的數據,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能需要10秒。

SSH的安裝

現在比較流行的實現SSH的軟件有OpenSSH,但是因為受到美國法律的限制,在很多Linux的發行版中都沒有包括OpenSSH,但是可以從網絡上下載並安裝OpenSSH。

安裝完SSH之後,很多軟件(如OpenSSH)都已經自動幫你配置好相關文件了,但是這不是絕對的,因此,你必須要學會自己配置SSH的配置文件。

安裝完成以後會在“/etc/ssh/”這個目錄下,包含兩個文件“sshd_config”和“ssh_config”;在“/etc/pam.d/”目錄下,包含文件“ssh”。這三個文件,通過後面的配置介紹就會知道,是運行ssh的必須配置文件。

一台機器,它既可以做SSH的服務器端,讓別的client通過ssh連接進來;當然,它自身也可以作為SSH的client端,連接到遠程的服務器去。因此,一般安裝好SSH的相關軟件(如OpenSSH),都要對這兩種情況進行配置。下面就分別講述,(主要以OpenSSH作為實例軟件),當它作為服務器的時候需要配置哪些文件,而作為客戶端的時候又需要怎麼配置。

作為客戶端時SSH需要配置的文件

OpenSSH有三種配置方式:命令行參數、用戶配置文件和系統級的配置文件(“/etc/ssh/ssh_config”)。命令行參數優先於用戶配置文件,用戶配置文件優先於系統配置文件,所有的命令行的參數都能在配置文件中設置。

由於在安裝的時候沒有默認的用戶配置文件,所以要把“/etc/ssh/ssh_config”文件copy並重新命名為“~/.ssh/config”。

客戶端配置文件,就是/etc/ssh/ssh_config,也就是~/.ssh/config,是OpenSSH系統范圍的配置文件,允許你通過設置不同的選項來改變客戶端程序的運行方式。這個文件的每一行包含“關鍵詞--值”的匹配,其中“關鍵詞”是忽略大小寫的。下面列出來的是最重要的關鍵詞,並且作了相關的作用注釋,你可以使用man命令來查看幫助頁(ssh (1)),這樣就可以得到詳細的列表。

# Site-wide defaults for various options

Host * -- 表示在該文件的下一個host之前的所有配置條目,都只對匹配後面字符串的主機有效,“*”表示所有計算機

ForwardAgent no -- 設置連接是否經過驗證代理轉發給遠程計算機(如果有的話)

ForwardX11 no -- 設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set),為了在本地運行遠程的X程序必須設置這個值

RhostsAuthentication no -- 設置是否使用基於rhosts的安全驗證

RhostsRSAAuthentication no -- 設置是否使用利用RSA算法的基於rhosts的安全驗證

RSAAuthentication yes -- 設置是否使用RSA算法進行安全驗證

PasswordAuthentication yes -- 設置是否使用口令驗證

FallBackToRsh no -- 設置如果用ssh連接出現錯誤是否自動使用rsh

UseRsh no -- 設置是否在這台計算機上使用“rlogin/rsh”

BatchMode no -- 如果設為“yes”,passphrase/password(交互式輸入口令)的提示將被禁止。因此,當不能交互式輸入口令的時候,如對腳本文件和批處理任務,它就十分有用。

CheckHostIP yes -- 設置ssh是否查看連接到服務器的主機的IP地址以防止DNS欺騙,建議設置為“yes”

StrictHostKeyChecking no -- 如果設置為“yes”,ssh就不會自動把計算機的密鑰加入“$HOME/.ssh/known_hosts”文件,並且一旦計算機的密鑰發生了變化,就拒絕連接

IdentityFile ~/.ssh/identity -- 設置從哪個文件讀取用戶的RSA安全驗證標識

Port 22 -- 設置連接到遠程主機的端口

Cipher blowfish -- 設置加密用的密碼

EscapeChar ~ -- 設置escape字符

CompressionLevel 6 -- 傳輸的數據使用數據壓縮,壓縮的級別是【1,9】

LogLevel DEBUG INFO -- 表示當SSH出現問題的時候,怎麼辦?默認為“INFO”

作為服務器時SSH需要配置的文件

SSH服務器的配置使用的是“/etc/ssh/sshd_config”配置文件,這些選項的設置在配置文件中已經有了一些說明而且用“man sshd”也可以查看幫助。請注意OpenSSH對於SSH 1.x和2.x沒有不同的配置文件。

下面列出來的是最重要的關鍵詞,並且作了相關的作用注釋。

# This is ssh server systemwide configuration file.

Port 22 -- 設置服務器sshd監聽的端口號

ListenAddress 192.168.1.1 -- 設置sshd服務器綁定的ip地址

HostKey /etc/ssh/ssh_host_key -- 設置包含計算機私人密鑰的文件

ServerKeyBits 1024 -- 定義服務器密鑰的位數

LoginGraceTime 600 -- 設置如果用戶不能成功登陸,在切斷連接之前,服務器需要等待的時間,以秒為單位

KeyRegenerationInterval 3600 -- 設置在多少秒之後自動生成服務器的密鑰(如果使用密鑰),重新生成密鑰是為了防止被盜用的密鑰被用來解密被截獲的信息

PermitRootLogin no -- 設置root用戶能不能使用ssh登錄;最好把這個選項設置成“PermitRootLogin without-password”,這樣“root”用戶就不能從沒有密匙的計算機上登錄;

把這個選項設置成“no”將禁止“root”用戶登錄,只能用“su”命令從普通用戶轉成“root”;設為yes就表示允許root通過ssh登錄,不安全,極不建議

IgnoreRhosts yes -- 設置驗證的時候是否使用“rhosts”和“shosts”文件

IgnoreUserKnownHosts yes -- 設置ssh daemon在進行RhostsRSAAuthentication安全驗證的時候是否忽略用戶的“$HOME/.ssh/known_hosts”

StrictModes yes -- 設置ssh在接收登錄請求之前,是否檢查用戶家目錄和rhosts文件的權限和所有權。

X11Forwarding no -- 設置是否允許X11轉發。設為“yes”允許用戶運行遠程主機上的X程序。

PrintMotd yes -- 設置sshd是否在用戶登錄的時候顯示“/etc/motd”中的信息

SyslogFacility AUTH -- 設置在記錄來自sshd的消息的時候,是否給出“facility code”

LogLevel INFO -- 設置記錄sshd日志消息的層次。INFO是一個好的選擇。

RhostsAuthentication no -- 設置是否只用rhosts或“/etc/hosts.equiv”進行安全驗證

RhostsRSAAuthentication no -- 設置是否允許用rhosts或“/etc/hosts.euive”加上RSA進行安全驗證

RSAAuthentication yes -- 設置是否允許只有RSA進行驗證

PasswordAuthentication yes -- 設置是否允許口令驗證。設為no只允許用戶用基於密鑰的方式登錄,而不能使用基於口令的方式登錄。

PermitEmptyPasswords no -- 設置是否允許用口令為空的帳號登陸

AllowUsers admin -- AllowUsers的後面跟著任意的數量的用戶名的匹配串(patterns)或user@host這樣的匹配串,這些字符串之間用空格隔開,主機名可以是DNS名或ip地址。

#Subsystem /usr/local/sbin/sftpd -- 把前面的#號去掉並且把路徑名設置成/usr/bin/sftpserv,則用戶將能使用sftp(安全帶ftp)了。

PubkeyAuthentication yes -- 允許使用公鑰進行驗證

生成密鑰對

正如前面所介紹的,如果要實現ssh的通信,那麼服務器端必須要有客戶端的公鑰,而客戶端自己保留私鑰,這樣才能實現驗證,因為它們是基於公鑰算法進行加密的。因此,就必須要在客戶端生成密鑰對,然後自己保留私鑰,把公鑰分發到自己想訪問的服務器端去。下面就來介紹客戶端這個生成密鑰對的過程。

用下面的命令可以生成密匙:ssh-keygen;如果遠程主機使用的是SSH 2.x就要用這個命令:ssh-keygen –d。在同一台主機上同時有SSH1和SSH2的密匙是沒有問題的,因為密匙是存成不同的文件的。

ssh-keygen/ssh-keygen -d命令運行之後會顯示下面的信息:

Generating public/private dsa key pair.

Enter file in which to save the key (/home/mms/.ssh/id_dsa):

#按回車保存為: /home/mms/.ssh/id_dsa,即當前用戶mms的私鑰

Enter passphrase (empty for no passphrase):

# 按回車,表示讀取密鑰時不需要密鑰的密碼

Enter same passphrase again:

# 確認密鑰的密碼,必須和上面的輸入相同

Your identification has been saved in /home/mms/.ssh/id_dsa.

# 私鑰保存信息

Your public key has been saved in /home/mms/.ssh/id_dsa.pub.

# 公鑰保存信息

The key fingerprint is:

ec:41:e8:08:38:0b:f8:1e:bc:92:98:32:fc:d7:69:7d [email protected]

# 密鑰指紋

現在你有一對密匙了,公用密匙要分發到所有你想用ssh登錄的遠程主機上去;私人密匙要好好地保管防止別人知道你的私人密匙。用“ls –l ~/.ssh/identity”或“ls –l ~/.ssh/id_dsa”所顯示的文件的訪問權限必須是“-rw-------”。如果你懷疑自己的密匙已經被別人知道了,不要遲疑馬上生成一對新的密匙。當然,你還要重新分發一次公用密匙。

分發公鑰

具體步驟如下所示:

1. copy公鑰到所要登錄的遠程服務器的指定用戶的家目錄(你在要訪問的服務器是所使用的登錄用戶的家目錄)下,例如:

scp id_dsa.pub oracle@csdba:/home/oracle/.ssh/pub.ilonng

這裡Oracle為sftp使用的登錄用戶,若目錄/home/[user]/.ssh/不存在,請先創建之。

2. 將copy來的公鑰文件改名為authorized_keys,如果已經存在authorized_keys,可以使用命令: cat id_dsa.pub >> authorized_keys 將其內容附加到authorized_keys的末尾

3. 修改公鑰文件的訪問權限

chmod 644 authorized_keys

4. 重啟SSH服務

SSH連接的建立

安裝完OpenSSH之後,用下面命令測試一下連接的建立:

ssh -l [your accountname on the remote host] [address of the remote host]

如果OpenSSH工作正常,你會看到下面的提示信息:

The authenticity of host [hostname] can't be established.

Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.

Are you sure you want to continue connecting (yes/no)?

OpenSSH告訴你它不知道這台主機,但是你不用擔心這個問題,因為你是第一次登錄這台主機。鍵入“yes”,這將把這台遠程主機的“識別標記”加到“~/.ssh/know_hosts”文件中,以便識別之用。當你第二次訪問這台遠程主機的時候,你的機器就能通過這些“識別標記”來識別遠程的那台機器,耶就不會再顯示這條提示信息了。然後,SSH提示你輸入遠程主機上你的帳號的口令。輸入完口令之後,就建立了SSH連接,這之後就可以象使用telnet那樣使用SSH了。

跨機拷貝SCP

SCP的全稱是secure copy (remote file copy program),此命令是openssh-clients附帶的,它的作用就是在機器之間實現拷貝,且機器之間的傳輸完全是加密的,此命令格式為:scp localfile user@server:path。

SCP假定你在遠程主機上的家目錄為你的工作目錄,如果你使用相對目錄就要相對於家目錄,因此上面命令格式中path最好使用絕對路徑;用“scp”命令的“-r”參數允許遞歸地拷貝目錄。

Copyright © Linux教程網 All Rights Reserved