SSH權威指南介紹

本書是一本介紹通信安全的書籍,如果你想保障你的通信安全,本書能給你一個很好的解決
方案。本書從ssh協議介紹起,到具體的開源實現和商業實現。但本書同時介紹開源實現和
商業實現,給人感覺比較亂。

注意:由於openssh是開源軟件,各版間的配置方法和設置參數可能會不同,所以設置時要
以最新版的手冊爲準,不要硬套書本的設置。

第一章 SSH簡介
ssh(secure shell)是一種通用,功能強大的基於軟件的網絡安全解決方案,計算機每次向網絡
發送數據時,SSH都會自動對其進行加密。數據到達目的地時,SSH自動對加密數據進行
解密。整個過程都是透明的。它使用了現代的安全加密算法,足以勝任大型公司的任務繁重
的應用程序的要求。

SSH協議內容涉及認證AUTHENTICATION,加密ENCRYPTION,和網絡上傳輸數據的完整
性INTEGRITY。

SSH特性概述
1、遠程登錄
$ ssh -l root host.example.com
2、安全文件傳輸
$ scp myfile metoo@secondacount.com
3、安全執行遠程命令,能確保傳輸的數據安全。
4、密鑰和代理
基於密鑰的認證方法不用記住多個帳號密碼。
5、訪問控制,能授權別人訪問自已帳號。
6、端口轉發
$ ssh -L 3002:localhost:119 xxx.xxx.com

相關安全技術
rsh命令族,rsh,rlogin and rcp。連接不加密,認證模型十分脆弱。
PGP加密程序。它是基於文件的。
Kerberos認證系統,用於網絡可能被監視,而且計算機不是中心控制的環境。基於麻省理工
學院的Athena項目。它SSH不是,SSH是輕量級的,容易部署。Kerberos使用前必須構建
一些重要基礎。
IPSEC,Internet安全協議。
SRP,安全遠程密碼協議,是Stanford大學開發的。是一種專用的認證協議。
SSL,安全套接字。
stunnel,是一種SSL工具,它爲UNIX環境現有的基於TCP的服務(POP,IMAP等)增加
SSL保護,而不用修改服務器源程序。

第二章 SSH客戶端的基本用法
最常用功能,1、經由安全連接登錄到遠程計算機。2、通過安全連接在計算機間拷貝文件。

當你第一次連接SSH服務器時,出現問答時要回答“yes”,把已知名主機的密鑰的公共部
分拷貝一份存在本地。之後你每次連接這臺服務器,就用這個公鑰來驗證遠程主機。最好是
能在首次連接前就能獲得這個公鑰,否則第一次連接服務器時你可能已受到中間人攻擊。

使用密鑰進行認證,SSH支持公鑰認證,可以使用加密密鑰,密鑰比密碼更安全。
SSH證書使用一對密鑰,一個私鑰,一個公鑰,私鑰只保存你獨有的一些祕密信息。SSH
用其向服務器證明自已的身份。公鑰是公開的,可以隨便將其放入SSH服務器上自已的帳
號中,在認證時,進行私鑰和公鑰協商,如果匹配,那麼身份就得以證明,認證就成功。

在使用公鑰認證以前,首先要進行一些設置:
1、需要一對密鑰,還需要使用一個口令來保護自已的私鑰。
使用ssh-keygen程序生成一對密鑰。如果不存在SSH目錄,程序爲自動創建本地SSH目錄
~/.ssh,並將所生成的密鑰分成兩個文件存儲,公有部份identity.pub,私有部分identity,或
id_dsa_1024_a,id_dsa_1024_a.pub(ssh2)。
2、需要在SSH服務器上安裝自已的公鑰。
通過配置SSH目錄中的一個文件實現,對於SSH1 AND OPENSSH來說該文件是
~/.ssh/authorized_keys。對SSH2來說是~/.ssh2/authorization。OPENSSH中的SSH-2連接自
3.0版本起也一同使用authorized_keys文件。3.0版本前的使用authorized_keys2。把用戶本
地機器生成identity.pub文件內容加入其中。對SSH2來說,用戶需編輯兩個文件,一個客
戶端一個在服務器端,
在客戶端,要創建或編輯文件~/.ssh2/identification並在其中插入一行,說明自已的私鑰文件
名: IdKey id_dsa_1024_a.
在服務器端,要創建或編輯文件~/.ssh2/authorization,該文件包含有公鑰信息,每行一個,
但和SSH1的authorized_keys文件不同(authorized_keys中包含有公鑰的拷貝),authorization
中只給出公鑰文件名:Key id_dsa_1024_a.pub。最後,把這個文件從本地機器上拷貝到服務
器~/.ssh2中。爲安全起見,要確保ssh目錄的安全,只有所有者纔有權寫入。如果遠程用戶
SSH配置文件的權限設置不當,服務器可能會拒絕進行認證。

公鑰認證比密碼認證更安全,因爲:
1、 公鑰認證需要兩個加密部份(磁盤上的identify文件和用戶頭腦中的口令),入侵都必須
2、 具備兩種條件才行。密碼認證只需要一個部份,那就是密碼,它可能更容易被竊取。
3、 在公鑰認證中,口令和密鑰都不用發給遠程主機,只要把前面討論的認證者發給遠程主
4、 機就可以了,因此,並沒有祕密信息傳出客戶端。
3、機器生成的密鑰是不可能猜測出來的,而人生成的密碼容易受到字典攻擊。
通過禁用密碼認證並只允許使用密鑰認證能極大提高主機的安全性。

