ssh實現免密登錄


win10安裝openssh

查看:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

# This should return the following output:

Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent
Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

安裝:

# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

# Both of these should return the following output:

Path          :
Online        : True
RestartNeeded : False

卸載:

# Uninstall the OpenSSH Client
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Uninstall the OpenSSH Server
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

使用ssh-copy-id將公鑰復制到遠程服務器

服務端開啟密鑰登錄配置

編輯 /etc/ssh/sshd_config 文件,進行如下設置:

RSAAuthentication yes
PubkeyAuthentication yes

另外,請留意 root 用戶能否通過 SSH 登錄:

PermitRootLogin yes

當你完成全部設置,並以密鑰方式登錄成功后,再禁用密碼登錄:

PasswordAuthentication no

最后,重啟 SSH 服務:

[root@host .ssh]$ service sshd restart

客戶端上傳公鑰,並登錄

ssh-keygen 產生公鑰與私鑰對.

ssh-copy-id 將本機的公鑰復制到遠程機器的~/ .ssh/authorized_key文件中

第一步:在本地機器上使用ssh-keygen產生公鑰私鑰對

$ ssh-keygen

ssh-keygen -t rsa -C "hongda159505@aliyun.com"

第二步:用ssh-copy-id將公鑰復制到遠程機器中

$ ssh-copy-id -i .ssh/id_rsa.pub user@server

-i:指定公鑰文件

第三步:登錄到遠程服務器不用輸入密碼

ssh root@18.16.200.110

本機會將這一登錄信息保存在~/.ssh/known_hosts文件當中。

使用ssh配置文件

配置文件

SSH 的配置文件與用戶實際執行 ssh 命令時傳入的參數協同作用。按照優先級,低優先級的配置項可視作默認值;而高優先級的配置項則會覆蓋默認值。按優先級,有如下排序:

  1. 用戶實際執行 ssh 時傳入的參數;
  2. 用戶的 SSH 配置文件 ${HOME}/.ssh/config
  3. 系統的 SSH 配置文件 /etc/ssh/ssh_config

配置文件說明

/etc/ssh/ssh_config配置文件

選項參數                                   說明
Host *                                    選項“Host”只對能夠匹配后面字串的計算機有效。“*”表示所有的計算機。
ForwardAgent no                           設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。
ForwardX11 no                             設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)
RhostsAuthentication no                   設置是否使用基於rhosts的安全驗證
RhostsRSAAuthentication no                設置是否使用用RSA算法的基於rhosts的安全驗證
RSAAuthentication yes                     設置是否使用RSA算法進行安全驗證
PasswordAuthentication yes                設置是否使用口令驗證
FallBackToRsh no                          設置如果用ssh連接出現錯誤是否自動使用rsh
UseRsh no                                 設置是否在這台計算機上使用“rlogin/rsh”
BatchMode no                              如果設為“yes”,passphrase/password(交互式輸入口令)的提示將被禁止。當不能交互式輸入口令的時候,這個選項對腳本文件和批處理任務十分有用
CheckHostIP yes                           設置ssh是否查看連接到服務器的主機的IP地址以防止DNS欺騙。建議設置為“yes”
StrictHostKeyChecking no                  如果設置成“yes”,ssh就不會自動把計算機的密匙加入“$HOME/.ssh/known_hosts”文件,並且一旦計算機的密匙發生了變化,就拒絕連接
IdentityFile ~/.ssh/identity              設置從哪個文件讀取用戶的RSA安全驗證標識
Port 22                                   設置連接到遠程主機的端口
Cipher blowfish                           設置加密用的密碼
EscapeChar ~                              設置escape字符

Host參數通配符:

'*' 代表 0~n 個非空白字符。
'?' 代表一個非空白字符。
'!' 表示例外通配。
*,匹配所有主機名。
*.example.com,匹配以 .example.com 結尾。
!*.dialup.example.com,*.example.com,以 ! 開頭是排除的意思。
192.168.0.?,匹配 192.168.0.[0-9] 的 IP。

HostName IdentityFile 文件名稱可以使用以下轉義符:

'%d' 本地用戶目錄
'%u' 本地用戶名稱
'%l' 本地主機名
'%h' 遠程主機名
'%r' 遠程用戶名

ControlPath 指定 control socket 的路徑,值可以直接指定也可以用一下參數代替

%L 本地主機名的第一個組件
%l 本地主機名(包括域名)
%h 遠程主機名(命令行輸入)
%n 遠程原始主機名
%p 遠程主機端口
%r 遠程登錄用戶名
%u 本地 ssh 正在使用的用戶名
%i 本地 ssh 正在使用 uid
%C 值為 %l%h%p%r 的 hash

/etc/ssh/sshd_config配置文件

參數選項                                                         說明
Port 22                                                         SSH 預設使用 22 這個 port,您也可以使用多的 port !
Protocol 2,1                                                    選擇的 SSH 協議版本,可以是 1 也可以是 2 ,如果要同時支持兩者,就必須要使用 2,1 這個分隔了!
ListenAddress 0.0.0.0                                           監聽的主機適配卡!舉個例子來說,如果您有兩個 IP,分別是 192.168.0.100 及 192.168.2.20 ,那么只想要開放 192.168.0.100 時,就可以寫如同下面的樣式:
ListenAddress 192.168.0.100                                     只監聽來自 192.168.0.100 這個 IP 的SSH聯機。如果不使用設定的話,則預設所有接口均接受 SSH
PidFile /var/run/sshd.pid                                       可以放置 SSHD 這個 PID 的檔案!左列為默認值
LoginGraceTime 600                                              當使用者連上 SSH server 之后,會出現輸入密碼的畫面,在該畫面中,在多久時間內沒有成功連上 SSH server ,就斷線!時間為秒!
Compression yes                                                 是否可以使用壓縮指令?
HostKey /etc/ssh/ssh_host_key                                   SSH version 1 使用的私鑰
HostKey /etc/ssh/ssh_host_rsa_key                               SSH version 2 使用的 RSA 私鑰
HostKey /etc/ssh/ssh_host_dsa_key                               SSH version 2 使用的 DSA 私鑰
KeyRegenerationInterval 3600                                    由前面聯機的說明可以知道, version 1 會使用 server 的 Public Key ,每隔一段時間來重新建立一次!時間為秒!
ServerKeyBits 768                                               Server key 的長度!
SyslogFacility AUTH                                             當有人使用 SSH 登入系統的時候,SSH會記錄信息
LogLevel INFO                                                   登錄記錄的等級---》全部
PermitRootLogin no                                              是否允許 root 登入!預設是允許的,但是建議設定成 no!
UserLogin no                                                    在 SSH 底下本來就不接受 login 這個程序的登入!
StrictModes yes                                                 當使用者的 host key 改變之后,Server 就不接受聯機
RSAAuthentication yes                                           是否使用純的 RSA 認證!?僅針對 version 1 !
PubkeyAuthentication yes                                        是否允許 Public Key ?只有 version 2
AuthorizedKeysFile   .ssh/authorized_keys                       設定若要使用不需要密碼登入的賬號時,那么那個賬號的存放檔案所在檔名!
RhostsAuthentication no                                         本機系統不使用 .rhosts , .rhosts 不安全!
IgnoreRhosts yes                                                是否取消使用 ~/.ssh/.rhosts 來做為認證!
RhostsRSAAuthentication no                                      針對 version 1 ,使用 rhosts 檔案在/etc/hosts.equiv配合 RSA 演算方式來進行認證!
HostbasedAuthentication no                                      這個項目與上面的項目類似,不過是給 version 2 使用的!
IgnoreUserKnownHosts no                                         是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄的主機內容
PasswordAuthentication yes                                      密碼驗證當然是需要的!
PermitEmptyPasswords no                                         上面那一項如果設定為 yes 的話,這一項就最好設定為 no ,這個項目在是否允許以空的密碼登入!
ChallengeResponseAuthentication yes                             挑戰任何的密碼認證!所以,任何 login.conf 規定的認證方式,均可適用!
PAMAuthenticationViaKbdInt yes                                  是否啟用其它的 PAM 模塊!啟用這個模塊將會導致 PasswordAuthentication 設定失效!

與Kerberos 有關的參數設定!底下不用設定
KerberosAuthentication no
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
KerberosTgtPassing no

有關在 X-Window 底下使用的相關設定
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

PrintMotd no                                                    登入后是否顯示出一些信息呢?例如上次登入的時間、地點等,預設是 yes ,但是,如果為了安全,可以考慮改為 no !
PrintLastLog yes                                                顯示上次登入的信息!預設也是 yes 
KeepAlive yes                                                   一般而言,如果設定這項目的話,那么 SSH Server 會傳送KeepAlive 的訊息給 Client 端,以確保兩者的聯機正常!在這個情況下,任何一端死掉后, SSH 可以立刻知道!而不會有僵屍程序的發生!
UsePrivilegeSeparation yes                                      使用者的權限設定項目!
MaxStartups 10                                                  同時允許幾個尚未登入的聯機畫面
DenyUsers *                                                     設定受抵擋的使用者名稱
AllowUsers *                                                    設定允許的使用者名稱

使用

~/.ssh/下創建config文件,並填寫如下:

Host dev
HostName 18.16.200.110
Port 22
User root
IdentityFile ~/.ssh/id_rsa

就可以直接使用下面來直接訪問

ssh dev

注意,上述的密鑰為私鑰。

批量管理

