對于linux運(yùn)維工作者而言,使用ssh遠(yuǎn)程遠(yuǎn)程服務(wù)器是再熟悉不過的了!對于ssh的一些嚴(yán)格設(shè)置也關(guān)系到服務(wù)器的安全維護(hù),今天在此,就本人工作中使用ssh的經(jīng)驗(yàn)而言,做一些總結(jié)記錄來下。
-bash: ssh: command not found 解決辦法:'yum install -y openssh-server openssh-clinets'
1. ssh登錄時(shí)提示:Read from socket failed: Connection reset by peer. 嘗試了很多解決方案均無效,無奈!卸載sshd,然后重新安裝 # yum remove openssh* # rm -rf /etc/ssh* # yum install -y openssh* # systemctl start sshd.service
2. ssh遠(yuǎn)程登陸后的提示信息 我們經(jīng)常會使用中控機(jī)ssh信任跳轉(zhuǎn)到其他機(jī)器上,但是不知道有沒有運(yùn)維朋友注意到ssh跳轉(zhuǎn)成功后的終端顯示的提示信息? 這些提示信息,是為了方便我們在第一時(shí)間知道ssh跳轉(zhuǎn)到哪臺目標(biāo)機(jī)上,也是為了避免長期頻繁跳轉(zhuǎn)后由于大意造成的誤入機(jī)器操作的風(fēng)險(xiǎn),我們通常會在ssh跳轉(zhuǎn)到目標(biāo)機(jī)器后顯示一些提示信息,在一些國家, 登入給定系統(tǒng)前, 給出未經(jīng)授權(quán)或者用戶監(jiān)視警告信息, 將會受到法律的保護(hù).如下: [root@bastion-IDC ~]# ssh -p22 192.168.1.15 Last login: Fri Jul 15 13:26:53 2016 from 124.65.197.154 =================================== ||||||||||||||||||||||||||||||||||| =================================== HOSTNAME: monit-server IPADDRES: 192.168.1.15 =================================== IDC監(jiān)控機(jī) ===================================
那么上面的提醒信息是在哪設(shè)置的呢? 做法一:其實(shí)很簡單,這些信息是在目標(biāo)機(jī)器的/etc/motd文件里自定義的 [root@monit-server ~]# cat /etc/motd =================================== ||||||||||||||||||||||||||||||||||| =================================== HOSTNAME: monit-server IPADDRES: 192.168.1.15 =================================== IDC監(jiān)控機(jī) ===================================
做法二:在目標(biāo)機(jī)器的/etc/ssh/sshd_config文件里定義,然后重啟sshd服務(wù)即可。這兩種做法是一致的效果! Banner /etc/sshfile
[root@host-192-168-1-117 ~]# cat /etc/sshfile this is 192.168.1.117
遠(yuǎn)程登陸: [root@linux-node2 ~]# ssh 192.168.1.117 this is 192.168.1.117 [root@host-192-168-1-117 ~]#
3. 實(shí)現(xiàn)SSH無密碼登錄:使用ssh-keygen和ssh-copy-id ssh-keygen 產(chǎn)生公鑰與私鑰對. ssh-copy-id 將本機(jī)的公鑰復(fù)制到遠(yuǎn)程機(jī)器的authorized_keys文件中,ssh-copy-id也能讓你有到遠(yuǎn)程機(jī)器的/home/username/.ssh和~/.ssh/authorized_keys的權(quán)利. 操作記錄: 1)第一步:在本地機(jī)器上使用ssh-keygen產(chǎn)生公鑰私鑰對 #ssh-keygen -t rsa //一路默認(rèn)回車 這樣就會在當(dāng)前用戶家目錄下的.ssh目錄里產(chǎn)生公鑰和私鑰文件:id_rsa.pub、id_rsa??梢詫d_rsa.pub公鑰文件復(fù)制成authorized_keys 2)第二步:可以手動(dòng)將本機(jī)的id_rsa.pub公鑰文件內(nèi)容復(fù)制到遠(yuǎn)程目標(biāo)機(jī)的.ssh/authorized_keys文件中,可以就可以實(shí)現(xiàn)ssh無密碼登陸。 當(dāng)然,也可以在本機(jī)直接使用ssh-copy-id將公鑰復(fù)制到遠(yuǎn)程機(jī)器中 #ssh-copy-id -i /root/.ssh/id_rsa.pub user@ip [把本機(jī)的公鑰拷貝到遠(yuǎn)程機(jī)器上,比如B機(jī)器] 也可以不加公鑰路徑,會默認(rèn)加上 #ssh-copy-id user@ip 注意: ssh-copy-id 將key寫到遠(yuǎn)程機(jī)器的 ~/ .ssh/authorized_key.文件(文件會自動(dòng)創(chuàng)建)中
1 2 | 對于非22端口(比如22222)情況下的 ssh -copy- id 的使用,需要這樣用:
# ssh-copy-id -i /root/.ssh/id_rsa.pub '-p 22222 root@192.168.18.18'
|
3)這樣,本機(jī)登錄到上面遠(yuǎn)程機(jī)器(B機(jī)器)就不用輸入密碼 #ssh user@ip
4. ssh登錄失敗,報(bào)錯(cuò):Pseudo-terminal will not be allocated because stdin 現(xiàn)象: 需要登錄線上的一臺目標(biāo)機(jī)器A,但是不能直接登錄(沒有登錄權(quán)限),需要先登錄B機(jī)器,然后從B機(jī)器跳轉(zhuǎn)到A機(jī)器。 腳本如下: localhost:~ root# cat IDC-7.sh #!/bin/bash ssh root@101.201.114.106 'ssh -p25791 root@103.10.86.7'
但是在執(zhí)行腳本的時(shí)候報(bào)錯(cuò)如下: Pseudo-terminal will not be allocated because stdin
原因: 偽終端將無法分配,因?yàn)闃?biāo)準(zhǔn)輸入不是終端。 解決辦法: 需要增加-t -t參數(shù)來強(qiáng)制偽終端分配,即使標(biāo)準(zhǔn)輸入不是終端。 在腳本里添加-t -t參數(shù)即可,如下: localhost:~ root# cat IDC-7.sh #!/bin/bash ssh root@101.201.114.106 'ssh -t -t -p25791 root@103.10.86.7'
或者 localhost:~ root# cat IDC-7.sh #!/bin/bash ssh -t root@101.201.114.106 'ssh -t -t -p25791 root@103.10.86.7'
5. ssh遠(yuǎn)程登陸緩慢問題 解決辦法: 編譯/etc/ssh/sshd_config配置文件: UseDNS no GSSAPIAuthentication no 然后重啟sshd服務(wù)即可!
6. ssh登錄出現(xiàn):permission denied(publickey.gssapi-with-mic) 解決方法: 修改/etc/ssh/sshd-config文件,將其中的: PermitRootLogin no修改為yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys前面加上#屏蔽掉 PasswordAuthentication no修改為yes 最后重啟sshd服務(wù)即可!
7. ssh連接錯(cuò)誤問題 1) 在使用ssh或scp或rsync遠(yuǎn)程連接的時(shí)候,出現(xiàn)如下報(bào)錯(cuò): Address **** maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT! 解決方法: 修改本機(jī)ssh_config文件 [root@kvmserver ~]# vim /etc/ssh/ssh_config GSSAPIAuthentication no [root@kvmserver ~]#/etc/init.d/sshd restart
問題迎刃而解~~
2) 本機(jī)scp、rsync命令都已具備,但是在使用scp或rsync遠(yuǎn)程同步的時(shí)候報(bào)錯(cuò): bash: scp: command not found bash: rsync: command not found 原因:是由于遠(yuǎn)程機(jī)器上沒有安裝scp或rsync造成的!安裝這兩個(gè)命令即可~ yum install openssh-clients yum install rsync
3)遠(yuǎn)程ssh連接時(shí)錯(cuò)誤“ The X11 forwarding request was rejected!” 解決方法: 將sshd_config中 設(shè)置 X11Forwarding yes 重啟sshd服務(wù)。
8. ssh連接超時(shí)被踢出問題 當(dāng)使用xshell,SecureCRT等客戶端訪問linux服務(wù)器,有時(shí)候會出現(xiàn)終端定期超時(shí)被踢出的情況。 下面介紹三種方法來防止超時(shí)被踢出的方法,后兩種情況的設(shè)置方法以及通過設(shè)置shell變量來達(dá)到此目的的方法:
1、 配置服務(wù)器 # vim /etc/ssh/sshd_config 1)找到 ClientAliveInterval參數(shù),如果沒有就自己加一行 數(shù)值是秒,比如你設(shè)置為120 ,則是2分鐘 ClientAliveInterval 120 2)ClientAliveCountMax 指如果發(fā)現(xiàn)客戶端沒有響應(yīng),則判斷一次超時(shí),這個(gè)參數(shù)設(shè)置允許超時(shí)的次數(shù)。如3 、5等自定義
修改兩項(xiàng)參數(shù)后如下: ---------------------------- ClientAliveInterval 120 ClientAliveCountMax 3 //0 不允許超時(shí)次數(shù) 修改/etc/ssh/sshd_config文件,將 ClientAliveInterval 0和ClientAliveCountMax 3的注釋符號去掉,將ClientAliveInterval對應(yīng)的0改成60,沒有就自己輸入。 ClientAliveInterval指定了服務(wù)器端向客戶端請求消息的時(shí)間間隔, 默認(rèn)是0,不發(fā)送.而ClientAliveInterval 60表示每分鐘發(fā)送一次, 然后客戶端響應(yīng), 這樣就保持長連接了.ClientAliveCountMax, 使用默認(rèn)值3即可.ClientAliveCountMax表示服務(wù)器發(fā)出請求后客戶端沒有響應(yīng)的次數(shù)達(dá)到一定值, 就自動(dòng)斷開. 正常情況下, 客戶端不會不響應(yīng). 重新加載sshd服務(wù)。退出客戶端,再次登陸即可驗(yàn)證。 3)重啟sshd service # /etc/init.d/ssh restart
2、 配置客戶端 #vim /etc/ssh/ssh_config 然后找到里面的 ServerAliveInterval 參數(shù),如果沒有你同樣自己加一個(gè)就好了 參數(shù)意義相同,都是秒數(shù),比如5分鐘等 ServerAliveInterval 300
3、# echo export TMOUT=1000000 >> /root/.bash_profile; source .bash_profile 在Linux 終端的shell環(huán)境中通過設(shè)置環(huán)境變量TMOUT來阻止超時(shí)。如果顯示空白,表示沒有設(shè)置, 等于使用默認(rèn)值0, 一般情況下應(yīng)該是不超時(shí). 如果大于0, 可以在如/etc/profile之類文件中設(shè)置它為0.
9. ssh遠(yuǎn)程登陸,公鑰授權(quán)不通過:Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 公司IDC機(jī)房服務(wù)器,之前做了跳板機(jī)環(huán)境,其他機(jī)器只允許從跳板機(jī)ssh無密碼信任過去,并且在信任關(guān)系做好后,禁用了其他機(jī)器的密碼登陸功能(sshd_config文件里設(shè)置“PermitEmptyPasswords no”)
后來跳板機(jī)出現(xiàn)了問題,打算重裝這臺機(jī)器,重裝前取消了其他機(jī)器里只允許跳板機(jī)ssh信任關(guān)系,并且恢復(fù)了密碼登陸功能: [root@bastion-IDC ssh]# vim /etc/ssh/sshd_config PermitEmptyPasswords yes [root@bastion-IDC ssh]# service sshd restart
修改后,當(dāng)時(shí)在其他機(jī)器間是可以ssh相互登陸,當(dāng)時(shí)沒在意,以為一切ok了。 可是,到了第二天,再次ssh登陸時(shí),尼瑪,居然報(bào)錯(cuò)了~~ Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
最后發(fā)現(xiàn)是selinux惹的禍!關(guān)閉它即可。 1)臨時(shí)關(guān)閉selinux [root@bastion-IDC ssh]# setenforce 0 [root@bastion-IDC ssh]# getenforce Permissive 2)永久關(guān)閉 [root@bastion-IDC ssh]# vim /etc/sysconfig/selinux SELINUX=disabled [root@bastion-IDC ssh]# reboot #重啟系統(tǒng)才能生效
說明: 1)ssh可同時(shí)支持publickey和password兩種授權(quán)方式,publickey默認(rèn)不開啟,需要配置為yes。 如果客戶端不存在.ssh/id_rsa,則使用password授權(quán);存在則使用publickey授權(quán);如果publickey授權(quán)失敗,依然會繼續(xù)使用password授權(quán)。
2)GSSAPI身份驗(yàn)證. GSSAPIAuthentication 是否允許使用基于 GSSAPI 的用戶認(rèn)證.默認(rèn)值為'no'.僅用于SSH-2. GSSAPICleanupCredentials 是否在用戶退出登錄后自動(dòng)銷毀用戶憑證緩存。默認(rèn)值是'yes'.僅用于SSH-2. 需要特別注意的是: GSSAPI是公共安全事務(wù)應(yīng)用程序接口(GSS-API) 公共安全事務(wù)應(yīng)用程序接口以一種統(tǒng)一的模式為使用者提供安全事務(wù),由于它支持最基本的機(jī)制和技術(shù),所以保證不同的應(yīng)用環(huán)境下的可移植性. 該規(guī)范定義了GSS-API事務(wù)和基本元素,并獨(dú)立于基本的機(jī)制和程序設(shè)計(jì)語言環(huán)境,并借助于其它相關(guān)的文檔規(guī)范實(shí)現(xiàn).
如果我們在服務(wù)端打開GSSAPIAuthentication配置項(xiàng),如下: [root@server ~]#vim /etc/ssh/sshd_config ........ GSSAPIAuthentication yes GSSAPICleanupCredentials yes
那么在客戶端登錄服務(wù)端會用gssapi-keyex,gssapi-with-mic進(jìn)行身份校驗(yàn),同樣客戶端也要支持這種身份驗(yàn)證,如下:
[root@client ~]#vim /etc/ssh/ssh_config GSSAPIAuthentication yes GSSAPIDelegateCredentials yes
我們在客戶端連接SSH服務(wù)端,如下: ssh -v 192.168.1.11 ................. debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
我們看到如下的信息: debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache found debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Next authentication method: gssapi-keyex debug1: No valid Key exchange context 說明SSH登錄時(shí)采用GSSAPI的方式進(jìn)行身份驗(yàn)證,但我們的系統(tǒng)不支持.
最后如果我們不用這種方式進(jìn)行身份驗(yàn)證的話,建議關(guān)閉這個(gè)選項(xiàng),這樣可以提高驗(yàn)證時(shí)的速度.
10. ssh自定義安全設(shè)置 1) 為了ssh登陸的時(shí)候加一層保護(hù),可以修改默認(rèn)端口。修改ssh服務(wù)配置文件/etc/ssh/sshd_config port 2222
這樣遠(yuǎn)程連接時(shí)加短褲 #ssh 192.168.1.83 -p 2222
2) ssh使用時(shí)加-l后面跟用戶名,表示登陸到對方的這個(gè)用戶下面。 #ssh -l wangshibo 192.168.1.83 -p 2222 等同于 #ssh wangshibo@192.168.1.83 -p 2222
3) 限制ssh登陸的來源ip,白名單設(shè)置(hosts.allow優(yōu)先級最高,具體參考:Linux服務(wù)器安全登錄設(shè)置記錄) 一是通過iptables設(shè)置ssh端口的白名單,如下設(shè)置只允許192.168.1.0/24網(wǎng)段的客戶機(jī)可以遠(yuǎn)程連接本機(jī) #vim /etc/sysconfig/iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT 二是通過/etc/hosts.allow里面進(jìn)行限制(如下),/etc/hosts.deny文件不要任何內(nèi)容編輯,保持默認(rèn)! #vim /etc/hosts.allow sshd:192.168.1.*,192.168.9.*,124.65.197.154,61.148.60.42,103.10.86.7:allow sshd:all:deny
4)僅允許特定的用戶通過SSH登陸 如不允許root用戶登錄; 只允許幾個(gè)指定的用戶登錄(比如wangshibo、guohuihui、liuxing用戶) 禁止某些指定的用戶登錄(比如zhangda,liqin用戶) 但是要注意:設(shè)置的這幾個(gè)用戶必須同時(shí)存在于本機(jī)和對方機(jī)器上 修改ssh服務(wù)配置文件/etc/ssh/sshd_config PermitRootLogin no //將yes修改為no AllowUsers wangshibo guohuihui liuxing //這個(gè)參數(shù)AllowUsers如果不存在,需要手動(dòng)創(chuàng)建,用戶之間空格隔開 DenyUsers zhagnda liqin //這個(gè)參數(shù)DenyUsers如果不存在,需要手動(dòng)創(chuàng)建,用戶之間空格隔開
也可以設(shè)置僅允許某個(gè)組的成員通過ssh訪問主機(jī)。 AllowGroups wheel ops
實(shí)例說明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 1)只允許指定用戶進(jìn)行登錄(白名單):
在 /etc/ssh/sshd_config 配置文件中設(shè)置 AllowUsers 選項(xiàng)。格式如下:
AllowUsers root grace kevin app
表示只允許grace用戶、kevin用戶通過 ssh 登錄本機(jī)。
AllowUsers root@192.168.10.10 app@192.168.10.11 kevin@192.168.10.13
表示只允許從192.168.10.10登錄的root用戶、從192.168.10.11登錄的app用戶、從192.168.10.13登錄的kevin用戶可以通過 ssh 登錄本機(jī)。
2)只拒絕指定用戶進(jìn)行登錄(黑名單):)
在 /etc/ssh/sshd_config 配置文件中設(shè)置DenyUsers選項(xiàng)。格式如下:
DenyUsers wangbo linan zhangyang
表示拒絕wangbo、linan和zhangyang用戶通過 ssh 登錄本機(jī)。
需要注意的是:
- AllowUsers、DenyUsers跟后面的配置之間使用TAB鍵進(jìn)行隔開
- 多個(gè)百名單或黑名單之間使用空格隔開
例子:
[root@Centos6 ~] # cat /etc/ssh/sshd_config
.......
AllowUsers root@192.168.10.202 app@192.168.10.200 kevin@192.168.10.202
[root@Centos6 ~] # /etc/init.d/sshd restart
[root@Centos6 ~] # cat /etc/ssh/sshd_config
.......
AllowUsers root app kevin
[root@Centos6 ~] # /etc/init.d/sshd restart
[root@Centos6 ~] # cat /etc/ssh/sshd_config
.......
DenyUsers wangbo linan zhangyang
[root@Centos6 ~] # /etc/init.d/sshd restart
如下,由于已經(jīng)允許了app和root登錄,則后面針對root@192.168.10.202和app@192.168.10.200的限制就無效了(兩者別放在一起配置)
[root@Centos6 ~] # cat /etc/ssh/sshd_config
.......
AllowUsers app root root@192.168.10.202 app@192.168.10.200
[root@Centos6 ~] # /etc/init.d/sshd restart
|
######## 還可以使用pam規(guī)則限制ssh登錄 ########
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 1)允許指定的用戶(比如kevin、grace賬號)進(jìn)行登錄
在 /etc/pam .d /sshd 文件第一行加入,一定要在第一行,因?yàn)橐?guī)則是自上而下進(jìn)行匹配的。
auth required pam_listfile.so item=user sense=allow file = /etc/sshusers onerr=fail
然后在 /etc 下建立sshusers文件,編輯這個(gè)文件,加入你允許使用 ssh 服務(wù)的用戶名,不用重新啟動(dòng)sshd服務(wù)。
最后重啟sshd服務(wù)即可!
操作如下:
[root@docker-test1 ~] # vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=allow file = /etc/sshusers onerr=fail
........
[root@docker-test1 ~] # touch /etc/sshusers
[root@docker-test1 ~] # vim /etc/sshusers
kevin
grace
[root@docker-test1 ~] # /etc/init.d/sshd restart
2)pam規(guī)則也可以寫成deny的。比如拒絕kevin、grace賬號進(jìn)行登錄
操作如下:
[root@docker-test1 ~] # vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file = /etc/sshusers onerr=succeed
........
[root@docker-test1 ~] # touch /etc/sshusers
[root@docker-test1 ~] # vim /etc/sshusers
kevin
grace
[root@docker-test1 ~] # /etc/init.d/sshd restart
3)pam規(guī)則可以使用group限制。
允許規(guī)則:
auth required pam_listfile.so item=group sense=allow file = /etc/security/allow_groups onerr=fail
禁止規(guī)則:
auth required pam_listfile.so item=group sense=deny file = /etc/security/deny_groups onerr=succeed
操作如下:
[root@docker-test1 ~] # vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=group sense=allow file = /etc/security/allow_groups onerr=fail
新建一個(gè)組,組名為bobo,然后將kevin和grace添加到這個(gè)bobo組內(nèi)
[root@docker-test1 ~] # groupadd bobo
[root@docker-test1 ~] # gpasswd -a kevin bobo
Adding user kevin to group bobo
[root@docker-test1 ~] # usermod -G bobo grace
[root@docker-test1 ~] # id kevin
uid=1000(kevin) gid=1000(kevin) groups =1000(kevin),1002(bobo)
[root@docker-test1 ~] # id grace
uid=1001(grace) gid=1001(grace) groups =1001(grace),1002(bobo)
在 /etc/security/allow_groups 文件按中加入組名(注意如果不加root,則root就不能被允許登錄了)
[root@docker-test1 ~] # vim /etc/security/allow_groups
bobo
[root@docker-test1 ~] # /etc/init.d/sshd restart
如上設(shè)置后,則只有kevin用戶能被允許登錄!
如果是禁止規(guī)則,則第一行改為下面內(nèi)容:
auth required pam_listfile.so item=group sense=deny file = /etc/security/deny_groups onerr=succeed
|
除此之外,禁止某些用戶ssh登錄,可以 使用passwd或usermod命令進(jìn)行賬號鎖定
5)取消密碼驗(yàn)證,只用密鑰對驗(yàn)證 修改ssh服務(wù)配置文件/etc/ssh/sshd_config PasswordAuthentication no PubkeyAuthentication yes
6)給賬號設(shè)置強(qiáng)壯的密碼:將密碼保存到文本進(jìn)行復(fù)制和粘帖就可以了 # yum -y install expect # mkpasswd -l 128 -d 8 -C 15 -s 10 lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx>iHikTagiVz0$cMtqOcIypkpd,vvD*kJhs3q@sb:CiCqgtqdqvse5lssfmranbtx 參數(shù)說明: -l 密碼長度 -d 多少個(gè)數(shù)字 -C 大寫字母個(gè)數(shù) -s 特殊符號的個(gè)數(shù)
7)只允許通過指定的網(wǎng)絡(luò)接口來訪問SSH服務(wù),(如果本服務(wù)器有多個(gè)IP的時(shí)候) 仍然是修改/etc/ssh/sshd_config,如下: ListenAddress 192.168.1.15 //默認(rèn)監(jiān)聽的是0.0.0.0
這樣,就只允許遠(yuǎn)程機(jī)器通過ssh連接本機(jī)的192.168.1.15內(nèi)網(wǎng)ip來進(jìn)行登陸了。
8)禁止空密碼登錄 如果本機(jī)系統(tǒng)有些賬號沒有設(shè)置密碼,而ssh配置文件里又沒做限制,那么遠(yuǎn)程通過這個(gè)空密碼賬號就可以登陸了,這是及其不安全的! 所以一定要禁止空密碼登陸。修改/etc/ssh/sshd_config,如下: PermitEmptyPasswords no //這一項(xiàng),默認(rèn)就是禁用空密碼登陸
9) ssh_config和sshd_config ssh_config和sshd_config都是ssh服務(wù)器的配置文件,二者區(qū)別在于,前者是針對客戶端的配置文件,后者則是針對服務(wù)端的配置文件。兩個(gè)配置文件都允許你通過設(shè)置不同的選項(xiàng)來改變客戶端程序的運(yùn)行方式。sshd_config的配置一般都比較熟悉,下面單獨(dú)說下ssh_config針對客戶端的配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | [root@dns01 dns_rsync] # cat /etc/ssh/ssh_config
# Site-wide defaults for various options
Host *
ForwardAgent no
ForwardX11 no
RhostsAuthentication no
RhostsRSAAuthentication no
? RSAAuthentication yes
PasswordAuthentication yes
FallBackToRsh no
UseRsh no
BatchMode no
CheckHostIP yes
StrictHostKeyChecking no
IdentityFile ~/. ssh /identity
Port 22
Cipher blowfish
EscapeChar ~
下面對上述選項(xiàng)參數(shù)逐進(jìn)行解釋:
# Site-wide defaults for various options
帶“ #”表示該句為注釋不起作,該句不屬于配置文件原文,意在說明下面選項(xiàng)均為系統(tǒng)初始默認(rèn)的選項(xiàng)。說明一下,實(shí)際配置文件中也有很多選項(xiàng)前面加有“#”注釋,雖然表示不起作用,其實(shí)是說明此為系統(tǒng)默認(rèn)的初始化設(shè)置。
Host *
'Host' 只對匹配后面字串的計(jì)算機(jī)有效,“*”表示所有的計(jì)算機(jī)。從該項(xiàng)格式前置一些可以看出,這是一個(gè)類似于全局的選項(xiàng),表示下面縮進(jìn)的選項(xiàng)都適用于該設(shè)置,可以指定某計(jì)算機(jī)替換*號使下面選項(xiàng)只針對該算機(jī)器生效。
ForwardAgent no
'ForwardAgent' 設(shè)置連接是否經(jīng)過驗(yàn)證代理(如果存在)轉(zhuǎn)發(fā)給遠(yuǎn)程計(jì)算機(jī)。
ForwardX11 no
'ForwardX11' 設(shè)置X11連接是否被自動(dòng)重定向到安全的通道和顯示集(DISPLAY set )。
RhostsAuthentication no
'RhostsAuthentication' 設(shè)置是否使用基于rhosts的安全驗(yàn)證。
RhostsRSAAuthentication no
'RhostsRSAAuthentication' 設(shè)置是否使用用RSA算法的基于rhosts的安全驗(yàn)證。
RSAAuthentication yes
'RSAAuthentication' 設(shè)置是否使用RSA算法進(jìn)行安全驗(yàn)證。
PasswordAuthentication yes
'PasswordAuthentication' 設(shè)置是否使用口令驗(yàn)證。
FallBackToRsh no
'FallBackToRsh' 設(shè)置如果用 ssh 連接出現(xiàn)錯(cuò)誤是否自動(dòng)使用rsh,由于rsh并不安全,所以此選項(xiàng)應(yīng)當(dāng)設(shè)置為 'no' 。
UseRsh no
'UseRsh' 設(shè)置是否在這臺計(jì)算機(jī)上使用 'rlogin/rsh' ,原因同上,設(shè)為 'no' 。
BatchMode no
'BatchMode' :批處理模式,一般設(shè)為 'no' ;如果設(shè)為 'yes' ,交互式輸入口令的提示將被禁止,這個(gè)選項(xiàng)對腳本文件和批處理任務(wù)十分有用。
CheckHostIP yes
'CheckHostIP' 設(shè)置 ssh 是否查看連接到服務(wù)器的主機(jī)的IP地址以防止DNS欺騙。建議設(shè)置為 'yes' 。
StrictHostKeyChecking no
'StrictHostKeyChecking' 如果設(shè)為 'yes' , ssh 將不會自動(dòng)把計(jì)算機(jī)的密匙加入 '$HOME/.ssh/known_hosts' 文件,且一旦計(jì)算機(jī)的密匙發(fā)生了變化,就拒絕連接。
IdentityFile ~/. ssh /identity
'IdentityFile' 設(shè)置讀取用戶的RSA安全驗(yàn)證標(biāo)識。
Port 22
'Port' 設(shè)置連接到遠(yuǎn)程主機(jī)的端口, ssh 默認(rèn)端口為22。
Cipher blowfish
“Cipher”設(shè)置加密用的密鑰,blowfish可以自己隨意設(shè)置。
EscapeChar ~
“EscapeChar”設(shè)置escape字符。<br>
=================================================================================
比如說,A機(jī)器的 ssh 端口是22,B機(jī)器的端口是22222,一般來說A機(jī)器 ssh 連接B機(jī)器的時(shí)候是使用-p22222指定端口。但是可以修改A機(jī)器的 /etc/ssh/ssh_config 文件中的
Port為22222,這樣A機(jī)器 ssh 連接的時(shí)候就默認(rèn)使用22222端口了。
|
######## 去掉SSH公鑰檢查的方法(交互式y(tǒng)es/no)########
SSH公鑰檢查是一個(gè)重要的安全機(jī)制,可以防范中間人劫持等黑客攻擊。但是在特定情況下,嚴(yán)格的 SSH 公鑰檢查會破壞一些依賴SSH協(xié)議的自動(dòng)化任務(wù),就需要一種手段能夠繞過SSH的公鑰檢查。 SSH連接遠(yuǎn)程主機(jī)時(shí),會檢查主機(jī)的公鑰。如果是第一次連接該主機(jī),會顯示該主機(jī)的公鑰摘要,彈出公鑰確認(rèn)的提示,提示用戶是否信任該主機(jī)(Yes/no)。當(dāng)選擇Yes接受,就會將該主機(jī)的公鑰追加到文件 ~/.ssh/known_hosts 中。當(dāng)再次連接該主機(jī)時(shí),就不會再提示該問題了。 SSH公鑰檢查有好處,但首次連接時(shí)會導(dǎo)致某些自動(dòng)化任務(wù)中斷,或者由于 ~/.ssh/known_hosts 文件內(nèi)容清空,導(dǎo)致自動(dòng)化任務(wù)中斷。
去掉SSH公鑰檢查的方法: 1)SSH客戶端的StrictHostKeyChecking 配置指令,可以實(shí)現(xiàn)當(dāng)?shù)谝淮芜B接服務(wù)器時(shí),自動(dòng)接受新的公鑰。只需要修改 /etc/ssh/ssh_config 文件,包含下列語句: StrictHostKeyChecking no
2)或者在ssh連接命令中使用-oStrictHostKeyChecking=no參數(shù) [root@puppet ~]# ssh -p22222 172.168.1.33 -oStrictHostKeyChecking=no 或者 [root@puppet ~]# ssh -p22222 172.168.1.33 -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no
######## ssh 登陸忽略known_hosts文件 ######## 使用ssh登錄遠(yuǎn)程機(jī)器,同時(shí)會把ssh信息記錄在本地的~/.ssh/known_hsots文件中。如果出現(xiàn)ssh沖突了,需要手動(dòng)刪除或修改known_hsots里面對應(yīng)遠(yuǎn)程機(jī)器的ssh信息。那么如果忽略掉這個(gè)known_hosts的訪問? 操作如下: 1)修改/etc/ssh/sshd_config 配置文件中的選項(xiàng) IgnoreUserKnownHosts 改成 yes,重啟sshd服務(wù)即可。 2)如果還是不行,就在/etc/ssh/sshd_config 配置文件中再加入一下幾行,然后再重啟sshd服務(wù)。 StrictHostKeyChecking no UserKnownHostsFile /dev/null
######## ansible中取消ssh交換式y(tǒng)es/no ######## 配置文件/etc/ansible/ansible.cfg的 [defaults] 中(打開注釋) # uncomment this to disable SSH key host checking host_key_checking = False
######## ssh只允許使用key登錄, 禁止使用密碼登錄 ######## 1) 生產(chǎn)公私鑰文件 # ssh-keygen -t rsa 上面命令一路回車, 此時(shí)在/root/.ssh/目錄下生成了2個(gè)文件,id_rsa為私鑰,id_rsa.pub為公鑰。 私鑰自己下載到本地電腦妥善保存(丟了服務(wù)器可就沒法再登陸了),為安全,建議刪除服務(wù)器端的私鑰。公鑰則可以任意公開。
使用以下命令將公鑰導(dǎo)入到系統(tǒng)中: # cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
2) 修改SSH的配置文件/etc/ssh/sshd_config # vim /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
#默認(rèn)PasswordAuthentication 為yes,即允許密碼登錄,改為no后,禁止密碼登錄 PasswordAuthentication no
3) 重啟SSH服務(wù) # /etc/init.d/sshd restart
4) 使用私鑰登錄xshell或securecrt客戶端了
######## SSH服務(wù)啟動(dòng)報(bào)錯(cuò)案例 ######## 在某臺服務(wù)器上部署了sftp服務(wù),最后發(fā)現(xiàn)sftp遠(yuǎn)程登錄正常,但是ssh遠(yuǎn)程登錄失?。ūM管已經(jīng)輸入了正確的用戶名和密碼)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@kevin ssh ] # service sshd restart
Stopping sshd: [ OK ]
Starting sshd: /etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
Starting sshd: [ OK ]
如上啟動(dòng)后,遠(yuǎn)程 ssh 登錄這臺機(jī)器,輸入正確的用戶名和密碼,則會登錄失敗??!
[root@kevin ssh ] # ssh -V
OpenSSH_7.6p1, OpenSSL 1.0.1e-fips 11 Feb 2013
原因是新版本的openssh不支持以上參數(shù),需要修改sshd的配置文件。
修改內(nèi)容如下,否則還是無法通過 ssh 登錄這臺服務(wù)器:
[root@kevin ssh ] # vim /etc/ssh/sshd_config
.......
##去掉前面的注釋,允許root通過ssh登錄
PermitRootLogin yes
##注釋掉下面三個(gè)參數(shù)
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
#UsePAM yes
再次重啟 ssh ,上面的報(bào)錯(cuò)信息就沒有了。此時(shí)遠(yuǎn)程 ssh 登錄就OK了!
[root@kevin ssh ] # service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
|
######## SSH連接超時(shí)時(shí)間(timed out)設(shè)置 ########
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 1)使用下面命令連接,可以減少 ssh 連接超時(shí)等待的時(shí)間
# ssh -o ConnectTimeout=5 -p22 root@172.16.60.20
或者修改sshd_config文件里面的UseDNS 選項(xiàng),改為UseDNS no
2)設(shè)置SSH超時(shí)時(shí)間的方法
# vim /root/.bash_profile
export TMOUT=1000000 #以秒為單位。或者修改/etc/profile文件也可以。
# source /root/.bash_profile
# vim /etc/ssh/sshd_config
ClientAliveInterval=60
# service sshd restart
意思是每過一分鐘,sshd都會和 ssh client打個(gè)招呼 (即服務(wù)器端給客戶端發(fā)送一個(gè) '空包' ),檢測它是否存在,如果不存時(shí)則斷開連接!
這里需要注意: 設(shè)置完成后,要退出 ssh 遠(yuǎn)程連接,再次登錄后才可以生效。因?yàn)橐僮x取一次~ /bash_profile 文件。
總結(jié):
在ClientAliveInterval( /etc/ssh/sshd_config )、環(huán)境變量TMOUT(在 /etc/profile 或.bash_profile中設(shè)置)以及putty的 'Seconds between keepalives' (默認(rèn)為0)這些設(shè)置方法中,
經(jīng)檢測驗(yàn)證,只有TMOUT可以控制 ssh 連接在空閑時(shí)間超時(shí),自動(dòng)斷開連接的時(shí)間,數(shù)字單位為 '秒' 。在設(shè)置了TMOUT后(非0),另外兩個(gè)變量則不起作用的。
另外,特別提醒的是,設(shè)置好 ssh 的登錄超時(shí)時(shí)間以后,記得退出重新登錄或重啟系統(tǒng),以使配置生效。
3)SSH禁止超時(shí)設(shè)置
SSH默認(rèn)過一段時(shí)間會超時(shí),有時(shí)候正在執(zhí)行著腳本,出去一會回來就斷開了,輸出信息都看不到了,很是無奈!
其實(shí)禁止SSH自動(dòng)超時(shí)最簡單的辦法就是:每隔一段時(shí)間在客戶端和服務(wù)器之間發(fā)送一個(gè) '空包' !?。。?!
至于到底是從客戶端發(fā)給服務(wù)器,還是服務(wù)器發(fā)給客戶端其實(shí)都不重要,重要的是需要它們之間要有通信。
下面介紹兩種阻止SSH連接超時(shí)的方法(推薦方法二):
方法一:客戶端阻止SSH超時(shí)
編輯本地的SSH配置文件:~/. ssh /config
# vim ~/.ssh/config
ServerAliveInterval 120
這個(gè)設(shè)置會讓客服端機(jī)器在使用SSH連接服務(wù)器時(shí),每隔120秒給服務(wù)器發(fā)送一個(gè) '空包' ,保持它們之間的連接。
方法二:服務(wù)器端阻止SSH超時(shí)
如果有服務(wù)器端的root權(quán)限,可以在服務(wù)端進(jìn)行配置,這樣就不需要每個(gè)客戶端都單獨(dú)配置。
# vim /etc/ssh/sshd_config
ClientAliveInterval 120
ClientAliveCountMax 720
第一行,表示每隔120秒向客戶端發(fā)送一個(gè) '空包' ,以保持于客戶端的連接。
第二行,表示總共發(fā)送720次 '空包' ,之后斷開它們之間的連接,也就是:120秒 × 720 = 86400 秒 = 24小時(shí) 后。
最后重啟sshd服務(wù),再打開新終端進(jìn)行 ssh 連接就可以了,在24小時(shí)內(nèi)不會出現(xiàn)連接超時(shí)。
# /etc/init.d/ssh restart
|
######## SSH公鑰下發(fā)無效 ######## ssh的.pub公鑰已經(jīng)拷貝到遠(yuǎn)程主機(jī)的.ssh/authorized_keys文件里,但是ssh跳轉(zhuǎn)時(shí),仍然要輸入密碼!!即公鑰下發(fā)后,ssh信任關(guān)系沒有生效!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 解決辦法:
1)遠(yuǎn)程主機(jī)對應(yīng)用戶家目錄下的. ssh 目錄必須是700或755權(quán)限,絕不能是775或777權(quán)限!即只對該用戶有寫權(quán)限!(一般設(shè)置700權(quán)限)
2)遠(yuǎn)程主機(jī)對應(yīng)用戶家目錄下的. ssh /authorized_keys 文件權(quán)限必須是600權(quán)限!即只對該用戶有寫權(quán)限!(一般設(shè)置600權(quán)限)
3)遠(yuǎn)程主機(jī)對應(yīng)用戶家目錄的權(quán)限必須是700或755權(quán)限,絕不能是775或777權(quán)限!即只對該用戶有寫權(quán)限!(一般設(shè)置700權(quán)限),大多數(shù)情況下都是由于這個(gè)原因?qū)е碌模。。?/code>
如果. ssh 目錄和. ssh /authorized_keys 文件權(quán)限對別的用戶有寫權(quán)限,則就會導(dǎo)致 ssh 認(rèn)證失敗!
=====================================================================================================
例如在一次ansible自動(dòng)化部署中,之前配置好的 ssh 信任關(guān)系失效,報(bào)錯(cuò)如下:
{ 'changed' : false , 'msg' : 'SSH Error: data could not be sent to remote host \'172.16.60.240\'. Make sure this host can be reached over ssh' , 'unreachable' : true }
查看現(xiàn)象,發(fā)現(xiàn)之前配置好的 ssh 信任關(guān)系失效了?。?/code>
[root@bz3devjenci1002 lx0319] # ssh -p22 kevin@172.16.60.240
Authorized only. All activity will be monitored and reported
kevin@172.16.60.240's password:
分析原因及解決辦法:
登錄172.16.60.240這臺機(jī)器的kevin用戶下,發(fā)現(xiàn)authorized_keys文件里確實(shí)已經(jīng)傳入了ansible主節(jié)點(diǎn)的id_rsa.pub公鑰內(nèi)容,并且下面兩個(gè)權(quán)限都正確:
[kevin@bz4autestap1002 ~]$ ll -d . ssh
drwx------ 2 kevin kevin 4096 Jul 24 10:48 . ssh #700權(quán)限是正確的
[kevin@bz4autestap1002 ~]$ ll . ssh /authorized_keys
-rw------- 1 kevin kevin 2412 Jul 24 10:45 . ssh /authorized_keys #600權(quán)限也是正確的
然后查看kevin用戶目錄權(quán)限,發(fā)現(xiàn)是777!這才是問題根源!該用戶目錄權(quán)限不能對別的用戶有寫權(quán)限,否則會造成 ssh 認(rèn)證失?。?/code>
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwxrwxrwx 14 kevin kevin 4096 Jul 24 10:48 /home/kevin
修改為600權(quán)限即可
[kevin@bz4autestap1002 ~]$ chmod 600 /home/kevin
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwx------ 14 kevin kevin 4096 Jul 24 10:48 /home/kevin
再次在遠(yuǎn)程嘗試 ssh 認(rèn)證跳轉(zhuǎn)
[root@bz3devjenci1002 lx0319] # ssh -p22 kevin@172.16.60.240
[kevin@bz4autestap1002 ~]$
|
######## Centos7修改ssh默認(rèn)端口的方法 ########
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | CentOS 7 對于防火墻這一塊的設(shè)置有一定的修改,修改 ssh 端口后,必須關(guān)閉防火墻和selinux之后才能正常重啟sshd服務(wù),否則啟動(dòng)失敗。操作記錄如下:
1)修改 /etc/ssh/sshd_config #這個(gè)是修改ssh服務(wù)端配置文件。
[root@k8s-master01 ~] # vim /etc/ssh/sshd_config
.........
#Port 22 #這行最好去掉#號,防止配置失效以后不能遠(yuǎn)程登錄,還得去機(jī)房修改,等修改以后的端口能使用以后在注釋掉
Port 6666 #下面添加這一行
[root@k8s-master01 ~] # vim /etc/ssh/ssh_config #這個(gè)是修改ssh客戶端配置文件,一般可以不用修改。
........
# Port 22
Port 6666
======================================================================================================
ssh 客戶端配置文件使用場景:
比如A機(jī)器的 /etc/ssh/ssh_config 客戶端配置文件的 ssh 端口是22,B機(jī)器的 /etc/ssh/sshd_config 服務(wù)端配置文件是6666
那么A機(jī)器 ssh 連接B機(jī)器時(shí)就要帶上 '-p6666' , 如果A機(jī)器的 ssh 客戶端配置文件的端口也是6666的話,就可以直接 ssh 連接B機(jī)器了。
======================================================================================================
2)要關(guān)閉防火墻和selinux。否則,centos7修改 ssh 端口后會啟動(dòng)sshd服務(wù)失?。∫欢ㄒ⒁膺@個(gè)!
[root@k8s-master01 ~] # systemctl disable firewalld
[root@k8s-master01 ~] # systemctl stop firewalld
[root@k8s-master01 ~] # firewall-cmd --state
not running
[root@k8s-master01 ~] # cat /etc/sysconfig/selinux
.......
SELINUX=disabled
[root@k8s-master01 ~] # setenforce 0
[root@k8s-master01 ~] # getenforce
Disabled
這樣,在修改 ssh 端口后,就能順利啟動(dòng)sshd服務(wù)了!
======================================================================================================
這里還需要注意下:如果是打開了防火墻或selinux,則需要將修改的sshd端口添加到對應(yīng)的防火墻規(guī)則中(默認(rèn)只加了 ssh 的22端口)
a)firewalld配置
添加到防火墻:
# firewall-cmd --zone=public --add-port=6666/tcp --permanent (permanent是保存配置,不然下次重啟以后這次修改無效)
重啟:
#firewall-cmd --reload
查看添加端口是否成功,如果添加成功則會顯示 yes ,否則no
# firewall-cmd --zone=public --query-port=6666/tcp
b)selinux配置
使用以下命令查看當(dāng)前SElinux 允許的 ssh 端口:
# semanage port -l | grep ssh
添加6666端口到 SELinux
# semanage port -a -t ssh_port_t -p tcp 6666
然后確認(rèn)一下是否添加進(jìn)去
# semanage port -l | grep ssh
如果成功會輸出
ssh_port_t tcp 6666, 22
c)然后就可以順利啟動(dòng)sshd服務(wù)了。
|
|