1. 程式人生 > >ssh配置文件詳解

ssh配置文件詳解

創建 如果 protocol 端口號 pro clas group 日誌 linux

一、ssh詳解

1、什麽是ssh

簡單來說,ssh是一種網絡協議,用於計算機之間的加密登錄。

如果一個用戶從本地計算機,使用ssh協議登錄另一臺遠程計算機,我們就可以認為,這種登錄是安全的,即使被中途截獲,密碼也不會泄露。

需要指出的是,ssh只有一種協議,存在多種實現,既有商業實現,也有開源實現。

2、基本用法

(1)、使用某個用戶(例如user)登錄遠程主機host

命令:ssh user@host

(2)、如果本地用戶名和遠程用戶名一致,則登錄時可以省略用戶名

命令:ssh host

(3)、ssh的默認端口是22,也就是說,你的登錄請求會送進遠程主機的22端口。使用-p參數,可以修改這個端口

命令:ssh –p 端口號 user@host

3、中間人攻擊

SSH之所以能夠保證安全,原因在於它采用了公鑰加密。整個過程如下:

(1)遠程主機收到用戶的登錄請求,把自己的公鑰發給用戶。

(2)用戶使用這個公鑰,將登錄密碼加密後,發送回來。

(3)遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。

這個過程本身是安全的,但是實施的時候存在一個風險:如果有人截獲了登錄請求,然後冒充遠程主機,將偽造的公鑰發給用戶,那麽用戶很難辨別真偽。因為不像https協議,SSH協議的公鑰是沒有證書中心(CA)公證的,也就是說,都是自己簽發的。可以設想,如果攻擊者插在用戶與遠程主機之間(比如在公共的wifi區域),用偽造的公鑰,獲取用戶的登錄密碼。再用這個密碼登錄遠程主機,那麽SSH的安全機制就蕩然無存了。這種風險就是著名的"中間人攻擊"。

4、ssh的安全驗證

SSH有自己的一套驗證方式,可以阻攔大部分的攻擊,當然如果有人想通過撞庫來嘗試密碼的話,就只有設置防火墻或者做其它的安全措施了。

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

(1)、第一種級別(基於口令的安全驗證)

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

(2)、第二種級別(基於密匙的安全驗證)

需要依靠密匙,也就是你必須為自己創建一對密匙,並把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之後,先在該服務器上你的主目錄下尋找你的公用密匙,然後把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)並把它發送給客戶端軟件。客戶端軟件收到“質詢”之後就可以用你的私人密匙解密再把它發送給服務器。

用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。第二種級別不僅加密所有傳送的數據,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能需要10秒。

5、口令登錄

(1)、如果是第一次登錄對方主機,系統會出現如下圖的提示

技術分享圖片

這段話的意思是,無法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續連接嗎?