現在我們構建這樣一個場景。我們有 1000 台服務器;它們的主機名編號從 w-i0.test.sh.localnet 一直到 w-i999.test.sh.localnet。那么,為了免密以 cloud 用戶的身份登錄這 1000 台機器,我們可以首先將准備好的公鑰上傳到這 1000 台機器上;而后在 SSH 配置文件里配置如下內容。

Host i? i?? i???
    Host w-%h.test.sh.localnet
    User cloud
    IdentityFile ~/.ssh/id_rsa.test

這樣一來,我們就只需要使用 ssh i73 就能以 cloud 用戶的身份,登錄 w-i73.test.sh.localnet

Host ???
HostName 18.16.200.%h
Port 22
User root
IdentityFile /root/.ssh/id_rsa 

上面直接輸入三位數,就可以直接跳轉到對應的節點

Host ? ?? ???
HostName 18.16.200.%h
Port 22
User root
IdentityFile /root/.ssh/id_rsa 

這樣就可以任意一個后綴ip都可以直接訪問對應的節點

代理登錄

有的時候你可能沒法直接登錄到某台服務器,而需要使用一台中間服務器進行中轉,如公司內網服務器。首先確保你已經為服務器配置了公鑰訪問,並開啟了agent forwarding,那么你需要添加如下配置到 ~/.ssh/config

Host gateway
    HostName proxy.example.com
    User root
Host pro
    HostName pro.internal.example.com                  # 目標服務器地址
    User root                                         # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa                    # 認證文件
    ProxyCommand ssh gateway netcat -q 600 %h %p      # 代理命令

那么你現在可以使用 $ ssh pro 連接了。

服務器開啟ssh服務

安裝openssh-server

$ yum list installed |grep openssh-server
openssh-server.x86_64                       8.0p1-4.el8_1                           @base

沒有就進行安裝

wsl的centos7中沒有service和systemctl命令

使用:

$ sshd
sshd re-exec requires execution with an absolute path
#上述問題為,必須為絕對路徑執行

λ wsl.exe -u root -e /usr/sbin/sshd
Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.

$ ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:nuhZj04FWP8to7r7t+2Q7Aa2KTUzaJzu6d7MJftA9Cw root@hongda
The key's randomart image is:
+---[RSA 2048]----+
|        .        |
|       o .       |
|      . . o      |
|         o + .   |
|       .SoE * .  |
|       o=+B+ +   |
|      .o=o+B=    |
|     . +oOo*oo   |
|      o=@=B++oo  |
+----[SHA256]-----+

# root @ hongda in /etc/ssh [18:24:06]
$ /usr/sbin/sshd
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key

# root @ hongda in /etc/ssh [18:26:26] C:255
$ ssh-keygen -A
ssh-keygen: generating new host keys: DSA ECDSA ED25519

# root @ hongda in /etc/ssh [18:27:41]
$ /usr/sbin/sshd

解決ssh長時間不輸入命令斷開問題

ssh長時間不使用會出現下面的提示:

 client_loop: send disconnect: Broken pipe

服務端

在服務器端,可以讓服務器發送“心跳”信號測試提醒客戶端進行保持連接

通過修改 sshd 的配置文件,能夠讓 SSH Server 發送“心跳”信號來維持持續連接,下面是設置的內容

打開服務器 /etc/ssh/sshd_config,我在最后增加一行

ClientAliveInterval 60
 
ClientAliveCountMax 1

這 樣,SSH Server 每 60 秒就會自動發送一個信號給 Client,而等待 Client 回應,(注意:是服務器發心跳信號,不是客戶端,這個有別於一些 FTP Client 發送的 KeepAlives 信號哦~~~),如果客戶端沒有回應,會記錄下來直到記錄數超過 ClientAliveCountMax 的值時,才會斷開連接。

客戶端

如果你沒有服務器端管理權限,在客戶端進行設置也可以實現

只要在/etc/ssh/ssh_config文件里加兩個參數就行了

TCPKeepAlive yes
 
ServerAliveInterval 300

前一個參數是說要保持連接,后一個參數表示每過5分鍾發一個數據包到服務器表示“我還活着”

如果你沒有root權限,修改或者創建~/.ssh/ssh_config也是可以的

在這種方法中, 如果你只想針對某一個ssh連接進行持續, 你可以將上述配置文件復制一下進行修改然后在連接的時候使用 -F參數進行配置文件的指定。 當然因為只需要修改兩個參數, 你也可以直接在連接命令中進行設定即:

$ ssh -o TCPKeepAlive=yes -o ServerAliveInterval=300 xx@xx.com -p xxxx

參考:

利用 SSH 的用戶配置文件 Config 管理 SSH 會話

最佳搭檔:利用 SSH 及其配置文件節省你的生命

Centos7開啟SSH服務

Installation of OpenSSH For Windows Server 2019 and Windows 10


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM