1. 程式人生 > >ssh服務以及分發公鑰

ssh服務以及分發公鑰

驗證 file chattr 改名 開始 被攻擊 界面 運行 火墻

第1章 ssh
SSH(22端口)是Secure Shell Protocol的簡寫,安裝時的軟件包是openssh,有ssh 1,和ssh 2兩個版本
-t 指定加密類型rsa1是版本1,rsa,dsa,ecdsa是版本2
SSH先對聯機數據包通過加密技術進行加密處理,加密後在進行數據傳輸。確保了傳遞的數據安全
telnet(23端口)實現遠程控制管理,但是不對數據進行加密,默認不支持root用戶登錄

1.1 ssh簡介
ssh在進行數據傳輸之前,先對聯機數據包通過加密技術進行加密處理,加密後再進行數據傳輸,確保傳輸安全
ssh是專為遠程登錄會話和其他網絡服務提供的安全性協議(例如rsync),利用ssh協議可以有效的防止遠程管理過程中的信息泄露問題,,企業普遍使用ssh協議替代傳統不安全的遠程聯機,例如telnet

1.1.1 安裝ssh
默認已安裝,一般將兩個都安裝
客戶端連接服務端後生成一個其他進程,和原本的ssh進程沒有關系
主要有兩個進程或多個
/usr/sbin/sshd 此進程對客戶端第一次連接ssh服務端有影響
sshd: root@pts/0 一但連接成功,是否可以始終保持連接由次進程決定
1.1.1.1 客戶端
[root@backup ~]# rpm -qf which ssh
openssh-clients-5.3p1-122.el6.x86_64
1.1.1.2 服務端
[root@backup ~]# rpm -qf which sshd
openssh-server-5.3p1-122.el6.x86_64
1.1.2 兩個功能
SSH服務主要提供兩個服務功能

  1. 一是提供類似telnet遠程聯機服務器的服務,即上面提到的SSH服務;
    ? 02. 另一個是類似FTP服務的sftp-server,借助SSH協議來傳輸數據的,
    提供更安全的SFTP服務(vsftp,proftp)。
    1.1.3 ssh的兩個版本
    sshv1與sshv2版本比較:
    v1版本鑰匙和鎖頭默認不會變化,數據傳輸不安全
    v2版本鑰匙和鎖頭會經常變化,數據傳輸更安全

1.1.4 工作原理
服務端ssh是一個守護進程,在後臺運行並響應其他客戶端的連接請求.服務端ssh服務的進程名為sshd,實時
監聽其他客戶端的連接請求,並進行處理,一般包括公共秘鑰認證,密鑰交換,對稱密鑰加密和非安全連接等.

客戶端命令包括ssh以及scp,scp(遠程拷貝),slogin(遠程登錄),sftp(安全ftp文件傳輸)這些命令

1.2 ssh加密原理
利用了公鑰和私鑰認證機制,實現數據加密和解密,客戶端創建一對密鑰向服務端發送公鑰(需要輸入密碼),本
地保留私鑰,連接時驗證密鑰即可,公鑰在網絡中傳輸,私鑰保存在本地
分為dsa和rsa兩種
ssh_host_dsa_key 私鑰
ssh_host_dsa_key.pub 公鑰
ssh_host_rsa_key 私鑰
ssh_host_rsa_key.pub 公鑰
ssh_keyscan 172.16.1.41 查看指定主機的公鑰
ssh_keyscan -t dsa 172.16.1.41 查看指定主機的指定dsa格式公鑰

1.2.1 公鑰私鑰算法
1.x 建立連接時,向客戶端發送公鑰,客戶端如果用私鑰破開,回應服務端消息,建立連接。黑客也會收到公鑰,會模仿客戶端私鑰,打開服務端的公鑰建立連接
2.x 前邊的步驟和1.x大致相似,但是服務端公鑰會定時更換,並通知客戶端,防止黑客偽造私鑰

1.3 ssh排錯流程

1.4 ssh認證方法
1.4.1 基於口令驗證

