SSH 安全性和配置入门
您是否是需要能夠以盡可能最安全的方式通過網絡進行通信的一個新 UNIX 管理員?重溫基礎知識、學習 SSH 的復雜細節,并深入研究 SSH 的高級功能,以安全地自動化您的日常系統維護、遠程系統管理,并使用高級腳本管理多個主機。
什么是 SSH?基本描述
Secure Shell (SSH) 的目的在于在通過網絡遠程訪問另一個主機時提供最大的保護。它通過提供更好的身份驗證工具和 Secure Copy (SCP)、Secure File Transfer Protocol (SFTP)、X 會話轉發和端口轉發等功能來加密網絡交換,從而增加其他非安全協議的安全性。有各種類型的加密可用,從 512 位加密到高達 32768 位加密,包括密碼,比如 Blowfish、Triple DES、CAST-128、Advanced Encryption Scheme (AES) 和 ARCFOUR。更高位的加密配置以使用更高的網絡帶寬為代價。圖 1?和?圖 2?展示如何使用一個像 Wireshark 這樣的網絡嗅探程序輕松讓任何人隨意查看 telnet 會話。
圖 1. Telnet 協議會話未加密。
常用縮略詞
API:應用程序編程接口
FTP:文件傳輸協議
IETF:互聯網工程任務組
POSIX:UNIX 可移植操作系統接口
RFC:請求注解
×××:虛擬專用網絡
在使用 telnet 這樣的不安全 “明文” 協議時,網絡上的任何人都可以竊取您的密碼和其他敏感信息。圖 1?展示用戶?fsmythe?通過一個 telnet 連接登錄到一個遠程主機。他輸入其用戶名?fsmythe?和密碼?r@m$20!0,同一網絡上的任何其他用戶都可以看到,將其看作是倒霉、沒有戒心的 telnet 用戶。
圖 2. SSH 協議會話加密。
圖 2?提供了對典型 SSH 會話的概覽,并展示了加密的協議如何不被同一網段的任何其他用戶看到。現在每個主流 Linux 和 UNIX 版本都附帶有默認安裝的 SSH 包 — 通常是開源 OpenSSH 包—,因此有點需要下載和從源碼進行編譯。如果您不在一個 Linux 或 UNIX 平臺上,有大量開源和基于 SSH 的免費軟件工具可用,它們大受追捧并廣為應用,比如?WinSCP、Putty、FileZilla、TTSSH?和?Cygwin(安裝在 Windows 操作系統之上的 POSIX 軟件)。這些工具在 Windows 平臺上提供一個 UNIX 或 Linux 式的 shell 接口。
不管您的操作系統是什么,SSH 都為老生常談的日常計算操作提供許多實際效益。它不僅可靠、安全和靈活,而且易于安裝、使用和配置 — 而且獨具特色。
回頁首
SSH 架構
IETF RFC 4251 到 4256 將 SSH 定義為 “經由一個不安全網絡進行遠程登錄和其他安全網絡服務的安全 shell 協議”。shell 由三個主要元素組成(參見?圖 3):
傳輸層協議:該協議提供服務器身份驗證、隱私和具有完美轉發隱私的完整性。該層可以提供可選壓縮且通過一個 TCP/IP 連接運行,但是也可用于任何其他可靠的數據流之上。
用戶認證協議:該協議從服務器到客戶端進行身份驗證,且通過傳輸層運行。
連接協議:該協議多路傳輸加密隧道到多個邏輯通道,通過用戶認證協議運行。
圖 3. SSH 協議邏輯層
傳輸層負責密鑰交換和服務器身份驗證。它設置加密、完整性驗證和(可選)壓縮并向上層公開一個用于發送和接收純文本數據包的 API。用戶認證層提供客戶端身份驗證以及多種驗證方法。常見的身份驗證方法包括密碼、公鑰、鍵盤交互、GSSAPI、SecureID 和 PAM。
連接層定義通道、全局請求和借以提供 SSH 服務的通道請求。單個 SSH 連接可以并行承載多個通道,每個都可雙方向傳輸數據。通道請求轉送信息,比如服務器端流程的退出代碼。SSH 客戶端發起一個轉發服務器端端口的請求。
這種開發式架構設計提供廣泛的靈活性。傳輸層可媲美傳輸層安全(Transport Layer Security,TLS),而且您可以運用定制的身份驗證方法來擴展用戶認證層。通過連接層,您可以多道傳輸二級會話到單個 SSH 連接(參見 圖 4)。
圖 4. 7 層 OSI 模型內的 SSH
回頁首
針對 UNIX 和 Linux 系統的 SSH 的一般用途
您通常使用 SSH 來允許用戶登錄到一個遠程主機并執行命令。然而,SSH 還支持隧道和 X11 連接。它甚至可以使用 SFTP 或 SCP 傳輸文件。SSH 適用于大部分常見平臺內的多個應用程序,這些平臺包括 Linux、UNIX、Windows 和 Apple OS X,雖然有些應用程序可能需要僅在特定 SSH 客戶端或服務器上提供或與之兼容的功能。
下面是一些常見的 SSH 語法例子:
遠程主機 shell 訪問(取代 telnet 和 rlogin 明文,不安全協議):
#?ssh?fsmythe@example.com [fsmythe@example.com]?~在遠程主機(代替 rsh)執行單一命令:
#?ssh?root@example.com?reboot? root@example.com's?password:?******通過?SCP?命令將文件從本地服務器復制到遠程主機。
root@edb-01.example.com's?password:?****** file1.txt??????100%????0?????0.0KB/s???00:00 file2.txt??????100%????0?????0.0KB/s???00:00結合 SFTP,作為 FTP 文件傳輸的一個安全替代品:
sftp?fsmythe@example.com? Connecting?to?example.com... fsmythe@example.com's?password:?******* sftp>結合 rsync 有效安全地備份、復制和鏡像文件到一個本地或遠程主機:
#?rsync?-avul?--rsh=ssh?/opt/edbdata/?root@example.com:/root/backup/ root@example.com's?password:?****** building?file?list?...?done ./ file1.txt file2.txt file3.txt file4.txt dir1/file5.txt dir2/file6.txtsent?982813?bytes??received?2116?bytes??1374860.38?bytes/sec total?size?is?982138??speedup?is?1.00端口轉發或端口隧道化(不要與 ××× 混淆):
ssh?-L?8000:mailserver:110?example.com????fsmythe@example.com's?password:?********從一個遠程主機轉發 X 會話(可能通過多個中間主機):
Edit?/etc/ssh/sshd_config?and?change?2?keywords?:? AllowTcpForwarding?yes X11Forwarding?yes #?service?sshd?restart? $?export?DISPLAY? $?ssh?-X?fsmythe@example.comX11 轉發配置與帶 SSH X11 隧道的一個 X Windows 客戶端的結合,支持實現通過 SSH 安全地在同一 Windows 主機上運行的一個 UNIX 或 Linux GUI 子系統,該 Windows 主機是到 Linux 或 UNIX 遠程主機的 SSH 會話的來源:
ssh?-ND?8000?fsmythe@example.com Browser?Settings,?goto?'Manual?Proxy?Configuration'?set?"SOCKS?Host"?to?example.com, the?'Port?to?8000'?,?Enable?SOCKS?v5,?and?lastly?set?'No?Proxy?for'?field to?'localhost,?127.0.0.1'使用?sshfs?將一個目錄作為本地計算機上的文件系統安全地掛載到一個遠程服務器:
#?yum?install?sshfs?fuse-utils?(Install?sshfs?and?fuse-utils) $sshfs?example.com:/remote_dir?/mnt/local_dir通過一個或多個機制對服務器進行自動化的遠程主機監控和管理:
(Report?number?of?apache?processes?running?on?the?remote?server?example.com): $?ssh?example.com?ps?-ef?|?grep?httpd?|?wc?-l root@example.com's?password:?*****
回頁首
SSH 安全性和配置最佳實踐
對于一些之前列舉的代碼示例,許多系統管理員擔心 SSH 使用情況和功能的一些安全性實現。盡管已經口頭和書面說明了常見的各種 SSH 安全性和遠程主機安全性方法,下面有一系列流程和配置可用于加強有關遠程主機訪問的 SSH 安全性:
將 root 賬戶僅限制為控制臺訪問:
#?vi?/etc/ssh/sshd_config PermitRootLogin?no為私有密鑰使用一個強大的口令和密碼保護來創建公私密鑰對(絕不要生成一個無密碼的密鑰對或一個無密碼口令無密鑰的登錄):
(Use?a?higher?bit?rate?for?the?encryption?for?more?security) ssh-keygen?-t?rsa?-b?4096配置 TCP 包裝程序,以便僅允許選定的遠程主機并拒絕不合意的主機:
#?vi?/etc/hosts.deny ALL:?192.168.200.09 #?IP?Address?of?badguy在工作站或筆記本電腦上,關閉 SSH 服務禁用 SSH 服務器,然后刪除 ssh 服務器包:?
#?chkconfig?sshd?off? #?yum?erase?openssh-server通過控制用戶訪問限制 SSH 訪問:
#?vi?/etc/ssh/sshd_config? AllowUsers?fsmythe?bnice?swilson DenyUsers?jhacker?joebadguy?jripper僅使用 SSH Protocol 2:
#?vi?/etc/ssh/sshd_config Protocol?2不要支持閑置會話,并配置 Idle Log Out Timeout 間隔:
#?vi?/etc/ssh/sshd_config ClientAliveInterval?600 #?(Set?to?600?seconds?=?10?minutes) ClientAliveCountMax?0禁用基于主機的身份驗證:
#?vi?/etc/ssh/sshd_config HostbasedAuthentication?no禁用用戶的 .rhosts 文件:
#?vi?/etc/ssh/sshd_config IgnoreRhosts?yes配置防火墻以接受僅來自已知網段的 SSH 連接:
Update?/etc/sysconfig/iptables?(Redhat?specific?file)?to?accept?connection?only? from?192.168.100.0/24?and?209.64.100.5/27,?enter:-A?RH-FW-1-INPUT?-s?192.168.100.0/24?-m?state?--state?NEW?-p?tcp?--dport?22?-j?ACCEPT -A?RH-FW-1-INPUT?-s?209.64.100.5/27?-m?state?--state?NEW?-p?tcp?--dport?22?-j?ACCEPT限制 SSH 將偵聽和綁定到的可用接口:
#?vi?/etc/ssh/sshd_config ListenAddress?192.168.100.17 ListenAddress?209.64.100.15設置用戶策略,實施強大的密碼來防御強力***、社會工程企圖(social engineering attempts)和字典***:
#?<?/dev/urandom?tr?-dc?A-Za-z0-9_?|?head?-c8 oP0FNAUt[使用?Chroot SSHD?將 SFTP 用戶局限于其自己的主目錄:
#?vi?/etc/ssh/sshd_config? ChrootDirectory?/data01/home/%u X11Forwarding?no AllowTcpForwarding?no禁用空密碼:
#?vi?/etc/ssh/sshd_config PermitEmptyPasswords?no在指定時間內對傳入端口 2022 連接的數量限速:
Redhat?iptables?example?(Update?/etc/sysconfig/iptables):?-A?INPUT??-i?eth0?-p?tcp?--dport?2022?-m?state?--state?NEW?-m?limit?--limit?3/min --limit-burst?3?-j?ACCEPT-A?INPUT??-i?eth0?-p?tcp?--dport?2022?-m?state?--state?ESTABLISHED?-j?ACCEPT -A?OUTPUT?-o?eth0?-p?tcp?--sport?2022?-m?state?--state?ESTABLISHED?-j?ACCEPT配置?iptables,以便在 30 秒內僅允許在端口 2022 上有三個連接嘗試:
Redhat?iptables?example?(Update?/etc/sysconfig/iptables):? -I?INPUT?-p?tcp?--dport?2022?-i?eth0?-m?state?--state?NEW?-m?recent?--set-I?INPUT?-p?tcp?--dport?2022?-i?eth0?-m?state?--state?NEW?-m?recent?--update? --seconds?30?--hitcount?3?-j?DR使用一個日志分析器,比如?logcheck、loggrep、splunk?或?logwatch?來更好地理解日志并創建日志報告。另外,在 SSH 應用程序自身內增加日志記錄的詳細度:
Installation?of?the?logwatch?package?on?Redhat?Linux? #?yum?install?logwatch通過配置增加 SSH 日志記錄的詳細度:
#?vi?/etc/ssh/sshd_config LogLevel?DEBUG在補丁上總是將 SSH 程序包和需要的庫保持為最新:
#?yum?update?openssh-server?openssh?openssh-clients?-y隱藏 OpenSSH 版本,要求 SSH 源代碼并進行重新編譯。然后進行以下更新:
#?vi?/etc/ssh/sshd_config VerifyReverseMapping?yes #?Turn?on??reverse?name?checking UsePrivilegeSeparation?yes #?Turn?on?privilege?separation StrictModes?yes #?Prevent?the?use?of?insecure?home?directory????#?and?key?file?permissions AllowTcpForwarding?no #?Turn?off?,?if?at?all?possible? X11Forwarding?no #?Turn?off?,?if?at?all?possible PasswordAuthentication?no #?Specifies?whether?password?authentication?is?#?allowed.??The?default?is?yes.?Users?must?have?#?another?authentication?method?available?.從系統上刪除 rlogin 和 rsh 二進制程序,并將它們替代為 SSH 的一個?symlink:
#?find?/usr?-name?rsh /usr/bin/rsh #?rm?-f?/usr/bin/rsh #?ln?-s?/usr/bin/ssh?/usr/bin/rsh
SSH 支持可啟用或禁用的多種不同的身份驗證方法和技術。在 /etc/ssh/sshd_config 文件中,您可以進行這些配置更改,方法就是輸入為身份驗證方法列出的關鍵字,然后緊接?yes?或?no。下面是一些常見的配置更改:
#?RSAAuthentication?yes #?PubkeyAuthentication?yes #?RhostsRSAAuthentication?no #?HostbasedAuthentication?no #?RhostsRSAAuthentication?and?HostbasedAuthentication PasswordAuthentication?yes ChallengeResponseAuthentication?no #?KerberosAuthentication?no GSSAPIAuthentication?yessshd_config 文件內的?AllowedAuthentications?和?RequiredAuthentications?決定哪些身份驗證方法和配置僅用于 SSH Protocol 2,且它們支持密碼和公鑰身份驗證的語法如下:
#?vi?/etc/ssh/sshd_config AllowedAuthentications?publickey,?password RequiredAuthentications?publickey,?password回頁首
SSH 的私鑰和公鑰對
為了幫助驗證身份,SSH 有一個密鑰管理功能和相關的代理。當配置為公鑰身份驗證時,您的密鑰證明您在遠程 SSH 主機上的身份。一個基于 SSH 的身份包括兩個部分:一個公鑰和一個私鑰。私有 SSH 密鑰是用于出站 SSH 連接的用戶身份,且應當保密。當用戶發起一個 SSH 或 SCP 會話到遠程主機或服務器時,他或她被認為是?SSH 客戶端。通過一個數學算法,一個私鑰如同您的電子***;公鑰如同您向其出示***的鎖或門機制。您的私鑰說,“這真的是 Fred Smythe”;公鑰說,“是的,您確實是真正的 Fred Smythe;您已通過身份驗證:請進入。”
您的公鑰代表您允許通過您的大門或鎖進入的人。公鑰需要保密;它們不能用于泄漏一個系統或對系統進行未經授權的訪問。在一個 Linux 或 UNIX 系統上,這些私有和公共密鑰對存儲在 ASCII 文本系統中;在 Windows 系統上,一些程序將密鑰對存儲為文本文件,一些存儲在 Windows 注冊表中。
通過一個 SSH Protocol 2 配置可創建使用多個私有密鑰的多重鑒定。讓我們看看如何在一個典型的 Linux 主機上生成、設置和配置一個 SSH 私有和公共密鑰對(參見?圖 5)。
圖 5. 在 SSH 定義的架構模型中定義的 SSH 公私密鑰對事務圖
配置公私 SSH 密鑰對的步驟
步驟 1 中所示的示例(參見?清單 1)為用戶 fsmythe 使用?ssh-keygen?使用程序,通過?dsa?的?type?創建 SSH 公私密鑰對。
清單 1. 生成 SSH 密鑰對
[fsmythe@example.com?~]$?/usr/bin/ssh-keygen?-t?dsa Generating?public/private?dsa?key?pair. Enter?file?in?which?to?save?the?key?(/home/fsmythe/.ssh/id_dsa): Enter?passphrase?(empty?for?no?passphrase):?******????(Enter?'mypassword') Enter?same?passphrase?again:?****** (Enter?'mypassword') Your?identification?has?been?saved?in?/home/fsmythe/.ssh/id_dsa. Your?public?key?has?been?saved?in?/home/fsmythe/.ssh/id_dsa.pub. The?key?fingerprint?is: 33:af:35:cd:58:9c:11:91:0f:4a:0c:3a:d8:1f:0e:e6?fsmythe@example.com [fsmythe@example.com?~]$步驟 2 中所示的示例(清單 2) 展示如何將密鑰對的公共密鑰從源主機復制到目標主機的 authorized_keys 文件,該文件位于目標主機上預期用戶帳戶的主目錄下的 .ssh 子目錄內。
清單 2. 將公共密鑰從源主機復制到目標主機上的 authorized_keys 文件
[fsmythe@example.com?~]$?scp?-p?/home/fsmythe/.ssh/id_dsa.pub? fsmythe@thor01.com:/home/fsmythe/.ssh/authorized_keys fsmythe@?thor01.com's?password: id_dsa.pub???????100%?? 624??? 0.6KB/s???? 00:00步驟 3 中所示的示例(參見?清單 3)發出第一次遠程 SSH 調用(ls -d /tmp)到目標服務器,從而緩存您的服務器的 .ssh/known_hosts 文件內的密鑰。您可以輸入與在創建 SSH 公私密鑰對時同樣的口令,且在遠程目標服務器上運行的命令的輸出可在您本地的源服務器上看到。
清單 3. 通過在目標遠程主機上運行遠程命令來驗證 SSH 訪問
[fsmythe@example.com?~]$?ssh?root@thor01.com?ls?-d?/tmp The?authenticity?of?host?'thor01.com?(10.12.53.118)'?can't?be?established. RSA?key?fingerprint?is?84:4f:e5:99:0b:7d:54:d0:1b:3e:2b:96:02:34:41:25. Are?you?sure?you?want?to?continue?connecting?(yes/no)??yes Warning:?Permanently?added?'thor01.com,10.12.53.118'?(RSA)?to?the?list?of?known?hosts. Enter?passphrase?for?key?'/root/.ssh/id_dsa':?******??(Enter?'mypassword')? /tmp file1.txt file2.txt dir3_5432注意:對于上述示例,您不必輸入用戶 fsmythe 的密碼。不過您可以輸入您在第一步中設置的口令。如果您選擇在訪問遠程目標時不輸入口令,那么在提示輸入口令時輸入步驟 1 中的?enter?來創建一個空口令。現在,您不必輸入任何內容來作為用戶 fsmythe 訪問 thor01.com 遠程目標機器。
配置和使用 ssh-agent
對于拒絕創建無密碼 SSH 公私密鑰對的真正的偏執狂來說,有一個?ssh-agent?實用程序。簡言之,您使用?ssh-agent?實用程序來暫時在無口令集的公私密鑰對配置上授予無密碼的 SSH 訪問,但僅針對當前 shell 會話。在運用?ssh-agent?實用程序之前,像往常一樣輸入口令:
[root@example01.com?~]#?ssh?root@example02.com Enter?passphrase?for?key?'/root/.ssh/id_dsa':****** (User?must?type?password) Last?login:?Sat?May??8?06:37:26?2010?from?10.12.53.118接下來,查詢?ssh-agent?以在標準輸出中生成 Bourne shell 命令:
[root@example01.com?~]#?ssh-agent?-s SSH_AUTH_SOCK=/tmp/ssh-vxZIxF1845/agent.1845;?export?SSH_AUTH_SOCK; SSH_AGENT_PID=1849;?export?SSH_AGENT_PID; echo?Agent?pid?1849;在步驟 3 中,在當前 shell 會話中設置前述的環境變量:
[root@example01?~]#?SSH_AUTH_SOCK=/tmp/ssh-vxZIxF1845/agent.1845;export?SSH_AUTH_SOCK SSH_AGENT_PID=1849;?export?SSH_AGENT_PID;echo?Agent?pid?1849 Agent?pid?1849然后,確認?ssh-agent?在運行:
[root@example01.com?~]#?ps?-fp?$SSH_AGENT_PID UID????????PID??PPID??C?STIME?TTY??????????TIME?CMD root??????1849?????1??0?06:14??????????00:00:00?ssh-agent?-s現在,在運行的?ssh-agent?內列出當前加載的身份:
[root@example01.com?~]#?ssh-add?-l The?agent?has?no?identities.在步驟 6 中,添加所需的 SSH 身份(使用該 SSH 密鑰的正確口令對其進行預先驗證):
[root@example01.com?~]#?ssh-add Enter?passphrase?for?/root/.ssh/id_dsa: Identity?added:?/root/.ssh/id_dsa?(/root/.ssh/id_dsa) ******?(Entered?'mypassword')現在,您可以確認將這些身份加載到運行的?ssh-agent?中:
[root@example01.com?~]#?ssh-add?-l 1024?33:af:35:cd:58:9c:11:91:0f:4a:0c:3a:d8:1f:0e:e6?/root/.ssh/id_dsa?(DSA)最后,使用 SSH 命令語法測試?ssh-agent。注意,現在有一個口令提示:
#?Assuming?target?remote?host?has?correct?authorized?key?for?private?key?from?example01 [root@example01.com?~]#?ssh?-A?root@example02.com Last?login:?Sat?May??8?06:36:27?2010?from?10.12.53.118 [root@example02?~]##?Assuming?target?remote?host?has?correct?authorized?key?for?private?key?from?example03 [root@example01.com?~]#?ssh?-A?root@example03.com Last?login:?Sat?May??8?07:04:05?2010?from?10.12.53.119 [root@example03?~]#在使用?ssh-add?命令輸入口令時,您實際上是在解密私有密鑰然后通過代理將其放到內存中,用于將來使用該口令的 SSH 連接。注意,您可以輸入多個私有密鑰并使用?ssh-add?命令預先驗證它們。
清單 4?中所示的 SSH 工具?ssh-keyscan?允許您從多個遠程 SSH 主機收集公共 SSH 主機密鑰。該工具有助于構建 /etc/ssh_known_hosts 文件且異常快速有效。它主要適用于用于自動化用途的 shell 腳本。
清單 4. 使用 ssh-keyscan 的示例
[root@example01?~]#?/usr/bin/ssh-keyscan?-t?rsa,dsa?example02.com #?example02.comSSH-2.0-OpenSSH_4.3 example02.comssh-dss?AAAAB3NzaC1kc3MAAACBALd5/TGn7jCL1DWWzYMw96jw3QOZGBXJgP4m9LACViyM0QHs ewHGo841JdInfE825mVe0nB/UT15iylLOsI/jFCac+ljQRlO+h2q7WOwGveOUN7TxyKlejM+G1pg5DndGt05iYn+2 dDfn5CmEsI+K0F2vk/+mpoSOk9HKq9VgwNzAAAAFQDPeLAth62TRUcN/nTYoqENBmW3SwAAAIEAryoKa+VaG5LQNj wBujAuA7hGl+DIWVb1aZ8xAHkcyL5XgrOWEKNnK9mDmEN66oMLfTMO3w8/OvbJUmcXcU3jnL3zguz2E2OIv6t6vAa F6niL7A/VhxGGxy4CJZnceufStrzZ3UKXRzjwlm0Bwu/LruVF2m3XLvR5XVwUgyWvw+AAAACAaK12k3uC/OOokBgi eu/SuD5wCSBsf9rqG9ZFa32ujZwRZmA/AwPrZd6q3ASxmjtMp6zGQSzxPczUvLH9D9WIJo713bw8wCPo/7pqiQNRs OZXqlQyaXyrDout6CI683b1/rxsZKPrJpFNehrZwjWrwpYhK7VaTuzxvWtrDyDxWec= #?example03.comSSH-2.0-OpenSSH_4.3 example03.comssh-rsa?AAAAB3NzaC1yc2EAAAABIwAAAQEAq5So5VBeH4gPX1A1VEeQkGsb/miiWsWnNTW8ZWYj 2IvU7rKpk/dBIp64WecYYYgDqTK5u0Q+yTijF8wEEI9rRyoh9p5QraM8qy9NxcHzyGqU4vSzfVrblIQrDI8iv7iwz 7PxQAY76NmweaUyGEDfIErty4gCn/ksy85IgffATa9nt36a4iUhiDNifnE8dm1ZrKkvz3lIg0w+Cu0T9MY77AqLWj Moo0WoQArIvYa0soS3VhzgD/Biwu/sh3eHJtFUxTVxnATdkWkHKUI1wxma3j7jF0saTRKEQSvG6492W+U1FhEjFGN r7KeZXH99uFpuUWFA7xO7uaG/MLWSjPJMxw== #?example04.comSSH-2.0-OpenSSH_4.3 example04.comssh-dss?AAAAB3NzaC1kc3MAAACBALd5/TGn7jCL1DWWzYMw96jw3QOZGBXJgP4m9LACViyM0QHs ewHGo841JdInfE825mVe0nB/UT15iylLOsI/jFCac+ljQRlO+h2q7WOwGveOUN7TxyKlejM+G1pg5DndGt05iYn+2 dDfn5CmEsI+K0F2vk/+mpoSOk9HKq9VgwNzAAAAFQDPeLAth62TRUcN/nTYoqENBmW3SwAAAIEAryoKa+VaG5LQNj wBujAuA7hGl+DIWVb1aZ8xAHkcyL5XgrOWEKNnK9mDmEN66oMLfTMO3w8/OvbJUmcXcU3jnL3zguz2E2OIv6t6vAa F6niL7A/VhxGGxy4CJZnceufStrzZ3UKXRzjwlm0Bwu/LruVF2m3XLvR5XVwUgyWvw+AAAACAaK12k3uC/OOokBgi eu/SuD5wCSBsf9rqG9ZFa32ujZwRZmA/AwPrZd6q3ASxmjtMp6zGQSzxPczUvLH9D9WIJo713bw8wCPo/7pqiQNRs OZXqlQyaXyrDout6CI683b1/rxsZKPrJpFNehrZwjWrwpYhK7VaTuzxvWtrDyDxWec= #?example05.comSSH-2.0-OpenSSH_4.3 example05.comssh-rsa?AAAAB3NzaC1yc2EAAAABIwAAAQEAq5So5VBeH4gPX1A1VEeQkGsb/miiWsWnNTW8ZWYj 2IvU7rKpk/dBIp64WecYYYgDqTK5u0Q+yTijF8wEEI9rRyoh9p5QraM8qy9NxcHzyGqU4vSzfVrblIQrDI8iv7iwz 7PxQAY76NmweaUyGEDfIErty4gCn/ksy85IgffATa9nt36a4iUhiDNifnE8dm1ZrKkvz3lIg0w+Cu0T9MY77AqLWj Moo0WoQArIvYa0soS3VhzgD/Biwu/sh3eHJtFUxTVxnATdkWkHKUI1wxma3j7jF0saTRKEQSvG6492W+U1FhEjFGN r7KeZXH99uFpuUWFA7xO7uaG/MLWSjPJMxw==回頁首
使用 UNIX 應用程序或腳本配置 SSH
配置供遠程 shell 腳本使用的 SSH 訪問以及用于維護、遠程備份和存檔系統的遠程工具非常有用,但一旦涉及到服務器安全性,它一直都是一個有極大爭議的主題。用戶可能希望運行的很多 shell 腳本,比如:
$?ssh?fsmythe@example.com?/usr/local/bin/dangerous_script.pl不能處理提示其進行身份驗證的一個必需的 SSH 口令,但除非提前配置一個無密碼的公私 SSH 密鑰對、一個?ssh-agent?配置或一個可信的主機網絡機制 — 不提示輸入 SSH 密鑰的配置 —,否則這不太可能。這是因為 SSH 期待來自與該 shell 會話相關的當前終端的口令。通過使用一個預期腳本或 Perl(參見?CPAN Module Net::SSH::Perl)腳本(或您的 shell 腳本可以選擇性地調用上述腳本類型中的一種)用戶可以解決該問題:
#!/usr/local/bin/expect spawn?sftp?$argv expect?"password:" send?"mysshpassowrd\r"向一般用戶授予一個無密碼的 SSH 機制來訪問遠程主機在一些系統管理員的眼里已相當不可想象。然而,擁護無密碼 SSH 機制訪問遠程主機的其他安全措施,比如遠程主機上的用戶僅提供一個受限的 korn shell (rksh) 帳戶或受限的 shell (rssh) 而非一個完全的 bash 或 Bourne shell 帳戶。一個授權密鑰也可以將用戶限制為列表中命令的一個子集,因此實際上,用戶僅可以使用運程運行所需的確切命令,沒有可能發生進一步訪問或會損壞系統的一個意外命令運行。清單 5?中提供的 SSH 限制示例提供這樣一個限制類型。
清單 5. 限制遠程主機上 authorized_keys 文件的配置示例
[fsmythe@example02?.ssh]$?more?authorized_keys command="/usr/local/bin/secureScript.sh",no-port-forwarding,no-X11-forwarding,no-agent-fo rwarding,no-pty?ssh-dss?AAAAB3NzaC1kc3MAAACBAOFsC6C7cJUGOZG4Ur9W0J6mxTTk5+MYTu5XfRESPLVwQ A7HlUxhsXsxgmb1L1RgvR/g0JZnipDS+fGOrN2/IerSpgyzegTVxYLPrOovvuyCn5TA0+rmyrkV27so6yRDkdqTJc YzWNJOyDndnTrDc/LNmqLFKoGMQ33aur6RNv4VAAAAFQD4leC5Fc1VJqjvXCNsvazBhi84vQAAAIAWbshT80cTESg dX/srxX4KVNAzY1uhBz5V0UYR4FGP+aoe6laxRj+gQvFIvAKIrpikvBjgyW6cdT8+k0t8HGIQp20MzSBdY9sH8xdj 05AG97Nb/L8xzkceB78qfXhV6txaM1CzssUtiOtaAygrywNPBDEN9MbEbwpVVVyd6iqZNgAAAIAmV0SUZoUr8dHdC tagRye4bGOQjoztpb4C0RbXQw+w7Jpzr6cZISdZsK4DTBjODvv2+/OWPm7NEzzWyLzHPBNul8hAHOUCOpp+mYWbXX F78BTk2Ess0SZu8dwpOtasTNEp+xPcsOvQx2Kdr17gTp+28SfpREuLudOr6R3KeTb+hw==?fsmythe@example01主機 example01 上的用戶 fsmythe 僅允許執行本例中的命令?="/usr/local/bin/secureScript.sh。
回頁首
使用 SSH 創建一個可信的主機環境
最后,我要提一下作為一種替代方案來設置公私 SSH 密鑰對的可信主機環境。對于自動化或在有必要進行這些類型的調用的一個腳本環境中,雖然可信主機環境仍然承擔一些安全風險,但它優于公私密鑰對場景。一個可信主機環境或可信主機身份驗證主要依賴于列出獲準訪問的用戶和主機組合的預配置文件。有兩種可信主機身份驗證。較老(比如針對 OpenSSH 和 SSH1)和較弱的使用明文協議命令(rsh、rcp?和?rlogin);檢查兩個文件;并在 sshd_config 文件中設置一個關鍵字:
/etc/hosts.equiv ~/.rhostsSSH Protocol 2 不支持該方法。相反,對于更安全的可信主機網絡,在 /etc/ssh/sshd_config 文件(接受主機名或 IP 地址)中進行如下更改,并配置 shosts.equiv 和/或 .shosts 文件:
/etc/shosts.equiv ~/.shosts要在 /etc/ssh/sshd_config 文件中為 SSH Protocol 2 啟用一個可信主機環境,使用:
PermitEmptyPasswords?yes AllowSHosts?remoteclient.com DenySHosts例如,如果您在服務器 example.com 上且按如下方式配置了您的 /etc/shosts.equiv 文件:
+remoteclient.com?fsmythe +secureserver.net?sallyh +192.168.100.12?fsmythe -hackers.org?james您將允許用戶 fsmythe 從遠程源 remoteclient.com,192.168.100.12,和 secureserver.net 進行可信主機身份驗證,允許用戶從 secureserver.net 進行訪問,拒絕來自遠程源 hackers.org 的用戶 james 的訪問。
可信主機身份驗證和公私 SSH 密鑰對身份驗證方法是類似的,在很大程度上實現相同的結果。表 1?提供對兩種身份驗證方法的并排比較。
表 1. 公私 SSH 密鑰對與可信主機環境之比較
| 根據 IP 地址進行身份驗證 | 是 | 是 |
| 根據主機名進行身份驗證 | 是 | 是 |
| 使用其他公鑰功能 | 否 | 是 |
| 根據遠程用戶名進行身份驗證 | 是 | 否 |
| 允許主機名和 IP 地址中有通配符 | 否 | 是 |
| 口令是登錄訪問所必需的 | 否 | 否 |
| IP 地址或主機名變更消息 | 有時 | 是 |
| 服務器和客戶端需要的配置 | 否 | 是 |
| 對自動化任務或腳本化需求有用 | 是 | 是 |
對那些目前嘲笑在網絡上使用無密碼遠程 SSH 訪問來支持可信主機身份驗證這一想法的那些管理員,在使用腳本實現遠程 SSH 功能時考慮公私密鑰對的缺點:
如果一個服務器主機名或 IP 地址改變,公私密鑰對配置會由于緩存的已知主機而破壞。需要在 .ssh/known_hosts 文件中刪除舊條目,且 SSH 遠程主機名和/或 IP 地址被再次緩存。這會破壞依賴于公私密鑰對的腳本。
公私密鑰對身份驗證同時需要客戶端和服務器配置。如果一個 SSH 公鑰改變或重新生成密鑰對,所有遠程主機將在其 authorized_keys 文件中需要新的公共密鑰。
如果 .ssh/ 文件夾的權限或私有或公共密鑰文件本省改變,它會阻止無 SSH 密碼的訪問發生。要禁用嚴格的文件和目錄權限檢查,在 /etc/ssh/sshd_config 文件內將關鍵字?StrictModes?設置為?no。
一旦生成密鑰對,沒有集中方式來撤銷密鑰,或確切地知道該密鑰已向誰分發。
回頁首
結束語
SSH 是一個強大而安全的網絡實用程序,全球有無數用戶使用它來完成各種任務。作為 telnet 和?r*?系列命令等明文協議的一個安全替代方案,擁有可免費分發的 SSH 客戶端和服務器的多個產品,SSH 是很難被擊敗的。在許多網絡中被廣泛用于腳本化技術內的大量遠程監控、系統維護、遠程系統審計、報告和自動化,SSH 似乎已被普遍接受并將繼續不斷演化。
回頁首
下載
| putty-0.60-installer.exe | 1.7MB |
| FileZilla_3.3.2.1_win32-setup.exe | 4.0MB |
| teraterm-4.65.exe | 7.5MB |
| winscp427setup.exe | 2.9MB |
| SoftonicDownloader11694.exe | 251KB |
參考資料?
學習
Secure Shell。Wikipedia 提供了對 SSH 的精彩介紹和討論。
OpenSSH:OpenSSH 是 Internet 技術用戶依賴的一個連通性工具版本。可免費獲取。
RFC 4251:閱讀 SSH 協議架構。
The OpenSSH Protocol under the Hood(Girish Venkatachalam,Linux Journal,2007 年 4 月):在 OpenSSH 上獲取 “基本事實細節”。
Server clinic: Connect securely with ssh(Cameron Laird,developerWorks,2003 年 7 月):了解使用 SSH 保護服務器的更多信息。
SSH and?ssh-agent:了解更多并從 Symantec 下載工具。
SSH public keys:更多了解使用公共密鑰的風險。
SSH tutorial for Linux:Suso.com 提供在 Linux 環境中開始使用 SSH 的一本好教程。
Five SSH tricks:探究您必須知道的 5 個 SSH 技巧。
Top 20 OpenSSH Server Best Security Practices:探究這些服務器最佳安全實踐。
AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的信息,您可以利用它們來擴展自己的 UNIX 技能。
AIX and UNIX 新手入門:訪問“AIX and UNIX 新手入門”頁面可了解更多關于 AIX 和 UNIX 的內容。
AIX and UNIX 專題匯總:AIX and UNIX 專區已經為您推出了很多的技術專題,為您總結了很多熱門的知識點。我們在后面還會繼續推出很多相關的熱門專題給您,為了方便您的訪問,我們在這里為您把本專區的所有專題進行匯總,讓您更方便的找到您需要的內容。
AIX and UNIX 下載中心:在這里你可以下載到可以運行在 AIX 或者是 UNIX 系統上的 IBM 服務器軟件以及工具,讓您可以提前免費試用他們的強大功能。
IBM Systems Magazine for AIX 中文版:本雜志的內容更加關注于趨勢和企業級架構應用方面的內容,同時對于新興的技術、產品、應用方式等也有很深入的探討。IBM Systems Magazine 的內容都是由十分資深的業內人士撰寫的,包括 IBM 的合作伙伴、IBM 的主機工程師以及高級管理人員。所以,從這些內容中,您可以了解到更高層次的應用理念,讓您在選擇和應用 IBM 系統時有一個更好的認識。
技術書店:閱讀關于這些和其他技術主題的圖書。
討論
SSH user community:加入 SSH 社區。
加入?developerWorks 中文社區。查看開發人員推動的博客、論壇、組和維基,并與其他 developerWorks 用戶交流。
參與 AIX and UNIX 論壇:
AIX 論壇
AIX for Developers 論壇
集群系統管理
性能工具論壇
虛擬化論壇
更多?AIX and UNIX 論壇
轉載于:https://blog.51cto.com/h2appy/1690456
總結
以上是生活随笔為你收集整理的SSH 安全性和配置入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins+svn搭建
- 下一篇: 用 Celery 实现邮件推送系统