【轉】SSH 協議與OpenSSH詳解

轉自http://www.open-open.com/lib/view/open1422417444048.html

1. ssh概述

ssh是(Secure SHell protocol) 的簡寫,安全外殼協議(SSH)是一種在不安全網絡上提供安全遠程登錄及其它安全網絡服務的協議。

2. ssh 主要功能

  • 一個就是類似 telnet 的遠程聯機使用 shell 的服務器,即 ssh

  • 另一個就是類似 FTP 服務的 sftp-server ,提供更安全的 FTP 服務

3. ssh 工作原理

SSH 協議與OpenSSH詳解

  • 服務器建立公鑰: 每一次啓動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的文件,若系統剛剛安裝完成時,由於沒有這些公鑰,因此 sshd 會主動去計算出這些需要的公鑰,同時也會計算出服務器自己需要的私鑰

  • 客戶端主動聯機請求: 若客戶端想要聯機到 ssh 服務器,則需要使用適當的客戶端程序來聯機,包括 ssh, putty 等客戶端程序連接

  • 服務器傳送公鑰給客戶端: 接收到客戶端的要求後,服務器便將第一個步驟取得的公鑰傳送給客戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的)

  • 客戶端記錄並比對服務器的公鑰數據及隨機計算自己的公私鑰: 若客戶端第一次連接到此服務器,則會將服務器的公鑰記錄到客戶端的用戶家目錄內的 ~/.ssh/known_hosts 。若是已經記錄過該服務器的公鑰,則客戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰, 則開始計算客戶端自己的公私鑰

  • 回傳客戶端的公鑰到服務器端: 用戶將自己的公鑰傳送給服務器。此時服務器:具有服務器的私鑰與客戶端的公鑰,而客戶端則是: 具有服務器的公鑰以及客戶端自己的私鑰,你會看到,在此次聯機的服務器與客戶端的密鑰系統 (公鑰+私鑰) 並不一樣,所以才稱爲非對稱加密系統

  • 開始雙向加解密: (1)服務器到客戶端:服務器傳送數據時,拿用戶的公鑰加密後送出。客戶端接收後,用自己的私鑰解密 (2)客戶端到服務器:客戶端傳送數據時,拿服務器的公鑰加密後送出。服務器接收後,用服務器的私鑰解密,這樣就能保證通信安全

4. ssh 組成

(1). ssh 協議使用的是tcp 22號端口,telnet 使用的是tcp 的23號端口,ssh協議是C/S架構,分爲服務器端與客戶端。

(2). 服務器端的程序有 sshd

客戶端的程序有,Windows下 putty,SecureCRT,SSHSSH Secure Shell Client …… Linux下有,ssh

5. ssh 工具實現

OpenSSH 包括sshd主程序與ssh客戶端

6. sshd 配置文件詳解

vim /etc/ssh/sshd_config

#1. SSH Server 全局設定,port ,協議 ……

  • # Port 22  #默認端口,也可以使用多個端口

  • Protocol 2 #協議版本號

  • # ListenAddress 0.0.0.0 #默認值是監聽所有接口的 SSH 要求

  • # PidFile /var/run/sshd.pid #放置 SSHD 這個 PID 的文件

  • # LoginGraceTime 2m #2分鐘之內不輸入密碼,自動斷開

  • # Compression delayed  #使用壓縮數據模式進行傳輸,登入後纔將數據壓縮 (delayed)

#2. 主要私有Key 存放文件

  • # HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私鑰

  • # HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私鑰

  • # HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私鑰

#3. 關於登錄文件的數據與daemon的名稱

  • SyslogFacility AUTHPRIV #記錄日誌/var/log/secure

  • # LogLevel INFO #日誌等級

#4. 安全設置

  • # PermitRootLogin yes #是否允許 root 登入

  • # StrictModes yes #是否讓 sshd 去檢查用戶家目錄或相關文件的權限數據

  • # PubkeyAuthentication yes #使用密鑰登錄系統

  • # AuthorizedKeysFile .ssh/authorized_keys #用戶登錄公鑰存放位置

  • PasswordAuthentication yes #登錄密碼認證

  • # PermitEmptyPasswords no #否允許以空的密碼登入

  • # RhostsAuthentication no #系統不使用 .rhosts認證

  • # IgnoreRhosts yes #是否取消使用 ~/.ssh/.rhosts 來做爲認證

  • # RhostsRSAAuthentication no #專門給 version 1 用的,使用 rhosts 文件在 /etc/hosts.equiv

  • # HostbasedAuthentication no #上面的項目類似,不過是給 version 2 使用的

  • # IgnoreUserKnownHosts no #是否忽略家目錄內的 ~/.ssh/known_hosts

  • ChallengeResponseAuthentication no #允許任何的密碼認證

  • UsePAM yes #利用 PAM 管理使用者認證,可以記錄與管理

