一、原理簡介:
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台服務器的免密碼登錄。
3、基本步驟:
- 設置主機名。
- 在服務器flower1上利用ssh-keygen命令生成公鑰私鑰對。
- 將flower1上的公鑰分別拷貝到flower2~4服務器上。
- 修改相關文件的權限。
- 驗證免密碼登錄。
二、實際操作流程:
1、修改4台服務器上的主機名:
這里以主機1為例,hostname修改為flower1。那么有幾種修改方式呢?下面4種方式都可以做到,但是效果有所不同。
1: hostname flower1 --運行后立即生效(新會話生效),但是在系統重啟后會丟失所做的修改 2: echo 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| +-----------------+
進入到~/.ssh目錄下查看生成的文件:其中id_rsa為私鑰,id_rsa.pub為公鑰。
3、將flower1上的公鑰拷貝到flower2~4相關目錄下:
這里使用scp命令進行復制,首先保證flower2~4下有~/.ssh目錄。
這里以flower2為例
[root@flower1 .ssh]# scp id_rsa.pub root@10.170.125.14:~/.ssh
然后到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
其余幾台服務器使用類似的方式修改即可。