在EC2 Linux之间免密码登陆

一、背景

1、应用场景

在云上用EC2运行一些集群式应用的时候,需要让多个节点之间可以无缝的访问,互相具有可信的权限,也就是通常说的免密码登陆。通常,在AWS云上的EC2默认是证书方式登陆的,那么这种免密码登陆与EC2内置的证书登陆有何区别?请看本文讲解。

2、证书登陆的原理

SSH有多种身份验证,包括密码验证、证书验证、LDAP认证等。在非云环境上,大家使用最多的是密码认证,为用户提供正确的密码即可登陆。证书认证的方式是生成一组非对称密钥,算法通常是RSA或者ED2559椭圆曲线算法。生成好的证书分别是公钥(idrsa.pub)和私钥(idrsa)。公钥可以被公开给所有节点和用户,而私钥仅掌握在客户端手中。当登陆Linux服务器时,客户端(例如开发者笔记本)手中拿的是PEM格式的私钥,Linux服务器上事先已经配置好公钥。然后进行身份认证,公钥和私钥匹配认证通过,则获得SSH后的Shell权限。

免密码登陆的原理,是提前在要登陆的客户机上,将要使用的公钥加入受信任列表;而在发起操作的客户机上,将要使用的私钥提前方式在特定目录。由于AWS EC2创建时候就默认使用证书登陆,因此一般登陆EC2都会使用ssh -i xxx.pem ec2-user@10.10.10.10这样的命令来登陆。这条命令中,-i xxx.pem就是指定钥使用的证书私钥,而证书公钥在创建EC2时候,已经自动被EC2初始化向导加入信任列表了,因此就可以登陆成功。如果希望免掉-i xxx.pem参数,那么只需确保发起登陆的客户端节点的证书文件在默认的~/.ssh/目录下即可。由此,即可实现SSH命令免参数、免密码登陆。下面来创建一个实验环境。

3、本实验的环境创建

创建3个EC2,选择最小的t2或者t3规格即可,系统可选择兼容CentOS 7的Amazon Linux 2操作系统。选择其他Linux系统也是相同的原理。三个节点中,一个作为Master节点(Lead节点),另外两个作为Slave节点(Member节点)。在创建以上Linux节点的过程中,和往常一样,使用AWS控制台上提供的证书作为登陆EC2的凭证。

稍后,为了三台节点之间互信,我们将创建一个不受AWS控制台管理的新的密钥对,然后用这个新的密钥对去配置节点之间的免密钥登陆。由此,生成的新免密码登陆不会影响现有EC2的PEM证书登陆。

二、实现从Lead节点到Member节点的免密钥登陆

首先配置Lead节点到Member节点的免密钥登陆。此时Lead节点作为发起SSH命令的客户端,Member节点是SSH的Server端。

1、在Lead节点上修改SSH客户端服务配置文件

使用System Manager或者其他方式登陆到Lead节点,切换到root身份,编辑~/.ssh/config文件,如果不存在的话新建这个文件。加入内容如下:

Host *
    ForwardAgent yes
Host *
    StrictHostKeyChecking no

保存退出。

2、在Lead节点上创建密钥对

切换到root身份,执行ls -la ~/.ssh/命令查看本机是否已经有存在的密钥对,分别是公钥id_rsa.pub和私钥id_rsa。如果有存在的,可能是之前部署别的应用时候创建过,那么可以使用现存的,即可跳过本小节。如果本机上没有这两个文件,那么可以使用如下方法生成。

执行如下命令生成新密钥:

ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

以上命令将在~/.ssh/目录下生成一对密钥,分别是公钥id_rsa.pub和私钥id_rsa

设置权限为仅本用户可读:

chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/config

3、在Lead节点上将密钥对的公钥复制出来

切换到root身份,执行cat ~/.ssh/id_rsa.pub命令,将公钥以文本格式显示,然后复制出来。其格式类似如下:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/ymz3blFX+icS5XL1Tz3TyaV9Y6pxL1xZD559P3DMJMF9SRaQgTH8AfXZbKyjkUC03Aujbo5NAJpkW806h4gkK+rJHHXYXX5gX1QmdN2mABRppgs+vvr+V1AbLfnEmVwFutsuYqmRKVX1paCXWCmzfJ6LlkDYScFYA+rYQwMzrH+6rOCEIyxnAgtYoCTWkKJRESddyy5Oh584GiF2NAtufwT5qU38z2TkqHZo4XQ/J2dIQX1q4p6r8VNKNujnbiZIADVrbjd2oCUgjWTPer99yO94SAlpTenWdMA0oI41yDzlmIy3KUlk2ml5XkU5+9N0a29xr/nanu1kPEqzOz8J root@ip-172-31-47-219.us-west-2.compute.internal

至此Lead节点配置完成。

4、在Member节点上设置对公钥的信任

使用System Manager或者其他方式登陆节点,切换到root身份,编辑~/.ssh/authorized_keys文件,这个文件对于一台AWS EC2而言是已经存在的,如果是自己导入的Image到云上,那么可能是没有这个文件的,新建一个空白的即可。

