SSH安全性和配置入門

餘二五發表於2017-11-15

您是否是需要能夠以儘可能最安全的方式通過網路進行通訊的一個新 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 協議會話未加密。

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

常用縮略詞

  • API:應用程式程式設計介面

  • FTP:檔案傳輸協議

  • IETF:網際網路工程任務組

  • POSIX:UNIX 可移植作業系統介面

  • RFC:請求註解

  • VPN:虛擬專用網路

在使用 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
  • 埠轉發或埠隧道化(不要與 VPN 混淆):

    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
"

向一般使用者授予一個無密碼的 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 系統時有一個更好的認識。

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

本文轉自 h2appy  51CTO部落格,原文連結:http://blog.51cto.com/h2appy/1690456,如需轉載請自行聯絡原作者


相關文章