您是不是須要可以以儘量最安全的方式經過網絡進行通訊的一個新 UNIX 管理員?重溫基礎知識、學習 SSH 的複雜細節,並深刻研究 SSH 的高級功能,以安全地自動化您的平常系統維護、遠程系統管理,並使用高級腳本管理多個主機。html
什麼是 SSH?基本描述
linux
Secure Shell (SSH) 的目的在於在經過網絡遠程訪問另外一個主機時提供最大的保護。它經過提供更好的身份驗證工具和 Secure Copy (SCP)、Secure File Transfer Protocol (SFTP)、X 會話轉發和端口轉發等功能來加密網絡交換,從而增長其餘非安全協議的安全性。有各類類型的加密可用,從 512 位加密到高達 32768 位加密,包括密碼,好比 Blowfish、Triple DES、CAST-12八、Advanced Encryption Scheme (AES) 和 ARCFOUR。更高位的加密配置以使用更高的網絡帶寬爲代價。圖 1 和 圖 2 展現如何使用一個像 Wireshark 這樣的網絡嗅探程序輕鬆讓任何人隨意查看 telnet 會話。算法
API:應用程序編程接口shell
FTP:文件傳輸協議apache
IETF:互聯網工程任務組編程
POSIX:UNIX 可移植操做系統接口緩存
RFC:請求註解安全
×××:虛擬專用網絡bash
在使用 telnet 這樣的不安全 「明文」 協議時,網絡上的任何人均可以竊取您的密碼和其餘敏感信息。圖 1 展現用戶 fsmythe 經過一個 telnet 鏈接登陸到一個遠程主機。他輸入其用戶名 fsmythe 和密碼 r@m$20!0,同一網絡上的任何其餘用戶均可以看到,將其看做是倒黴、沒有戒心的 telnet 用戶。服務器
圖 2 提供了對典型 SSH 會話的概覽,並展現了加密的協議如何不被同一網段的任何其餘用戶看到。如今每一個主流 Linux 和 UNIX 版本都附帶有默認安裝的 SSH 包 — 一般是開源 OpenSSH 包—,所以有點須要下載和從源碼進行編譯。若是您不在一個 Linux 或 UNIX 平臺上,有大量開源和基於 SSH 的免費軟件工具可用,它們大受追捧並廣爲應用,好比 WinSCP、Putty、FileZilla、TTSSH 和 Cygwin(安裝在 Windows 操做系統之上的 POSIX 軟件)。這些工具在 Windows 平臺上提供一個 UNIX 或 Linux 式的 shell 接口。
無論您的操做系統是什麼,SSH 都爲老生常談的平常計算操做提供許多實際效益。它不只可靠、安全和靈活,並且易於安裝、使用和配置 — 並且獨具特點。
IETF RFC 4251 到 4256 將 SSH 定義爲 「經由一個不安全網絡進行遠程登陸和其餘安全網絡服務的安全 shell 協議」。shell 由三個主要元素組成(參見 圖 3):
傳輸層協議:該協議提供服務器身份驗證、隱私和具備完美轉發隱私的完整性。該層能夠提供可選壓縮且經過一個 TCP/IP 鏈接運行,可是也可用於任何其餘可靠的數據流之上。
用戶認證協議:該協議從服務器到客戶端進行身份驗證,且經過傳輸層運行。
鏈接協議:該協議多路傳輸加密隧道到多個邏輯通道,經過用戶認證協議運行。
傳輸層負責密鑰交換和服務器身份驗證。它設置加密、完整性驗證和(可選)壓縮並向上層公開一個用於發送和接收純文本數據包的 API。用戶認證層提供客戶端身份驗證以及多種驗證方法。常見的身份驗證方法包括密碼、公鑰、鍵盤交互、GSSAPI、SecureID 和 PAM。
鏈接層定義通道、全局請求和藉以提供 SSH 服務的通道請求。單個 SSH 鏈接能夠並行承載多個通道,每一個均可雙方向傳輸數據。通道請求轉送信息,好比服務器端流程的退出代碼。SSH 客戶端發起一個轉發服務器端端口的請求。
這種開發式架構設計提供普遍的靈活性。傳輸層可媲美傳輸層安全(Transport Layer Security,TLS),並且您能夠運用定製的身份驗證方法來擴展用戶認證層。經過鏈接層,您能夠多道傳輸二級會話到單個 SSH 鏈接(參見 圖 4)。
您一般使用 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.txt sent 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.com
X11 轉發配置與帶 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 安全性:
將 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 yes
sshd_config 文件內的 AllowedAuthentications
和 RequiredAuthentications
決定哪些身份驗證方法和配置僅用於 SSH Protocol 2,且它們支持密碼和公鑰身份驗證的語法以下:
# vi /etc/ssh/sshd_config AllowedAuthentications publickey, password RequiredAuthentications publickey, password
爲了幫助驗證身份,SSH 有一個密鑰管理功能和相關的代理。當配置爲公鑰身份驗證時,您的密鑰證實您在遠程 SSH 主機上的身份。一個基於 SSH 的身份包括兩個部分:一個公鑰和一個私鑰。私有 SSH 密鑰是用於出站 SSH 鏈接的用戶身份,且應當保密。當用戶發起一個 SSH 或 SCP 會話到遠程主機或服務器時,他或她被認爲是 SSH 客戶端。經過一個數學算法,一個私鑰如同您的電子***;公鑰如同您向其出示***的鎖或門機制。您的私鑰說,「這真的是 Fred Smythe」;公鑰說,「是的,您確實是真正的 Fred Smythe;您已經過身份驗證:請進入。」
您的公鑰表明您容許經過您的大門或鎖進入的人。公鑰須要保密;它們不能用於泄漏一個系統或對系統進行未經受權的訪問。在一個 Linux 或 UNIX 系統上,這些私有和公共密鑰對存儲在 ASCII 文本系統中;在 Windows 系統上,一些程序將密鑰對存儲爲文本文件,一些存儲在 Windows 註冊表中。
經過一個 SSH Protocol 2 配置可建立使用多個私有密鑰的多重鑑定。讓咱們看看如何在一個典型的 Linux 主機上生成、設置和配置一個 SSH 私有和公共密鑰對(參見 圖 5)。
步驟 1 中所示的示例(參見 清單 1)爲用戶 fsmythe 使用 ssh-keygen
使用程序,經過 dsa
的 type
建立 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 子目錄內。
[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 公私密鑰對時一樣的口令,且在遠程目標服務器上運行的命令的輸出可在您本地的源服務器上看到。
[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 公私密鑰對的真正的偏執狂來講,有一個 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 腳本。
[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==
配置供遠程 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 限制示例提供這樣一個限制類型。
[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 密鑰對的可信主機環境。對於自動化或在有必要進行這些類型的調用的一個腳本環境中,雖然可信主機環境仍然承擔一些安全風險,但它優於公私密鑰對場景。一個可信主機環境或可信主機身份驗證主要依賴於列出獲准訪問的用戶和主機組合的預配置文件。有兩種可信主機身份驗證。較老(好比針對 OpenSSH 和 SSH1)和較弱的使用明文協議命令(rsh
、rcp
和 rlogin
);檢查兩個文件;並在 sshd_config 文件中設置一個關鍵字:
/etc/hosts.equiv ~/.rhosts
SSH 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 提供對兩種身份驗證方法的並排比較。
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 Windows SSH 客戶端安裝程序 | putty-0.60-installer.exe | 1.7MB |
FileZilla Windows SSH 安裝程序 | FileZilla_3.3.2.1_win32-setup.exe | 4.0MB |
Tera Term Windows SSH 安裝程序 | teraterm-4.65.exe | 7.5MB |
WinSCP 安裝包 | winscp427setup.exe | 2.9MB |
Cygwin Universal Downloader | 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 論壇: