Linux高階篇--openssh服務
阿新 • • 發佈:2018-12-10
Linux高階篇–SSH服務
一、 SSH
- ssh: secure shell, protocol, 22/tcp, 安全的遠端登入
- 具體的軟體實現: OpenSSH: ssh協議的開源實現,CentOS預設安裝 dropbear:另一個開源實現
- SSH協議版本 v1: 基於CRC-32做MAC,不安全;man-in-middle v2:雙方主機協議選擇安全的MAC方式 基於DH演算法做金鑰交換,基於RSA或DSA實現身份認證
- 兩種方式的使用者登入認證: 基於password 基於key
知識擴充套件: 遠端執行命令,無需登入到目標主機,適用於檢視目標主機的簡單資訊
[[email protected] ~]#ssh [email protected] 'hostname'
[email protected]'s password:
centos6
openssh軟體組成
- OpenSSH介紹
- 相關包: openssh openssh-clients openssh-server
- 工具: 基於C/S結構 Client: ssh, scp, sftp,slogin Windows客戶端: xshell, putty, securecrt, sshsecureshellclient Server: sshd
ssh客戶端
- 客戶端元件:
- ssh, 配置檔案:/etc/ssh/ssh_config Host PATTERN StrictHostKeyChecking no 首次登入不顯示檢查提示
- 格式:ssh [[email protected]]host [COMMAND] ssh [-l user] host [COMMAND]
- 常見選項 -p port:遠端伺服器監聽的埠 -b:指定連線的源IP -v:除錯模式 -C:壓縮方式 -X:支援x11轉發 -t:強制偽tty分配 ssh -t remoteserver1 ssh remoteserver2
- 允許實現對遠端系統經驗證地加密安全訪問
- 當用戶遠端連線ssh伺服器時,會複製ssh伺服器/etc/ssh/ssh_host*key.pub(CentOS7預設是ssh_host_ecdsa_key.pub)檔案中的公鑰到客戶機的~./ssh/know_hosts中。下次連線時,會自動匹配相應私鑰,不能匹配,將拒絕連線
-X 支援x11轉發
即nm-connection-editor 圖形介面
ssh -X 192.168.32.6 讓遠端主機圖形介面在本機顯示,無論目標主機是否為圖形介面,本機呼叫目標主機的圖形介面不受影響
底層通過X協議實現通過圖形程式讓客戶端和伺服器端的通訊
對於X協議來說,客戶端與伺服器端與ssh協議正好相反,本機充當伺服器,遠端主機相當於客戶端
windows通過遠端連線linux,並顯示圖形介面,使用xmanager中的xstart軟體可以實現,退出當前使用者登入即可退出xstart遠端連線
-t 強制偽終端分配
多臺裝置通過逐個跳轉,遠端連線到遠端主機
如ABCDE五臺主機,A連線到E,只能通過A-->B-->C-->D-->E的方式實現遠端
可以通過ssh -t實現,命令如下:
ssh -t 192.168.32.7 ssh -t 192.168.32.17 ssh 192.168.32.27
需要逐個輸入每臺主機的登入密碼
最後一個終端可以不用加-t選項
ssh服務登入驗證
- ssh服務登入驗證方式: 使用者/口令 基於金鑰
- 基於使用者和口令登入驗證 1、客戶端發起ssh請求,伺服器會把自己的公鑰傳送給使用者 2、使用者會根據伺服器發來的公鑰對密碼進行加密 3、加密後的資訊回傳給伺服器,伺服器用自己的私鑰解密,如果密碼正確,則使用者登入成功
- 基於金鑰的登入方式 1、首先在客戶端生成一對金鑰(ssh-keygen) 2、並將客戶端的公鑰ssh-copy-id 拷貝到服務端 3、當客戶端再次傳送一個連線請求,包括ip、使用者名稱 4、服務端得到客戶端的請求後,會到authorized_keys中查詢,如果有響應的IP和使用者,就會隨機生成一個字串,例如:acdf 5、服務端將使用客戶端拷貝過來的公鑰進行加密,然後傳送給客戶端 6、得到服務端發來的訊息後,客戶端會使用私鑰進行解密,然後將解密後的字串傳送給服務端 7、服務端接受到客戶端發來的字串後,跟之前的字串進行對比,如果一致,就允許免密碼登入
ssh命令實現基於key認證
- 基於金鑰的認證:
(1) 在客戶端生成金鑰對
ssh-keygen -t rsa [-P ‘’] [-f “~/.ssh/id_rsa”]
ssh-keygen -t rsa
(2) 把公鑰檔案傳輸至遠端伺服器對應使用者的家目錄 ssh-copy-id [-i [identity_file]] [[email protected]]hostssh-copy-id 192.168.32.128(目標ip地址)
(3) 測試
直接遠端登入即可,無需輸入口令
ssh 192.168.32.128(目標ip地址)
(4)重設私鑰口令: ssh-keygen –p (5)驗證代理(authentication agent)保密解密後的金鑰 這樣口令就只需要輸入一次 在GNOME中,代理被自動提供給root使用者 否則執行ssh-agent bash (6)鑰匙通過命令新增給代理 ssh-add
- 在SecureCRT或Xshell實現基於key驗證 在SecureCRT工具—>建立公鑰—>生成Identity.pub檔案 轉化為openssh相容格式(適合SecureCRT,Xshell不需要轉化格式),並複製到需登入主機上相應檔案authorized_keys中,注意許可權必須為600,在需登入的ssh主機上執行: ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
排錯小結:
ssh是基於key連線通訊雙方,如果有主機通過冒充ip地址以及mac地址連線某主機是行不通的,會有警告資訊出現,因此基於key的驗證方法相對更為安全
hostA向hostB發起連線請求,
第一次通訊時,hostA把hostB的公鑰/etc/ssh/ssh_host_rsa_key.pub複製到自己主機/root/.ssh/know_hosts檔案下
主機hostB用自己的私鑰進行簽名加密資料傳送給主機hostA,而此時主機hostA已經存有hostB的公鑰,如果可以解密,說明hostB是原來的裝置,如果無法解密,則說明是另外的裝置
注意:如果hostB的私鑰被竊取,那麼獲取hostB私鑰的裝置可以冒充hostB與之前和hostB驗證過的裝置通訊,因此對於私鑰要做好保密措施
複製私鑰到其他主機時,注意檔案的使用者、組以及許可權問題
如果使用新裝置代替舊裝置,而新裝置的地址改為舊地址的ip,此時,新裝置的key與老裝置不同,此時想通過該ip地址連線到新裝置時,會提示錯誤資訊:提示目標主機的key發生變化
解決方法:刪除本機記錄的舊裝置的key資訊,再次連線新裝置即可
rm -rf /root/.ssh
如何確認第一次連線的目標主機為可信的目標主機
拿到目標主機的公鑰資訊/etc/ssh/ssh_host_rsa_key.pub與當前顯示的key進行比較,如果一致,則表示目標可信
[[email protected] ~]#ssh 192.168.32.129
The authenticity of host '192.168.32.129 (192.168.32.129)' can't be established.
RSA key fingerprint is 3a:19:e1:94:56:01:ed:08:15:7c:1c:30:9d:93:d7:28.
Are you sure you want to continue connecting (yes/no)?
計算方法:
cp ssh_host_rsa_key.pub(目標主機公鑰) /data
base64 -d /data/ssh_host_rsa_key.pub >pubkey
[[email protected] data]# md5sum pubkey centos7中出來md5運算,還有sha256運算得出的值
3a19e1945601ed08157c1c309d93d728 pubkey
發現與RSA key fingerprint is 3a:19:e1:94:56:01:ed:08:15:7c:1c:30:9d:93:d7:28.中的key一致,說明目標主機可信
實現100臺裝置批量匯入公鑰資訊:
使用expect工具
vim ssh_push_key.sh
#!/bin/bash
pass="magedu"
rpm -q expect &> /dev/null || yum -y install expect
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
while read ip ;do
expect <<EOF
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $ip
#若要增加使用者名稱,則$ip更改為使用者@$ip,如:[email protected]$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$pass\n" }
}
expect eof
EOF
done < iplist.txt
注意:指令碼中iplist.txt檔案需要生成,可通過指令碼實現
scp命令
- scp命令:
- scp [options] SRC… DEST/
- 兩種方式: scp [options] [[email protected]]host:/sourcefile /destpath scp [options] /sourcefile [[email protected]]host:/destpath
- 常用選項: -C 壓縮資料流 -r 遞迴複製 -p 保持原檔案的屬性資訊 -q 靜默模式 -P PORT 指明remote host的監聽的埠 缺點:當某個檔案發生變化時,scp會把所有檔案全部複製一遍到遠端主機,這樣一來就會浪費頻寬
rsync命令
- 基於ssh和rsh服務實現高效率的遠端系統之間複製檔案
- 使用安全的shell連線做為傳輸方式 rsync –av /etc server1:/tmp 複製目錄和目錄下檔案 rsync –av /etc/ server1:/tmp 只複製目錄下檔案
- 比scp更快,只複製不同的檔案
- 選項: -n 模擬複製過程 -v 顯示詳細過程 -r 遞迴複製目錄樹 -p 保留許可權 -t 保留時間戳 -g 保留組資訊 -o 保留所有者資訊 -l 將軟連結檔案本身進行復制(預設) -L 將軟連結檔案指向的檔案複製 -a 存檔,相當於–rlptgoD,但不保留ACL(-A)和SELinux屬性(-X)
該命令基於增量型複製,只複製發生變化檔案,未發生變化的檔案不會複製,節約流量頻寬,很好的解決了scp的問題
sftp命令
- 互動式檔案傳輸工具
- 用法和傳統的ftp工具相似
- 利用ssh服務實現安全的檔案上傳和下載
- 使用ls cd mkdir rmdir pwd get put等指令,可用?或help獲取幫助資訊 sftp [[email protected]]host sftp> help
pssh工具
- pssh是一個python編寫可以在多臺伺服器上執行命令的工具,也可實現檔案複製,使用epel源安裝才能使用
- 選項如下: --version:檢視版本 -h:主機檔案列表,內容格式”[[email protected]]host[:port]” -H:主機字串,內容格式”[[email protected]]host[:port]” -A:手動輸入密碼模式 -i:每個伺服器內部處理資訊輸出 -l:登入使用的使用者名稱 -p:併發的執行緒數【可選】 -o:輸出的檔案目錄【可選】 -e:錯誤輸入檔案【可選】 -t:TIMEOUT 超時時間設定,0無限制【可選】 -O:SSH的選項 -P:打印出伺服器返回資訊 -v:詳細模式 示例:
通過pssh批量關閉seLinux
pssh -H [email protected] -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config"
pssh -H [email protected] -i setenforce 0
將標準錯誤和標準正確重定向都儲存至/app目錄下
pssh -H 192.168.32.130 -o /app -e /app -i "hostname"
pssh -H 192.168.32.130 -i hostname
當不支援ssh的key認證時,通過 -A選項,使用密碼認證批量執行指令
[[email protected] ~]#pssh -H 192.168.32.130 -A -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 輸入密碼
[1] 21:46:44 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
管理多臺主機時,需要輸入多個密碼(假設密碼不一致)
[[email protected] ~]#pssh -H 192.168.32.130 -H 192.168.32.128 -A -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 輸入密碼
[1] 21:46:44 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
輸入第一個密碼,則第二個主機命令執行失敗
解決方法:使用基於key驗證管理多臺主機(無需輸入密碼),前提時主機之間已經實現基於key的驗證
pssh命令預設基於key驗證
[[email protected] .ssh]#pssh -H 192.168.32.130 -H 192.168.32.128 -i hostname
[1] 21:53:05 [SUCCESS] 192.168.32.128
centos6
[2] 21:53:05 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
管理大批量主機時,可以把ip地址存入文字中,呼叫該文字即可
-h 呼叫主機檔案列表
[[email protected] ~]#cat iplist.txt
192.168.32.128
192.168.32.130
[[email protected] ~]#pssh -h iplist.txt -i hostname
[1] 21:56:07 [SUCCESS] 192.168.32.128
centos6
[2] 21:56:07 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
批量建立賬號
[[email protected] ~]#pssh -h iplist.txt -i "useradd testuser"
[1] 21:57:07 [SUCCESS] 192.168.32.130
[2] 21:57:08 [SUCCESS] 192.168.32.128
[[email protected] ~]#pssh -h iplist.txt -i "getent passwd testuser"
[1] 21:57:18 [SUCCESS] 192.168.32.128
testuser:x:501:501::/home/testuser:/bin/bash
[2] 21:57:18 [SUCCESS] 192.168.32.130
testuser:x:1001:1001::/home/testuser:/bin/bash
PSCP.PSSH命令
- pscp.pssh功能是將本地檔案批量複製到遠端主機
- pscp [-vAr] [-h hosts_file] [-H [[email protected]]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] local remote
- Pscp-pssh選項 -v 顯示覆制過程 -r 遞迴複製目錄
- 將本地curl.sh 複製到/app/目錄 pscp.pssh -H 192.168.1.10 /root/test/curl.sh /app/ pscp.pssh -h host.txt /root/test/curl.sh /app/
- 將本地多個檔案批量複製到/app/目錄 pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/
- 將本地目錄批量複製到/app/目錄 pscp.pssh -H 192.168.1.10 -r /root/test/ /app/
PSLURP命令
- pslurp功能是將遠端主機的檔案批量複製到本地
- pslurp [-vAr] [-h hosts_file] [-H [[email protected]]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir] remote local(本地名)
- Pslurp選項 -L 指定從遠端主機下載到本機的儲存的目錄,local是下載到本地後的名稱 -r 遞迴複製目錄
- 批量下載目標伺服器的passwd檔案至/app下,並更名為user pslurp -H 192.168.1.10 -L /app/ /etc/passwd user
如果拉取多個檔案,該命令把檔案拉取過來以後,會自動建立以對方主機ip為命名的目錄存放拉取過來的檔案,用以區分檔案
[[email protected] ~]pslurp -H 192.168.32.130 -L /data/ /etc/fstab f1
[[email protected] data]#tree
.
├── 192.168.32.128
│ └── f1
├── 192.168.32.130
└── f1
SSH埠轉發
- SSH埠轉發 SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網路資料。但是,SSH 還能夠將其他 TCP 埠的網路資料通過 SSH連結來轉發,並且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”(tunneling),這是因為 SSH 為其他 TCP連結提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些 TCP應用均能夠從中得益,避免了使用者名稱,密碼以及隱私資訊的明文傳輸。而與此同時,如果工作環境中的防火牆限制了一些網路埠的使用,但是允許 SSH 的連線,也能夠通過將 TCP 埠轉發來使用 SSH 進行通訊
- SSH 埠轉發能夠提供兩大功能: 加密 SSH Client 端至 SSH Server 端之間的通訊資料 突破防火牆的限制完成一些之前無法建立的 TCP 連線
- 本地轉發: -L localport:remotehost:remotehostport sshserver
- 選項: -f 後臺啟用 -N 不開啟遠端shell,處於等待狀態 -g 啟用閘道器功能 示例: ssh –L 9527:telnetsrv:23 -N sshsrv telnet 127.0.0.1 9527 當訪問本機的9527的埠時,被加密後轉發到sshsrv的ssh服務,再解密被轉發到telnetsrv:23 data<- ->ocalhost:9527<- ->ocalhost:XXXXX<- ->shsrv:22<- ->shsrv:YYYYY<- ->telnetsrv:23
實驗1:本地轉發
A B C 三臺主機,A在網際網路(外網),B和C在同一區域網
A:192.168.32.6
B:192.168.32.7
C:192.168.32.17
主機B只能通過ssh訪問,主機C只能通過telnet訪問,主機A不能夠直接訪問主機C
A---->C A到C使用telnet連線不安全
可以通過A--->B--->C實現
A---->B 通過ssh連線,該階段A相當於ssh客戶端,B相當於ssh服務端。主機A會開啟一個隨機埠號,通過22埠連線主機B
B---->C 通過telnet連線,該階段B相當於telnet客戶端,C相當於telnet服務端。主機B也會開啟一個隨機埠號,通過23埠連線主機C
由於B和C在公司內網,實現了A到C的安全訪問
在主機A上進行配置,開啟一個埠9527
當連線主機A的9527埠時,就會被ssh協議封裝起來,傳到主機B,主機B收到以後解封裝,再通過telnet連線到主機C
模擬實驗:
三臺主機分別安裝telnet、telnet-server,相互之間測試通過telnet訪問
systemctl start telnet.socket 開啟telnet服務
ss -ntl 檢視telnet23埠是否開啟
在主機C上進行防火牆設定:C拒絕A的訪問
iptables -A INPUT -s 192.168.32.6(拒絕訪問的ip地址) -j REJECT
在主機A進行操作:
ssh -L 9527:192.168.32.17:23 -Nf 192.168.32.7
192.168.32.17 目標伺服器地址(telnet server)
192.168.32.7 主機B地址(ssh server)
ss -nt 在主機A執行命令檢視9527埠是否已開啟
在主機A上進行遠端連線
telnet 127.0.0.1 9527
關閉隧道 killall ssh
- 遠端轉發: -R sshserverport:remotehost:remotehostport sshserver 示例: ssh –R 9527:telnetsrv:23 –N sshsrv 讓sshsrv偵聽9527埠的訪問,如有訪問,就加密後通過ssh服務轉發請求到本機ssh客戶端,再由本機解密後轉發到telnetsrv:23 Data<- ->shsrv:9527<- ->shsrv:22<- ->ocalhost:XXXXX<- ->ocalhost:YYYYY<- ->telnetsrv:23
一般情況下,公司內部不允許外部主機連線內部主機
因此可以通過從公司內部主機B主動連線外部主機A(公司防火牆一般情況下不會進位制從內往外連線),建立連線後,在通過ssh隧道封裝telnet等其他協議與公司內部主機C(telnet server)通訊
實驗2:遠端轉發:反向ssh埠轉發
B--->A B充當ssh客戶端,A充當ssh服務端
A--->B 此過程直接完成
B--->C B充當telnet客戶端,C充當telnet服務端
A:192.168.32.6
B:192.168.32.7
C:192.168.32.17
在主機B上進行配置
ssh -R 9527:192.168.32.17:23 192.168.32.6
192.168.32.17 目標主機(telnet server)在實際應用中配置,192.168.32.17應配置為公網地址
192.168.32.6 主機A的地址
ss -nt 在主機A執行命令檢視9527埠是否已開啟
在主機A上遠端連線
telnet 127.0.0.1 9527
實驗3:A B C D四臺主機
A B在同一區域網,C D在同一區域網
B C可以通過ssh轉發資料
實現主機A與主機D通過網際網路進行通訊
兩種方法:
方法1:本地轉發
主機B充當ssh客戶端,主機C充當ssh服務端
命令:ssh -L
方法2:遠端轉發
主機B充當ssh服務端,主機C充當ssh客戶端
命令:ssh -R
這兩種方法最終實現效果一樣
使用smtp協議模擬實驗,埠號為25
該協議不支援遠端連線,要在配置檔案中更改
vim /etc/postfix/main.cf
inet_interfaces = all 把該行前的註釋符號去掉
在主機B上進行配置
先關閉防火牆iptables -F,再新增策略
iptables -A -s 192.168.32.6 -j REJECT
iptables -A -s 192.168.32.7 -j REJECT
A:192.168.32.6
B:192.168.32.7
C:192.168.32.17
D:192.168.32.27
本地轉發:在主機B上進行操作
ssh -L 9527:192.168.32.27:25 -Nfg 192.168.32.17
檢視9527埠是否存在,此時9527埠為*:9527,而不是127.0.0.1:9527,說明任意ip地址都可以使用該埠
在主機A上進行以下操作:
telnet 192.168.32.7 9527
遠端轉發:在主機C上進行操作
ssh -L 9527:192.168.32.27:25 -Nfg 192.168.32.7
檢視9527埠是否存在
在主機A上進行以下操作:
telnet 192.168.32.7 9527
- 動態埠轉發:
- 當用firefox訪問internet時,本機的1080埠做為代理伺服器,firefox的訪問請求被轉發到sshserver上,由sshserver替之訪問internet ssh -D 1080 [email protected] 在本機firefox設定代理socket proxy:127.0.0.1:1080 curl --socks5 127.0.0.1:1080 http://www.qq.com
動態埠轉發
A:192.168.32.6 谷歌網站
B:192.168.32.7 虛擬主機VPS
C:192.168.32.17 上網主機client
模擬實驗
在主機A上執行命令
iptables -A INPUT -s 192.168.32.17 -j REJECT
在主機C上進行操作
ssh -D 9527 192.168.32.7 -fN
192.168.32.7 虛擬主機vps ip地址(跳板機)
此時仍然無法連線谷歌網站,需要配置瀏覽器的代理伺服器地址192.168.32.17 埠:9527
瀏覽器設定:preferences--高階--network--setting--手工指定代理伺服器地址(manual proxy configuration)--SOCKS Host 127.0.0.1 port 9527
只能在本機上使用,而且本機必須是linux系統
第四臺主機D:192.168.32.27
通過上網主機client連線谷歌網站
在主機C上進行操作
ssh -D 9527 192.168.32.7 -fNg
此時要配置瀏覽器的代理伺服器地址192.168.32.17 埠:9527
或curl --socks5 192.168.32.17:9527 http://192.168.32.6,使用該命令無需為瀏覽器配置代理地址
X協議轉發
- 所有圖形化應用程式都是X客戶程式 能夠通過tcp/ip連線遠端X伺服器 資料沒有加密機,但是它通過ssh連線隧道安全進行
- ssh -X [email protected] gedit remotehost主機上的gedit工具,將會顯示在本機的X伺服器上 傳輸的資料將通過ssh連線加密
ssh伺服器
- 伺服器端:sshd, 配置檔案: /etc/ssh/sshd_config
- 常用引數: Port ListenAddress ip LoginGraceTime 2m PermitRootLogin yes StrictModes yes 檢查.ssh/檔案的所有者,許可權等 MaxAuthTries 6 MaxSessions 10 同一個連線最大會話 PubkeyAuthentication yes PermitEmptyPasswords no PasswordAuthentication yes GatewayPorts no ClientAliveInterval:單位:秒 ClientAliveCountMax:預設3 UseDNS yes GSSAPIAuthentication yes 提高速度可改為no MaxStartups 未認證連線最大值,預設值10 Banner /path/file
- 限制可登入使用者的辦法: AllowUsers user1 user2 user3 DenyUsers AllowGroups DenyGroups
man sshd_config 檢視配置檔案幫助
sshd_config引數介紹:
17 #Port 22 埠號,一般情況下要連線到網際網路要更改為非標準埠號
18 #AddressFamily any any指支援ipv4和ipv6地址
19 #ListenAddress 0.0.0.0 哪個ip地址監聽服務埠號,預設所有ip地址都可以訪問22埠,可以指定22埠被本地某個ip地址監聽,如:listenaddress 192.168.32.7
22 HostKey /etc/ssh/ssh_host_rsa_key
23 #HostKey /etc/ssh/ssh_host_dsa_key
24 HostKey /etc/ssh/ssh_host_ecdsa_key
25 HostKey /etc/ssh/ssh_host_ed25519_key 主機之間相互連線使用的key,基於不同演算法生成,centos7連線使用ecdsa演算法生成的key,centos6連線使用rsa演算法生成的key
37 #LoginGraceTime 2m 連線等待時間,預設為2分鐘(即連線時輸入密碼之前狀態的等待時間)
38 #PermitRootLogin yes 允許root登入,預設為yes,如果為no,則root不允許登入,可以先登入普通使用者再切換root使用者登入
39 #StrictModes yes 嚴格模式,是否檢查必要檔案的許可權
40 #MaxAuthTries 6 最大驗證嘗試次數為6,但驗證時預設為3次
41 #MaxSessions 10 指每個網路連線開啟的會話次數,每個網路連線是指在同一個連線視窗下克隆該視窗的次數最大為10次,
43 #PubkeyAuthentication yes 基於密碼驗證
47 AuthorizedKeysFile .ssh/authorized_keys 基於key驗證檔案存放位置
65 PasswordAuthentication yes 支援使用者名稱密碼驗證
79 GSSAPIAuthentication no
115 UseDNS no
以上兩項建議更改為no,系統連線速度會變快
98 #AllowAgentForwarding yes 允許代理轉發
99 #AllowTcpForwarding yes 允許tcp轉發
117 #MaxStartups 10:30:100 限制併發連線數
當最大連線數不超過10次時,不受影響;當連線數超過10次時開始隨機拒絕最大連線數的30%主機連線,70%不受影響;當連線數達到100時,拒絕全部主機連線
112 #ClientAliveInterval 0 客戶端存活間隔,預設一直存活,不做檢查;如果為其他數字,表示每隔多少秒探測一次客戶端是否存活
113 #ClientAliveCountMax 3 預設探測三次
Banner /path/file 使用者登入時的登入提示,可以在檔案中寫入提示語句,登入時顯示該提示語句
ssh服務的最佳實踐 建議使用非預設埠 禁止使用protocol version 1 限制可登入使用者 設定空閒會話超時時長 利用防火牆設定ssh訪問策略 僅監聽特定的IP地址 基於口令認證時,使用強密碼策略 tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs 使用基於金鑰的認證 禁止使用空密碼 禁止root使用者直接登入 限制ssh的訪問頻度和併發線上數 經常分析日誌 知識擴充套件:
分析日誌/var/log/secure,把失敗連線次數過多的ip地址扔到防火牆
awk '/Failed password for root from/{ip[$(NF-3)]++}END{for (i in ip){if(ip[i]>=3)system("iptables -A INPUT -s "i" -j REJECT")}}' /var/log/secure
二、 dropbear編譯安裝
- 原始碼編譯安裝: 1、安裝開發包組:yum groupinstall “Development tools” 2、下載dropbear-2017.75.tar.bz2 3、解壓原始碼包tar xf dropbear-2017.75.tar.bz2 4、檢視相關編譯文件less INSTALL README 5、開始編譯,指定配置檔案安裝路徑 ./configure --prefix=/app/dropbear --sysconfdir=/etc/dropbear --disable-zlib 6、make PROGRAMS=“dropbear dbclient dropbearkey dropbearconvert scp” 7、make PROGRAMS=“dropbear dbclient dropbearkey dropbearconvert scp” install 8、配置PATH路徑,在任意目錄下都可以執行該命令 echo PATH=/app/dropbear/bin:/app/dropbear/sbin:$PATH >> /etc/profile.d/dropbear.sh source /etc/profile.d/dropbear.sh 9、生成執行服務所需的key mkdir /etc/dropbear cd /app/dropbear/bin dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048 dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key 10、執行服務,指定服務埠為2222: cd /app/dropbear/sbin dropbear -p :2222 -F –E #前臺執行 或dropbear -p :2222 #後臺執行 ss -ntl 檢視埠是否啟動 cat /var/run/dropbear.pid 檢視dropbear程序號 11、dropbear軟體工具測試 cd /app/dropbear/bin (1)使用dbclient客戶端連線其他主機 source /etc/profile.d/dropbear.sh dbclient 192.168.32.128 (2)使用scp遠端複製檔案 此時系統預設使用/usr/bin/下的dbclient,建立軟連結指向/app/dropbear/下的dbclient ln -s /app/dropbear/bin/dbclient /usr/bin/dbclient 12、把此服務設定為開機自啟動 dropbear -p :2222 #後臺執行 把dropbear裝置後臺執行 方法1:在/usr/lib/systemd/system/下配置service檔案 方法2:寫入/etc/rc.local檔案 /app/dropbear/sbin/dropbear -p 2222 chmod +x /etc/rc.d/rc.local 給檔案加上執行全興 13、如果使用完畢,不再需要該工具,可以刪除 刪除此服務 刪除etc/rc.local配置檔案中的內容 殺掉dropbear程序 killall dropbear 刪除配置檔案 rm -rf /app/dropbear rm -rf /etc/dropbear 刪除原始碼檔案 rm -rf dropbear-2018.76* 此時本機的scp複製檔案存在問題 刪除PATH變數下的路徑 rm -rf /etc/profile.d/dropbear.sh 刪除hash快取,快取中存的是/app/dropbear/sbin下的scp hash -r 刪除全部快取 hash -d 刪除某條快取記錄
三、 sudo
更改分身
- su 切換身份:su –l username –c ‘command’
- sudo 來自sudo包,man 5 sudoers sudo能夠授權指定使用者在指定主機上執行某些命令。如果未授權使用者嘗試使用 sudo,會提示聯絡管理員 sudo可以提供日誌,記錄每個使用者使用sudo操作 sudo為系統管理員提供配置檔案,允許系統管理員集中地管理使用者的使用許可權和使用的主機 sudo使用時間戳檔案來完成類似“檢票”的系統,預設存活期為5分鐘的“入場券” 通過visudo命令編輯配置檔案,具有語法檢查功能 visudo –c 檢查語法 visudo -f /etc/sudoers.d/test
sudo
- 配置檔案:/etc/sudoers, /etc/sudoers.d/
- 時間戳檔案:/var/db/sudo
- 日誌檔案:/var/log/secure
- 配置檔案支援使用萬用字元glob: ?:任意單一字元 * :匹配任意長度字元 [wxc]:匹配其中一個字元 [!wxc]:除了這三個字元的其它字元 \x : 轉義 [[alpha]] :字母 示例: /bin/ls [[alpha]]*
- 配置檔案規則有兩類; 1、別名定義:不是必須的 2、授權規則:必須的
sudoers
- 授權規則格式: 使用者 登入主機=(代表使用者) 命令
- 示例: root ALL=(ALL) ALL
- 格式說明: user: 執行命令者的身份 host: 通過哪些主機 (runas):以哪個使用者的身份 command: 執行哪些命令
寫在子配置檔案/etc/sudoers.d目錄下,把授權命令寫入該目錄下自定義的檔案中
cat /etc/sudoers.d/f1
wang ALL=(root) /bin/mount /dev/sr0 /mnt
注意“=”號後的(root)可以省略不寫,預設代表root
示例:
cat /etc/sudoers/wang
wang 192.168.32.128= /bin/cat /etc/shadow
cat /etc/sudoers/mage
mage 192.156.32.128=(wang) ALL
在mage使用者介面
sudo -u wang sudo /bin/cat /etc/shadow
別名
- Users和runas: username #uid %group_name %#gid user_alias|runas_alias
- host: ip或hostname network(/netmask) host_alias
- command: command name directory sudoedit Cmnd_Alias
sudo別名和示例
- 別名有四種類型:User_Alias, Runas_Alias, Host_Alias ,Cmnd_Alias
- 別名格式:[A-Z]([A-Z][0-9])* 大寫字母開頭,除了開頭,後續的也必須是大寫字母、數字或下劃線
- 別名定義: Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5 示例:
示例1:
Student ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
示例2:
student ALL=(root) /sbin/pidof,/sbin/ifconfig
%wheel ALL=(ALL) NOPASSWD: ALL
示例3
User_Alias NETADMIN= netuser1,netuser2
Cmnd_Alias NETCMD = /usr/sbin/ip
NETADMIN ALL=(root) NETCMD
示例4
User_Alias SYSADER=wang,mage,%admins
User_Alias DISKADER=tom
Host_Alias SERS=www.magedu.com,172.16.0.0/24
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk
SYSADER SERS= SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD
示例4
User_Alias ADMINUSER = adminuser1,adminuser2
Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]\*, !/usr/bin/passwd root
ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
示例5
Defaults:wang runas_default=tom
wang ALL=(tom,jerry) ALL
示例6
wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd
示例7
wang ALL=(ALL) /bin/cat /var/log/messages*
sudo命令
- ls -l /usr/bin/sudo
- sudo –i –u wang 切換身份
- sudo [-u user] COMMAND -V 顯示版本資訊等配置資訊 -u user 預設為root -l,ll 列出使用者在主機上可用的和被禁止的命令 -v 再延長密碼有效期限5分鐘,更新時間戳 -k 清除時間戳(1970-01-01),下次需要重新輸密碼 -K 與-k類似,還要刪除時間戳檔案 -b 在後臺執行指令 -p 改變詢問密碼的提示符號 示例:-p “password on %h for user %p:”