所謂"公鑰指紋",是指公鑰長度較長(這裏采用RSA算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。上例中是20:42:b3:d6:79:dc:79:ec:26:1a:54:8c:72:b7:a7:e3,再進行比較,就容易多了。

很自然的一個問題就是,用戶怎麽知道遠程主機的公鑰指紋應該是多少?回答是沒有好辦法,遠程主機必須在自己的網站上貼出公鑰指紋,以便用戶自行核對。

(2)、假設經過風險衡量後,用戶決定接受這個遠程主機的公鑰

技術分享圖片

(3)、系統會出現一句提示,表示192.168.10.13主機已經得到認可

技術分享圖片

(4)、輸入密碼(如果密碼正確,就可以登錄了)

技術分享圖片技術分享圖片

說明:

當遠程主機的公鑰被接受以後,它就會被保存在文件$HOME/.ssh/known_hosts之中。下次再連接這臺主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。

每個SSH用戶都有自己的known_hosts文件,此外系統也有一個這樣的文件,通常是/etc/ssh/ssh_known_hosts,保存一些對所有用戶都可信賴的遠程主機的公鑰。

6、公鑰登錄

使用密碼登錄,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登錄,可以省去輸入密碼的步驟。

所謂"公鑰登錄",原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。

(1)、這種方法要求用戶必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen生成一個,如下圖所示

技術分享圖片

說明:

運行上面的命令以後,系統會出現一系列提示,可以一路回車。其中有一個問題是,要不要對私鑰設置口令(passphrase),如果擔心私鑰的安全,這裏可以設置一個。

運行結束以後,在$HOME/.ssh/目錄下,會新生成兩個文件:id_rsa.pub和id_rsa。id_rsa.pub是公鑰,id_rsa是私鑰。

(2)、這時再輸入下面的命令,將公鑰傳送到遠程主機host上面

命令:ssh-copy-id 192.168.10.12

技術分享圖片

說明:

第一次是需要輸入密碼的,但之後ssh就不需要輸密碼了。

如果ssh-copy-id不行的話,就打開遠程主機的/etc/ssh/sshd_config這個文件,檢查下面幾行前面"#"註釋是否取掉。

  RSAAuthentication yes

  PubkeyAuthentication yes

  AuthorizedKeysFile .ssh/authorized_keys

然後,重啟遠程主機的ssh服務。

7、authorized_keys文件

遠程主機將用戶的公鑰,保存在登錄後的用戶主目錄的$HOME/.ssh/authorized_keys文件中。公鑰就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

(1)、這裏不使用上面的ssh-copy-id命令,改用下面的命令,解釋公鑰的保存過程:  ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

說明:

1)、"$ ssh user@host",表示登錄遠程主機;

2)、單引號中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登錄後在遠程shell上執行的命令;

3)、"$ mkdir -p .ssh"的作用是,如果用戶主目錄中的.ssh目錄不存在,就創建一個;

4)、'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,將本地的公鑰文件~/.ssh/id_rsa.pub,重定向追加到遠程文件authorized_keys的末尾。

5)、寫入authorized_keys文件後,公鑰登錄的設置就完成了。

(2)、通過安裝lrzsz服務實現

1)、安裝lrzsz服務後,使用sz +公鑰路徑下載下來

2)、通過rz命令將下載下來的公鑰上傳到遠程主機上,將公鑰重定向追加到文件authorized_keys的末尾

3)、寫入authorized_keys文件後,公鑰登錄的設置就完成了。

二、ssh自定義安全設置

1、為了ssh登陸的時候加一層保護,可以修改默認端口。修改ssh服務配置文件/etc/ssh/sshd_config

port 2222

這樣遠程連接時加上端口

ssh 192.168.10.13 -p 2222

2、ssh使用時加-l後面跟用戶名,表示登陸到對方的這個用戶下面。

ssh -l user 192.168.10.13 -p 2222

等同於

ssh [email protected] -p 2222

3、限制ssh登陸的來源ip,白名單設置(hosts.allow優先級最高)

1)、通過iptables設置ssh端口的白名單,如下設置只允許192.168.1.0/24網段的客戶機可以遠程連接本機

Iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT

或者

vim /etc/sysconfig/iptables

-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT

2)、通過/etc/hosts.allow裏面進行限制(如下),/etc/hosts.deny文件不要任何內容編輯,保持默認!

vim /etc/hosts.allow

sshd:192.168.1.*,192.168.9.*,124.65.197.154,61.148.60.42,103.10.86.7:allow

sshd:all:deny

4、僅允許特定的用戶通過SSH登陸

如不允許root用戶登錄;

只允許幾個指定的用戶登錄(比如wangshibo、guohuihui、liuxing用戶)

禁止某些指定的用戶登錄(比如zhangda,liqin用戶)

但是要註意:設置的這幾個用戶必須同時存在於本機和對方機器上

修改ssh服務配置文件/etc/ssh/sshd_config

PermitRootLogin no //將yes修改為no

AllowUsers wangshibo guohuihui liuxing //這個參數AllowUsers如果不存在,需要手動創建,用戶之間空格隔開;

DenyUsers zhagnda liqin //這個參數DenyUsers如果不存在,需要手動創建,用戶之間空格隔開;

也可以設置僅允許某個組的成員通過ssh訪問主機。

AllowGroups wheel ops

5、取消密碼驗證,只用密鑰對驗證

