Linux使用ssh-keygen實現SSH無密碼登錄


一、原理簡介:

1、SSH公鑰認證的基本原理:

    SSH是一個專為遠程登錄會話和其他網絡服務提供安全性的協議。默認狀態下SSH鏈接是需要密碼認證的,可以通過添加系統認證(即公鑰-私鑰)的修改,修改后系統間切換可以避免密碼輸入和SSH認證。

    對信息的加密和解密采用不同的key,這對key分別稱作private key和public key,其中,public key存放在欲登錄的服務器上,而private key為特定的客戶機所持有。

    當客戶機向服務器發出建立安全連接的請求時,首先發送自己的public key,如果這個public key是被服務器所允許的,服務器就發送一個經過public key加密的隨機數據給客戶機,這個數據只能通過private key解密,客戶機將解密后的信息發還給服務器,服務器驗證正確后即確認客戶機是可信任的,從而建立起一條安全的信息通道。

    通過這種方式,客戶機不需要向外發送自己的身份標志“private key”即可達到校驗的目的,並且private key是不能通過public key反向推斷出來的。這避免了網絡竊聽可能造成的密碼泄露。客戶機需要小心的保存自己的private key,以免被其他人竊取,一旦這樣的事情發生,就需要各服務器更換受信的public key列表。

2、要實現的效果:

   網絡拓撲圖如下:共4台服務器,主機名分別為flower1~4,要實現flower1到另外3台服務器的免密碼登錄。

    flower

3、基本步驟:

  1. 設置主機名。
  2. 在服務器flower1上利用ssh-keygen命令生成公鑰私鑰對。
  3. 將flower1上的公鑰分別拷貝到flower2~4服務器上。
  4. 修改相關文件的權限。
  5. 驗證免密碼登錄。

二、實際操作流程:

1、修改4台服務器上的主機名:

    這里以主機1為例,hostname修改為flower1。那么有幾種修改方式呢?下面4種方式都可以做到,但是效果有所不同。

1hostname flower1     --運行后立即生效(新會話生效),但是在系統重啟后會丟失所做的修改

2echo flower1   > /proc/sys/kernel/hostname  --運行后立即生效(新會話生效),但是在系統重啟后會丟失所做的修改

3: sysctl kernel.hostname=flower1    --運行后立即生效(新會話生效),但是在系統重啟后會丟失所做的修改

4: 修改/etc/sysconfig/network下的HOSTNAME變量  --需要重啟生效,永久性修改。

    上面4種方式的區別在哪呢?

    hostname是Linux系統下的一個內核參數,它保存在/proc/sys/kernel/hostname下,但是它的值是Linux啟動時從/etc/rc.d/rc.sysinit讀取的。

    而/etc/rc.d/rc.sysinit中HOSTNAME的取值來自與/etc/sysconfig/network下的HOSTNAME。

    所以,如果服務器重啟,就肯定以/etc/sysconfig/network為准。其余3種方式都是臨時的修改。

    另外,從上面的邏輯上看,hostname的取值跟/etc/hosts中的配置沒什么關系。

    所以,如果要服務器的hostname立刻生效,並保證重啟后生效,該如何操作呢?

    只要修改/etc/sysconfig/network中的HOSTNAME,並在命令行執行 hostname flower1即可。

[root@iZ940419pwoZ ~]# vim /etc/sysconfig/network
[root@iZ940419pwoZ ~]# hostname flower1
[root@iZ940419pwoZ ~]# hostname
flower1
[root@iZ940419pwoZ ~]# reboot

    重啟看一下效果。如法炮制,修改其余3台服務器,分別命名為flower2\flower3\flower4

2、在服務器flower1上利用ssh-keygen命令生成公鑰私鑰對:

    這里需要注意一點,雖然flower1也是服務器,但是它是作為ssh客戶端來進行配置的。

    在用戶的主目錄下執行以下命令(這里使用的是root用戶,可以根據個人需要調整),連續按3次回車即可。

[root@flower1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
df:71:f6:3e:bb:bb:6c:38:91:f4:bc:70:a1:dd:86:a9 root@flower1
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|             . . |
|        S   o Ooo|
|         . . Oo*o|
|          . ..=.o|
|            Eo.= |
|              o*B|
+-----------------+

image

    進入到~/.ssh目錄下查看生成的文件:其中id_rsa為私鑰,id_rsa.pub為公鑰。

image

3、將flower1上的公鑰拷貝到flower2~4相關目錄下:

    這里使用scp命令進行復制,首先保證flower2~4下有~/.ssh目錄。

    這里以flower2為例

[root@flower1 .ssh]# scp id_rsa.pub root@10.170.125.14:~/.ssh

image

然后到flower2機器上

# touch ~/.ssh/authorized_keys (如果已經存在這個文件, 跳過這條)
# chmod 600 ~/.ssh/authorized_keys  (# 注意: 必須將~/.ssh/authorized_keys的權限改為600, 該文件用於保存ssh客戶端生成的公鑰,可以修改服務器的ssh服務端配置文件/etc/ssh/sshd_config來指定其他文件名)
# cat ~/.ssh/id_rsa.pub  >> /root/.ssh/authorized_keys (將id_rsa.pub的內容追加到 authorized_keys 中, 注意不要用 > ,否則會清空原有的內容,使其他人無法使用原有的密鑰登錄)

4、驗證:

[root@flower1 .ssh]# ssh 10.170.125.14

image

其余幾台服務器使用類似的方式修改即可。


免責聲明!

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



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