SSH运维总结-【liunx学习】
【歡迎關注微信公眾號:廈門微思網絡】
微思網絡(官網):https://www.xmws.cn/
導語
對于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??梢詫d_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?root@192.168.18.18'
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 root@101.201.114.106 "ssh -p25791 root@103.10.86.7"
但是在執行腳本的時候報錯如下:
Pseudo-terminal will not be allocated because stdin
原因:
偽終端將無法分配,因為標準輸入不是終端。
解決辦法:
需要增加-t -t參數來強制偽終端分配,即使標準輸入不是終端。
在腳本里添加-t -t參數即可,如下:
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遠程登陸緩慢問題
解決辦法:
編譯/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 wangshibo@192.168.1.83 -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 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登錄本機。
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 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
如下,由于已經允許了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規則限制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 yes6)給賬號設置強壯的密碼:將密碼保存到文本進行復制和粘帖就可以了
# 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 optionsHost *ForwardAgent noForwardX11 noRhostsAuthentication noRhostsRSAAuthentication noRSAAuthentication yesPasswordAuthentication yesFallBackToRsh noUseRsh noBatchMode noCheckHostIP yesStrictHostKeyChecking noIdentityFile ~/.ssh/identityPort 22Cipher blowfishEscapeChar ~ 下面對上述選項參數逐進行解釋: # 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 no2)或者在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_keys2)? 修改SSH的配置文件/etc/ssh/sshd_config?
# vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys#默認PasswordAuthentication 為yes,即允許密碼登錄,改為no后,禁止密碼登錄
PasswordAuthentication no3)? 重啟SSH服務
# /etc/init.d/sshd restart
4)? 使用私鑰登錄xshell或securecrt客戶端了
########??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 ]
在某臺服務器上部署了sftp服務,最后發現sftp遠程登錄正常,但是ssh遠程登錄失敗(盡管已經輸入了正確的用戶名和密碼)。
########? SSH連接超時時間(timed out)設置? ######## 1)使用下面命令連接,可以減少ssh連接超時等待的時間 # ssh -o ConnectTimeout=5 -p22 root@172.16.60.20 或者修改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公鑰下發無效 ########
解決辦法: 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 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這臺機器的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 kevin@172.16.60.240 [kevin@bz4autestap1002 ~]$
ssh的.pub公鑰已經拷貝到遠程主機的.ssh/authorized_keys文件里,但是ssh跳轉時,仍然要輸入密碼!!即公鑰下發后,ssh信任關系沒有生效!########? 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 22Port 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服務了。
總結
以上是生活随笔為你收集整理的SSH运维总结-【liunx学习】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全网最全 Python 操作 Excel
- 下一篇: Windows 11正式发布,所有用户均