修改ssh服務配置文件/etc/ssh/sshd_config

PasswordAuthentication no

PubkeyAuthentication yes

6、給賬號設置復雜的密碼:將密碼保存到文本進行復制和粘帖就可以了

#rpm -ivh expect-5.43.0-5.1.i386.rpm| yum -y install expect

mkpasswd -l 128 -d 8 -C 15 -s 10 //將下面密碼保存到文本進行復制、粘貼即可

lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx>iHikTagiVz0$cMtqOcIypkpd,vvD*kJhs3q@sb:CiCqgtqdqvse5lssfmranbtx

參數說明:

-l 密碼長度

-d 多少個數字

-C 大寫字母個數

-s 特殊符號的個數

7、只允許通過指定的網絡接口來訪問SSH服務,(如果本服務器有多個IP的時候)

仍然是修改/etc/ssh/sshd_config,如下:

ListenAddress 192.168.1.15 //默認監聽的是0.0.0.0

這樣,就只允許遠程機器通過ssh連接本機的192.168.1.15內網ip來進行登陸了。

8、禁止空密碼登錄

如果本機系統有些賬號沒有設置密碼,而ssh配置文件裏又沒做限制,那麽遠程通過這個空密碼賬號就可以登陸了,這是及其不安全的,所以一定要禁止空密碼登陸。修改/etc/ssh/sshd_config,如下:

PermitEmptyPasswords no //這一項,默認就是禁用空密碼登陸

9、 ssh_config和sshd_config

ssh_config和sshd_config都是ssh服務器的配置文件,二者區別在於,前者是針對客戶端的配置文件,後者則是針對服務端的配置文件。兩個配置文件都允許你通過設置不同的選項來改變客戶端程序的運行方式。

三、ssh配置文件詳解

1、/etc/ssh/ssh_config配置文件

選項參數	                          說明
Host *	                                  選項“Host”只對能夠匹配後面字串的計算機有效。“*”表示所有的計算機。
ForwardAgent no	                          設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。
ForwardX11 no	                          設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)
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字符

2、/etc/ssh/sshd_config配置文件

參數選項                                                        說明
Port 22                                                         SSH 預設使用 22 這個 port,您也可以使用多的 port !
Protocol 2,1                                                    選擇的 SSH 協議版本,可以是 1 也可以是 2 ,如果要同時支持兩者,就必須要使用 2,1 這個分隔了!
ListenAddress 0.0.0.0                                           監聽的主機適配卡!舉個例子來說,如果您有兩個 IP,分別是 192.168.0.100 及 192.168.2.20 ,那麽只想要開放 192.168.0.100 時,就可以寫如同下面的樣式:
ListenAddress 192.168.0.100                                     只監聽來自 192.168.0.100 這個 IP 的SSH聯機。如果不使用設定的話,則預設所有接口均接受 SSH
PidFile /var/run/sshd.pid                                       可以放置 SSHD 這個 PID 的檔案!左列為默認值
LoginGraceTime 600                                              當使用者連上 SSH server 之後,會出現輸入密碼的畫面,在該畫面中,在多久時間內沒有成功連上 SSH server ,就斷線!時間為秒!
Compression yes                                                 是否可以使用壓縮指令?
HostKey /etc/ssh/ssh_host_key                                   SSH version 1 使用的私鑰
HostKey /etc/ssh/ssh_host_rsa_key                               SSH version 2 使用的 RSA 私鑰
HostKey /etc/ssh/ssh_host_dsa_key                               SSH version 2 使用的 DSA 私鑰
KeyRegenerationInterval 3600                                    由前面聯機的說明可以知道, version 1 會使用 server 的 Public Key ,每隔一段時間來重新建立一次!時間為秒!
ServerKeyBits 768                                               Server key 的長度!
SyslogFacility AUTH                                             當有人使用 SSH 登入系統的時候,SSH會記錄信息
LogLevel INFO                                                   登錄記錄的等級---》全部
PermitRootLogin no                                              是否允許 root 登入!預設是允許的,但是建議設定成 no!
UserLogin no                                                    在 SSH 底下本來就不接受 login 這個程序的登入!
StrictModes yes                                                 當使用者的 host key 改變之後,Server 就不接受聯機
RSAAuthentication yes                                           是否使用純的 RSA 認證!?僅針對 version 1 !
PubkeyAuthentication yes                                        是否允許 Public Key ?只有 version 2
AuthorizedKeysFile   .ssh/authorized_keys                       設定若要使用不需要密碼登入的賬號時,那麽那個賬號的存放檔案所在檔名!
RhostsAuthentication no                                         本機系統不使用 .rhosts , .rhosts 不安全!
IgnoreRhosts yes                                                是否取消使用 ~/.ssh/.rhosts 來做為認證!
RhostsRSAAuthentication no                                      針對 version 1 ,使用 rhosts 檔案在/etc/hosts.equiv配合 RSA 演算方式來進行認證!
HostbasedAuthentication no                                      這個項目與上面的項目類似,不過是給 version 2 使用的!
IgnoreUserKnownHosts no                                         是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄的主機內容
PasswordAuthentication yes                                      密碼驗證當然是需要的!
PermitEmptyPasswords no                                         上面那一項如果設定為 yes 的話,這一項就最好設定為 no ,這個項目在是否允許以空的密碼登入!
ChallengeResponseAuthentication yes                             挑戰任何的密碼認證!所以,任何 login.conf 規定的認證方式,均可適用!
PAMAuthenticationViaKbdInt yes                                  是否啟用其它的 PAM 模塊!啟用這個模塊將會導致 PasswordAuthentication 設定失效!

