SSH 安全性和配置入門

您是不是須要可以以儘量最安全的方式經過網絡進行通訊的一個新 UNIX 管理員?重溫基礎知識、學習 SSH 的複雜細節,並深刻研究 SSH 的高級功能,以安全地自動化您的平常系統維護、遠程系統管理,並使用高級腳本管理多個主機。html

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 會話。算法

圖 1. Telnet 協議會話未加密。

展現 telnet 協議會話未加密的圖解

經常使用縮略詞

  • API:應用程序編程接口shell

  • FTP:文件傳輸協議apache

  • IETF:互聯網工程任務組編程

  • POSIX:UNIX 可移植操做系統接口緩存

  • RFC:請求註解安全

  • ×××:虛擬專用網絡bash

在使用 telnet 這樣的不安全 「明文」 協議時,網絡上的任何人均可以竊取您的密碼和其餘敏感信息。圖 1 展現用戶 fsmythe 經過一個 telnet 鏈接登陸到一個遠程主機。他輸入其用戶名 fsmythe 和密碼 r@m$20!0,同一網絡上的任何其餘用戶均可以看到,將其看做是倒黴、沒有戒心的 telnet 用戶。服務器

圖 2. SSH 協議會話加密。

展現 SSH 協議會話加密的圖解

圖 2 提供了對典型 SSH 會話的概覽,並展現了加密的協議如何不被同一網段的任何其餘用戶看到。如今每一個主流 Linux 和 UNIX 版本都附帶有默認安裝的 SSH 包 — 一般是開源 OpenSSH 包—,所以有點須要下載和從源碼進行編譯。若是您不在一個 Linux 或 UNIX 平臺上,有大量開源和基於 SSH 的免費軟件工具可用,它們大受追捧並廣爲應用,好比 WinSCPPuttyFileZillaTTSSH 和 Cygwin(安裝在 Windows 操做系統之上的 POSIX 軟件)。這些工具在 Windows 平臺上提供一個 UNIX 或 Linux 式的 shell 接口。

無論您的操做系統是什麼,SSH 都爲老生常談的平常計算操做提供許多實際效益。它不只可靠、安全和靈活,並且易於安裝、使用和配置 — 並且獨具特點。

SSH 架構

IETF RFC 4251 到 4256 將 SSH 定義爲 「經由一個不安全網絡進行遠程登陸和其餘安全網絡服務的安全 shell 協議」。shell 由三個主要元素組成(參見 圖 3):

  • 傳輸層協議:該協議提供服務器身份驗證、隱私和具備完美轉發隱私的完整性。該層能夠提供可選壓縮且經過一個 TCP/IP 鏈接運行,可是也可用於任何其餘可靠的數據流之上。

  • 用戶認證協議:該協議從服務器到客戶端進行身份驗證,且經過傳輸層運行。

  • 鏈接協議:該協議多路傳輸加密隧道到多個邏輯通道,經過用戶認證協議運行。

圖 3. SSH 協議邏輯層

SSH 協議邏輯層

傳輸層負責密鑰交換和服務器身份驗證。它設置加密、完整性驗證和(可選)壓縮並向上層公開一個用於發送和接收純文本數據包的 API。用戶認證層提供客戶端身份驗證以及多種驗證方法。常見的身份驗證方法包括密碼、公鑰、鍵盤交互、GSSAPI、SecureID 和 PAM。

鏈接層定義通道、全局請求和藉以提供 SSH 服務的通道請求。單個 SSH 鏈接能夠並行承載多個通道,每一個均可雙方向傳輸數據。通道請求轉送信息,好比服務器端流程的退出代碼。SSH 客戶端發起一個轉發服務器端端口的請求。

這種開發式架構設計提供普遍的靈活性。傳輸層可媲美傳輸層安全(Transport Layer Security,TLS),並且您能夠運用定製的身份驗證方法來擴展用戶認證層。經過鏈接層,您能夠多道傳輸二級會話到單個 SSH 鏈接(參見 圖 4)。

圖 4. 7 層 OSI 模型內的 SSH

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.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 安全性和遠程主機安全性方法,下面有一系列流程和配置可用於增強有關遠程主機訪問的 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
  • 使用一個日誌分析器,好比 logcheckloggrepsplunk 或 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 鏈接的用戶身份,且應當保密。當用戶發起一個 SSH 或 SCP 會話到遠程主機或服務器時,他或她被認爲是 SSH 客戶端。經過一個數學算法,一個私鑰如同您的電子***;公鑰如同您向其出示***的鎖或門機制。您的私鑰說,「這真的是 Fred Smythe」;公鑰說,「是的,您確實是真正的 Fred Smythe;您已經過身份驗證:請進入。」

您的公鑰表明您容許經過您的大門或鎖進入的人。公鑰須要保密;它們不能用於泄漏一個系統或對系統進行未經受權的訪問。在一個 Linux 或 UNIX 系統上,這些私有和公共密鑰對存儲在 ASCII 文本系統中;在 Windows 系統上,一些程序將密鑰對存儲爲文本文件,一些存儲在 Windows 註冊表中。

經過一個 SSH Protocol 2 配置可建立使用多個私有密鑰的多重鑑定。讓咱們看看如何在一個典型的 Linux 主機上生成、設置和配置一個 SSH 私有和公共密鑰對(參見 圖 5)。

圖 5. 在 SSH 定義的架構模型中定義的 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)和較弱的使用明文協議命令(rshrcp 和 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 提供對兩種身份驗證方法的並排比較。

表 1. 公私 SSH 密鑰對與可信主機環境之比較
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 系統時有一個更好的認識。

  • 技術書店:閱讀關於這些和其餘技術主題的圖書。

討論

相關文章
相關標籤/搜索