2,393 瀏覽數

SSH(Secure SHell)

SSH (Secure SHell)
Step 0 : 前言
Step 1 : 套件需求
Step 2 : 安裝
Step 3 : SSH 的 Client 端
Step 4 : 設定與使用 RSA 與 DSA 認證
Step 5 : SSH 的設定檔
Step 6 : 安全性的設定
Step 7 : 錯誤訊息

Step 0 : 前言

SSH 主要是用來取代 Telnet 這種以明碼為傳遞基礎的遠端登入服務,在使用 SSH 之前先來說說 OpenSSH 是如何建立安全連線的機制.

建立連線(目前 SSH 有兩種版本的連線模式)

  • SSH protocol version 1:
    首先 client 與 server 會交換公開主機金鑰(OpenSSH 在安裝時會產生一支用 RSA 加密方式產生 768-bit 的主機金鑰).如果 client 機器以前沒見過這個公開金鑰.則會詢問是否接受這個未被信任的金鑰,情況如: client 第一次登入 SSH server.

    [root@benjr ~]# ssh 10.6.101.42
    The authenticity of host ’10.6.101.42 (10.6.101.42)’ can’t be established.
    RSA key fingerprint is 36:cb:6c:82:9e:08:c4:a3:2d:f7:f7:39:54:d0:e2:19.
    Are you sure you want to continue connecting (yes/no)?
    

    選擇 yes 則表示 client 接受 server 的公開主機金鑰並且存放在使用者家目錄 .ssh/known_hosts 下.下一次就不會再詢問了

    [root@benjr ~]# cat /home/user/.ssh/known_hosts
    10.6.101.42 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAtsyWn1GIeACVJnPe0l7x5X8+4l+IjvV7p+kJ4G81cZIg6K23Wh
    Q2+eOi73YPajRqQCVcOhKAVL+Ql37vegQycYLi24/mMavV4Gcldk2UKhhbe8mW5WLe34HYB66jvw
    8R5g+e3zpZmlgHvodSoNLyhLSke38cct4tTlfxaIrQMqc=
    

    然後會使用這把公開主機金鑰來協調出一隻 session 金鑰 (在 Client 接受這個 768-bit 的公開主機金鑰之後,Client 自己也會隨機產生一支 256-bit 的私鑰,並且以加密的方式將公開主機金鑰與私鑰整合成一支完整的 Key,並且將這支 Key 也傳送給 server ),用來將所有後續的 session 資料都使用這支 session 金鑰作為 3DES(Triple-DES),blowfish 或 IDEA 等對稱加密(symmetric encryption)的鑰匙來加密.由於 Client 端每次的 256-bit 的 Key 是隨機取得的,所以你這次的連線與下次的連線的 Key 就不會一樣.

  • SSH protocol version 2:

    與 version 1 不同的是,在 version 2 當中將不再產生公開主機金鑰了,所以,當 Client 端連線到 Server 端時,兩者將藉由 Diffie-Hellman key(非對稱式加密的一種) 的演算方式來產生一個分享的 Key ,之後兩者將藉由類似 Blowfish(對稱式加密的一種) 的演算方式進行同步解密的動作!

    每一個 sshd 都提供這兩個版本的連線,而決定這兩種模式連線的,就必需要在 client 端連線時選擇連線的模式才能確認。目前預設情況下,會自動使用 version 2 的連線模式喔!而由於我們的連線資料中,經過了這個 Public 與 Private Key 的加密、解密動作,所以在中間的傳送過程中,當然就比較安全的多

  • note:

    1. Asymmetric Encryption (非對稱式加密 ) 方式如下:
      • 接收端
        會產生兩把鑰匙 (Public/Private Key), Public Key(P:公開金鑰 ) 會發佈給其他人來使用,而 Private Key (S:私有金鑰) 則自己保存
      • 傳送端
        傳送端會使用 (P) 將資訊 M 來加密, 並將經過加密的資料 P(M) 傳送出去
      • 接收端
        接收端就可以用私鑰來解密 M=S(P(M))
    2. Client 是如何將 “session 金鑰 (對稱加密 symmetric encryption)" 傳送至 Server (對稱加密使用同一把鑰匙加解密,再網路上傳送時有可能被擷取),方法就是使用非對稱式加密的方式來傳送,其資料就是 session 金鑰.
    3. 為何不使用主機金鑰或使用者金鑰來加密,第一因為非對稱加密的演算法很消耗 CPU 的資源,第二 session 金鑰是為了特定的 session (使用者每次建立的連線) 而建立的,當 session 關閉後就不會再用了.對入侵者而言 session 金鑰所需功夫較多(因為每位使用者 session 金鑰皆不同)

    使用者身份認證
    Server 預設是會嘗試使用 RSA(SSH V.1) 或 DSA(SSH V.2) 憑證(金鑰對,非對稱式加密)來對客戶端來做驗證,如果使用者擁有 server 認可的憑證,使用者需輸入憑證的祕密金鑰通行碼,如果成功 SSH client 與 Server 會使用憑證來完成 challenge-response 驗證.
    如果 RSA/DSA 驗證失敗,或一開始就沒有客戶端憑證,則遠端伺服器會提示使用者輸入正確的標準 Unix 使用者名稱/密碼組合.要記住客戶端與伺服器間已經建立了加密的 session 因此使用者名稱 / 密碼的組合,雖然比憑證為基礎的驗證容易破壞,但至少在傳送之前加密過了(session 金鑰).

    詳細步驟如下(以 DSA 認證做說明):
    1.SSH 會檢查你的 $HOME/.ssh 目錄下,看看你是否擁有秘密金鑰(名稱 id_dsa)
    2.如果金鑰存在,SSH 會提示你輸入此金鑰的通行證,接下來會使用這金鑰來建立簽章,再與你的公開金鑰傳給遠端伺服器.
    3.伺服器會檢查公開金要是否為允許的金鑰(合法的使用者,會存在 $HOME/.ssh/authorized_key2 檔案中)
    4.如果金鑰驗證無誤,伺服器還會去驗證簽章是用這金鑰所建立的.
    5.如果成功,伺服器會允許 session 進行下去.
    6.如果 RSA/DSA 驗證失敗,或一開始就沒有客戶端憑證,則遠端伺服器會提示使用者輸入正確的標準 Unix 使用者名稱/密碼組合

    note:
    簽章的建立
    它主要用在身份的確認,其方法類似 Asymmetric Encryption 會使用兩把公與私鑰 (Public/Private Key), Private key 會當成加密用, Public key 就會當解密用
    所以它的運作方式不同於 Asymmetric Encryption
    .傳送端
    產生兩把鑰匙 (Public/Private Key), Public Key(P) 會發佈給其他人來使用,而 Private Key (S) 則自己保存.
    傳送端使用自己產生的 Private key (S) 將資訊 M 來加密, 並將經過加密的資料 S(M) 傳送出去
    .接收端
    接收端就可以用傳送者的公鑰來解密 M=P(S(M))
    這種方式的接收者可以確定傳送者,但傳送者無法得知接收者是否由其他人冒充.所以產生下面這種方法.
    DSA (Digital Signature Algorithm) 除了簽章並加上 Detached Signatures(數字簽證演算法),傳送者會先用 SHA將資料產生 fingerprint 並傳送給接收者,接收只就可以依據此一 fingerprint 來判斷資料是否召到修改.

    Step 1 : 套件需求

    openssh-*
    openssl-*
    因為 Openssh 使用 Openssl 的加解密的函式庫(Open SSL 使用非對稱式加密 ).

    Step 2 : 安裝

    [root@benjr ~]# rpm -ivh openssl-<VERSION>
    [root@benjr ~]# rpm -ivh openssh-<VERSION>
    

    開啟 SSH 的服務

    [root@benjr ~]# chkconfig shhd on
    [root@benjr ~]# service sshd start
    

    Step 3 : SSH 的 Client 端

    不用修改 SSH server ,Clients 端一開始就可以使用了
    Linux 客戶端:
    在 Linux 客戶端方面,我們主要以 ssh 進行一般連線

    [root@benjr ~]# ssh 10.6.101.42
    The authenticity of host ’10.6.101.42 (10.6.101.42)’ can’t be established.
    RSA key fingerprint is 36:cb:6c:82:9e:08:c4:a3:2d:f7:f7:39:54:d0:e2:19.
    Are you sure you want to continue connecting (yes/no)?yes
    Warning: Permanently added ’10.6.101.42′ (RSA) to the list of known hosts.
    user2@10.6.101.42′s password:
    

    選擇 yes 則表示 client 接受 server 的公開主機金鑰,因為我們沒有建立使用者金鑰,伺服器會提示使用者輸入正確的標準 Unix 使用者密碼..

    Windows 客戶端:
    在 Linux 底下已經有 ssh 了,那麼如果在 Windows 底下呢?該怎麼辦,這個可以直接使用 putty(只要 putty.exe 這支程式就夠了) 這種類型的連線軟體呢,他也是免費的軟體喔!取得的方式可以參考底下的網站:
    http://sourceforge.net/projects/leputty

    直接在 Windows 底下執行,執行的圖示有點像底下這樣
    putty01
    這樣就可以連上你的 SSH Server 了

    Step 4 : 設定與使用 RSA 與 DSA 認證

    SSH 可以使用 Public Key 來比對資料,而不需輸入密碼.實作上的步驟如下 :
    Client 端
    1. 首先,先在 Client 上面建立 Public Key 跟 Private Key 這兩把鑰匙,利用的指令為 ssh-keygen 這個命令:

    [root@benjr ~]# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/user/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/user/.ssh/id_rsa.
    Your public key has been saved in /home/user/.ssh/id_rsa.pub.
    The key fingerprint is:
    f6:25:06:d6:bf:88:d5:34:26:46:c3:62:8e:98:38:fe user@sit-lab
    

    上面產生的 key 為 RSA ,你也可以指定為 DSA ,產生的 key 存在 $HOME/.ssh 中(id_rsa 為私鑰, id_rsa.pub 為公鑰),passphrase 主要是保護私鑰(你需要一串密碼來解開私鑰),你也可以不設.
    2. 再來,將 Private Key 放在 Client 上面的家目錄,亦即 $HOME/.ssh/ ,並且修改許可權為僅有該 User 可讀的狀態: 預設產生的 key 就是放在使用者家目錄 $HOME/.ssh/ ,所以這裡並不需要修改任何東西.
    3. 最後,將那把 Public Key 放在任何一個你想要用來登入的主機的 Server 端的某 User 的家目錄內之

    [root@benjr ~]# scp id_rsa.pub 10.6.101.42:/home/user/.ssh
    user@10.6.101.42′s password:
    id_rsa.pub 100% 223 2.5MB/s 00:00
    

    server 端
    匯入剛才 client 端產生的公鑰至 $HOME/.ssh/ 裏面的認證檔案 authorized_keys2 即可完成

    [root@benjr ~]# cd ~/.ssh
    [root@benjr ~]# cat id_dsa.pub >> authorized_keys2
    

    下次登入就不需要使用者帳號密碼了,但是如果你有設定私鑰的 passphrase 這時還是需要私鑰的密碼.

    Step 5 : SSH 的設定檔

    [root@benjr ~]# vi /etc/ssh/sshd_config
    

    請參考鳥哥的網站 http://linux.vbird.org/linux_server/0310telnetssh.php#ssh_sshdconfig

    Step 6 : 安全性的設定

    SSH 雖然是比較安全的,但是沒有人能保證 SSH 就不會有漏洞,所以你還是能使用些防護機制來保護你的 SSH.根據 網路存取安全機制 這一篇.防護機制可以包括以下兩個.
    1.防火牆 (iptables) :
    由於 ssh 這個服務是開啟在 port 22 ,所以你可以使用 ipchains 或 iptables 來開放一些你允許的 IP 以 port 22 的進入!
    2.TCP Wrappers:
    SSH 引用 libwrap.a library,則會受到 TcpWrapper ( /etc/host.allow , /etc/host.deny) 的控管的控管. 關於 TCP Wrapper 請參考下列的網頁 TCP Wrapper

    Step 7 : 錯誤訊息

    使用 SSH 常見的錯誤訊息.

    [root@benjr ~]# scp -r msgs 192.8.1.1:/root
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that the RSA host key has just been changed.
    The fingerprint for the RSA key sent by the remote host is
    85:65:da:e4:9d:02:76:50:a8:3e:31:f9:df:8a:8e:62.
    Please contact your system administrator.
    Add correct host key in /root/.ssh/known_hosts to get rid of this message.
    Offending key in /root/.ssh/known_hosts:1
    RSA host key for 192.8.1.1 has changed and you have requested strict checking.
    Host key verification failed.
    lost connection
    

    只要移除使用者的 known_hosts 即可,如 root 的設定檔位於 /root/.ssh/known_hosts ,不過這樣其他的 SSH 下次登入還要再同意一次,建議只刪除檔案有衝突的部分.

    [root@benjr ~]# rm /root/.ssh/known_hosts
    rm: remove regular file `/root/.ssh/known_hosts’? y
    [root@benjr ~]# scp -r msgs 192.8.1.1:/root
    The authenticity of host ’192.8.1.1 (192.8.1.1)’ can’t be established.
    RSA key fingerprint is 85:65:da:e4:9d:02:76:50:a8:3e:31:f9:df:8a:8e:62.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added ’192.8.1.1′ (RSA) to the list of known hosts.
    root@192.8.1.1′s password:
    

    4 個網友的想法 “SSH(Secure SHell)

    1. 自動參照通知: Networking | Benjr.tw

    2. 自動參照通知: 安全性 | Benjr.tw

    3. 自動參照通知: WSCP – windows Secure copy | Benjr.tw

    4. 自動參照通知: Amazon 雲端服務(二) – EC2 | Benjr.tw

    發表迴響