Linux系統下的ssh使用 (依據我的經驗總結)

 

對於linux運維工做者而言,使用ssh遠程遠程服務器是再熟悉不過的了!對於ssh的一些嚴格設置也關係到服務器的安全維護,今天在此,就本人工做中使用ssh的經驗而言,作一些總結記錄來下。html

-bash: ssh: command not found
解決辦法;
yum install -y openssh-server openssh-clinetsnode

(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.servicelinux

(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監控機
===================================docker

作法二:在目標機器的/etc/ssh/sshd_config文件裏定義,而後重啓sshd服務便可。這兩種作法是一致的效果!
Banner /etc/sshfileshell

[root@host-192-168-1-117 ~]# cat /etc/sshfile
this is 192.168.1.117vim

遠程登錄:
[root@linux-node2 ~]# ssh 192.168.1.117
this is 192.168.1.117
[root@host-192-168-1-117 ~]#centos

(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.文件(文件會自動建立)中api

對於非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變量來達到此目的的方法:

一、 配置服務器
#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

二、 配置客戶端
#vim /etc/ssh/ssh_config
而後找到裏面的
ServerAliveInterval
參數,若是沒有你一樣本身加一個就行了
參數意義相同,都是秒數,好比5分鐘等
ServerAliveInterval 300

三、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規則進行設置。

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命令進行帳號鎖定。
http://www.javashuo.com/article/p-syrububf-ba.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針對客戶端的配置文件:

[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

===================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客戶端了

=========================設置終端登陸超時時間====================

遠程登陸linux服務器,如何設置終端失效時間(即過了多久不操做,終端即將失效)。方法以下:
[root@mq-console-nameserver ~]# vim /etc/profile
......
export TMOUT=600
[root@mq-console-nameserver ~]# source /etc/profile

如上設置後,登陸這臺服務器的終端在10分鐘內不作操做,則該終端就將失效!

=======================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的.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 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 ~]$

===============================================================
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服務了。
相關文章
相關標籤/搜索