與Kerberos 有關的參數設定!底下不用設定
KerberosAuthentication no
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
KerberosTgtPassing no

有關在 X-Window 底下使用的相關設定
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

PrintMotd no                                                    登入後是否顯示出一些信息呢?例如上次登入的時間、地點等,預設是 yes ,但是,如果為了安全,可以考慮改為 no !
PrintLastLog yes                                                顯示上次登入的信息!預設也是 yes 
KeepAlive yes                                                   一般而言,如果設定這項目的話,那麽 SSH Server 會傳送KeepAlive 的訊息給 Client 端,以確保兩者的聯機正常!在這個情況下,任何一端死掉後, SSH 可以立刻知道!而不會有僵屍程序的發生!
UsePrivilegeSeparation yes                                      使用者的權限設定項目!
MaxStartups 10                                                  同時允許幾個尚未登入的聯機畫面
DenyUsers *                                                     設定受抵擋的使用者名稱
AllowUsers *                                                    設定允許的使用者名稱


四、ssh練習

1、配置ssh只能使用key登錄

(1)、遠程主機的配置過程(主機192.168.10.13)

1、修改主機192.168.10.13的配置文件,使其支持使用ssh私鑰登錄

Vim /etc/ssh/sshd_config

取消下面三行的註釋,如圖1所示

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

PubkeyAuthentication yes ##是否允許 Public Key ?只有 version 2

AuthorizedKeysFile .ssh/authorized_keys ##設定若要使用不需要密碼登入的賬號時,那麽那個賬號的存放檔案所在檔名!

技術分享圖片

圖1、取消相關註釋

重啟sshd服務即可

2、關閉root用戶使用密碼登錄

修改主機192.168.10.13的配置文件/etc/ssh/sshd_config,將PasswordAuthentication 後面的yes改為no,如圖2所示

PasswordAuthentication no ##設置是否使用口令驗證

技術分享圖片

圖2、把yes改為no

重啟sshd服務即可

(2)本機的配置過程(主機192.168.10.11)

1、使用ssh-keygen生成公鑰和私鑰,如圖3所示

技術分享圖片

圖3、ssh-keygen生成公鑰和私鑰

2、直接使用ssh口令登錄來驗證剛剛的配置是否成功

在主機192.168.10.11上,ssh 192.168.10.13我們可以發現ssh不進去了,如圖4所示

技術分享圖片

圖4、驗證使用口令是否ssh成功


3、將主機192.168.10.11的公鑰上傳到主機192.168.10.13上

