SSH常见问题
對于linux運維工作者而言,使用ssh遠程遠程服務器是再熟悉不過的了!對于ssh的一些嚴格設置也關系到服務器的安全維護,今天在此,就本人工作中使用ssh的經驗而言,做一些總結記錄來下。
-bash: ssh: command not found
解決辦法;
yum install -y openssh-server openssh-clinets
(0)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
(1)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 ~]#
(2)實現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.文件(文件會自動創建)中
| 1 2 | 對于非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
(3)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"
(4)ssh遠程登陸緩慢問題
解決辦法:
編譯/etc/ssh/sshd_config配置文件:
UseDNS no
GSSAPIAuthentication no
然后重啟sshd服務即可!
(5)ssh登錄出現:permission denied(publickey.gssapi-with-mic)
解決方法:
修改/etc/ssh/sshd-config文件,將其中的:
PermitRootLogin no修改為yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys前面加上#屏蔽掉
PasswordAuthentication no修改為yes
最后重啟sshd服務即可!
(6)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服務。
(7)ssh連接超時被踢出問題解決
當使用xshell,SecureCRT等客戶端訪問linux服務器,有時候會出現終端定期超時被踢出的情況。
下面介紹三種方法來防止超時被踢出的方法,后兩種情況的設置方法以及通過設置shell變量來達到此目的的方法:
1、 配置服務器
#vi /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
sudo /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.
(8)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的方式進行身份驗證,但我們的系統不支持.
最后如果我們不用這種方式進行身份驗證的話,建議關閉這個選項,這樣可以提高驗證時的速度.
(9)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================================================================
除了上面的方法可以限制ssh指定用戶登錄外,還可以使用pam規則進行設置。
================================================================
除此之外,禁止某些用戶ssh登錄,可以使用passwd或usermod命令進行賬號鎖定。
https://www.cnblogs.com/kevingrace/p/6109818.html
5)取消密碼驗證,只用密鑰對驗證
修改ssh服務配置文件/etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
6)給賬號設置強壯的密碼:將密碼保存到文本進行復制和粘帖就可以了
# rpm -ivh expect-5.43.0-5.1.i386.rpm| 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針對客戶端的配置文件:
centos7下修改ssh默認的22端口后,出現重啟ssh失敗的現象。可能原因:
selinux沒有關閉
# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled' /etc/sysconfig/selinux
# reboot
修改ssh端口后,遠程ssh連接不上??赡茉?#xff1a;
firewalld防火墻沒有關閉,默認的22端口是開啟的,如果防火墻沒有關閉,則ssh修改后的新端口是不通的。
# systemctl stop firewalld
# systemctl disable firewalld
# firewall-cmd --state
------------------------------------------去掉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
====================ansible中取消ssh交換式yes/no==================
配置文件/etc/ansible/ansible.cfg的[defaults]中(打開注釋)
# uncomment this to disable SSH key host checking
host_key_checking = False
=========================設置終端登錄超時時間====================
遠程登錄linux服務器,如何設置終端失效時間(即過了多久不操作,終端即將失效)。方法如下: [root@mq-console-nameserver ~]# vim /etc/profile ...... export TMOUT=600 [root@mq-console-nameserver ~]# source /etc/profile如上設置后,登錄這臺服務器的終端在10分鐘內不做操作,則該終端就將失效!======================SSH服務啟動報錯案例=======================
在某臺服務器上部署了sftp服務,最后發現sftp遠程登錄正常,但是ssh遠程登錄失敗(盡管已經輸入了正確的用戶名和密碼)。
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
參考文獻
https://www.cnblogs.com/kevingrace/p/6110842.html
總結
- 上一篇: python生成目录树_Python生成
- 下一篇: linux redis 普通用户,非ro