切换到root身份,将上一步的公钥加入到~/.ssh/authorized_keys文件的末尾。注意不要删除和改动authorized_keys文件现有的配置,如果改动现有信息,那么现有登陆就会失效。添加完毕后,效果如下:

o-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"ec2-user\" rather than the user \"root\".';echo;sleep 10" ssh-rsa AAABB5NzaC1yc2EADAADAQABBAABAQC32mKMtMI0xC/TVOqP1rqASFFTipLuncy1FDd/qfLvax0wb+0o+kHzDB+CUN4fA24Y3ipi3z/Lx0rGD0GJaQNdLrhq+sUB0FTPH7t+HBrMOghom+H9xJVcMX+sKke+Od3ySQg++IIBuXx1RG+jdBV/cI1PpLwlpYHuMpVS4t8ZmO2srkYm5nQn/vXYGUTiTD+/VRNyp3xqzlkA2znlM2h+YSnrNFbl2YRCyEQNM59ZUeDKjOCvLPg3zvTXvSwooll1aXMSbZsRjtQlChiXIyubny+Z1cM1w8Xg1iJQEAsMGmum40vetPtfSKNcZFqUvf9/eEnTm19IBPxvH8vjms1z9 mykey
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/ymz3blFX+icS5XL1Tz3TyaV9Y6pxL1xZD559P3DMJMF9SRaQgTH8AfXZbKyjkUC03Aujbo5NAJpkW806h4gkK+rJHHXYXX5gX1QmdN2mABRppgs+vvr+V1AbLfnEmVwFutsuYqmRKVX1paCXWCmzfJ6LlkDYScFYA+rYQwMzrH+6rOCEIyxnAgtYoCTWkKJRESddyy5Oh584GiF2NAtufwT5qU38z2TkqHZo4XQ/J2dIQX1q4p6r8VNKNujnbiZIADVrbjd2oCUgjWTPer99yO94SAlpTenWdMA0oI41yDzlmIy3KUlk2ml5XkU5+9N0a29xr/nanu1kPEqzOz8J root@ip-172-31-47-219.us-west-2.compute.internal

保存退出。无须重新启动SSH服务,修改后立刻生效。

5、从Lead节点登陆到Member节点的测试

登陆到,切换到root身份,在Lead节点上执行如下命令:

ssh 172.31.58.204

返回结果如下:

Last login: Tue Oct 29 03:55:22 2024 from ip-172-31-47-219.us-west-2.compute.internal
   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

[root@ip-172-31-58-204 ~]#

可看到登陆成功。

由此实现了从Lead节点到Member节点的无缝登陆。

四、实现Member节点之间的互通、以及Member节点到Lead节点的互通

上文的配置步骤,实现了Lead节点到Member节点的免密钥登陆。然而两个Member节点之前,还是不能免密钥登陆的,同时从Member节点向Lead节点,还是不能免密钥的。如果要实现集群内所有节点、所有方向都免密钥,那么还需要互相配置信任。

1、确保集群内所有节点的受信任证书都包含对应的公钥

上文仅对一台Member节点配置了受信任文件即authorized_keys。接下来要对集群内所有节点,包括Lead节点和其他Member节点都完成这一配置。

使用System Manager或者其他方式登陆到所有节点,包括Lead节点和Member节点,切换到root身份,编辑文件~/.ssh/authorized_keys,保存这个文件中的现有内容不要删除,然后在末尾将证书的公钥粘贴进去。保存退出。

在所有节点执行如下命令设置正确的权限。

chmod 600 ~/.ssh/authorized_keys

在完成这步配置后,Lead节点可以免登陆所有的Member节点了。

2、确保集群内所有节点都拥有私钥文件

上文的配置是在Lead节点生成的密钥对,因此仅Node节点有证书的私钥。为了在所有节点之间实现登陆,那么需要将证书从Lead节点复制到其他Member节点。复制的办法可以采用scp命令复制。由于上一步已经配置好Lead节点对所有Member节点的登陆,因此在Lead节点上执行如下scp命令即可直接复制文件。

scp ~/.ssh/id_rsa 172.31.55.132:/root/.ssh/
scp ~/.ssh/id_rsa 172.31.58.204:/root/.ssh/

替换以上IP地址为Member节点实际的IP地址,注意保持目录不要变。

如果对Linux的scp命令不熟悉的话,还可以采用cat命令显示证书内容并复制到剪贴板,再通过终端登录到各节点上,编辑~/.ssh/id_rsa,粘贴刚才复制的私钥,即可完成复制。

在所有节点执行如下命令设置正确的权限。

chmod 600 ~/.ssh/id_rsa

3、确保集群内所有节点都配置了SSH客户端参数

使用System Manager或者其他方式登陆到所有节点,包括Lead节点和Member节点,切换到root身份,新建~/.ssh/config文件,加入内容如下:

Host *
    ForwardAgent yes
Host *
    StrictHostKeyChecking no

保存退出。

在所有节点执行如下命令设置正确的权限。

chmod 600 ~/.ssh/config

4、测试节点之间的相互登陆

至此配置完成。所有节点之间都可免密码登陆。

五、参考文档

To enable passwordless SSH between the instances in the cluster

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-passwordless