使用公鑰/私鑰對(duì)設(shè)定免密的Linux登錄方式
使用一組公鑰/私鑰對(duì)讓你不需要密碼登錄到遠(yuǎn)程 Linux 系統(tǒng)或使用 ssh 運(yùn)行命令,這會(huì)非常方便,但是設(shè)置過(guò)程有點(diǎn)復(fù)雜。下面是幫助你的方法和腳本。
在 Linux 系統(tǒng)上設(shè)置一個(gè)允許你無(wú)需密碼即可遠(yuǎn)程登錄或運(yùn)行命令的帳戶(hù)并不難,但是要使它正常工作,你還需要掌握一些繁瑣的細(xì)節(jié)。在本文,我們將完成整個(gè)過(guò)程,然后給出一個(gè)可以幫助處理瑣碎細(xì)節(jié)的腳本。
設(shè)置好之后,如果希望在腳本中運(yùn)行 ssh
命令,尤其是希望配置自動(dòng)運(yùn)行的命令,那么免密訪(fǎng)問(wèn)特別有用。
需要注意的是,你不需要在兩個(gè)系統(tǒng)上使用相同的用戶(hù)帳戶(hù)。實(shí)際上,你可以把公用密鑰用于系統(tǒng)上的多個(gè)帳戶(hù)或多個(gè)系統(tǒng)上的不同帳戶(hù)。
設(shè)置方法如下。
在哪個(gè)系統(tǒng)上啟動(dòng)?
首先,你需要從要發(fā)出命令的系統(tǒng)上著手。那就是你用來(lái)創(chuàng)建 ssh
密鑰的系統(tǒng)。你還需要可以訪(fǎng)問(wèn)遠(yuǎn)程系統(tǒng)上的帳戶(hù)并在其上運(yùn)行這些命令。
為了使角色清晰明了,我們將場(chǎng)景中的第一個(gè)系統(tǒng)稱(chēng)為 “boss”,因?yàn)樗鼘l(fā)出要在另一個(gè)系統(tǒng)上運(yùn)行的命令。
因此,命令提示符如下:
boss$
如果你還沒(méi)有在 boss 系統(tǒng)上為你的帳戶(hù)設(shè)置公鑰/私鑰對(duì),請(qǐng)使用如下所示的命令創(chuàng)建一個(gè)密鑰對(duì)。注意,你可以在各種加密算法之間進(jìn)行選擇。(一般使用 RSA 或 DSA。)注意,要在不輸入密碼的情況下訪(fǎng)問(wèn)系統(tǒng),你需要在下面的對(duì)話(huà)框中的兩個(gè)提示符出不輸入密碼。
如果你已經(jīng)有一個(gè)與此帳戶(hù)關(guān)聯(lián)的公鑰/私鑰對(duì),請(qǐng)?zhí)^(guò)此步驟。
boss$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/myself/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <== 按下回車(chē)鍵即可
Enter same passphrase again: <== 按下回車(chē)鍵即可
Your identification has been saved in /home/myself/.ssh/id_rsa.
Your public key has been saved in /home/myself/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:1zz6pZcMjA1av8iyojqo6NVYgTl1+cc+N43kIwGKOUI myself@boss
The key's randomart image is:
+---[RSA 3072]----+
| . .. |
| E+ .. . |
| .+ .o + o |
| ..+.. .o* . |
| ... So+*B o |
| + ...==B . |
| . o . ....++. |
|o o . . o..o+ |
|=..o.. ..o o. |
+----[SHA256]-----+
上面顯示的命令將創(chuàng)建公鑰和私鑰。其中公鑰用于加密,私鑰用于解密。因此,這些密鑰之間的關(guān)系是關(guān)鍵的,私有密鑰絕不應(yīng)該被共享。相反,它應(yīng)該保存在 boss 系統(tǒng)的 .ssh
文件夾中。
注意,在創(chuàng)建時(shí),你的公鑰和私鑰將會(huì)保存在 .ssh
文件夾中。
下一步是將公鑰復(fù)制到你希望從 boss 系統(tǒng)免密訪(fǎng)問(wèn)的系統(tǒng)。你可以使用 scp
命令來(lái)完成此操作,但此時(shí)你仍然需要輸入密碼。在本例中,該系統(tǒng)稱(chēng)為 “target”。
boss$ scp .ssh/id_rsa.pub myacct@target:/home/myaccount
myacct@target's password:
你需要安裝公鑰在 target 系統(tǒng)(將運(yùn)行命令的系統(tǒng))上。如果你沒(méi)有 .ssh
目錄(例如,你從未在該系統(tǒng)上使用過(guò) ssh
),運(yùn)行這樣的命令將為你設(shè)置一個(gè)目錄:
target$ ssh localhost date
target$ ls -la .ssh
total 12
drwx------ 2 myacct myacct 4096 Jan 19 11:48 .
drwxr-xr-x 6 myacct myacct 4096 Jan 19 11:49 ..
-rw-r--r-- 1 myacct myacct 222 Jan 19 11:48 known_hosts
仍然在目標(biāo)系統(tǒng)上,你需要將從“boss”系統(tǒng)傳輸?shù)墓€添加到 .ssh/authorized_keys
文件中。如果該文件已經(jīng)存在,使用下面的命令將把它添加到文件的末尾;如果文件不存在,則創(chuàng)建該文件并添加密鑰。
target$ cat id_rsa.pub >> .ssh/authorized_keys
下一步,你需要確保你的 authorized_keys
文件權(quán)限為 600。如果還不是,執(zhí)行命令 chmod 600 .ssh/authorized_keys
。
target$ ls -l authorized_keys
-rw------- 1 myself myself 569 Jan 19 12:10 authorized_keys
還要檢查目標(biāo)系統(tǒng)上 .ssh
目錄的權(quán)限是否設(shè)置為 700。如果需要,執(zhí)行 chmod 700 .ssh
命令修改權(quán)限。
target$ ls -ld .ssh
drwx------ 2 myacct myacct 4096 Jan 14 15:54 .ssh
此時(shí),你應(yīng)該能夠從 boss 系統(tǒng)遠(yuǎn)程免密運(yùn)行命令到目標(biāo)系統(tǒng)。除非目標(biāo)系統(tǒng)上的目標(biāo)用戶(hù)帳戶(hù)擁有與你試圖連接的用戶(hù)和主機(jī)相同的舊公鑰,否則這應(yīng)該可以工作。如果是這樣,你應(yīng)該刪除早期的(并沖突的)條目。
使用腳本
使用腳本可以使某些工作變得更加容易。但是,在下面的示例腳本中,你會(huì)遇到的一個(gè)煩人的問(wèn)題是,在配置免密訪(fǎng)問(wèn)權(quán)限之前,你必須多次輸入目標(biāo)用戶(hù)的密碼。一種選擇是將腳本分為兩部分——需要在 boss 系統(tǒng)上運(yùn)行的命令和需要在 target 系統(tǒng)上運(yùn)行的命令。
這是“一步到位”版本的腳本:
#!/bin/bash
# NOTE: This script requires that you have the password for the remote acct
# in order to set up password-free access using your public key
LOC=`hostname` # the local system from which you want to run commands from
# wo a password
# get target system and account
echo -n "target system> "
read REM
echo -n "target user> "
read user
# create a key pair if no public key exists
if [ ! -f ~/.ssh/id_rsa.pub ]; then
ssh-keygen -t rsa
fi
# ensure a .ssh directory exists in the remote account
echo checking for .ssh directory on remote system
ssh $user@$REM "if [ ! -d /home/$user/.ssh ]; then mkdir /home/$user/.ssh; fi"
# share the public key (using local hostname)
echo copying the public key
scp ~/.ssh/id_rsa.pub $user@$REM:/home/$user/$user-$LOC.pub
# put the public key into the proper location
echo adding key to authorized_keys
ssh $user@$REM "cat /home/$user/$user-$LOC.pub >> /home/$user/.ssh/authorized_ke
ys"
# set permissions on authorized_keys and .ssh (might be OK already)
echo setting permissions
ssh $user@$REM "chmod 600 ~/.ssh/authorized_keys"
ssh $user@$REM "chmod 700 ~/.ssh"
# try it out -- should NOT ask for a password
echo testing -- if no password is requested, you are all set
ssh $user@$REM /bin/hostname
腳本已經(jīng)配置為在你每次必須輸入密碼時(shí)告訴你它正在做什么。交互看起來(lái)是這樣的:
$ ./rem_login_setup
target system> fruitfly
target user> lola
checking for .ssh directory on remote system
lola@fruitfly's password:
copying the public key
lola@fruitfly's password:
id_rsa.pub 100% 567 219.1KB/s 00:00
adding key to authorized_keys
lola@fruitfly's password:
setting permissions
lola@fruitfly's password:
testing -- if no password is requested, you are all set
fruitfly
在上面的場(chǎng)景之后,你就可以像這樣登錄到 lola 的帳戶(hù):
$ ssh lola@fruitfly
[lola@fruitfly ~]$
一旦設(shè)置了免密登錄,你就可以不需要鍵入密碼從 boss 系統(tǒng)登錄到 target 系統(tǒng),并且運(yùn)行任意的 ssh
命令。以這種免密的方式運(yùn)行并不意味著你的帳戶(hù)不安全。然而,根據(jù) target 系統(tǒng)的性質(zhì),保護(hù)你在 boss 系統(tǒng)上的密碼可能變得更加重要。