第一章 ssh簡介
1. ssh含義
SSH服務端是一個守護進程(daemon),它在後臺運行並相應來自客戶端的連接請求。SSH服務端的進程名爲sshd,負責實時監聽遠程SSH客戶端的連接請求,並進行處理,一般包括公共密鑰認證、密鑰交換、對稱密碼加密和非安全連接等。這個SSH服務就是我們前面基礎系統優化中保留開機自啓動的服務之一。
SSH客戶端包含ssh以及像scp(遠程拷貝)、slogin(遠程登錄)、sftp(安全FTP文件傳輸)等應用程序。
ssh工作機制大致是本地的ssh客戶端先發送一個連接請求到遠程的ssh服務端,服務端檢查連接的客戶端發送的數據包和IP地址,如果確認合法,就會發送密鑰給SSH的客戶端,此時,客戶端本地再將密鑰發回給服務端,自此連接建立。SSH 1.x和SSH 2.前者爲密碼後者是密鑰
2. 基於口令的安全驗證
基與口令的安全驗證的方式就是大家現在一直在用的,只要知道服務器的SSH連接賬號和口令(當然也要知道對應服務器的IP及開放的SSH端口,默認爲22),就可以通過ssh客戶端登錄到這臺遠程主機。此時,聯機過程中所有傳輸的數據都是加密的。
[root@nfs01 ~]# ssh -p22 [email protected]
root@10.0.0.41's password:
Last login: Fri May 12 11:50:03 2017 from 10.0.0.253
[root@backup ~]# exit
logout
Connection to 10.0.0.41 closed.
[root@nfs01 ~]#
3. 基於密鑰(鑰匙鎖頭)的安全驗證
基於密鑰的安全驗證方式是指,需要依靠密鑰,也就是必須事先建立一堆密鑰對,然後把公用密鑰(鎖頭)放在需要訪問的目標服務器,另外,還需要把私有密鑰(鑰匙)(Private key)放到SSH的客戶端或對應的客戶端服務器上。
SSH客戶端收到質詢之後就可以用自己的私鑰解密,再把它發送給SSH服務器,使用這種方式,需要知道聯機用戶的密鑰文件。與第一種基於口令驗證的方式相比,第二種方式不需要在網絡上傳送口令密碼,所以安全性更高了,這時我們也要注意保護我們的密鑰文件,特別是私鑰文件,一旦被黑客獲取,危險就很大了。
4. SSH配置文件信息
修改SSH服務的運行參數,是通過修改配置文件/etc/ssh/sshd_config實現的。
一般來說SSH服務使用默認的配置已經能夠很好的工作了,如果對安全要求不高,僅僅提供SSH服務的情況,可以不需要修改任何配置。
命令參數 | 參數說明 |
---|---|
Port | 指定sshd進程監聽的端口號,默認爲22。可以使用多條指令監聽多個端口,默認將在本機的所有網絡接口上監聽,但是可以通過ListenAddress指定只在某個特定的接口上進行監聽。 |
PermitEmptyPasswords | 是否允許密碼爲空的用戶遠程登錄。默認爲“no” |
PermitRootLogin | 是否允許root登錄。可用值如下:yes表示允許,NO表示爲禁止。Without-password表示禁止使用密碼認證登錄。Forced-commands-only表示只有在指定了command選項的情況下才允許使用公鑰認證登錄,同時其它認證方法全部被禁止。這個值常用於做遠程備份之類的事情。1.多開一個窗口。2.臨時多部署一條連接方式。3給普通用戶sudo權限。 |
UseDNS | 指定sshd是否應該對遠程主機名進行反向解析,以檢查此主機名是否與其IP地址真是對應。默認值爲yes |
ListenAddress | 指定監聽並提供服務相應的網卡地址信息。 |
5. 鑰匙和鎖頭的使用過程
連接服務的ssh客戶端,創建出密鑰和鎖頭
連接服務的ssh客戶端,將鎖頭髮送給ssh服務端
連接服務的ssh客戶端,發出連接請求
ssh服務端收到連接請求後,會發出質詢信息,你想鏈接我,你能打開我的鎖頭嗎
ssh客戶端利用鑰匙解密了質詢,至此鑰匙和鎖頭就匹配了,將匹配後的結果告知服務器端
ssh服務端認可匹配結果,連接請求建立
第二章 查看端口命令總結
1. ss
[root@nfs01 ~]# ss -lntup |egrep 22
udp UNCONN 0 0 *:57343 *:* users:(("rpc.statd",1223,7))
udp UNCONN 0 0 127.0.0.1:975 *:* users:(("rpc.statd",1223,4))
udp UNCONN 0 0 :::40163 :::* users:(("rpc.statd",1223,9))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",1349,4))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",1349,3))
tcp LISTEN 0 128 *:15735 *:* users:(("rpc.statd",1223,8))
tcp LISTEN 0 128 :::28156 :::* users:(("rpc.statd",1223,10))
2. netstat
[root@nfs01 ~]# netstat -lntup |egrep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1349/sshd
tcp 0 0 0.0.0.0:15735 0.0.0.0:* LISTEN 1223/rpc.statd
tcp 0 0 :::22 :::* LISTEN 1349/sshd
tcp 0 0 :::28156 :::* LISTEN 1223/rpc.statd
udp 0 0 0.0.0.0:57343 0.0.0.0:* 1223/rpc.statd
udp 0 0 127.0.0.1:975 0.0.0.0:* 1223/rpc.statd
3. lsof
[root@nfs01 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1349 root 3u IPv4 11110 0t0 TCP *:ssh (LISTEN)
sshd 1349 root 4u IPv6 11112 0t0 TCP *:ssh (LISTEN)
sshd 2617 root 3r IPv4 19684 0t0 TCP 10.0.0.31:ssh->10.0.0.253:54109 (ESTABLISHED)
4. namp
[root@nfs01 ~]# nmap -p 22 10.0.0.41
Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-12 15:07 CST
Nmap scan report for 10.0.0.41
Host is up (0.00028s latency).
PORT STATE SERVICE
22/tcp open ssh
MAC Address: 00:0C:29:A0:B1:48 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
5. telnet
telnet 10.0.0.41 22
第三章 scp用法
本地nfs客戶端推送到rsync服務端
[root@backup ~]# scp /etc/hosts root@172.16.1.31:/data/
root@172.16.1.31's password:
hosts 100% 321 0.3KB/s 00:00
[root@nfs01 data]# ll
total 4
-rw-r--r-- 1 root root 321 May 12 16:01 hosts
本地nfs客戶端從rsync服務端拉
[root@backup ~]# scp [email protected]:/etc/hosts /tmp/
root@172.16.1.31's password:
hosts 100% 320 0.3KB/s 00:00
第四章 SSH入侵案例說明
- 如何防止SSH登錄入侵小結:
- 用密鑰登錄,不用密碼登錄。
- 牤牛陣法:解決SSH安全問題
- 防火牆封閉,SSH,,指定源IP限制(局域網、信任公網)
- 開啓SSH只監聽本地內網IP(ListenAddress 172.16.1.61)
- 儘量不給服務器外網IP
- 最小化(軟件安裝-授權)
- 給系統的重要文件或命令做一個指紋 md5sum /etc/hosts >/tmp/hosts_finger.txt grep XXX
/tmp/hosts_finger.txt - 給他上鎖chattr +i +a
第五章 ssh+key共享密鑰部署流程說明
1. 生成鑰匙 鎖頭 (密鑰對)
[root@m01 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair. #生成一對dsa類型的祕鑰對(公鑰和私鑰)
Enter file in which to save the key (/root/.ssh/id_dsa): #想要把你的密鑰對放在哪裏 默認即可
Enter passphrase (empty for no passphrase): #給你的鑰匙鎖頭 加上個密碼把。 回車
Enter same passphrase again: #確認
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:
e8:26:51:ba:ed:f0:00:37:a7:3a:ab:ab:34:83:0a:9e root@m01
The key's randomart image is:
+--[ DSA 1024]----+
| |
| |
| . |
| o . |
| . = o S |
|. o O |
|o+ * + |
|= =. B |
|*Eoo o |
+-----------------+
[root@m01 ~]# ll ~/.ssh -d
drwx------ 2 root root 4096 2017-04-18 09:42 /root/.ssh
[root@m01 ~]# ls -l /root/.ssh/
total 12
-rw------- 1 root root 668 Jan 5 16:37 id_dsa ###私鑰 鑰匙
-rw-r--r-- 1 root root 598 Jan 5 16:37 id_dsa.pub ####公鑰 鎖頭
-rw-r--r-- 1 root root 1576 Jan 5 14:58 known_hosts
第六章 公鑰(鎖頭)如何傳遠端端服務端
1. 查看sshd端口
[root@m01 ~]# netstat -lntup |egrep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1192/sshd
tcp 0 0 :::22 :::* LISTEN 1192/sshd
2. 指定公鑰文件發送至服務端IP
[root@ansible01-61 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.111
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.111's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.1.111'"
and check to make sure that only the key(s) you wanted were added.
3. ssh-copy-id是個腳本文件
[root@m01 ~]# file `which ssh-copy-id`
/usr/bin/ssh-copy-id: POSIX shell script text executable
4. 刪除遠端服務器的公鑰文件
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub "-p52113 [email protected]"
說明:根據命令腳本,修改$1傳參信息,從而實現根據ssh不同端口傳送公鑰文件
============================================
#!/bin/bash
until [ $# -eq 0 ]
do
echo $*
shift
done
============================================
5. ssh-copy-id執行過程
ssh $1 "exec sh -c '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)'"
①. 臨時設置了一下umask 077
②. 看目標服務器是否存在 ~/.ssh 目錄
③. 如果目錄不存在,則創建 mkdir ~/.ssh
④. 把id_dsa.pub內容 放到了 ~/.ssh/authorized_keys
authorized_keys文件內容實質上等於id_dsa.pub公鑰文件內容
6. ssh服務如何識別公鑰文件
[root@m01 ~]# vim /etc/ssh/sshd_config
49 #AuthorizedKeysFile .ssh/authorized_keys
說明:利用ssh服務配置文件,識別公鑰文件信息
7. 操作後檢查直接輸入命令
[root@m01 ~]# ssh [email protected] hostname
nfs01
8. ssh服務分發公鑰實質執行過程
- 管理服務器創建私鑰和公鑰(密鑰對)
- 將公鑰文件遠程傳送複製到被管理服務器相應用戶~/.ssh下,並修改.ssh目錄權限爲700
- 修改公鑰文件文件名稱爲authorized_keys,授權權限爲600
- 利用ssh服務配置文件的配置參數,進行識別公鑰文件authorized_keys
- 進而實現基於密鑰遠程登錄服務器(免密碼登錄/非交互方式登錄)
第七章 ssh+key公鑰批量分發
1. 生成密鑰阻礙因素處理辦法(非交互)
[root@m01 script]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P '' -q
ssh-dss AAAAB3NzaC1kc3MAAACBAI6xLEXhSXfNcpmh/64vmOhgZjU4y/KvYRvUkBptp7dDYhHeVLRh3fCMmuPy4PCyMg3eWbinWV2Wv9az83g/bG7sNhmwIWCeey/9UD7Iiyzv4azOHR65gbKoPfOGEOjZ1XvV3dJS9wjgyK59xuhOyYEP+dI86J8l8H7uJ131XH7NAAAAFQCjiQqnJZV44vroP+sP23MPYMOMGQAAAIALpuvd8WWO2dgrgFCOE9SDeZtlTDyeXLoqj/A+04SYFk3u6lh6R4iOVE6arWB9w81aPPh1X0mXXgKJT4j5o7iET/NS7jW43JGnyqsM8DFadQ1atNqzUHRezCfw96v7d8hWFuGEFnyckY3zJyeD/Ri9RDpCMxa/ZDsVZWU3U/Ld6gAAAIBgRsOUF4TNbK6AG6phjoLPIkLvpvOunZveB4e+Ul0ikJDIJror1NJM8epWzEuBUZQd4T+mrfW8q5UYNDAlwxsI4F9t1Cdc4EH5ce3/s+lFnIAdiR8thfn0IFMrFFb/iN8fcIaazcE8MNKyJLJyzPv0F19Kxco7lYv/0Wnq8YkwUQ==
2. ssh連接密碼信息阻礙問題解決方式
#!/bin/bash
for ip in 7 31 41
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
done