Linux下的openssh詳解


前言

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的安全連接建立

  1. 客戶端連接到服務器上
  2. 客戶端和服務器交換自己支持的SSH協議版本號
  3. 客戶端和服務器切換到基於報文的協議
  4. 服務器向客戶端提供自己的身份證明和會話參數
  5. 客戶端給服務器發送一個(會話)密鑰
  6. 雙方啟用加密並完成服務器認證
  7. 建立安全連接

 

/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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM