這裏直接寫步驟,下面的有興趣可以看看
1.進入到.ssh目錄下
[root@wangjian /]# cd /root/.ssh/
[root@wangjian .ssh]#
2. 執行生成密鑰,所有的參數都可以爲空,也就是一直回車確認: ssh-keygen -t rsa
[root@wangjian .ssh]# 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:
SHA256:LbwmYfGVE/RnsDNCmiZO8eyHt+0WoFVfmaI1NI6MqX8 root@wangjian
The key's randomart image is:
+---[RSA 3072]----+
| . .+ oo o|
| + ++++*.o.|
| + *o=+Bo=. |
| o B.+o+ =. |
| +.So+. |
| . .o= o. |
| . o..E.. |
| o ... |
| .. |
+----[SHA256]-----+
[root@wangjian .ssh]#
3. 查看生產的文件
[root@wangjian .ssh]# ll
total 12
-rw-------. 1 root root 2602 Jun 29 21:38 id_rsa
-rw-r--r--. 1 root root 567 Jun 29 21:38 id_rsa.pub
-rw-r--r--. 1 root root 525 Jun 21 18:23 known_hosts
[root@wangjian .ssh]#
4.如果沒有authorized_keys ,就新建,這裏可以看到我沒有這個文件.
touch authorized_keys
[root@wangjian .ssh]# touch authorized_keys
[root@wangjian .ssh]# ll
total 12
-rw-r--r--. 1 root root 0 Jun 29 21:41 authorized_keys
-rw-------. 1 root root 2602 Jun 29 21:38 id_rsa
-rw-r--r--. 1 root root 567 Jun 29 21:38 id_rsa.pub
-rw-r--r--. 1 root root 525 Jun 21 18:23 known_hosts
[root@wangjian .ssh]#
5.設置權限 chmod 600 authorized_keys
[root@wangjian .ssh]# chmod 600 authorized_keys
[root@wangjian .ssh]# ll
total 12
-rw-------. 1 root root 0 Jun 29 21:41 authorized_keys
-rw-------. 1 root root 2602 Jun 29 21:38 id_rsa
-rw-r--r--. 1 root root 567 Jun 29 21:38 id_rsa.pub
-rw-r--r--. 1 root root 525 Jun 21 18:23 known_hosts
[root@wangjian .ssh]#
6.複製公鑰到需要免登陸的服務器 scp id_rsa.pub wangjianali:/root/.ssh/
複製時還是需要輸入密碼的
[root@wangjian .ssh]# scp id_rsa.pub wangjianali:/root/.ssh/
The authenticity of host 'wangjianali (101.37.18.102)' can't be established.
ECDSA key fingerprint is SHA256:k+24IDtR7DCnFjWo1R9+lZpC+m3WK+NBDFZjXpa0YgM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'wangjianali,101.37.18.102' (ECDSA) to the list of known hosts.
root@wangjianali's password:
id_rsa.pub 100% 567 26.8KB/s 00:00
[root@wangjian .ssh]#
7.將客戶端公鑰追加到服務端的authorized_key
文件中,完成公鑰認證操作,如果服務端沒有authorized_key,執行4,5步
cat id_rsa.pub >> authorized_keys(這裏需要注意,id_rsa.pub一定要是自己複製過來的文件,不要和自身的id_rsa.pu混淆)
[root@wangjianali .ssh]# cat id_rsa.pub >> authorized_keys
[root@wangjianali .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCZdQHmP/1pKJwpANEdoDdVkpi7wV7jdlsto3h/jsUHsaX0t5pFDoFLKmUz9XaxgWqQhR8Rvvh9w9tXujxSoRlXea8rI7HhelYysgKxu7OkrYYbMpXUQtQU5fHSR+iPEX6geRQDTAvh78O+o/vYFrvOiO9oQQOpxfaZfBFiiSCW/o5cRmqSiQY39sKiI1kHeFn+CcxcCjZxvQwTU9oFV08ySRel1QNB3bPwcXN0+d4x7FnCiU26AeMcO8GjF9mEfc513cMv3L/Wba0ZNxPxUBcTmsm5k/3Z6IXtIQmiquifjXT42fAsqQp8P8DKTkkVWsS96kjBL6DmSFSYvSPM3zPlRziLeaj+0hu+6Bsu6HQqt47y/efB/+/if+taA6XPEcw3DKKIndxAUzHJoCQAL+hquUnuuS+2HEMjsbBjCUPLEpk/Is8tdqA0wtlWkO4RHNGZsjMx3ZO5EN5NkczNP8ALHE9kpUMK030keEaKJpka5piRseMc+lY2TY0uLNdclIE= root@wangjian
8.測試 ssh wangjianali
[root@wangjian .ssh]# ssh wangjianali
Welcome to Alibaba Cloud Elastic Compute Service !
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Mon Jun 29 21:43:27 2020 from 27.17.178.28
[root@wangjianali ~]#
可以看到這裏已經不需要密碼,就直接連接到wangjianali這個服務器了
我沒有在意authorized_keys文件的權限,導致最後還是需要密碼,這裏大家一定要注意下
scp
傳輸文件
scp(secure copy)
是linux
系統下基於ssh
登錄進行安全的遠程文件拷貝的命令。
# 傳遞文件到遠程
scp local_file remote_username@remote_ip:remote_file
# 傳遞文件夾到遠程
scp -r local_folder remote_username@remote_ip:remote_folder
# 複製遠程文件到本地,只是調換下文件參數位置即可
scp remote_username@remote_ip:remote_file local_file
與scp
相似的命令是cp
,但是cp
只能本機拷貝而不能跨服務器,因此需要與ssh
合作構成scp
命令。
我們直接使用scp
來跨機器拷貝文件,會提示輸入密碼:
# 提示輸入server端服務器的wangjianali用戶密碼
[root@wangjiantencent ~]# ls
authorized_keys logs store
[root@wangjiantencent ~]# scp store/ wangjianali:~/
root@wangjianali's password:
原因就在於,scp
是先使用ssh
連接服務端機器後,再使用網絡來執行遠程拷貝(cp)
。
可以參考ssh
的過程:
# 同樣的提示輸入server端服務器的work用戶密碼
[root@wangjiantencent ~]# ssh wangjianali
root@wangjianali's password:
SSH
免密登錄
我們都知道如何使用ssh
登錄遠程服務器了,但是每次登錄都要輸入密碼,比較麻煩。ssh
提供一種免密登錄的方式:公鑰登錄.
- 在客戶端使用
ssh-keygen
生成一對密鑰:公鑰+私鑰 - 將客戶端公鑰追加到服務端的
authorized_key
文件中,完成公鑰認證操作 - 認證完成後,客戶端向服務端發起登錄請求,並傳遞公鑰到服務端
- 服務端檢索
authorized_key
文件,確認該公鑰是否存在 - 如果存在該公鑰,則生成隨機數
R
,並用公鑰來進行加密,生成公鑰加密字符串pubKey(R)
- 將公鑰加密字符串傳遞給客戶端
- 客戶端使用私鑰解密公鑰加密字符串,得到
R
- 服務端和客戶端通信時會產生一個會話
ID(sessionKey)
,用MD5
對R和SessionKey
進行加密,生成摘要(即MD5
加密字符串) - 客戶端將生成的
MD5
加密字符串傳給服務端 - 服務端同樣生成
MD5(R,SessionKey)
加密字符串 - 如果客戶端傳來的加密字符串等於服務端自身生成的加密字符串,則認證成功
- 此時不用輸入密碼,即完成建連,可以開始遠程執行
shell
命令
實現免密登錄
ssh-genkey
是生成密鑰的工具,執行完成後生成公鑰和密鑰,這兩個文件會默認保存在~/.ssh/
路徑下。常用的參數爲:
-t:
指定生成密鑰類型(rsa、dsa)
。默認爲rsa
-f:
指定存放私鑰的文件,公鑰文件名爲私鑰文件名加.pub
後綴。默認爲id_rsa
-P:
指定passphrase
(私鑰的密碼),用於確保私鑰的安全。默認爲空-C:
備註。默認爲user@hostname
我們直接執行來生成密鑰,所有的參數都可以爲空,也就是一直回車確認:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/work/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
74:17:74:38:b2:c7:70:fd:1d:33:eb:e2:71:71:cc:11 [email protected]
此時,生成的文件在~/.ssh/
目錄下,我們會看到這些文件:
id_rsa // 私鑰文件
id_rsa.pub // 公鑰文件
authorized_keys // 存放客戶端公鑰的文件
known_hosts // 確認過公鑰指紋的可信服務器列表的文件
config // 指定不同域名使用哪個密鑰的配置文件
因爲一臺機器即能是客戶端,又能是服務端,因此同時存在authorized_keys
(在該機器爲服務端時使用)和Known_hosts
(在該機器爲客戶端時使用)。
我們的服務器會有很多的用戶,如果所有的用戶都用同一份密鑰,可能就沒辦法劃分權限或者區分用戶,如多個用戶提交git
就需要按照用戶名來生成密鑰,用於區分用戶。同時你可能也希望針對不同的服務器使用不同的密鑰對,因此需要config
配置文件來配置針對不同服務器的配置:
$vim ~/.ssh/config
Host a.baidu.com
User work
IdentityFile ~/.ssh/id_rsa
Host b.baidu.com
User zhaoshuaiqiang
IdentityFile ~/.ssh/zhaoshuaiqiang
這樣在連接不同的服務器時,就會使用不同的密鑰文件來登錄。
在客戶端生成密鑰對之後,將公鑰追加到服務器的authorized_keys
文件中即可。
...
15 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAn30bjwtkLW82vTlLMQnI/a42J2g7o+HBCpSzBgNG+xfZuSNQOAU8+FNKQvriT4AL7ToiTtrZDLOEGqyQzaxQejuNnWG6aQ9ETh96qXhVLecWidaBieFGuv+F
uXz6x551xtFXx64AzG+706dhnv1nOACYlrnfvXhi5kZzWzprET+CxMIeYhJQwwc19pF5zCWeU9QUvd1mOu0n8JVycevmuXRdVx9WpXq2+aaaaaaaa3uYGMBxvSLtT40O1AiEZ+k9EeYCnTEV
tnGoVWCyxpwv6rR/GDOtJL/d+/Wb6I0HEKxxe087yZz8GWpQN5TEIAjq3oEjI/aiGw== [email protected]
16 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzRmK+CAVLnryXqQwweu8Yji8bGAvqzf8PSDzYn1nmE6ZeDkBbrWvFlVZ2yOip3IX8RjvuPc28mTCr0LsIOOmpvET0SzOkt0hzLBPiyCN/QvbKU/RbUv8v5y2
hEAlbUkMEzv7qOHQEruGEvA5y99gf/nYjK5OFKVpmg838OScUV3i88Xbqk8rtcuRZHWuZLnuB5spBsEE5r1UrnH/Ik7frZr8Vb4X6aZWbAp1yc0SqZ8JXVbmOiakqq0WqkLm+zqhEwr+Ooh2guH23x9zjMqY
Uy+aaaaaBEBC+LepCvskArBt/SRwJDJkcItz8T7kBC3CP0Y0X4hB+6k6/yM/pup5w== [email protected]
此時,即可免密登錄服務器。
私鑰的安全性
假設你已經實現了服務器集羣的免密登錄,那麼如果你的一臺客戶端被攻擊成功了,那麼整個集羣的安全性便蕩然無存了。因此,我們有時還需要對密鑰做安全性保障,即設置私鑰密碼:
// 使用rsa方法加密,生成test密鑰對,私鑰密碼爲123456
ssh-keygen -t rsa -f test -P 123456
此時,各機器仍然是免密登錄,但是需要你輸入私鑰密碼:
$ssh [email protected]
Enter passphrase for key '/home/work/.ssh/test':