對於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。可以將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.檔案(檔案會自動建立)中
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
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針對客戶端的配置檔案:
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 ~
下面對上述選項引數逐進行解釋: # 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字元。 ====================================================== 比如說,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
——————————————–ansible中取消ssh交換式yes/no———————————————–
配置檔案/etc/ansible/ansible.cfg的[defaults]中(開啟註釋)
# uncomment this to disable SSH key host checking
host_key_checking = False