1.4.2 基於密鑰的安全驗證
需要依靠密鑰,也就是必須事先建立一對密鑰對,然後把公用密鑰(Publiic key)放在需要訪問的目標服務器上,
另外,還需要把私有密鑰(private key)放在ssh的客戶端或對應的客戶端服務器上
私鑰不能在網絡中傳輸--私鑰可以解密公鑰
公鑰可以在網絡中傳輸--公鑰不能解密私鑰
此時,如果想要連接到這個帶有公用密鑰的ssh服務器,客戶端ssh軟件或者客戶端服務器會向ssh服務器發出請求,請求用聯機的用戶密鑰進行安全驗證.ssh服務器收到請求之後,會先在該ssh服務器上連接的用戶的家目錄下尋找事先放上去的對應用戶的公用密鑰,然後把它和連接的ssh客戶端發送過來的公用密鑰進行比較.如果兩個密鑰一致,ssh服務器就用公用密鑰加密"質詢"(challenge)並把它發送給ssh客戶端,客戶端使用存放在本地的私鑰,解密質詢,將解密後的質詢發送給服務器,ssh服務器驗證質詢,確認無誤後建立連接

1.4.2.1 簡單過程
基於秘鑰的認證(實現免密碼管理)
①. 在管理端創建出秘鑰對(創建兩個信物)
②. 管理端將公鑰(鎖頭)傳輸給被管理端,鎖頭傳輸給被管理端要基於密碼方式認證
③. 管理端向被管理端發出建立連接請求,並發送公鑰
④. 被管理端發出公鑰質詢
⑤. 管理端利用私鑰解密公鑰,進行公鑰質詢響應
⑥. 被管理端接收到質詢響應,確認基於秘鑰認證成功

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

  1. 客戶端主動聯機要求: 若客戶端想要聯機到 ssh 服務器,則需要使用適當的客戶端程序來聯機,包括 ssh、xshell 等客戶端程序;
  2. 服務器傳送公鑰檔給客戶端: 接收到客戶端的要求後,服務器便將第一個步驟取得的公鑰檔案傳送給客戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的!);
  3. 客戶端記錄/比對服務器的公鑰數據及隨機計算自己的公私鑰: 若客戶端第一次連接到此服務器,則會將服務器的公鑰數據記錄到客戶端的用戶家目錄內的 ~/.ssh/known_hosts 。若是已經記錄過該服務器的公鑰數據,則客戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰數據, 則開始計算客戶端自己的公私鑰數據;
  4. 回傳客戶端的公鑰數據到服務器端: 用戶將自己的公鑰傳送給服務器。此時服務器:『具有服務器的私鑰與客戶端的公鑰』,而客戶端則是: 『具有服務器的公鑰以及客戶端自己的私鑰』,你會看到,在此次聯機的服務器與客戶端的密鑰系統 (公鑰+私鑰) 並不一樣,所以才稱為非對稱式密鑰系統喔。

  5. 開始雙向加解密:
    (1)服務器到客戶端:服務器傳送數據時,拿用戶的公鑰加密後送出。客戶端接收後,用自己的私鑰解密;
    (2)客戶端到服務器:客戶端傳送數據時,拿服務器的公鑰加密後送出。服務器接收後,用服務器的私鑰解密。

在上述的第 4 步驟中,客戶端的密鑰是隨機運算產生於本次聯機當中的,所以你這次的聯機與下次的聯機的密鑰可能就會不一樣啦! 此外在客戶端的用戶家目錄下的 ~/.ssh/known_hosts 會記錄曾經聯機過的主機的 public key ,用以確認我們是連接上正確的那部服務器。
1.4.3 基於秘鑰認證配置部署過程
1.4.3.1 管理服務器上創建秘鑰對

默認保存在
[root@web01 ~]# ll /root/.ssh/
total 16
-rw------- 1 root root 1964 Jan 29 19:50 authorized_keys 其他主機分發的公鑰,腳本規定更改名字
-rw------- 1 root root 1671 Jan 29 12:31 id_rsa 私鑰,本地保存
-rw-r--r-- 1 root root 392 Jan 29 12:31 id_rsa.pub 公鑰,發送給服務端
-rw-r--r-- 1 root root 1178 Jan 29 12:24 known_hosts 連接哪臺主機就保存哪臺主機的公鑰
1.4.3.2 分發公鑰給被管理端
-i 表示指定要分發的公鑰文件
腳本中的過程是先遠程登錄到其他主機,在指定目錄下存放公鑰的過程