#5. 登錄後項目

  • # PrintMotd yes #登入後是否顯示出一些信息

  • # PrintLastLog yes #顯示上次登入的信息

  • # TCPKeepAlive yes #當達成聯機後,服務器會一直傳送 TCP 封包給客戶端以判斷對方式否一直存在聯機

  • UsePrivilegeSeparation yes #是否權限較低的程序來提供用戶操作

  • MaxStartups 10 #同時允許幾個尚未登入的聯機畫面

  • DenyUsers * #設定受阻止的使用者名稱

  • DenyUsers test  #阻止用戶

  • DenyGroups test #阻止組

#6. SFTP 設定

  • Subsystem sftp /usr/lib/ssh/sftp-server

  • # UseDNS yes #爲了要判斷客戶端來源是正常合法的,因此會使用 DNS 去反查客戶端的主機名,不過在內網這項目設定爲 no 會讓聯機達成速度比較快


7. sftp 講解  


(1). 使用方式:sftp root@localhost

(2). sftp 支持的命令

針對遠程服務器主機 (Server) 的行爲

  • 變換目錄到 /etc/test 或其他目錄        
    cd /etc/test         
    cd PATH

  • 列出目前所在目錄下的文件名        
    ls         
    dir

  • 建立目錄        
    mkdir directory

  • 刪除目錄        
    rmdir directory

  • 顯示目前所在的目錄        
    pwd

  • 更改文件或目錄羣組        
    chgrp groupname PATH

  • 更改文件或目錄擁有者        
    chown username PATH

  • 更改文件或目錄的權限        
    chmod 644 PATH         
    其中,644 與權限有關

  • 建立鏈接文件        
    ln oldname newname

  • 刪除文件或目錄        
    rm PATH

  • 更改文件或目錄名稱        
    rename oldname newname

  • 離開遠程主機        
    exit (or) bye (or) quit

  • 針對本機 (Client) 的行爲(都加上 l, L 的小寫 )

  • 變換目錄到本機的 PATH 當中        
    lcd PATH

  • 列出目前本機所在目錄下的文件名        
    lls

  • 在本機建立目錄        
    lmkdir

  • 顯示目前所在的本機目錄        
    lpwd

  • 針對資料上傳/下載的操作

  • 將文件由本機上傳到遠程主機 put [本機目錄或文件] [遠程]        
    put [本機目錄或文件]         
    如果是這種格式,則文件會放置到目前遠程主機的目錄下

  • 將文件由遠程主機下載回來 get [遠程主機目錄或文件] [本機]        
    get [遠程主機目錄或文件]         
    若是這種格式,則文件會放置在目前本機所在的目錄當中!可以使用通配符,例如:         
    get *         
    get *.rpm


8. 遠程文件直接複製 scp

1
2
scp [-pr] [-l 速率] file [賬號@]主機:目錄名  #上傳
scp [-pr] [-l 速率] [賬號@]主機:file 目錄名  #下載

選項與參數:

1
2
3
-p :保留原來文件的權限數據
-r :複製來源爲目錄時,可以複製整個目錄 (含子目錄)
-l :可以限制傳輸的速度,單位爲 Kbits/s ,例如 [-l 800] 代表傳輸速限 100Kbytes/s

案例:

1
2
scp /etc/hosts* root @127.0.0.1 :~ #上傳
scp [email protected]:/etc/bashrc /tmp #下載


9. ssh的認證方式

基於口令的認證:這個就不用說了,就是輸入用戶名和密碼

基於密鑰的認證,具體步驟如下

(1).客戶端建立兩把鑰匙(公鑰與私鑰)

1
2
3
4
5
6
ssh-keygen [-t rsa|dsa] #可選 rsa 或 dsa
[root@localhost ~]# ssh-keygen #默認算法
[root@localhost ~]# ls -l .ssh/  
total 8   
-rw------- 1 root root 1675 May 27 03:05 id_rsa   
-rw-r--r-- 1 root root  408 May 27 03:05 id_rsa.pub

(2).將公鑰數據上傳到服務器上

scp ~/.ssh/id_rsa.pub [email protected]:~ #上傳到 root 的家目錄底下即可

(3).將公鑰放置服務器端的正確目錄與文件名(scp 或 ssh-copy-id)

方法一 scp

  • 建立 ~/.ssh 文件,注意權限需要爲 700

  • mkdir .ssh ; chmod 700 .ssh #權限設定中,務必是 700 且屬於使用者本人的賬號與羣組纔行

  • 將公鑰內的數據使用 cat 轉存到 authorized_keys 內

  • cat id_rsa.pub >> .ssh/authorized_keys

  • chmod 644 .ssh/authorized_keys #這個檔案的權限設定中,就得要是 644 纔可以

方法二 ssh-copy-id

命令格式:ssh-copy-id –i /path/to/pubkey USERNAME@ERMOTE_HOST

案例:

ssh-copy-id –i .ssh/id_rsa.pub [email protected]

10. sshd 管理細則

  • 密碼應該經常換且足夠複雜

  • 非默認端口登錄

  • 限制登錄用戶地址

  • 禁止管理員直接登錄

  • 僅允許有限制用戶登錄

  • 使用基於密鑰的認證禁止使用版本1

    • 禁止使用版本1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章