Linux運維學習筆記之十:SSH服務

第十八章 SSH服務

一、SSH服務基礎

1、簡介

SSH 爲 Secure Shell 的縮寫,由 IETF 的網絡工作小組(Network Working Group)所制定;SSH 爲建立在應用層和傳輸層基礎上的安全協議。SSH 是目前較可靠,專爲遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程序,後來又迅速擴展到其他操作平臺。SSH在正確使用時可彌補網絡中的漏洞。SSH客戶端適用於多種平臺。幾乎所有UNIX平臺-包括HP-UX、LinuxAIXSolarisDigital UNIXIrix,以及其他平臺,都可運行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上,由服務器定時下載.

發佈了40 篇原創文章 · 獲贊 15 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章