1.4.3.3 基於秘鑰登錄測試
ssh [email protected]
可以直接在登錄後加命令,以被登錄的主機執行這個命令,不用登錄到遠程主機,直接在遠程主機上執行命令
例如:
ssh [email protected] hostname -i
172.16.1.41
這就是批量管理主機
1.4.3.4 受控端默認端口不是22
受控端默認端口不是22,如何分發公鑰

  1. 實現批量部署ssh+key環境時遇到的問題
    1. 創建秘鑰對時需要進行交互,輸入回車
      需要交互確認的信息:
      1)需要確認私鑰保存路徑
      -f filename
      Specifies the filename of the key file.
      指定私鑰文件保存路徑信息參數
      ssh-keygen -t rsa -f /root/.ssh/id_rsa

2)需要確認私鑰密碼信息
-N new_passphrase
Provides the new passphrase.
-P passphrase
Provides the (old) passphrase.

ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ""
  1. 分發公鑰時,需要輸入yes和密碼信息
    vim /usr/bin/ssh-copy-id
    ssh -p52113 $1 "exec sh -c ‘cd; umask 077; test -d .ssh || mkdir .ssh ;
    cat >> .ssh/authorized_keys &&
    (test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)‘"

1)exec sh -c --- 在腳本中臨時設置環境變量信息
2)cd --- 切換到當前用戶家目錄
3)umask 077 --- 設置臨時的umask值
4)test -d .ssh || mkdir .ssh --- 判斷當前用戶家目錄是否存在.ssh目錄,如果不存在就進行創建
5)cat >> .ssh/authorized_keys && ...省略...
將當前主機秘鑰對中公鑰信息復制到遠程主機上,在遠程主機接收到公鑰信息後,
將信息保存到.ssh/authorized_keys

說明:遠程登錄到相應主機上, 將公鑰信息保存到遠程主機相應用戶家目錄中的.ssh/authorized_keys
  並將authorized_keys權限設置為600

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.31

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "172.16.1.7 -p52113"

1.4.4 認證代理服務
1.4.4.1 啟動代理服務
eval ssh-agent -s
1.4.4.2 向agent代理服務註冊本地服務器私鑰信息
ssh-add
1.4.4.3 發送憑證
ssh -A 172.16.1.31 -A發送憑證 -A 可以遞歸賦予權限

1.4.5 免交互分發

1.4.5.1 ssh-keygen創建密鑰對
rm -f /root/.ssh/id_dsa* 先刪除這個目錄下的公鑰和私鑰,防止出現覆蓋的交互式信息
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
-t 指定加密類型
-f 指定密鑰存放位置
-P 指定舊的密鑰的密碼,可以定向為空 或者使用-N (指定新的密鑰密碼,效果相同)
-q不顯示輸出信息
放在腳本中

1.4.5.2 批量分發公鑰
需要有yes/no的交互,去掉這個交互
ssh-copy-id -i /root/.ssh/id_dsapub "-o StrictHostKeyChecking=no [email protected]"
-i指定要發送的公鑰 -o 後加...忽略yes/no的交互
也可以直接在客戶端(管理端)配置文件/etc/ssh/ssh_config當中將StrictHostKeyChecking=no改成這樣

第一次分發公鑰時需要輸入密碼
yum install -y sshpass
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsapub "-o StrictHostKeyChecking=no [email protected]"
sshpass 指定了登錄密碼
1.4.5.3 完整腳本
#mk key
rm -f /root/.ssh/id*
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
#fenfa key
for ip in 7
do
echo "fenfa host 172.16.1.$ip" >/dev/null
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no [email protected].$ip" >/dev/null
done

1.4.5.4 實現批量管理

#!/bin/bash

CMD=$1