如果要修改密鑰
如果已經生成一個密鑰對,並把公鑰拷貝到多個SSH服務器上了,用戶有一天決定修改自
已的身份,因爲再運行ssh-keygen。這樣,就會覆蓋identify and identify.pub文件,用戶之
前的公鑰就沒用了,必須把新公鑰再次拷貝到各個服務器上。這是很頭疼的,所以建議:
1、 不能侷限於僅僅使用一個密鑰對,可隨意生一此密鑰對,將其保存在不同的文件中,並
2、 將其用作不同的用途。
3、 如果只是想修改口令,就不必重新生成一個密鑰對,ssh-keygen有一個命令行選項可以
4、 替換現有的密鑰口令。ssh1 and openssh是-p,對於ssh2是-e。這樣,因爲私鑰沒變,所以
5、 公鑰依然不效,中需使用新口令對私鑰進行解密就可以了。

ssh代理
它可以把私鑰保存在內存中,爲認證提供服務,不用重複輸入密碼。直到用戶退出爲止。代
理程序是ssh-agent。可手工運行也可編輯~/.login 或~/.xsession來自動運行。
$ ssh-agent $SHELL 其中SHELL是用戶登錄shell的環境變量。運行該命令後,打開另外
一個shell,在這個shell中可以訪問代理。
接着用ssh-add命令裝入私鑰。這樣,使用ssh and scp命令就不用再提醒輸入口令了。口令
裝入內存中。如果用戶正運行x window系統,並設置了DISPLAY環境變量,而標準輸入
不是終端,那麼ssh-add就使用一個圖形化X程序ssh-askpass來讀取口令。要強制ssh-add
使用X來讀取口令,請在命令行中輸入ssh-add < /dev/null。
-l 參數顯示內存中的密鑰
-d 參數從代理中刪除密鑰 $ ssh-add -d ~/.ssh/id_xxx.pub
-D 是刪除所有密鑰
-t 對加載的密鑰設置超時時間,超時代理將自動卸載密鑰。
-L -U 對代理進行加鎖和解鎖,當你離開計算機而不想退出登錄時有用。


代理轉發
可能通過代理轉發功能,可以用SCP把文件從遠程SSH服務器上拷貝到第三方SSH主機上。
條件是你在第三方SSH主機上必須有一個帳號。具體操作是這樣的:
1、 在本地主機上運行命令:# scp [email protected]:print-me
2、 [email protected]:other-print-me
2、這個scp進程與本地代理進行聯繫,並讓用戶和shell.isp.com進行認證。
3、自動在shell.isp.com上執行第二個scp,用來把文件拷貝到other.host.net主機上。
3、 由於啓用了代理轉發(SSH1 AND SSH2默認是打開的,openssh默認是關閉的),因此
4、 shell.isp.com上的SSH服務器就充當一個代理。
5、第二個scp進程通過聯繫shell.isp.com上的代理試圖讓用戶和other.host.net進行認證。
5、 shell.isp.net上ssh服務器祕密與用戶的本地代理進行通信,從而構建出一個認證者來提
6、 供用戶的證書並將其傳回服務器。
7、服務器爲第二個scp進程驗證用戶的身份,other.host.net上的認證獲得成功。
8、開始拷貝文件。
由於代理轉發不會把私鑰發送到遠程主機上,而是把認證返回第一臺機進行處理,因此密鑰
是安全的。

不用密碼或口令進行連接方式
1、使用代理的公鑰認證。
2、可信主機認證。
3、Kerberos認證。
在後文中將會討論這些方式的優缺點。

sftp
它是在SSH上的一個獨立文件傳輸工具,操作與ftp類似,可以在一個會話中調用多個命令
進行文件拷貝和處理,而scp每次調用時都要打開一個會話。sftp不區分ascii and binary傳
輸模式,只使用二進制模式,因此,如果使用它在windows and unix之間拷貝ascii文件,
那麼就不能正確轉換行結束符。

第三章 SSH內幕
SSH協議的主要特性和優點:
1、 使用強加密技術來保證數據的私密性。端到端通信用隨機密鑰進行加密,隨機密鑰爲會
話進行安全協商,會話結束後被丟棄。支持的算法有ARCFOUR,Blowfish,DES,IDEA,3DES等。
2、通信完整性,確保通信不會被修改。SSH-2基於MD5 AND SHA-1的加密hash算法。
3、認證,即發送者和接收者的身份證明。客戶機和服務器雙向認證。
4、授權,即對賬號進行訪問控制。
5、使用轉發或隧道技術對其它基於tcp/ip的會話進行加密。支持三種轉發,tcp端口轉發,
X轉發,代理轉發。

SSH可以防止的攻擊
1、網絡竊聽,SSH通信是加密的,即使截獲會話內容,也不能將其解密。
2、名字服務和IP僞裝,SSH通過加密驗證服務器主機身份可避免這類風險。
3、連接劫持,SSH的完整性檢測負責確定會話在傳輸過程是否被修改,如果被修改過,就
關閉連接。
4、 中間人攻擊,SSH利用兩種方法防止這種攻擊,第一種是服務器主機認證。除非攻擊者
已經成功攻擊了服務器主機,獲得服務器的私有主機密鑰。第二種是限制使用容易受到
這種攻擊的認證方法,密碼認證容易受到中間人攻擊,而公鑰和基於主機的/RhostsRSA
則對中間人攻擊可以免疫。
5、插入攻擊,這種攻擊可以客戶和服務器之間發送的正文數據流之間插入任意數據。ssh1
1.2.25後和openssh的所有版本都專門進行了設計,來檢測並防止這種攻擊。這種檢測程序
增大了插入攻擊的難度,但是並不能完全防止。ssh2使用強加密完整性檢測手段來防止這個
問題。可以用3DES算法來防止這種攻擊。

SSH不能防止的攻擊
1、 密碼崩潰,密碼認證是一種脆弱的認證形式,儘量使用公鑰認證方式。如果必須要密碼
認證,可考慮使用S/Key之類的一次性密碼機制。
2、 IP AND TCP攻擊,由於SSH是在TCP之上進行操作的,因此容易受到針對TCP和IP
缺陷而發起的攻擊。SYN flood,TCP不同步和TCP劫持等。只能通過更低層的防護措施
來保護。
3、流量分析。
4、隱祕通道。
5、粗心大意。安全是一個過程,而不是一個產品,不要認爲裝上SSH就安全了。

第四章 SSH的安裝和編譯時配置

第五章 服務器範圍的配置
sshd可以在三個層次上進行配置,第一層次是上面的安裝和編譯時配置;第二層次是本章的
服務器範圍配置;第三層次是每賬號配置(第八章),前者是服務器編譯時就指定了包含哪
些特定功能,不包含哪些功能,後者則是由終端用戶來修改自已賬號所使用的服務器的行爲。

以普通用戶身份運行SSH服務器
1、得到管理員許可。
2、生成一個主機密鑰。
$ ssh-keygen -N '' -b 1024 -f ~/myserver/hostkey 生成hostkey and hostkey.pub兩個文件
3、選擇端口號。 要選擇大於或等1024的端口,因爲只有超級用戶纔有權使用小於
1024的端口 。
4、創建服務器配置文件(可選) 可創建自已的配置文件,否則,服務就使用內建的特性或使
用服務器範圍的配置文件。
啓動服務器方式:$ sshd -h ~/myserver/hostkey -p 2345 -f ~/myserver/config
由普通用戶運行的服務器有一些缺點:
1、由於不是由root的uid下運行,因此只能連接到用戶自已的賬號上。
2、它需手工調用,不能自啓動。
3、 日誌用戶沒權看到,因爲服務器把它寫到syslog日誌系統中,但可用調試模式運行服務
4、 器,這樣信息就顯示在終端機上。

服務器配置文件
SSH1 AND OPENSSH的配置文件通常是/etc/sshd_config,而SSH2的配置文件通常是
/etc/ssh2/sshd2_config。

以非缺省的配置文件來調用sshd,可以使用命令 -f 選項。$ sshd -f /usr/local/ssh/my_config。

以*號作爲標號的語名都會被sshd忽略。

修改完配置後,修改不會馬上影響到服務器,可重啓服務器或發送SIGHUP信號。$ kill -HUP
`cat /etc/sshd.pid`

如果在命令行改動了配置,用SIGHUP信號重啓服務器不能覆蓋命令行的配置,它的優先
級高。

主機密鑰,sshd主機密鑰向SSH客戶端唯一地標識SSH服務器。主機密鑰保存在一對文件
中,一個文件包含私鑰,一個文件包含公鑰。對於SSH1 AND OPENSSH,它是
/etc/ssh_host_key。文件位置可用HostKey關鍵字修改 HostKey /usr/local/ssh/key。服務器的
公鑰保存在.pub文件中。
OPENSSH服務器有一個SSH-2的主機密鑰,缺省是在/etc/ssh_host_dsa_key。其位置可用
HostDsaKey /usr/local/openssh/key2修改。

對於SSH2,如果服務器是由超級用戶運行,缺省私鑰文件是/etc/ssh2/hostkey。如果是其它
用戶運行,則在~/.ssh2/hostkey。可用HostKeyFile /etc/local/ssh/key修改。公鑰是hostkey.pub
文件,可用publicHostKeyFile關鍵字修改。

可以用命令行選項指定私鑰文件:$ sshd -h /usr/local/ssh/key。

隨機數種子文件
如果用戶的系統中有一個隨機位源,如/dev/urandom,那麼OPENSSH就不能創建隨機數種
子文件。

服務器配置文件
通常是/etc/sshd_config /etc/ssh2/ssh2_config,可以用-f 選項重新指定其配置文件。可用於一
臺機器運行多個sshd的情況。

每賬號認證文件。~/.ssh/authorized_keys 。


文件權限
由於配置文件的權限設置錯誤,會降低系統的安全性,所以可以設置StrictModes YES/NO
關鍵字,對sshd的重要文件和目錄的權限進行檢查,如果檢查失敗,服務器就拒絕對該用
戶的SSH連接。

在多宿主主機上,使用ListenAddress xxx.xxx.xxx.xxx來限制SSH只監聽一個網絡接口。

空閒連接時間,IdleTimeout xx 如果是0代表什麼都不做,保持連接。否則,超時就斷開連
接,可以用s,m,h,d,w表示。

