前言
SSH(Secure Shell)
是一個提供數據通信安全、遠程登錄、遠程指令執行等功能的安全網絡協議,由芬蘭赫爾辛基大學研究員Tatu Ylönen
,於1995年提出,其目的是用於替代非安全的Telnet、rsh、rexec等遠程Shell協議。之后SSH發展了兩個大版本SSH-1和SSH-2。
通過使用SSH,你可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止 DNS欺騙
和 IP欺騙
。使用SSH,還有一個額外的好處就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的"通道"。
SSH的基本框架
SSH協議框架中最主要的部分是三個協議:
傳輸層協議(The Transport Layer Protocol)
:傳輸層協議提供服務器認證,數據機密性,信息完整性等的支持。用戶認證協議(The User Authentication Protocol)
:用戶認證協議為服務器提供客戶端的身份鑒別。連接協議(The Connection Protocol)
:連接協議將加密的信息隧道復用成若干個邏輯通道,提供給更高層的應用協議使用。
SSH-AUTH是SSH里面用於驗證客戶端身份的協議。我們在用ssh命令輸入密碼的那一步實際上就是在這個階段。可以看到的是,雖然傳輸的是用戶名和密碼,但是由於這個協議建立在SSH-TRANS之上,所以內容都是加密的,可以放心的傳輸。
而SSH-CONN是真正的應用協議。在這里可以定義各種不同的協議,其中我們經常使用的scp、sftp還有正常的remote shell都是定義在這里的一種協議實現。這里的各種應用協議都要首先經過SSH-AUTH的驗證之后才可以使用。
這個三個協議之間的關系可以用下面這幅圖來說明:
SSH的加密
SSH從安全和性能兩方面綜合考慮,結合使用了 Public Key/Private key(公鑰/私鑰)
和 Secret Key(密鑰)
。
Public Key/Private key
:非對稱加密,安全,但效率低,不適合大規模進行數據的加密和解密操作;即公鑰/私鑰模式,公鑰用來加密數據,私鑰用來解密數據Secret Key
:對稱機密,高效,但安全性相對較低,Key的分發尤其不方便;即數據的加密解密都采用同一把秘鑰
SSH的安全連接建立
- 客戶端連接到服務器上
- 客戶端和服務器交換自己支持的SSH協議版本號
- 客戶端和服務器切換到基於報文的協議
- 服務器向客戶端提供自己的身份證明和會話參數
- 客戶端給服務器發送一個(會話)密鑰
- 雙方啟用加密並完成服務器認證
- 建立安全連接
/etc/ssh/sshd_config配置文件詳細說明
Port 2 “Port”設置sshd監聽的端口號。 ListenAddress 192.168.1.1 “ListenAddress”設置sshd服務器綁定的IP地址。 HostKey /etc/ssh/ssh_host_key “HostKey”設置包含計算機私人密匙的文件。 ServerKeyBits 1024 “ServerKeyBits”定義服務器密匙的位數。 LoginGraceTime 600 “LoginGraceTime”設置如果用戶不能成功登錄,在切斷連接之前服務器需要等待的時間(以秒為單位)。 ClientAliveInterval 300(默認為0) 這個參數的是意思是每5分鍾,服務器向客戶端發一個消息,用於保持連接 KeyRegenerationInterval 3600 “KeyRegenerationInterval”設置在多少秒之后自動重新生成服務器的密匙(如果使用密匙)。重新生成密匙是為了防止用盜用的密匙解密被截獲的信息。 PermitRootLogin no “PermitRootLogin”設置root能不能用ssh登錄。這個選項一定不要設成“yes”。 IgnoreRhosts yes “IgnoreRhosts”設置驗證的時候是否使用“rhosts”和“shosts”文件。 IgnoreUserKnownHosts yes “IgnoreUserKnownHosts”設置ssh daemon是否在進行RhostsRSAAuthentication安全驗證的時候忽略用戶的“$HOME/.ssh/known_hosts” StrictModes yes “StrictModes”設置ssh在接收登錄請求之前是否檢查用戶家目錄和rhosts文件的權限和所有權。這通常是必要的,因為新手經常會把自己的目錄和文件設成任何人都有寫權限。 X11Forwarding no “X11Forwarding”設置是否允許X11轉發。 PrintMotd yes “PrintMotd”設置sshd是否在用戶登錄的時候顯示“/etc/motd”中的信息。 SyslogFacility AUTH “SyslogFacility”設置在記錄來自sshd的消息的時候,是否給出“facility pre”。 LogLevel INFO “LogLevel”設置記錄sshd日志消息的層次。INFO是一個好的選擇。查看sshd的man幫助頁,已獲取更多的信息。 RhostsAuthentication no “RhostsAuthentication”設置只用rhosts或“/etc/hosts.equiv”進行安全驗證是否已經足夠了。 RhostsRSAAuthentication no “RhostsRSA”設置是否允許用rhosts或“/etc/hosts.equiv”加上RSA進行安全驗證。 RSAAuthentication yes “RSAAuthentication”設置是否允許只有RSA安全驗證。 PasswordAuthentication yes “PasswordAuthentication”設置是否允許口令驗證。 PermitEmptyPasswords no “PermitEmptyPasswords”設置是否允許用口令為空的帳號登錄。
SSH設置ACL規則
- /etc/hosts.deny:屏蔽規則文件,在文件尾部添加相應行
- /etc/hosts.allow:允許規則文件,在文件尾部添加相應行
PS:允許的優先級比拒絕的優先級大
實例
[root@sample ~]# vi /etc/hosts.deny sshd: ALL // 添加這一行,屏蔽來自所有的SSH連接請求 [root@sample ~]# vi /etc/hosts.allow sshd: 192.168.0. // 添加這一行,只允許來自內網的SSH連接請求
問題集錦
ssh連接很慢GSS failure解決辦法;就我所遇到的情況來看, 顯然是要把 GSSAPI 禁用. 以下是三種可行的方式:
1. 連接時用命令指定:
ssh -o GSSAPIAuthentication=no cherry@59.151.47.49
2. 在 ssh 客戶端程序的配置文件里顯式禁用 GSSAPI 認證. 如, 編輯 /etc/ssh/ssh_config 文件, 添加或修改使其有如下一行:
GSSAPIAuthentication no
3. 在用戶根目錄下的 .ssh 目錄下創建一個 config 文件. 如, 編輯 /home/cherry/.ssh/config (如果該文件不存在, 則創建之), 添加選項:
GSSAPIAuthentication no
[注] A. /etc/ssh/ssh_config 是全局配置文件, 對其進行的修改會影響所有使用 ssh 客戶端的系統用戶.
B. /home/cherry/.ssh/config 是只會影響用戶 xcl 的本地 ssh 客戶端配置文件. 該文件的所有配置參數會覆蓋全局配置文件的相同配置參數.
取消DNS反向解析
vi /etc/ssh/sshd_config #UseDNS yes 修改為 UseDNS no service sshd restart