for ip in 7 8 31
do
echo "info hosts 172.16.1.$CMD"
ssh 172.16.1.$ip "$CMD"
done
1.5 ssh配置文件
可以man sshd_config查看詳細介紹
1.5.1 ssh命令和目錄
加密軟件
1.5.1.1 客戶端
openssh-clients
/etc/ssh/ssh_config --- ssh客戶端配置文件
/usr/bin/.ssh.hmac --- ssh服務的算法文件
/usr/bin/scp --- 基於ssh協議,實現遠程拷貝數據命令
/usr/bin/sftp --- 基於ssh協議,實現數據傳輸密命令
/usr/bin/slogin --- 遠程登錄主機連接命令 ssh登錄不能用也可以用這個
/usr/bin/ssh --- 遠程登錄主機連接命令
/usr/bin/ssh-add --- 此參數必須和ssh-agent命令結合使用,將秘鑰信息註冊到ssh-agent代理服務中
/usr/bin/ssh-agent --- 啟動ssh認證代理服務命令
/usr/bin/ssh-copy-id --- 遠程分發公鑰命令
/usr/bin/ssh-keyscan --- 顯示本地主機上默認的ssh公鑰信息
1.5.1.2 服務端
openssh:
openssh-server
/etc/rc.d/init.d/sshd --- ssh服務端啟動腳本命令
/etc/ssh/sshd_config --- ssh服務端配置文件
/usr/sbin/sshd --- 啟動ssh服務進程命令

1.5.1.3 修改服務端配置文件

1.5.1.4 設置監聽地址
監聽地址要麽是全部監聽,要麽是本地網卡的其中之一

1.5.1.5 scp
不同主機之間相互復制
例如:scp -rp /etc/hosts 10.0.0.31:/tmp

1.5.1.6 sftp
sftp -oPort=52113 [email protected] --- 實現ftp協議中控制鏈路建立
-oPort=52113 --- 指定連接ssh服務端口
sftp> --- 進入到ftp控制命令行中
bye --- Quit sftp 退出ftp控制界面命令
ls --- 顯示出sftp服務端文件或目錄數據信息
lls --- 顯示出sftp客戶端(本地)文件或目錄數據信息
pwd --- 檢查當前登錄到sftp服務端之後,所在路徑信息
lpwd --- 檢查當前登錄到sftp服務端之後,客戶端所在路徑信息

get             --- 從ftp服務端下載數據
put             --- 從ftp客戶端上傳數據
mget            --- 批量下載數據
mput            --- 批量上傳數據

1.5.2 防止被攻擊
如何防止SSH登錄入侵小結:
1、用密鑰登錄,不用密碼登陸(課後作業)。
2、牤牛陣法:解決SSH安全問題
a.防火墻封閉SSH,指定源IP限制(局域網、信任公網)
b.開啟SSH只監聽本地內網IP(ListenAddress 172.16.1.61)。
3、盡量不給服務器外網IP
4、最小化(軟件安裝-授權)
5、給系統的重要文件或命令做一個指紋

  1. 給他鎖上 chattr +i +a

1.5.3 抓包內容
1.5.3.1 三次握手

1.5.3.2 四次揮手

1.5.4 linux抓包命令
tcpdump -i eth0 -nn -c 5 "port 53"
-i ---指定抓取哪一個網卡上產生數據包流量
--nn ---抓取數據包中端口信息以數字方式顯示
-c ---表示抓取的數據包數量
"port 53" --- 雙引號裏面表示搜索數據包的條件
-w ---將抓取數據保存到指定文件中
-r ---對保存的數據包文件進行讀取
1.5.5 ssh知識要點總結
SSH是安全的加密協議,用於遠程連接linux服務器。
? SSH默認端口是22,安全協議版本SSHv2,除了2之外還有SSHv1(有漏洞)。
? SSH服務端主要包含兩個服務功能SSH遠程連接和SFTP服務。
? Linux SSH客戶端包含ssh遠程連接命令,以及遠程拷貝scp命令等。
1.6 配置telnet遠程連接服務
第一個裏程碑:安裝telnet服務軟件
yum install -y telnet telnet-server

第二個裏程碑:配置telnet服務可以被xinetd服務管理
vim /etc/xinetd.d/telnet
disable         = no

第三個裏程碑:啟動xinetd服務
/etc/init.d/xinetd start
netstat -lntup|grep 23
tcp        0      0 :::23          :::*               LISTEN      2427/xinetd

1.6.1 安裝telnet服務軟件
yum install telnet telnet-server
把telnet的客戶端和服務端軟件都安裝
1.6.2 配置xinetd服務目錄中的telnet文件
讓telnet服務允許被xinetd服務管理,將disable =yes修改為disable =no
1.6.3 抓取文件包

ssh服務以及分發公鑰