KeepAlive YES/NO 可以斷開失效的連接,比如客戶端崩潰。

失敗的登錄
LogingGraceTime 60 限定用戶必須在60秒內成功進行認證。 0值表禁用。命令行選項用
-g

PasswordGuesses 5 如果連接請求使用密碼認證,那麼sshd2就只允許客戶端嘗試五次。
SSH2)

限制併發連接
MaxConnections 32 最大32個連接(SSH2)

逆向IP映射
SSH2服務器可以根據客戶端地址進行逆向DNS查詢,以確保客戶端的地址就是這個地址。
如果檢查失敗,連接拒絕。
RequireReverseMapping yes (ssh2)

轉發
AllowTcp-Forwarding yes
X11Forwarding yes

服務器密鑰生成
該密鑰用來對客戶端/服務器之間的通信進行保護。是臨時的,永遠不會保存在磁盤上。服
務器在啓動時生成這個密鑰。並以固定的週期重新生成。缺省長度是768位,最小爲512,
可以ServerKeyBits 2048 指定長度。用KeyRegenerationInterval 1200指定週期。 命令行選
項:-k

加密算法
Ciphers any 允許所有支持算法。其它算法包括
3des-cbc,blowfish-cbc,twofish-cbc,arcfour,none

mac算法
MAC關鍵字可以讓用戶選擇sshd2進行完整性檢測所使用的算法,稱爲消息認證代碼。用
於sshd2的有hmac-sha1,hmac-md5,hmac-md5-96。

在OPENSSH中,用戶可以用Protocol關鍵字選擇支持SSH-1 AND SSH-2,1 代表SSH-1,2 代
SSH-2, 1,2 代表都支持。

允許用戶登錄:認證和訪問控制
1、認證負責對發起連接請求的用戶的身份進行驗證。
密碼認證
PasswordAuthentication yes AllowedAuthentications password (ssh2)
公鑰認證
RSAAuthentication yes (ssh1,openssh/1)
AllowedAuthentications publickey (ssh2)
DEAAuthentication yes (openssh/2)
Rhosts認證,可信主機認證通過檢查遠程主機名和相關用戶名來實現對客戶端的身份認證。
RhostsAuthentication yes (ssh1,openssh)
IgnoreRhosts yes (ssh1,ssh2,openssh)不使用系統的hosts.equiv and ~/.rhosts,使用SSH專用
的/etc/shosts.equiv and ~/.shosts
強可信主機認證。
RhostsRSAAuthentication yes ssh1,openssh
AllowedAuthentications hostbased ssh2
提取已知名主機的公鑰
UserKnownHosts no ssh2
IgnoreUserKnownHosts yes openssh
PGP認證
Kerberos認證
S/key認證
SecurID認證
PAM認證

2、訪問控制負責允許或禁止來自特定用戶、機器在或INTERNET域的SSH連接到服務器
上。
通常,只要設置正確,任何賬號都可以接收SSH連接,這種訪問權限可以使用服務器關鍵
字AllowUsers and DenyUsers覆蓋。
AllowUsers smith
如果配置文件中單獨出現一個AllowUsers,後面沒有任何內容,就表示禁止所有沒提到的用
戶連接,如果沒有AllowUsers這個關鍵字,則所有用戶都可連接。DenyUsers表示禁止連接。
可用通配符,

可以用組訪問控制AllowGroups DenyGroups

主機名訪問控制
AllowHosts hostname
DenyHosts hostname

超級用戶的訪問控制
sshd對超級用戶專門使用一種特殊的訪問機制,PermiRootLogin來允許或禁止使用SSH
訪問root賬號。

顯示用戶的歡迎信息
PrintMotd yes/no default is yes

顯示郵件信息
CheckMail yes/no default is yes

空密碼
PermitEmptyPasswords yes/no 如果使用密碼認證,並且有個賬號沒有設定密碼,那麼服務
器就可以拒絕訪問這個賬號

如果系統中存在/etc/nologin,那麼sshd就只允許root用戶登錄,其它都不能登錄。因此,touch
/etc/nologin是把訪問權只授給系統管理員的一種快速方法。這樣並不需要重新配置ssh。也
不需要重啓ssh

子系統
定義和調用遠程命令的一個抽象層,用戶可以通過在客戶端命令行中給出命令來調用遠程命
令,如:ssh server.examply.com /bin/tar c /home 這個命令調用tar,遠程把/home拷貝到磁帶上。
子系統是服務器機器上預定義的一組遠程命令,這樣就可以方便地執行。在服務器配置文檔
中定義:subsystem backups /bin/tar c /home,要在服務器上運行該命令,可以使用 -s 選項。
ssh -s backups server.example.com。缺省情況下,sshd_config中定義了一個子系統,subsystem
sftp 。不要刪除這個子系統,這是scp2和sftp必須的。

日誌
Fascisl Logging mode 把調試信息打印到系統日誌文件中,可以使用FascistLogging關鍵字
啓用。
調試模式 可以使用-d命令選項啓用
安靜模式 只能輸出嚴重錯誤,而不能輸出 普通日誌,可以使用QuietMode關鍵字或-q
命令行啓用。
openssh中的日誌配置關鍵字是SyslogFacility and LogLevel。SyslogFacility設置syslog的
facility(KERN,DAEMON,USER,AUTH,MAIL等),LogLevel記錄日誌提供的詳細程度,該
值從低到高順序是:QUIET,FATAL,ERROR,INFO,VERBOSE,DEBUG,使用DEBUG會侵犯用
戶的隱私權,這個級別只能用於診斷,而不能用於普通操作。


第六章 密鑰管理與代理
一個身份標識由兩部份組成,分別稱爲私鑰(Private Key)和公鑰(Public Key),合稱一個
密鑰對。

SSH1,SSH2 AND OPENSSH身份標識文件的格式各不相同。
SSH1缺省設置中,私鑰存儲在文件identity中,公鑰存儲在文件identity.pub中。這個密鑰
對存放在~/.ssh目錄下,在使用前,把公鑰拷貝到服務器上的一個認證文件裏,如SSH1 AND
OPENSSH中的~/.ssh/authorized_keys,此後,當客戶請求連接到你的服務器上的帳號時,就
會用一個私鑰作爲證明身份的標識,服務器則在authorized_keys文件中尋找與之匹配的公
鑰。

SSH2密鑰對文件的命名通常是根據該密鑰使用的加密算法的性質來起的,例如一個用DSA
加密的1024位密鑰生成時其缺省文件名是id_dsa_1024_a and id_dsa_1024_a.pub。用戶必須
把私鑰放在identification文件中,缺省是~/.ssh2/目錄,一個私鑰在這個文件中佔一行,在公
鑰認證中,每一行的開頭都有一個關鍵字IdKey,後跟一個私鑰文件名。如:
IdKey id_dsa_1024_a
IdKey my-other-ssh2-key
在服務器端的認證文件~/.ssh2/authorization中,SSH2不包含公鑰的實際拷貝,只是把公鑰
文件列出來,前面用關鍵字kEY標識。如:
Key id_dsa_1024_a.pub
Key something-else.pub
這樣維護起來更容易,更方便。

OPENSSH對SSH-1連接使用的標識和授權文件與SSH1完全相同,對於SSH-2連接,缺省
的密鑰則存儲在~/.ssh/id_dsa(private key)和~/.ssh/id_dsa.pub(public key)中,服務器上的授權
文件是~/.ssh/authorized_keys。

創建身份標識用ssh-keygen命令。

OPENSSH的ssh-keygen可以支持SSH1中相應程序的所有功能和選項,它還新增了爲SSH-2
連接生成DSA密鑰的能力。
$ ssh-keygen -t dsa -b 1024
-e -x 選項可把OPENSSH格式的密鑰存儲格式轉換成SSH2格式 (直接回車,按提示輸入轉
換文件名)
-i -X 選項把SSH2格式的密鑰轉換成OPENSSH格式。這樣可用SSH2客戶端連接
OPENSSH服務器。(直接回車,按提示輸入轉換文件名)
-y 如果不小心刪掉了OPENSSH的公鑰,可用-y恢復。
-l 可計算出公鑰的指紋,指紋是鑑別位置不同的兩個密鑰是否相同的常用的一種密碼學技
術。這項技術用於不可能逐位對比兩個密鑰的情況。OPENSSH AND SSH2都能計算指紋。
它是根據密鑰計算出來一個長度較短的值,它是原理與校驗和類似,用於驗證一串信息(在
我們的例子中是密鑰)的不可替換性。

啓動代理
1、單shell方式,使用當前登錄的shell. $ eval `ssh-agent`
2、子shell方式,派生出一個子shell,並繼承父shell的某些環境變量。 $ ssh-agent $SHELL
不要想當然運行 $ ssh-agent,這樣客戶端是無法有代理聯繫的。刪除代理用kill命令就可以
了。

SSH-1 與 SSH-2代理的兼容性
SSH-1的代理不能處理SSH-2的代理,SSH-2的代理卻可以處理SSH-1的代理請求。

第七章 客戶端的高級用法
$ ssh -a -p 220 -c blowfish -l sally -i myself server.example.com 可通過配置文件簡化命令
輸入

Host myserver
ForwardAgent no
Port 220
Cipher blowfish
User sally
IdentifyFile myself
HostName server.example.com
配置了該文件後,就可以在客戶端簡單地輸入
$ ssh myserver

全局文件和本地文件
全局文件通常是由管理員創建的,用來維護整臺計算機上的客戶行爲。該文件通常位於
/etc/ssh_config or /etc/ssh2/ssh2_config。每個客戶也可以在自已賬號中創建本地客戶配置文
件,通常是~/.ssh/config or ~/.ssh2/ssh2_config。本地配置文件優先級高於全局配置文件。命
令行選項的優先級又高於本地配置文件。

scp有關命令參數
-r 遞歸拷貝目錄
-p 保持文件權限和時間戳
-u 拷貝完成後刪除源文件
-d 防止覆蓋文件
-n 描述操作
-q 不顯示統計信息


第八章 每賬號服務器配置
這種配置可以讓SSH服務器區分每個服務器上的各個用戶。利用服務器目標賬號的認證文
件(authorized_keys)配置。侷限有兩點,它不能覆蓋編譯時配置和服務器範圍配置所採用
的安全措施,第二,如果使用公鑰認證,每賬號配置是十分靈活的,如果採用可信主機和密
碼認證,提供的選擇範圍就很小。

基於公鑰的配置
1、認證文件的完全格式 依次包含三項內容,一些選項,公鑰和註釋。多個選項用逗號分
開。
2、用於限制客戶端可以在服務器上調用的程序的強制命令。如客戶端請求執行/bin/ls命令,
而服務器端強制命令卻運行/bin/who命令,它十分有用,可用於加強安全性,了爲授權提供
方便。如要讓你的助手每次連接上來都運行email命令程序pine,則可以這樣:
command= "/usr/local/bin/pine" ...key...。最多可給每個密鑰關聯一個強制命令,要關聯多個命
令可把這些命令放入遠程主機的一個腳本中,並將該腳本作爲強制命令運行。如果強制命令
有shell出口,那會存在安全問題,等於沒有強制,客戶可以運行任何程序。以下規則可以
用來判斷一個程序是否適合用作強制命令。
a、 避免使用具有shell出口的程序(如:文件編輯器vi,Emacs; 分頁程序 more,less;調用分
b、 頁的man,新聞閱讀程序rn,郵件閱讀程序pine以及調試程序adb,非交互的程序find,xargs
c、 等)。
b、避免使用編譯器,解釋器或其它可以讓用戶生成並運行任意執行代碼的程序。
c、可創建或刪除文件的程序,如cp,mv,rm,scp,ftp等。
d、避免使用setuid or setgid的程序,特別是setuid 是root的程序。
d、 如果使用腳本作爲強制命令,就要遵循編寫安全腳本的傳統規則,在一個腳本之內,要
限制使用相對路徑作爲搜索路徑,應該使用絕對路徑來調用所有的程序;不要盲目地把
用戶提供的字符串作爲命令來執行;不要讓腳本執行任何setuid的工作。不要調用具有
shell出口的程序。
e、考慮使用受限shell。
f. 爲一個單獨的、專用的SSH密鑰(不要用你登錄的那個密鑰)關聯一個強制命令。這樣
不會影響你的登錄能力就可以方便地禁用該密鑰。
g、禁用不必要的SSH特性。如no-port-forwarding,no-agent-forwarding,no-pty(禁用tty分配)。
幾個常用的強制命令介紹
使用定製消息拒絕連接:command="/bin/echo Sorry,buddy,but you've terminated!" ...key... 千萬
不要用more and less之類的分頁程序
顯示命令菜單:利用腳本
檢查客戶端的原始程序:command="/bin/echo you tried to invoke
$SSH_ORIGINAL_COMMAND" ...key... $SSH_ORIGINAL_COMMAND環境變量保存着
客戶連接時運行的原始命令。
限制客戶端的原始命令,創建一個腳本,該腳本根據$SSH_ORIGINAL_COMMAND內容選
擇不同的操作。
把客戶端的原始命令記錄在日誌中:也是根據$SSH_ORIGINAL_COMMAND變量來做的一
個腳本。腳本內容如一:
#!/bin/sh
if [ -n "$SSH_ORIGINAL_COMMAND" ]
then
echo "`/bin/date`: $SSH_ORIGINAL_COMMAND" >> $HOME/ssh-command-log
exec $SSH_ORIGINAL_COMMAND
fi

3、限制來自特定主機的連接。由from選項完成。from="client.example.com" ...key...。強制
連接必須來自client.example.com。否則斷開。from="!client.example.com" ...key...表示拒絕該
地址的連接。支持通配符。SSH2不支持該功能。但可以通過$SSH2_CLIENT變量提取客戶
ip,編寫強制命令腳本達到同樣效果。
4、爲遠程程序設置環境變量。environment="EDITOR=emacs" ...key...,爲每個連接修改默認的
環境變量。
5、設置空閒超時時間,這樣如果客戶端用戶不再發送數據就強制將其斷開。idle-timeout=5m,
該選項會覆蓋服務器範圍配置。
6、對到達的SSH連接禁用某些特性,例如端口轉發和tty分配。禁用tty分配會使客戶端沒
有交互會話的能力。$SSH_TTY變量可顯示tty情況。

用戶的rc文件
ssh服務器會在每個連接到達時調用shell腳本/etc/sshrc,用戶可把一些登錄後想運行的腳本
寫到這個文件中。用戶可以在自已的目錄下定義類似的腳本,如果有自定義的~/.ssh/rc則
/etc/sshrc則不會執行。

第九章 端口轉發與X轉發
使用SSH對其它應用程序在別的TCP端口上建立的TCP/IP傳輸進行加密和解密,這一過
程稱爲端口轉發,其絕大多數操作都是透明的,功能非常強大。TELNET,SMTP,NNTP,IMAP
和一些基於TCP的不安全協議都可變得安全,只要將其連接通過SSH轉發即可。端口轉發
有時又叫做隧道傳輸。
例子:一個運行IMAP的服務器S,在家裏的主機H上運行一個email程序,現在想用ssh
保護IMAP連接。
$ ssh -L2001:localhost:143 S
-L 表明是本地轉發,,上面這命令可完成登錄到S的功能,現在的這個SSH會話同時將H
的2001端口轉發到S的143端口,在退出會話之前一直有效。並告知email程序使用被轉
發的端口,通常郵件程序連接服務器的143端口,即套接字 (S,143)。現在要令其連接
本地主機H自已的2001端口,也就是套接字(localhost,2001)。創建本地轉發時可以不用-L
選項,而在客戶端配置文件中用LocalForward關鍵字。
LocalForward 2001 localhost:143 ssh1 openssh
LocalForward "2001:localhost:143" ssh2

