天天看點

Linux系統下的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 

做法二:在目标機器的/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

[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

<code>對于非22端口(比如22222)情況下的</code><code>ssh</code><code>-copy-</code><code>id</code><code>的使用,需要這樣用:</code>

<code>ssh</code><code>-copy-</code><code>id</code> <code>-i  </code><code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.pub  </code><code>'-p 22222 [email protected]'</code>

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 [email protected] "ssh -p25791 [email protected]"

但是在執行腳本的時候報錯如下:

Pseudo-terminal will not be allocated because stdin

原因:

僞終端将無法配置設定,因為标準輸入不是終端。

解決辦法:

需要增加-t -t參數來強制僞終端配置設定,即使标準輸入不是終端。

在腳本裡添加-t -t參數即可,如下:

ssh [email protected] "ssh -t -t -p25791 [email protected]"

或者

ssh -t [email protected] "ssh -t -t -p25791 [email protected]"

(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 

[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等自定義

修改兩項參數後如下:

----------------------------

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 &gt;&gt; /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

GSSAPIDelegateCredentials yes

我們在用戶端連接配接SSH服務端,如下:

ssh -v 192.168.1.11

.................

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: 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 [email protected] -p 2222

一是通過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)取消密碼驗證,隻用密鑰對驗證

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&amp;sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx&gt;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針對用戶端的配置檔案:

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

<code>[root@dns01 dns_rsync]</code><code># cat /etc/ssh/ssh_config</code>

<code># Site-wide defaults for various options</code>

<code>   </code><code>Host *</code>

<code>        </code><code>ForwardAgent no</code>

<code>        </code><code>ForwardX11 no</code>

<code>        </code><code>RhostsAuthentication no</code>

<code>        </code><code>RhostsRSAAuthentication no</code>

<code>    </code><code>‍    RSAAuthentication </code><code>yes</code>

<code>        </code><code>PasswordAuthentication </code><code>yes</code>

<code>        </code><code>FallBackToRsh no</code>

<code>        </code><code>UseRsh no</code>

<code>        </code><code>BatchMode no</code>

<code>        </code><code>CheckHostIP </code><code>yes</code>

<code>        </code><code>StrictHostKeyChecking no</code>

<code>        </code><code>IdentityFile ~/.</code><code>ssh</code><code>/identity</code>

<code>        </code><code>Port 22</code>

<code>        </code><code>Cipher blowfish</code>

<code>        </code><code>EscapeChar ~</code>

<code>下面對上述選項參數逐進行解釋:</code>

<code>帶“</code><code>#”表示該句為注釋不起作,該句不屬于配置檔案原文,意在說明下面選項均為系統初始預設的選項。說明一下,實際配置檔案中也有很多選項前面加有“#”注釋,雖然表示不起作用,其實是說明此為系統預設的初始化設定。</code>

<code>Host *</code>

<code>"Host"</code><code>隻對比對後面字串的計算機有效,“*”表示所有的計算機。從該項格式前置一些可以看出,這是一個類似于全局的選項,表示下面縮進的選項都适用于該設定,可以指定某計算機替換*号使下面選項隻針對該算機器生效。</code>

<code>ForwardAgent no</code>

<code>"ForwardAgent"</code><code>設定連接配接是否經過驗證代理(如果存在)轉發給遠端計算機。</code>

<code>ForwardX11 no</code>

<code>"ForwardX11"</code><code>設定X11連接配接是否被自動重定向到安全的通道和顯示集(DISPLAY </code><code>set</code><code>)。</code>

<code>RhostsAuthentication no</code>

<code>"RhostsAuthentication"</code><code>設定是否使用基于rhosts的安全驗證。</code>

<code>RhostsRSAAuthentication no</code>

<code>"RhostsRSAAuthentication"</code><code>設定是否使用用RSA算法的基于rhosts的安全驗證。</code>

<code>RSAAuthentication </code><code>yes</code>

<code>"RSAAuthentication"</code><code>設定是否使用RSA算法進行安全驗證。</code>

<code>PasswordAuthentication </code><code>yes</code>

<code>"PasswordAuthentication"</code><code>設定是否使用密碼驗證。</code>

<code>FallBackToRsh no</code>

<code>"FallBackToRsh"</code><code>設定如果用</code><code>ssh</code><code>連接配接出現錯誤是否自動使用rsh,由于rsh并不安全,是以此選項應當設定為</code><code>"no"</code><code>。</code>

<code>UseRsh no</code>

<code>"UseRsh"</code><code>設定是否在這台計算機上使用</code><code>"rlogin/rsh"</code><code>,原因同上,設為</code><code>"no"</code><code>。</code>

<code>BatchMode no</code>

<code>"BatchMode"</code><code>:批處理模式,一般設為</code><code>"no"</code><code>;如果設為</code><code>"yes"</code><code>,互動式輸入密碼的提示将被禁止,這個選項對腳本檔案和批處理任務十分有用。</code>

<code>CheckHostIP </code><code>yes</code>

<code>"CheckHostIP"</code><code>設定</code><code>ssh</code><code>是否檢視連接配接到伺服器的主機的IP位址以防止DNS欺騙。建議設定為</code><code>"yes"</code><code>。</code>

<code>StrictHostKeyChecking no</code>

<code>"StrictHostKeyChecking"</code><code>如果設為</code><code>"yes"</code><code>,</code><code>ssh</code><code>将不會自動把計算機的密匙加入</code><code>"$HOME/.ssh/known_hosts"</code><code>檔案,且一旦計算機的密匙發生了變化,就拒絕連接配接。</code>

<code>IdentityFile ~/.</code><code>ssh</code><code>/identity</code>

<code>"IdentityFile"</code><code>設定讀取使用者的RSA安全驗證辨別。</code>

<code>Port 22</code>

<code>"Port"</code><code>設定連接配接到遠端主機的端口,</code><code>ssh</code><code>預設端口為22。</code>

<code>Cipher blowfish</code>

<code>“Cipher”設定加密用的密鑰,blowfish可以自己随意設定。</code>

<code>EscapeChar ~</code>

<code>“EscapeChar”設定escape字元。</code>

<code>======================================================</code>

<code>比如說,A機器的</code><code>ssh</code><code>端口是22,B機器的端口是22222,一般來說A機器</code><code>ssh</code><code>連接配接B機器的時候是使用-p22222指定端口。但是可以修改A機器的</code><code>/etc/ssh/ssh_config</code><code>檔案中的</code>

<code>Port為22222,這樣A機器</code><code>ssh</code><code>連接配接的時候就預設使用22222端口了。</code>

-------------------------------------------去掉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

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************

本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/6110842.html,如需轉載請自行聯系原作者

繼續閱讀