第十八章 SSH服務
一、SSH服務基礎
1、簡介
SSH 爲 Secure Shell 的縮寫,由 IETF 的網絡工作小組(Network Working Group)所制定;SSH 爲建立在應用層和傳輸層基礎上的安全協議。SSH 是目前較可靠,專爲遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程序,後來又迅速擴展到其他操作平臺。SSH在正確使用時可彌補網絡中的漏洞。SSH客戶端適用於多種平臺。幾乎所有UNIX平臺-包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平臺,都可運行SSH。
2、SSH服務提供的功能
(1)提供類似telnet的遠程聯機服務器的服務,即SSH服務。
(2)提供類似FTP服務的sftp-server,藉助SSH協議來傳輸數據,提供更安全的SFTP服務。
(3)提供遠程安全拷貝命令SCP。
3、SSH服務結構
(1)服務端:OpenSSH和OpenSSL
(2)客戶端:
Linux:SSH
Windows:SecureCRT、Putty、xshell
(3)守護進程:sshd
(4)配置文件:/etc/ssh/sshd_config
a、查看系統支持的協議
grep Protocol /etc/ssh/sshd_config
CentOS5.x: Protocol 2, 1
CentOS6.x: Protocol 2
b、查看臨時公鑰ServerKeyBits長度
grep ServerKeyBits /etc/ssh/sshd_config
#ServerKeyBits 1024 (CentOS5.x爲 768)
c、說明:sshd_config是配置服務端,ssh_config是配置客戶端
vi /etc/ssh/sshd_config
:set nu #vi的功能,顯示行號
Port 28888 #13行
PermitRootLogin no #42行,禁止root用戶ssh遠程登錄
PermitEmptyPasswords no #65行,禁止空密碼登錄
GSSAPIAuthentication no #爲防止GSSAPI導致SSH連接變慢
UseDNS no #122行,禁止使用DNS
(5)協議版本:
a、1.x和2.x
b、2.x的客戶端不能連接到1.x的服務程序上。
4、ssh服務認證類型
(1)基於口令的安全驗證
a、連接格式:
(i)ssh -p端口號 用戶名@IP #默認22可不寫
ssh -p28888 [email protected] #需輸入192.168.58.238的密碼
(ii)ssh -p端口號 用戶名@IPcommand #此方式執行命令後,會退回當前機器
ssh [email protected] /sbin/ifconfig #由於環境變量不識別,所以需全路徑
b、查看家目錄下的.ssh中是否存在know_hosts文件
ll ~/.ssh/know*
-rw-r--r-- 1 root root 394 Feb 14 19:47 known_hosts
c、查看know_hosts文件內容
cat known_hosts
192.168.58.238 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvzhqkn7q/+dqo+LVbFCKsnUYG9WQudjue
Yl8NY3neiDaxxnuf84faY73NEuF0WtOR0c5N14aPQQhMbIPinFbRuqFbZBQspxbR+nd/j/df43U2P+xCIk3rxC7+7SpHdau/5a/yUtsAYKMUmp+5Jx4EWPasy1Ww+OvwmMBOXFFE5Mf1oNg/Z+lQZlM7n9bQn2iEXu5BVjaY8Z1mo7xRM5ClF/nZ3pa8S+HpQRQ/gXRhvYLp/DRSvbiz2Hc/zkXRcwd+uhOZXsmVagOIgIJ3qcsbQHIZfFBU9jaiDIHqGc4LmPxRlr/RhaH3vdULjpbjAVE1EMPDX4/i1GncLuLtT/h8Q==
(2)基於密鑰的安全驗證
5、小結
(1)ssh是安全的加密協議,用於遠程連接服務器
(2)默認端口是22,安全協議版本是ssh2
(3)服務端主要包含2個服務功能:ssh遠程連接和SFTP服務
(4)客戶端主要包含2個服務功能:ssh連接命令和scp遠程拷貝命令
二、SCP命令基礎
1、作用:遠程拷貝命令
2、格式:
(1)格式一:推的方式push,將文件發送到遠程服務器
scp -P端口號 本地要拷貝的文件 選程機的用戶名@IP:目錄 #默認端口22可以不寫
scp test.txt [email protected]:/tmp
(2)格式二:拉的方式pull,將文件從遠程服務器拷貝回來
scp -P端口號 遠程機的用戶名@IP:目錄或文件 本地機的目錄
scp [email protected]:/tmp/test.txt /wddg
3、參數
-P:指定端口號
-r:表示要拷貝目錄
-p:表示在拷貝前後保持文件或目錄屬性
4、小結:
scp是加密的遠程拷貝,可以把數據從一臺服務器推送到另一臺服務器,也可以從其它服務器把數據拉回到本地服務器,但每次都是全量拷貝(rsync是增量拷貝),因此效率不高
三、SFTP服務基礎
1、格式
sftp -oPort=22 [email protected]
2、操作命令
操作遠程主機與普通Linux操作命令一樣:cd、pwd等
操作本地主機要在所有命令前加上l:lcd、lpwd等
上傳文件到遠程主機命令:put
put /etc/hosts /tmp
下載遠程主機文件到本地命令:get
get /etc/hosts /tmp
3、演示
sftp -oPort=22 [email protected]
Connecting to 192.168.58.238...
[email protected]'s password:
sftp> pwd
Remote working directory: /root
sftp> cd /wddg
sftp> pwd
Remote working directory: /wddg
sftp> ls -l
-rw-r--r-- 1 root root 15 Feb 14 22:49 server.txt
sftp> lpwd
Local working directory: /tmp
sftp> lls -l
-rw-r--r-- 1 root root 17 Feb 14 22:53 client.txt
drwx------ 2 gdm gdm 4096 Feb 14 18:53 orbit-gdm
sftp> put client.txt
Uploading client.txt to/wddg/client.txt client.txt 100% 17 0.0KB/s 00:00
sftp> get server.txt
Fetching /wddg/server.txt to server.txt/wddg/server.txt 100% 15 0.0KB/s00:00
sftp> ls -l
-rw-r--r-- 1 root root 17 Feb 14 22:51client.txt
-rw-r--r-- 1 root root 15 Feb 14 22:49server.txt
sftp> lls -l
-rw-r--r-- 1 root root 17 Feb 14 22:53 client.txt
drwx------ 2 gdm gdm 4096 Feb 14 18:53 orbit-gdm
-rw-r--r-- 1 root root 15 Feb 14 22:55 server.txt
4、小結:
(1)sftp -oPort=22 [email protected]
(2)上傳put 加客戶端本地路徑
(3)下載get 服務端內容,下載到本地的當前目錄
(4)put和get也可以指定上傳下載目錄,
(5)put和get只能針對文件進行操作,不能是目錄
(6)查看配置參數
egrep -v "^#|^$"/etc/ssh/sshd_config
四、SSH應用之一:批量分發
1、演示環境
主機名 |
IP |
用途 |
操作系統 |
linuxDelivery |
192.168.58.238 |
中心分發服務器 |
CentOS6.8 |
StudyLinux |
192.168.58.85 |
接收節點服務器 |
CentOS6.8 |
LS-B16175 |
192.168.16.75 |
接收節點服務器 |
RedHat6.4 |
2、需求分析
要求所有服務器在同一用戶下,實現從中心分發服務器將本地數據分發到接收節點服務器,在分發過程中不需要各接收節點服務器提示密碼驗證,除了分發功能,還需要可以批量查看客戶機上的CPU、LOAD、MEM以及系統版本等使用信息。
3、增加分發用戶:在所有機器上設置同一用戶oldboy
在SecureCRT的交互界面中操作:
(1)刪除所有服務器上的oldboy用戶,如查有組沒有刪除需手動刪除
userdel -rf oldboy
(2)新增用戶
useradd oldboy
(3)檢查用戶
id oldboy
(4)在每臺服務器上查看執行情況
(5)統一設置oldboy密碼
echo 123456 | passwd --stdin oldboy
4、創建密鑰對,實現免密登陸
(1)將所有服務器切換到oldboy用戶下
su - oldboy
(2)檢查是否切換成功
whoami
(3)密鑰類型
dsa:數字簽名算法.即Digital Signature Algorithm
rsa:一種加密算法,即可用於加密,也可用於數據簽名來實現認證
ssh-keygen -t dsa:建立dsa類型密鑰.-t參數是指建立密鑰的類型
ssh-keygen -t rsa:建立rsa類型密鑰
(4)在中心分發服務器上創建密鑰(實際上可在任何一臺機器上創建都行)
ssh-keygen -t dsa
Generatingpublic/private dsa key pair.
Enter file inwhich to save the key (/home/oldboy/.ssh/id_dsa): #直接回車,默認就行
Createddirectory '/home/oldboy/.ssh'.
Enter passphrase(empty for no passphrase): #直接回車,不用輸入密碼
Enter samepassphrase again:
Youridentification has been saved in /home/oldboy/.ssh/id_dsa.
Your public keyhas been saved in /home/oldboy/.ssh/id_dsa.pub.
The keyfingerprint is:
91:8e:8e:1f:f2:ea:d8:34:73:8f:7b:65:1c:e3:69:b8oldboy@linuxDelivery
The key'srandomart image is:
+--[ DSA1024]----+
| |
| . |
| o |
| o .o |
| . S+ + |
| o .B |
| * + = |
| + B +E |
| ..+.=o. |
+-----------------+
(5)檢查生成的密鑰,以.pub結尾的是公鑰
ll ~/.ssh
-rw------- 1 oldboy oldboy 668 Feb 1614:35 id_dsa #私鑰,權限小600
-rw-r--r-- 1 oldboy oldboy 610 Feb 16 14:35id_dsa.pub #公鑰,權限較大644
ll -d .ssh
drwx------ 2 oldboy oldboy 4096 Feb16 14:35 .ssh #.ssh目錄的權限是700
(6)分發公鑰
a、格式
ssh-copy-id -i 公鑰文件 接收服務器用戶@服務器 #該腳本命令只能發公鑰
ssh-copy-id -i 公鑰文件 "-p端口號接收服務器用戶@服務器" #非默認端口特殊寫法,要用雙引號
b、操作
ssh-copy-id -i .ssh/id_dsa.pub [email protected]
The authenticity of host '192.168.58.85 (192.168.58.85)' can't beestablished.
RSA key fingerprint isde:91:c6:84:6e:40:8c:ec:89:7b:da:58:11:eb:43:4f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.58.85' (RSA) to the list ofknown hosts.
[email protected]'s password: #由於是第一次連接該服務器,需輸入密碼123456
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.
[oldboy@linuxDelivery ~]$ ssh-copy-id -i .ssh/id_dsa.pub [email protected]
The authenticity of host '192.168.16.75 (192.168.16.75)' can't beestablished.
RSA key fingerprint is 04:ed:29:64:cd:f9:c7:3a:4a:50:a8:82:c5:05:77:8c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.16.75' (RSA) to the list ofknown hosts.
[email protected]'s password: #由於是第一次連接該服務器,需輸入密碼123456
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.
c、查看接收節點服務器接收的文件(已自動改名由id_dsa.pub改爲authorized_keys,權限改爲是600)
ll .ssh
-rw------- 1 oldboy oldboy610 Feb 16 14:41 authorized_keys #權限是600
d、測試
ssh [email protected] #成功,免密
ssh [email protected] #成功,免密
e、ssh-copy-id腳本原理
就是把~/.ssh/id_dsa.pub文件複製到指定的接收節點服務器對應用戶的家目錄下的.ssh目錄(提前創建,權限爲700)下,並將文件名改爲authorized_keys,設置權限爲600
grep authorized_keys /etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys
which ssh-copy-id
/usr/bin/ssh-copy-id
cat /usr/bin/ssh-copy-id #核心語名在第41行:
{ eval "$GET_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)'" || exit 1
5、批量分發
(1)編寫分發腳本
vi fenfa.sh
if [ $# -ne 1 ] # $#表示參數的個數,-ne表示不等於
then
echo "/bin/sh $0arg1"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $1 oldboy@$n:/wddg/share
done
(2)測試
sh fenfa.sh a.txt
(3)查看是否成功
ll /wddg/share
-rw-rw-r-- 1 oldboy oldboy 8 Feb 17 13:29 a.txt
(4)完善分發腳本
vi fenfa2.sh
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions #系統內置函數庫
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $fileoldboy@$n:$remotedir >/dev/null 2>&1
if [ $? –eq 0 ] # $?表示上一函數是否正確執行,0表示正常用執行
then
action "scp$file to $remotedir is ok" /bin/true #action表示調用系統函數庫
else
action "scp$file to $remotedir is fail" /bin/false
fi
done
(5)測試
sh fenfa2.sh a.txt /home/oldboy/
如果失敗,則可 –x調試
sh –x fenfa2.sh a.txt /home/oldboy/
五、SSH應用之二:批量管理
1、編寫管理腳本
vi view.sh
#!/bin/sh
if [ $# -ne 1 ]
then
echo"/bin/sh $0 arg1"
exit 1
fi
for n in '192.168.1.5'
do
ssh root@$n $1
done
2、測試(參數中如果有空格必須加雙引號)
sh view.sh "/sbin/ifconfig eth0 | sed -rn 's#^.*addr:(.*) Bcas.*#\1#gp'"
192.168.1.5
sh view.sh /usr/bin/free
total used free shared buffers cached
Mem: 2071068 71308 1999760 0 14824 27088
六、SSH應用之三:批量分發加強
1、ssh服務通過sudo 提權拷貝文件實現分發(同步用戶對部分目錄無操作權限)
(1)思路
先將要拷貝的文件分發到指定的接收節點服務器,再通過配置了sudo提權的cp命令,將相文件拷貝指定目錄。
(2)設置/etc/sudoers(通過SecureCRT在root用戶下更新所有節點服務器的/etc/sudoers文件)
visudo
oldboy ALL=(ALL) NOPASSWD:/bin/cp
(3)檢查語法
visudo –c
(4)測試
visudo cp hosts /etc/
(5)遠程執行sudo命令
由於安全方面的限制,ssh服務一般不讓遠程執行sudo命令。如查非要遠程執行sudo,有以下功2種方法:
a、使用-t參數(建議使用)
ssh –t hostname sudo <cmd>
b、修改sshd_config配置文件(有安全隱患)
將文件中的Defaults requiretty這行註釋,但會造成安全隱患,建議用第一種,加-t參數
c、不加-t執行,會報錯
ssh [email protected] sudo/bin/cp ~/hosts /etc/hosts
d、報錯
sudo: sorry, you must have a tty to run sudo
f、加-t執行,成功
ssh –t [email protected]sudo /bin/cp ~/hosts /etc/hosts
(6)優化分發腳本
vi fenfa3.sh
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions #系統內置函數庫
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $fileoldboy@$n:~ >/dev/null 2>&1 &&\
ssh –t [email protected] sudo /bin/cp ~/$file $remotedir&>/dev/null
if [ $? –eq 0 ] # $?表示上一函數是否正確執行,0表示正常用執行
then
action "scp$file to $remotedir is ok" /bin/true #action表示調用系統函數庫
else
action "scp$file to $remotedir is fail" /bin/false
fi
done
說明:
&&\中的&&表示前面的命令執行成功後纔會執行下一條命令。\表示換行.也就是把這2條命令當成一行來執行。
2、ssh服務通過加了特殊權限的rsync命令拷貝文件實現分發(同步用戶對部分目錄無操作權限)
(1)對rsync命令加上s權限
which rsync
chmod 4755 /usr/bin/rsync
(2)檢查
ll /usr/bin/rsync
(3)修改分發腳本
vi fenfa3.sh
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions #系統內置函數庫
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $fileoldboy@$n:~ >/dev/null 2>&1 &&\
ssh –t [email protected] /usr/bin/rsync ~/$file$remotedir &>/dev/null
if [ $? –eq 0 ] # $?表示上一函數是否正確執行,0表示正常用執行
then
action "scp$file to $remotedir is ok" /bin/true #action表示調用系統函數庫
else
action "scp$file to $remotedir is fail" /bin/false
fi
done
七、小結
1、免密碼登陸認證是單向,如果希望可以互相免密認證,需要兩邊都進行免密操作
2、免密登陸認證是基於用戶的,最好不要跨不同用戶
3、SSH連接慢時,需要設置/etc/ssh/sshd_config文件中的UseDNS 和GSSAPIAuthentication爲no
vi /etc/ssh/sshd_config
:set nu #vi的功能,顯示行號
Port 28888 #13行
PermitRootLogin no #42行,禁止root用戶ssh遠程登錄
PermitEmptyPasswords no #65行,禁止空密碼登錄
GSSAPIAuthenticationno #爲防止GSSAPI導致SSH連接變慢
UseDNSno #122行,禁止使用DNS
也可以通過ssh -v [email protected]進行調試
4、批量分發1000臺初始都需要輸入一次密碼,並且第一次連接要確認(可發通過expect自動應答)
5、對於需要將文件分發到沒有操作權限的目錄和文件時,有3種方法
a、利用root做ssh key驗證
優點:簡單、易用
缺點:安全差,同時無法禁止root遠程連接,一旦分發服務器的root被破,則全部服務器被破
應用:有80%的企業
b、利用sudo提權
優點:安全
缺點:配置複雜
c、利用特殊權限位,原理同sudo提權(拓展思路)
優點:相對安全
缺點:複雜,安全性一般,任何人都可以處理帶有suid權限的命令
d、建議
追求簡單,選1,考慮安全,選2,不建立選3
6、統一分發的重要安全思想
不管用什麼方法,一定要管理好中心分發服務器。因爲它的權限很大,很重要。
a、一定要取消中心分發服務器的外網IP
b、中心分發服務器開啓防火牆,禁止ssh對外用戶登陸。
c、僅授權某一臺後端無外網的服務器(跳板機A)訪問中心分發服務器。並且該服務器也沒有外網IP,只能通過VPN登陸。
d、中心分發服務器的跳板機A只能由跳板機B需要通過VPN連接.
e、管理時,管理員連接到跳板機B,再通過VPN連接到跳板機A, 再由跳板機訪問中心分發服務器,進行相應分發操作.
八、企業級生產場景批量管理的自動化管理方案
1、最簡單最常用的是ssh key,功能也最強大。一般中小型企事業會用,規模在50-100臺發下。
2、sina cfengine較早的批量管理工具,現在基本沒有企業用了。
3、門戶級別比較流行的,puppet批量管理工具,複雜、笨重。
4、saltstack批量管理工具,簡單、功能強大(配置複雜)
5、http + cron :將要分發的文件放在http上,由服務器定時下載.