-g 選項和GatewayPorts yes/no關鍵字可以配置除本地主機外的機器是否能使用本地的端口
轉發功能。出於安全問題,該禁止這個功能。

遠程轉發端口與本地轉發幾乎完全相同,只是方向相反。此時服務器在本地,轉發連接由遠
程主機發起。假設你已登錄進服務器S。則
$ ssh -R2001:localhost:143 H
-R代表遠程轉發。命令執行後,一條從遠程主機H的2001端口到服務器S的143端口的安
全隧道就建立起來了。H上的任何程序都可以通過連接(localhost,2001)來使用此安全隧道。
而在客戶端配置文件中用RemoteForward關鍵字.
RemoteForward 2001 S:143 ssh openssh
RemoteForward "2001:S:143" ssh2

$ ssh -o ClearAllForwardings=yes server.example.com 阻止第二條命令建立隧道

本地轉發與遠程轉發
在本地轉發中,應用程序客戶端與監聽端同SSH客戶端在一起,應用程序服務器與連接端
SSH服務器在一起。
在遠程轉發中,應用程序客戶端與監聽端同SSH服務器在一起,應用程序服務器與連接端
SSH客戶端在一起。

無遠程登錄的端口轉發,連接時帶-f參數。一次性轉發用-fo,ssh1與openssh不支持這個功
能,但可用以下語句實現:
$ ssh -f -L2001:localhost:143 server sleep 10

終止
如果一個SSH會話現在還在活動當中,終止會出錯。在SSH2中,如果退出有活動轉發連
接的會話,該會話會依然打開,但會轉到後臺運行。直到轉發連接終止。ssh1 and openssh
與此相反,如果要斷開還在活動的會話,會出現警告,仍然在前臺運行。

TIME_WAIT問題。在某些情況下,TCP連接斷連時,其一端的套接字在很短一段時間內變
得不可用,所以在斷連過程結束前不能把該端口用於TCP轉發。






第十章 推薦配置
服務器範圍配置
1、禁用其它訪問方式。
關掉r-命令,方法如下:刪除/etc/hosts.equiv文件,或改爲只讀空文件。禁用rshd,rlogind and
rexecd,通過修改inetd.conf文件。
2、/etc/sshd_config配置
HostKey /etc/ssh_host_key
PidFile /etc/sshd.pid
RandomSeed /etc/ssh_random_seed

StrictModes yes 要求用戶保護其與SSH有關的文件及目錄
Umask 0077 保證所有SSHD1創建是文件和目錄都只能由其所有者(SSHD 運行的
UID)讀取

port 22
ListenAddress 0.0.0.0
IdleTimeout 15m 15分鐘空閒超時
KeepAlive yes 客戶機死機時連接將會終止,而不會長期掛起。

LoginGraceTime 30 登錄時成功認證的時限爲30秒。

ServerKeyBits 768 服務器密鑰長度
KeyRegenerationInterval 3600 服務器密鑰一小時重新生成一次

PasswordAuthentication no 禁用密碼認證
RhostsAuthentication no 禁用可信主機認證
RhostsRSAAuthentication no 禁用增強可信主機認證
RSAAuthentication yes 啓用公鑰認證

IgnoreRhosts yes 完全禁止SSHD使用.rhosts文件
IgnoreRootRhosts yes

UseLogin no 禁用UseLogin,防止萬一使用了其它登錄程序

AllowHosts xxx 根據需要設置
SilentDeny yes 任何被DenyHosts拒絕的連接都不會向用戶返回消息,不必告訴攻擊
者發生了什麼,可以增加了排錯的難度。

PermitRootLogin nopwd 允許超級用戶通過SSH連接,但不能用密碼認證

FascistLogging no 禁用FascistLogging日誌方式,因爲它會在日誌中記錄用戶特定信息,對
攻擊者有用。
QuietMode no 禁用QuietMode日誌方式,使用日誌更詳細,敏感度更低

AllowTcpForwarding yes 允許tcp端口轉發和X轉發,保護其它的tcp連接
X11Forwarding yes

3、/etc/ssh2/sshd2_config配置
HostKeyFile /etc/ssh2/hostkey
PublicHostKeyFile /etc/ssh2/hostkey.pub
RandmoSeedFile /etc/ssh2/random_seed

UserConfigDirectory
IdentityFile
AuthorizstionFile

StrictModes yes

port 22
listenAddress 0.0.0.0
KeepAlive yes
RequireReverseMapping no

LoginGraceTime 30

由於sshd2沒有設置服務器密鑰的位數的關鍵字,用戶得在啓動時使用 -b 選項 $ sshd2 -b
1024 ....

AllowedAuthentications publickey
RequiredAuthentications publickey

IgnoreRhosts yes
UserKnownHosts no 禁用該項可防止用戶給未知主機提供信任權限。

PermitRootLogin nopwd


Ciphers any 不能選none


QuietMode no
VerboseMode yes

Ssh1Compatibility no 禁用SSH-1兼容模式
#Ssh1Path /usr/local/ssh1/sshd1 出於實用原因,也可以啓用此模式,之前要指明ssh1服
務器可執行文件位置

