關註上方 浩道Linux ,回復 資料 ,即可獲取海量 L inux 、 Python 、 網路通訊、網路安全 等學習資料!
前言
大家好,這裏是 浩道Linux ,主要給大家分享 L inux 、 P ython 、 網路通訊、網路安全等 相關的IT知識平台。
今天浩道跟大家分享一個技術群裏,一位群友自己搗鼓半天關於Linux系統ssh登入的問題,最後也沒能解決。我大概看了下他問題,都是一些比較基礎簡單的排錯,但是卻沒有自己去尋找相關報錯資訊。本文將給大家分享關於ssh運維相關的一些報錯問題匯總以及解決方法,希望可以讓大家少走彎路!
文章來源:https://www.cnblogs.com/kevingrace/p/6110842.html
對於linux運維工作者而言,使用ssh遠端遠端伺服器是再熟悉不過的了!對於ssh的一些嚴格設定也關系到伺服器的安全維護,今天在此,就本人工作中使用ssh的經驗而言,做一些總結記錄來下。
-bash: ssh: command not found
解決辦法:"yum install -y openssh-server openssh-clinets"
1. ssh登入時提示: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遠端登陸後的提示資訊
我們經常會使用中控機ssh信任跳轉到其他機器上,但是不知道有沒有運維朋友註意到ssh跳轉成功後的終端顯示的提示資訊?
這些提示資訊,是為了方便我們在第一時間知道ssh跳轉到哪台目標機上,也是為了避免長期頻繁跳轉後由於大意造成的誤入機器操作的風險,我們通常會在ssh跳轉到目標機器後顯示一些提示資訊,
在一些國家, 登入給定系統前, 給出未經授權或者使用者監視警告資訊, 將會受到法律的保護
.如下:
[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監控機
===================================
那麽上面的提醒資訊是在哪設定的呢?
做法一:其實很簡單,這些資訊是在目標機器的/etc/motd檔裏自訂的
[root@monit-server ~]# cat /etc/motd
===================================
|||||||||||||||||||||||||||||||||||
===================================
HOSTNAME: monit-server
IPADDRES: 192.168.1.15
===================================
IDC監控機
===================================
做法二:在目標機器的/etc/ssh/sshd_config檔裏定義,然後重新開機sshd服務即可。這兩種做法是一致的效果!
Banner /etc/sshfile
[root@host-192-168-1-117 ~]# cat /etc/sshfile
this is 192.168.1.117
遠端登陸:
[root@linux-node2 ~]# ssh 192.168.1.117
this is 192.168.1.117
[root@host-192-168-1-117 ~]#
3. 實作SSH無密碼登入:使用ssh-keygen和ssh-copy-id
ssh-keygen 產生公鑰與私鑰對.
ssh-copy-id 將本機的公鑰復制到遠端機器的authorized_keys檔中,ssh-copy-id也能讓你有到遠端機器的/home/username/.ssh和~/.ssh/authorized_keys的權利.
操作記錄:
1)第一步:在本地機器上使用ssh-keygen產生公鑰私鑰對
#ssh-keygen -t rsa //一路預設回車
這樣就會在當前使用者家目錄下的.ssh目錄裏產生公鑰和私鑰檔:id_rsa.pub、id_rsa。可以將id_rsa.pub公鑰檔復制成authorized_keys
2)第二步:可以手動將本機的id_rsa.pub公鑰檔內容復制到遠端目標機的.ssh/authorized_keys檔中,可以就可以實作ssh無密碼登陸。
當然,也可以在本機直接使用ssh-copy-id將公鑰復制到遠端機器中
#ssh-copy-id -i /root/.ssh/id_rsa.pub user@ip [把本機的公鑰拷貝到遠端機器上,比如B機器]
也可以不加公鑰路徑,會預設加上
#ssh-copy-id user@ip
註意:
ssh-copy-id 將key寫到遠端機器的 ~/ .ssh/authorized_key.檔(檔會自動建立)中
對於非22埠(比如22222)情況下的ssh-copy-id的使用,需要這樣用:
# ssh-copy-id -i /root/.ssh/id_rsa.pub '-p 22222 [email protected]'
3)這樣,本機登入到上面遠端機器(B機器)就不用輸入密碼
#ssh user@ip
4. ssh登入失敗,報錯:Pseudo-terminal will not be allocated because stdin
現象:
需要登入線上的一台目標機器A,但是不能直接登入(沒有登入許可權),需要先登入B機器,然後從B機器跳轉到A機器。
指令碼如下:
localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh [email protected] "ssh -p25791 [email protected]"
但是在執行指令碼的時候報錯如下:
Pseudo-terminal will not be allocated because stdin
原因:
偽終端將無法分配,因為標準輸入不是終端。
解決辦法:
需要增加-t -t參數來強制偽終端分配,即使標準輸入不是終端。
在指令碼裏添加-t -t參數即可,如下:
localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh [email protected] "ssh -t -t -p25791 [email protected]"
或者
localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh -t [email protected] "ssh -t -t -p25791 [email protected]"
5. ssh遠端登陸緩慢問題
解決辦法:
編譯/etc/ssh/sshd_config配置檔:
UseDNS no
GSSAPIAuthentication no
然後重新開機sshd服務即可!
6. ssh登入出現:permission denied(publickey.gssapi-with-mic)
解決方法:
修改/etc/ssh/sshd-config檔,將其中的:
PermitRootLogin no修改為yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys前面加上#遮蔽掉
PasswordAuthentication no修改為yes
最後重新開機sshd服務即可!
7. ssh連線錯誤問題
1) 在使用ssh或scp或rsync遠端連線的時候,出現如下報錯:
Address **** maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
解決方法:
修改本機ssh_config檔
[root@kvmserver ~]# vim /etc/ssh/ssh_config
GSSAPIAuthentication no
[root@kvmserver ~]#/etc/init.d/sshd restart
問題迎刃而解~~
2) 本機scp、rsync命令都已具備,但是在使用scp或rsync遠端同步的時候報錯:
bash: scp: command not found
bash: rsync: command not found
原因:是由於遠端機器上沒有安裝scp或rsync造成的!安裝這兩個命令即可~
yum install openssh-clients
yum install rsync
3)遠端ssh連線時錯誤「 The X11 forwarding request was rejected!」
解決方法:
將sshd_config中 設定 X11Forwarding yes
重新開機sshd服務。
8. ssh連線超時被踢出問題
當使用xshell,SecureCRT等客戶端存取linux伺服器,有時候會出現終端定期超時被踢出的情況。
下面介紹三種方法來防止超時被踢出的方法,後兩種情況的設定方法以及透過設定shell變量來達到此目的的方法:
1、 配置伺服器
# vim /etc/ssh/sshd_config
1)找到 ClientAliveInterval參數,如果沒有就自己加一行
數值是秒,比如你設定為120 ,則是2分鐘
ClientAliveInterval 120
2)ClientAliveCountMax
指如果發現客戶端沒有響應,則判斷一次超時,這個參數設定允許超時的次數。如3 、5等自訂
修改兩項參數後如下:
----------------------------
ClientAliveInterval 120
ClientAliveCountMax 3
//0 不允許超時次數
修改/etc/ssh/sshd_config檔,將 ClientAliveInterval 0和ClientAliveCountMax 3的註釋符號去掉,將ClientAliveInterval對應的0改成60,沒有就自己輸入。
ClientAliveInterval指定了伺服器端向客戶端請求訊息的時間間隔, 預設是0,不發送.而ClientAliveInterval 60表示每分鐘發送一次, 然後客戶端響應, 這樣就保持長連線了.ClientAliveCountMax, 使用預設值3即可.ClientAliveCountMax表示伺服器發出請求後客戶端沒有響應的次數達到一定值, 就自動斷開. 正常情況下, 客戶端不會不響應.
重新載入sshd服務。結束客戶端,再次登陸即可驗證。
3)重新開機sshd service
# /etc/init.d/ssh restart
2、 配置客戶端
#vim /etc/ssh/ssh_config
然後找到裏面的
ServerAliveInterval
參數,如果沒有你同樣自己加一個就好了
參數意義相同,都是秒數,比如5分鐘等
ServerAliveInterval 300
3、# echo export TMOUT=1000000 >> /root/.bash_profile; source .bash_profile
在Linux 終端的shell環境中透過設定環境變量TMOUT來阻止超時。如果顯示空白,表示沒有設定, 等於使用預設值0, 一般情況下應該是不超時. 如果大於0, 可以在如/etc/profile之類檔中設定它為0.
9. ssh遠端登陸,公鑰授權不透過:Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
公司
IDC機房
伺服器,之前做了彈板機環境,其他機器只允許從彈板機ssh無密碼信任過去,並且在信任關系做好後,禁用了其他機器的密碼登陸功能(sshd_config檔裏設定「PermitEmptyPasswords no」)
後來彈板機出現了問題,打算重裝這台機器,重裝前取消了其他機器裏只允許彈板機ssh信任關系,並且恢復了密碼登陸功能:
[root@bastion-IDC ssh]# vim /etc/ssh/sshd_config
PermitEmptyPasswords yes
[root@bastion-IDC ssh]# service sshd restart
修改後,當時在其他機器間是可以ssh相互登陸,當時沒在意,以為一切ok了。
可是,到了第二天,再次ssh登陸時,尼瑪,居然報錯了~~
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
最後發現是selinux惹的禍!關閉它即可。
1)臨時關閉selinux
[root@bastion-IDC ssh]# setenforce 0
[root@bastion-IDC ssh]# getenforce
Permissive
2)永久關閉
[root@bastion-IDC ssh]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@bastion-IDC ssh]# reboot #重新開機系統才能生效
說明:
1)ssh可同時支持publickey和password兩種授權方式,publickey預設不開啟,需要配置為yes。
如果客戶端不存在.ssh/id_rsa,則使用password授權;存在則使用publickey授權;如果publickey授權失敗,依然會繼續使用password授權。
2)GSSAPI身份驗證.
GSSAPIAuthentication 是否允許使用基於 GSSAPI 的使用者認證.預設值為"no".僅用於SSH-2.
GSSAPICleanupCredentials 是否在使用者結束登入後自動銷毀使用者憑證緩存。預設值是"yes".僅用於SSH-2.
需要特別註意的是:
GSSAPI是公共安全事務應用程式介面(GSS-API)
公共安全事務應用程式介面以一種統一的模式為使用者提供安全事務,由於它支持最基本的機制和技術,所以保證不同的套用環境下的可移植性.
該規範定義了GSS-API事務和基本元素,並獨立於基本的機制和程式設計語言環境,並借助於其它相關的文件規範實作.
如果我們在伺服端開啟GSSAPIAuthentication配置項,如下:
[root@server ~]#vim /etc/ssh/sshd_config
........
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
那麽在客戶端登入伺服端會用gssapi-keyex,gssapi-with-mic進行身份校驗,同樣客戶端也要支持這種身份驗證,如下:
[root@client ~]#vim /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
我們在客戶端連線SSH伺服端,如下:
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登入時采用GSSAPI的方式進行身份驗證,但我們的系統不支持.
最後如果我們不用這種方式進行身份驗證的話,建議關閉這個選項,這樣可以提高驗證時的速度.
10. ssh自訂安全設定
1) 為了ssh登陸的時候加一層保護,可以修改預設埠。修改ssh服務配置檔/etc/ssh/sshd_config
port 2222
這樣遠端連線時加短褲
#ssh 192.168.1.83 -p 2222
2) ssh使用時加-l後面跟使用者名稱,表示登陸到對方的這個使用者下面。
#ssh -l wangshibo 192.168.1.83 -p 2222
等同於
#ssh [email protected] -p 2222
3) 限制ssh登陸的來源ip,白名單設定
(hosts.allow優先級最高,具體參考:
Linux伺服器安全登入設定記錄
)
一是透過iptables設定ssh埠的白名單,如下設定只允許192.168.1.0/24網段的客戶機可以遠端連線本機
#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裏面進行限制(如下),/etc/hosts.deny檔不要任何內容編輯,保持預設!
#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使用者登入;
只允許幾個指定的使用者登入(比如wangshibo、guohuihui、liuxing使用者)
禁止某些指定的使用者登入(比如zhangda,liqin使用者)
但是要註意:設定的這幾個使用者必須同時存在於本機和對方機器上
修改ssh服務配置檔/etc/ssh/sshd_config
PermitRootLogin no //將yes修改為no
AllowUsers wangshibo guohuihui liuxing //這個參數AllowUsers如果不存在,需要手動建立,使用者之間空格隔開
DenyUsers zhagnda liqin //這個參數DenyUsers如果不存在,需要手動建立,使用者之間空格隔開
也可以設定僅允許某個組的成員透過ssh存取主機。
AllowGroups wheel ops
例項說明:
1)只允許指定使用者進行登入(白名單):
在 /etc/ssh/sshd_config 配置檔中設定 AllowUsers 選項。格式如下:
AllowUsers root grace kevin app
表示只允許grace使用者、kevin使用者透過ssh登入本機。
AllowUsers [email protected] [email protected] [email protected]
表示只允許從192.168.10.10登入的root使用者、從192.168.10.11登入的app使用者、從192.168.10.13登入的kevin使用者可以透過ssh登入本機。
2)只拒絕指定使用者進行登入(黑名單):)
在/etc/ssh/sshd_config配置檔中設定DenyUsers選項。格式如下:
DenyUsers wangbo linan zhangyang
表示拒絕wangbo、linan和zhangyang使用者透過ssh登入本機。
需要註意的是:
- AllowUsers、DenyUsers跟後面的配置之間使用TAB鍵進行隔開
- 多個百名單或黑名單之間使用空格隔開
例子:
[root@Centos6 ~]# cat /etc/ssh/sshd_config
.......
AllowUsers [email protected] [email protected] [email protected]
[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
如下,由於已經允許了app和root登入,則後面針對[email protected]和[email protected]的限制就無效了(兩者別放在一起配置)
[root@Centos6 ~]# cat /etc/ssh/sshd_config
.......
AllowUsers app root [email protected] [email protected]
[root@Centos6 ~]# /etc/init.d/sshd restart
######## 還可以使用pam規則限制ssh登入 ########
1)允許指定的使用者(比如kevin、grace帳號)進行登入
在/etc/pam.d/sshd檔第一行加入,一定要在第一行,因為規則是自上而下進行匹配的。
auth required pam_listfile.so item=user sense=allow file=/etc/sshusers onerr=fail
然後在/etc下建立sshusers檔,編輯這個檔,加入你允許使用ssh服務的使用者名稱,不用重新啟動sshd服務。
最後重新開機sshd服務即可!
操作如下:
[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規則也可以寫成deny的。比如拒絕kevin、grace帳號進行登入
操作如下:
[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規則可以使用group限制。
允許規則:
auth required pam_listfile.so item=group sense=allow file=/etc/security/allow_groups onerr=fail
禁止規則:
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
新建一個組,組名為bobo,然後將kevin和grace添加到這個bobo組內
[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
如上設定後,則只有kevin使用者能被允許登入!
如果是禁止規則,則第一行改為下面內容:
auth required pam_listfile.so item=group sense=deny file=/etc/security/deny_groups onerr=succeed
除此之外,禁止某些使用者ssh登入,可以 使用passwd或usermod命令進行帳號釘選
5)取消密碼驗證,只用金鑰對驗證
修改ssh服務配置檔/etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
6)給帳號設定強壯的密碼:將密碼保存到文本進行復制和粘帖就可以了
# yum -y install expect
# mkpasswd -l 128 -d 8 -C 15 -s 10
lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx>iHikTagiVz0$cMtqOcIypkpd,vvD*kJhs3q@sb:CiCqgtqdqvse5lssfmranbtx
參數說明:
-l 密碼長度
-d 多少個數位
-C 大寫字母個數
-s 特殊符號的個數
7)只允許透過指定的網路介面來存取SSH服務,(如果本伺服器有多個IP的時候)
仍然是修改/etc/ssh/sshd_config,如下:
ListenAddress 192.168.1.15
//預設監聽的是0.0.0.0
這樣,就只允許遠端機器透過ssh連線本機的192.168.1.15內網ip來進行登陸了。
8)禁止空密碼登入
如果本機系統有些帳號沒有設定密碼,而ssh配置檔裏又沒做限制,那麽遠端透過這個空密碼帳號就可以登陸了,這是及其不安全的!
所以一定要禁止空密碼登陸。修改/etc/ssh/sshd_config,如下:
PermitEmptyPasswords no //這一項,預設就是禁用空密碼登陸
9) ssh_config和sshd_config
ssh_config和sshd_config都是ssh伺服器的配置檔,二者區別在於,前者是針對客戶端的配置檔,後者則是針對伺服端的配置檔。兩個配置檔都允許你透過設定不同的選項來改變客戶端程式的執行方式。sshd_config的配置一般都比較熟悉,下面單獨說下ssh_config針對客戶端的配置檔:
[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 ~
下面對上述選項參數逐進行解釋:
# Site-wide defaults for various options
帶「#」表示該句為註釋不起作,該句不屬於配置檔原文,意在說明下面選項均為系統初始預設的選項。說明一下,實際配置檔中也有很多選項前面加有「#」註釋,雖然表示不起作用,其實是說明此為系統預設的初始化設定。
Host *
"Host"只對匹配後面字串的電腦有效,「*」表示所有的電腦。從該項格式前置一些可以看出,這是一個類似於全域的選項,表示下面縮排的選項都適用於該設定,可以指定某電腦替換*號使下面選項只針對該算機器生效。
ForwardAgent no
"ForwardAgent"設定連線是否經過驗證代理(如果存在)轉發給遠端電腦。
ForwardX11 no
"ForwardX11"設定X11連線是否被自動重新導向到安全的通道和顯示集(DISPLAY set)。
RhostsAuthentication no
"RhostsAuthentication"設定是否使用基於rhosts的安全驗證。
RhostsRSAAuthentication no
"RhostsRSAAuthentication"設定是否使用用RSA演算法的基於rhosts的安全驗證。
RSAAuthentication yes
"RSAAuthentication"設定是否使用RSA演算法進行安全驗證。
PasswordAuthentication yes
"PasswordAuthentication"設定是否使用口令驗證。
FallBackToRsh no
"FallBackToRsh"設定如果用ssh連線出現錯誤是否自動使用rsh,由於rsh並不安全,所以此選項應當設定為"no"。
UseRsh no
"UseRsh"設定是否在這台電腦上使用"rlogin/rsh",原因同上,設為"no"。
BatchMode no
"BatchMode":批次處理模式,一般設為"no";如果設為"yes",互動式輸入口令的提示將被禁止,這個選項對指令碼檔和批次處理任務十分有用。
CheckHostIP yes
"CheckHostIP"設定ssh是否檢視連線到伺服器的主機的IP地址以防止DNS欺騙。建議設定為"yes"。
StrictHostKeyChecking no
"StrictHostKeyChecking"如果設為"yes",ssh將不會自動把電腦的密匙加入"$HOME/.ssh/known_hosts"檔,且一旦電腦的密匙發生了變化,就拒絕連線。
IdentityFile ~/.ssh/identity
"IdentityFile"設定讀取使用者的RSA安全驗證標識。
Port 22
"Port"設定連線到遠端主機的埠,ssh預設埠為22。
Cipher blowfish
「Cipher」設定加密用的金鑰,blowfish可以自己隨意設定。
EscapeChar ~
「EscapeChar」設定escape字元。<br>
=================================================================================
比如說,A機器的ssh埠是22,B機器的埠是22222,一般來說A機器ssh連線B機器的時候是使用-p22222指定埠。但是可以修改A機器的/etc/ssh/ssh_config檔中的
Port為22222,這樣A機器ssh連線的時候就預設使用22222埠了。
######## 去掉SSH公鑰檢查的方法(互動式yes/no)########
SSH公鑰檢查是一個重要的安全機制,可以防範中間人劫持等黑客攻擊。但是在特定情況下,嚴格的 SSH 公鑰檢查會破壞一些依賴SSH協定的自動化任務,就需要一種手段能夠繞過SSH的公鑰檢查。
SSH連線遠端主機時,會檢查主機的公鑰。如果是第一次連線該主機,會顯示該主機的公鑰摘要,彈出公鑰確認的提示,提示使用者是否信任該主機(Yes/no)。當選擇Yes接受,就會將該主機的公鑰追加到檔 ~/.ssh/known_hosts 中。當再次連線該主機時,就不會再提示該問題了。
SSH公鑰檢查有好處,但首次連線時會導致某些自動化任務中斷,或者由於 ~/.ssh/known_hosts 檔內容清空,導致自動化任務中斷。
去掉SSH公鑰檢查的方法:
1)SSH客戶端的StrictHostKeyChecking 配置指令,可以實作當第一次連線伺服器時,自動接受新的公鑰。只需要修改 /etc/ssh/ssh_config 檔,包含下列語句:
StrictHostKeyChecking no
2)或者在ssh連線命令中使用-oStrictHostKeyChecking=no參數
[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登入遠端機器,同時會把ssh資訊記錄在原生的~/.ssh/known_hsots檔中。如果出現ssh沖突了,需要手動刪除或修改known_hsots裏面對應遠端機器的ssh資訊。那麽如果忽略掉這個known_hosts的存取? 操作如下:
1)修改/etc/ssh/sshd_config 配置檔中的選項
IgnoreUserKnownHosts
改成
yes
,重新開機sshd服務即可。
2)如果還是不行,就在/etc/ssh/sshd_config 配置檔中再加入一下幾行,然後再重新開機sshd服務。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
######## ansible中取消ssh交換式yes/no ########
配置檔/etc/ansible/ansible.cfg的 [defaults] 中(開啟註釋)
# uncomment this to disable SSH key host checking
host_key_checking = False
######## ssh只允許使用key登入, 禁止使用密碼登入 ########
1) 生產公私鑰檔
# ssh-keygen -t rsa
上面命令一路回車, 此時在/root/.ssh/目錄下生成了2個檔,id_rsa為私鑰,id_rsa.pub為公鑰。
私鑰自己下載到本地電腦妥善保存(丟了伺服器可就沒法再登陸了),為安全,建議刪除伺服器端的私鑰。公鑰則可以任意公開。
使用以下命令將公鑰匯入到系統中:
# 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
#預設PasswordAuthentication 為yes,即允許密碼登入,改為no後,禁止密碼登入
PasswordAuthentication no
3) 重新開機SSH服務
# /etc/init.d/sshd restart
4) 使用私鑰登入xshell或securecrt客戶端了
######## SSH服務啟動報錯案例 ########
在某台伺服器上部署了sftp服務,最後發現sftp遠端登入正常,但是ssh遠端登入失敗(盡管已經輸入了正確的使用者名稱和密碼)。
[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 ]
如上啟動後,遠端ssh登入這台機器,輸入正確的使用者名稱和密碼,則會登入失敗!!
[root@kevin ssh]# ssh -V
OpenSSH_7.6p1, OpenSSL 1.0.1e-fips 11 Feb 2013
原因是新版本的openssh不支持以上參數,需要修改sshd的配置檔。
修改內容如下,否則還是無法透過ssh登入這台伺服器:
[root@kevin ssh]# vim /etc/ssh/sshd_config
.......
##去掉前面的註釋,允許root透過ssh登入
PermitRootLogin yes
##註釋掉下面三個參數
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
#UsePAM yes
再次重新開機ssh,上面的報錯資訊就沒有了。此時遠端ssh登入就OK了!
[root@kevin ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
######## SSH連線超時時間(timed out)設定 ########
1)使用下面命令連線,可以減少ssh連線超時等待的時間
# ssh -o ConnectTimeout=5 -p22 [email protected]
或者修改sshd_config檔裏面的UseDNS 選項,改為UseDNS no
2)設定SSH超時時間的方法
# 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打個招呼 (即伺服器端給客戶端發送一個"空包"),檢測它是否存在,如果不存時則斷開連線!
這裏需要註意:設定完成後,要結束ssh遠端連線,再次登入後才可以生效。因為要再讀取一次~/bash_profile檔。
總結:
在ClientAliveInterval(/etc/ssh/sshd_config)、環境變量TMOUT(在/etc/profile或.bash_profile中設定)以及putty的"Seconds between keepalives"(預設為0)這些設定方法中,
經檢測驗證,只有TMOUT可以控制ssh連線在空閑時間超時,自動斷開連線的時間,數位單位為"秒"。在設定了TMOUT後(非0),另外兩個變量則不起作用的。
另外,特別提醒的是,設定好ssh的登入超時時間以後,記得結束重新登入或重新開機系統,以使配置生效。
3)SSH禁止超時設定
SSH預設過一段時間會超時,有時候正在執行著指令碼,出去一會回來就斷開了,輸出資訊都看不到了,很是無奈!
其實禁止SSH自動超時最簡單的辦法就是:每隔一段時間在客戶端和伺服器之間發送一個"空包"!!!!!
至於到底是從客戶端發給伺服器,還是伺服器發給客戶端其實都不重要,重要的是需要它們之間要有通訊。
下面介紹兩種阻止SSH連線超時的方法(推薦方法二):
方法一:客戶端阻止SSH超時
編輯原生的SSH配置檔:~/.ssh/config
# vim ~/.ssh/config
ServerAliveInterval 120
這個設定會讓客服端機器在使用SSH連線伺服器時,每隔120秒給伺服器發送一個"空包",保持它們之間的連線。
方法二:伺服器端阻止SSH超時
如果有伺服器端的root許可權,可以在伺服端進行配置,這樣就不需要每個客戶端都單獨配置。
# vim /etc/ssh/sshd_config
ClientAliveInterval 120
ClientAliveCountMax 720
第一行,表示每隔120秒向客戶端發送一個"空包",以保持於客戶端的連線。
第二行,表示總共發送720次"空包",之後斷開它們之間的連線,也就是:120秒 × 720 = 86400 秒 = 24小時 後。
最後重新開機sshd服務,再開啟新終端進行ssh連線就可以了,在24小時內不會出現連線超時。
# /etc/init.d/ssh restart
######## SSH公鑰下發無效 ########
ssh的.pub公鑰已經拷貝到遠端主機的.ssh/authorized_keys檔裏,但是ssh跳轉時,仍然要輸入密碼!!即公鑰下發後,ssh信任關系沒有生效!
解決辦法:
1)遠端主機對應使用者家目錄下的.ssh目錄必須是700或755許可權,絕不能是775或777許可權!即只對該使用者有寫許可權!(一般設定700許可權)
2)遠端主機對應使用者家目錄下的.ssh/authorized_keys檔許可權必須是600許可權!即只對該使用者有寫許可權!(一般設定600許可權)
3)遠端主機對應使用者家目錄的許可權必須是700或755許可權,絕不能是775或777許可權!即只對該使用者有寫許可權!(一般設定700許可權),大多數情況下都是由於這個原因導致的!!!
如果.ssh目錄和.ssh/authorized_keys檔許可權對別的使用者有寫許可權,則就會導致ssh認證失敗!
=====================================================================================================
例如在一次ansible自動化部署中,之前配置好的ssh信任關系失效,報錯如下:
{"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}
檢視現象,發現之前配置好的ssh信任關系失效了!!
[root@bz3devjenci1002 lx0319]# ssh -p22 [email protected]
Authorized only. All activity will be monitored and reported
[email protected]'s password:
分析原因及解決辦法:
登入172.16.60.240這台機器的kevin使用者下,發現authorized_keys檔裏確實已經傳入了ansible主節點的id_rsa.pub公鑰內容,並且下面兩個許可權都正確:
[kevin@bz4autestap1002 ~]$ ll -d .ssh
drwx------ 2 kevin kevin 4096 Jul 24 10:48 .ssh #700許可權是正確的
[kevin@bz4autestap1002 ~]$ ll .ssh/authorized_keys
-rw------- 1 kevin kevin 2412 Jul 24 10:45 .ssh/authorized_keys #600許可權也是正確的
然後檢視kevin使用者目錄許可權,發現是777!這才是問題根源!該使用者目錄許可權不能對別的使用者有寫許可權,否則會造成ssh認證失敗!
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwxrwxrwx 14 kevin kevin 4096 Jul 24 10:48 /home/kevin
修改為600許可權即可
[kevin@bz4autestap1002 ~]$ chmod 600 /home/kevin
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwx------ 14 kevin kevin 4096 Jul 24 10:48 /home/kevin
再次在遠端嘗試ssh認證跳轉
[root@bz3devjenci1002 lx0319]# ssh -p22 [email protected]
[kevin@bz4autestap1002 ~]$
######## Centos7修改ssh預設埠的方法 ########
CentOS 7 對於防火墻這一塊的設定有一定的修改,修改ssh埠後,必須關閉防火墻和selinux之後才能正常重新開機sshd服務,否則啟動失敗。操作記錄如下:
1)修改/etc/ssh/sshd_config #這個是修改ssh伺服端配置檔。
[root@k8s-master01 ~]# vim /etc/ssh/sshd_config
.........
#Port 22 #這行最好去掉#號,防止配置失效以後不能遠端登入,還得去機房修改,等修改以後的埠能使用以後在註釋掉
Port 6666 #下面添加這一行
[root@k8s-master01 ~]# vim /etc/ssh/ssh_config #這個是修改ssh客戶端配置檔,一般可以不用修改。
........
# Port 22
Port 6666
======================================================================================================
ssh客戶端配置檔使用場景:
比如A機器的/etc/ssh/ssh_config客戶端配置檔的ssh埠是22,B機器的/etc/ssh/sshd_config伺服端配置檔是6666
那麽A機器ssh連線B機器時就要帶上"-p6666", 如果A機器的ssh客戶端配置檔的埠也是6666的話,就可以直接ssh連線B機器了。
======================================================================================================
2)要關閉防火墻和selinux。否則,centos7修改ssh埠後會啟動sshd服務失敗!一定要註意這個!
[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埠後,就能順利啟動sshd服務了!
======================================================================================================
這裏還需要註意下:如果是開啟了防火墻或selinux,則需要將修改的sshd埠添加到對應的防火墻規則中(預設只加了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配置
使用以下命令檢視當前SElinux 允許的ssh埠:
# semanage port -l | grep ssh
添加6666埠到 SELinux
# semanage port -a -t ssh_port_t -p tcp 6666
然後確認一下是否添加進去
# semanage port -l | grep ssh
如果成功會輸出
ssh_port_t tcp 6666, 22
c)然後就可以順利啟動sshd服務了。
更多精彩
關註公眾號 「 浩道Linux 」
浩道Linux ,專註於 Linux系統 的相關知識、 網路通訊 、 網路安全 、 Python相關 知識以及涵蓋IT行業相關技能的學習, 理論與實戰結合,真正讓你在學習工作中真正去用到所學。同時也會分享一些面試經驗,助你找到高薪offer,讓我們一起去學習,一起去進步,一起去漲薪!期待您的加入~~~ 關註回復「資料」可 免費獲取學習資料 (含有電子書籍、視訊等)。
喜歡的話,記得 點「贊」 和 「在看」 哦