【原创】Linux 设置 SSH 免密登录

前言

1、概要

在运维或者操作多台 Linux 系统的服务器时,比较常用到的方法就是通过脚本一键管理与操作某些功能,这种时候使用 ssh 的免密登录就非常方便了。

本文介绍如何在两台 Linux 服务器之间设置免密登录。

2、相关环境

本文演示操作的相关环境如下:

Ubuntu 18.04.5
OpenSSH 7.6

3、免密登录原理

Linux 的 ssh 免密登录原理有点类似于现实生活中的门禁管理。比如,很多管理比较严格的小区对于出入人员都是有身份验证的要求的,一般的流程是业主需要使用身份证复印件在物业处进行身份登记,比如业主的身份证相当于是 ssh-keygen 生成的公钥,而在物业处进行身份登记就相当于是将公钥复制到指定主机用户的 ~/.ssh/authorized_keys 文件。然后业主进入小区的时候,物业会对身份进行校验,就相当于是 ssh 的公钥校验。

简单来说:如果要实现从 A 机器免密登录到 B 机器,那么需要在 A 机器上生成公钥,并将 A 机器的公钥注册(复制)到 B 机器,然后就能从 A 机器免密登录到 B 机器了。

4、注意事项

免密登录只对指定用户生效,比如 A 服务器的用户 zhangsan 生成的公钥,注册到了 B 服务器的 lisi 名下,那么只能由 A 服务器的 zhangsan 用户登录到 B 服务器的 lisi 用户。

正文

1、生成公钥

使用 zhangsan 登录 A 服务器,执行 ssh-keygen 命令,然后屏幕上会有提示输入的行,全部不用输入直接回车(Enter)即可。

zhangsan@ubuntu:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zhangsan/.ssh/id_rsa): 
Created directory '/home/zhangsan/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/zhangsan/.ssh/id_rsa.
Your public key has been saved in /home/zhangsan/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hdaD5TMzfL+srUTFz3oX55+nyRxvc6mLvio2dbvD52Y zhangsan@ubuntu
The key's randomart image is:
+---[RSA 2048]----+
|          .      |
|         B   .   |
|        + @ . o  |
|       . . B o o |
|        S   . ..+|
|         . o . +o|
|        . o o = =|
|       +   =.E BB|
|      . o.o=@=O+*|
+----[SHA256]-----+

2、获取公钥内容

获取 A 服务器的 zhangsan 用户生成的公钥内容,并复制其内容。

zhangsan@ubuntu:~$ cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIU2t0SPLcixULxEBeCMIABHFk8HZtBq5hQs7YqaWOR9IKfjKXDYN6Q9kB7APKEFlA0EvisykQS+LtXO2GVmK0b5GWYMpzXYbJQY2BqNdW5W1lAagGd6hBJ/gALK25gyAxontdIRld6eKZWoUyAaecDdpFGIQqTyYmfG7Fxoy6V+qjtNE3pCk3zG5OaMTkOROR6Vp8LP6OYBu0yuUIecg2KV55q6rDJggOKOYe/ekwSZfOVDvT4I5R97rG4MmXrTS4QySPW4bC3kb/yIIsBXq6i61UpAkHAmXGOrcD6alGGI/IPvqE7XeftwA37d8gZzUjXmWt8hAn0VvvAvdC9fah zhangsan@ubuntu

3、将 A 的公钥内容复制到 B 机器

将 A 的 zhangsan 的公钥内容复制到 B 的 lisi 的 ~/.ssh/authorized_keys 文件中,如果 lisi 的家目录下没有 .ssh 目录,可以创建一个(也可以在 B 上执行第一步的命令 ssh-keygen 同样也会生成该目录)

lisi@ubuntu:~$ pwd
/home/lisi
lisi@ubuntu:~$ mkdir .ssh
lisi@ubuntu:~$ 
lisi@ubuntu:~$ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIU2t0SPLcixULxEBeCMIABHFk8HZtBq5hQs7YqaWOR9IKfjKXDYN6Q9kB7APKEFlA0EvisykQS+LtXO2GVmK0b5GWYMpzXYbJQY2BqNdW5W1lAagGd6hBJ/gALK25gyAxontdIRld6eKZWoUyAaecDdpFGIQqTyYmfG7Fxoy6V+qjtNE3pCk3zG5OaMTkOROR6Vp8LP6OYBu0yuUIecg2KV55q6rDJggOKOYe/ekwSZfOVDvT4I5R97rG4MmXrTS4QySPW4bC3kb/yIIsBXq6i61UpAkHAmXGOrcD6alGGI/IPvqE7XeftwA37d8gZzUjXmWt8hAn0VvvAvdC9fah zhangsan@ubuntu' > ~/.ssh/authorized_keys

将 echo 后的单引号中的内容替换即可。

4、设置 authorized_keys 文件权限(重要)

为 B(lisi)中的 ~/.ssh/authorized_keys 文件设置 644 权限。这一步非常重要,不然即使复制了公钥,仍然需要输入密码。

lisi@ubuntu:~$ cd ~/.ssh
lisi@ubuntu:~/.ssh$ ls -l
total 4
-rw-rw-r-- 1 lisi lisi 397 Oct 25 20:24 authorized_keys

5、免密登录

从 A (zhangsan) 免密登录到 B (lisi)。

zhangsan@ubuntu:~/.ssh$ ssh -o StrictHostKeyChecking=no lisi@node2
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.0.0-23-generic x86_64)
*
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
*
 * Canonical Livepatch is available for installation.
*   - Reduce system reboots and improve kernel security. Activate at: https://ubuntu.com/livepatch
0 packages can be updated.
0 of these updates are security updates.
*
New release '20.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
*
Your Hardware Enablement Stack (HWE) is supported until April 2023.
*** System restart required ***
Last login: Sun Oct 25 20:19:57 2020 from 192.168.0.113
lisi@ubuntu:~$ 

注:

(1) -o StrictHostKeyChecking=no 是用于解决第一次使用 ssh 进行登录时会提示。如果不加此参数,会出现如下所示的提示,如果是在 shell 脚本中进行连接,建议使用此参数避免出现问题。关于这个问题的详细信息,请参考另一篇文章:

zhangsan@ubuntu:~/.ssh$ ssh lisi@node2
The authenticity of host 'node2 (192.168.0.114)' can't be established.
ECDSA key fingerprint is SHA256:JtpNyPoowLoghAS07IhtswPGs2wMjDooEK1RmCkL6/k.
Are you sure you want to continue connecting (yes/no)? 

(2) node2 是 /etc/hosts 中配置的 domain name,也可以是 hostname 或者 IP (如 ssh lisi@192.168.0.114)

(3) lisi@node2 表示的是通过用户 lisi 登录到 node2,只是这里是免密而已,而且由于公钥只复制到了用户 lisi 的家目录下(/home/lisi/.ssh/authorized_keys),因此,免密只对 lisi 用户生效。

(4) 如果不指定用户,如 ssh node2 表示使用当前服务器(A)登录的用户(zhangsan)作为登录 node2 的用户。

总结

为 Linux 的 SSH 设置免密登录还是比较简单的,但其中也有一些需要注意的小细节,比如 authorized_keys 的文件权限就是经常出现的问题等等。

You may also like...

发表评论

电子邮件地址不会被公开。