1. 程式人生 > >Linux高階篇--openssh服務

Linux高階篇--openssh服務

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]]host ssh-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:”