4、每賬號配置
對於SSH1 AND OPENSSH,~/.ssh/authorized_keys中的每一個密鑰都必須用適當的選項進
行限制,from選項限制只能從特定的主機訪問特定的密鑰。例如,假設文件中包含你家那
臺pc(myhome.isp.net)的公鑰,而其它機器根本不可能用那個密鑰來認證,我們就可以明確
限定這一關係:from = "myhome.isp.net" ...key...。還要對適當的密鑰設置空閒超時時間:from
= "myhome.isp.net" ,idle-timeout=5m ...key...。
最後,考慮每一個密鑰是否需要對到達的連接使用端口轉發,代理轉發以及分配tty等,如
果不需要,就可以分別用no-port-forwarding,no-agent-forwarding and no-pty禁用這些特性。

5、密鑰管理
至少創建1024位長的用戶密鑰,並用好的口令對密鑰進行保護。

6、客戶端配置
離開正在運行的ssh客戶端時,一定要用密碼保護。
在客戶端配置文件中啓用某些安全功能,並將其設置爲最強
Host *
FallBackToRsh no 禁止使用不安全的r-命令(ssh2)沒有這個問題。
UseRsh no
GatewayPorts no 禁止遠程客戶端連接本地的轉發端口
StrictHostKeyChecking ask 在主機密鑰發生變化時提醒你。請求你的處理意見。
配置“/etc/ssh/ssh_config”文件 
“/etc/ssh/ssh_config”文件是OpenSSH系統範圍的配置文件,允許你通過設置不同的選項
來改變客戶端程序的運行方式。這個文件的每一行包含“關鍵詞-值”的匹配,其中“關鍵
詞”是忽略大小寫的。下面列出來的是最重要的關鍵詞,用man命令查看幫助頁(ssh (1))
可以得到詳細的列表。 

編輯“ssh_config”文件(vi /etc/ssh/ssh_config),添加或改變下面的參數: 

# Site-wide defaults for various options 
Host * 
ForwardAgent no 
ForwardX11 no 
RhostsAuthentication no 
RhostsRSAAuthentication no 
RSAAuthentication yes 
PasswordAuthentication yes 
FallBackToRsh no 
UseRsh no 
BatchMode no 
CheckHostIP yes 
StrictHostKeyChecking no 
IdentityFile ~/.ssh/identity 
Port 22 
Cipher blowfish 
EscapeChar ~ 

下面逐行說明上面的選項設置: 

Host * 
選項“Host”只對能夠匹配後面字串的計算機有效。“*”表示所有的計算機。 

ForwardAgent no 
“ForwardAgent”設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。 

ForwardX11 no 
“ForwardX11”設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)。 

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

RhostsRSAAuthentication no 
“RhostsRSAAuthentication”設置是否使用用RSA算法的基於rhosts的安全驗證。 

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

PasswordAuthentication yes 
“PasswordAuthentication”設置是否使用口令驗證。 

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

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

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

CheckHostIP yes 

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

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

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

Port 22 
“Port”設置連接到遠程主機的端口。 

Cipher blowfish 
“Cipher”設置加密用的密碼。 

EscapeChar ~ 
“EscapeChar”設置escape字符。 

配置“/etc/ssh/sshd_config”文件 
“/etc/ssh/sshd_config”是OpenSSH的配置文件,允許設置選項改變這個daemon的運行。
這個文件的每一行包含“關鍵詞-值”的匹配,其中“關鍵詞”是忽略大小寫的。下面列出
來的是最重要的關鍵詞,用man命令查看幫助頁(sshd (8))可以得到詳細的列表。 

編輯“sshd_config”文件(vi /etc/ssh/sshd_config),加入或改變下面的參數: 

# This is ssh server systemwide configuration file. 
Port 22 
ListenAddress 192.168.1.1 
HostKey /etc/ssh/ssh_host_key 
ServerKeyBits 1024 
LoginGraceTime 600 
KeyRegenerationInterval 3600 
PermitRootLogin no 
IgnoreRhosts yes 
IgnoreUserKnownHosts yes 
StrictModes yes 
X11Forwarding no 
PrintMotd yes 
SyslogFacility AUTH 
LogLevel INFO 
RhostsAuthentication no 
RhostsRSAAuthentication no 
RSAAuthentication yes 
PasswordAuthentication yes 
PermitEmptyPasswords no 
AllowUsers admin 

下面逐行說明上面的選項設置: 

Port 22 
“Port”設置sshd監聽的端口號。 

ListenAddress 192.168.1.1 
“ListenAddress”設置sshd服務器綁定的IP地址。 

HostKey /etc/ssh/ssh_host_key 

“HostKey”設置包含計算機私人密匙的文件。 

ServerKeyBits 1024 
“ServerKeyBits”定義服務器密匙的位數。 

LoginGraceTime 600 
“LoginGraceTime”設置如果用戶不能成功登錄,在切斷連接之前服務器需要等待的時間(以
秒爲單位)。 

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 code”。 

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”設置是否允許用口令爲空的帳號登錄。 

AllowUsers admin 
“AllowUsers”的後面可以跟着任意的數量的用戶名的匹配串(patterns)或user@host這樣
的匹配串,這些字符串用空格隔開。主機名可以是DNS名或IP地址。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章