(1)、安裝lrzsz服務

Yum install –y lrzsz

(2)、使用sz命令下載公鑰,如圖5所示

技術分享圖片

圖5、下載公鑰


(3)、將公鑰上傳要主機192.168.10.13上,如圖6所示

技術分享圖片

圖6、上傳公鑰


(3)、將公鑰追加到文件authorized_keys裏

[root@localhost ~]# cat id_rsa.pub >> /root/.ssh/authorized_keys

(4)、在主機192.168.10.11上驗證是否能夠成功ssh到主機192.168.10.13上,如圖7所示

技術分享圖片

圖7、成功ssh到主機192.168.10.13

2、指定可以登錄的主機和不可以登錄的主機

(1)方法一、修改文件/etc/hosts.allow和/etc/hosts.deny

1、修改主機192.168.10.13的文件/etc/hosts.allow和/etc/hosts.deny

在文件/etc/hosts.allow添加一條允許主機192.168.10.11 ssh的記錄,如圖8所示

技術分享圖片

圖8、允許主機192.168.10.11 ssh

在文件/etc/hosts.deny添加一條拒絕主機192.168.10.12 ssh的記錄,如圖9所示


技術分享圖片

圖9、拒絕主機192.168.10.12 ssh

2、驗證

在主機192.168.10.11上驗證成功ssh到主機192.168.10.13上,如圖10所示

技術分享圖片

圖10、主機192.168.10.11成功ssh到主機192.168.10.13


在主機192.168.10.12上驗證不能ssh到主機192.168.10.13上,如圖11所示


技術分享圖片

圖11、主機192.168.10.12不能ssh到主機192.168.10.13

(2)方法二、修改文件/etc/ssh/sshd_config

1、修改文件/etc/ssh/sshd_config,在最後面添加如圖12所示的兩行,然後重啟sshd服務

技術分享圖片

圖12、添加的內容

說明:

AllowUsers [email protected] ##允許主機192.168.10.11 ssh登錄

DenyUsers [email protected] ##禁止主機192.168.10.12 ssh登錄

2、驗證

在主機192.168.10.11上驗證成功ssh到主機192.168.10.13上,如圖13所示

技術分享圖片

圖13、主機192.168.10.11成功ssh到主機192.168.10.13


在主機192.168.10.12上驗證不能ssh到主機192.168.10.13上,如圖14所示

技術分享圖片

圖14、主機192.168.10.12不能ssh到主機192.168.10.13

3、查看Linux日誌中有關ssh登錄成功和登錄失敗的日誌

ssh的日誌存放在文件/var/log/ secure

例如:

查看ssh登錄失敗的日誌,如圖15所示


技術分享圖片

圖15、ssh登錄失敗日誌

查看通過RSA成功ssh的日誌,如圖16所示

技術分享圖片

圖16、通過RSA成功ssh的日誌

五、在SecureCRT上配置公鑰的方法

在SecureCRT上配置公鑰的方法:

1、首先生成公鑰。

打開SecureCRT程序,點擊菜單欄的“工具”-》“創建公鑰”。按照步驟執行。其中一步比較重要就是選擇公鑰的格式。建議選擇“OpenSSH”,否則在服務器端使用時需要轉換為OpenSSH格式。如果選錯了。重新生成一次就可以了。然後選擇公鑰私鑰存放的地方。默認Identity是私鑰,Identity.pub是公鑰。


2、把Identity.pub文件上傳到你要登陸的Linux服務器上。方法有很多,比如ssh(先不要配置為公鑰登陸),ftp等。上傳時選擇ASCII方式。


3、在SecureCRT創建服務器連接。協議使用ssh。在“鑒權”方法中,取消勾選“密碼”。選擇“公鑰”,然後點擊右邊的屬性按鈕,在對話框中。

使用全局公鑰設置:表示所有連接都使用該公鑰連接服務器。

使用會話公鑰設置:可以分別為每個連接指定不同的公鑰。

下面的路徑就是指明私鑰的具體路徑。註意了,這裏要指明私鑰的路徑。

保存連接就可以了。




ssh配置文件詳解