如何使用 cloud-init 和用户数据添加拥有至 EC2 实例的 SSH 访问权限的新用户账户?

上次更新时间:2019 年 6 月 19 日

我需要添加另一个可使用 SSH 连接到 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例的用户。如何使用 cloud-init 和用户数据进行此操作?

简短描述

将用户数据脚本传递到执行以下操作的 cloud-init

1.    创建新用户。

2.    为 SSH 目录及其中的文件设置适当的所有权和文件权限。

3.    将 SSH 公钥附加到 authorized_keys 文件。

解决方法

在开始之前,请注意以下几点:

  • 停止和重新启动实例会擦除实例存储卷上的所有数据。请确保备份包含您想保留的数据的所有实例存储卷。有关更多信息,请参阅确定 AMI 的根设备类型
  • 停止和重新启动实例会更改实例的公有 IP 地址。在将外部流量路由到您的实例时,最佳做法是使用弹性 IP 地址而不是公有 IP 地址。

1.    使用 SSH 连接到您的 EC2 实例

2.    运行下面的命令以确认 cloud-init 已安装:

sudo yum list installed cloud-init

如果尚未安装 cloud-init,请运行下面的命令来安装它:

sudo yum install cloud-init

3.    打开 Amazon EC2 控制台,然后选择实例。

4.    依次选择操作实例状态停止

注意:如果停止处于禁用状态,则表示要么实例已停止,要么其根设备是一个实例存储卷。

5.    从密钥对检索公钥

6.    依次选择操作实例设置查看/更改用户数据

7.    复制以下命令并将其粘贴到用户数据字段。

对于用户名,请输入新用户的用户名。对于 ssh-rsa AB3nzExample,请输入您的公钥。

#cloud-config
cloud_final_modules:
- [users-groups,always]
users:
  - name: username
    groups: [ wheel ]
    sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
    shell: /bin/bash
    ssh-authorized-keys: 
    - ssh-rsa AB3nzExample

注意:默认情况下,cloud-init 指令仅在实例启动时执行。但是,如果您使用此用户数据脚本,则每次实例重新引导或重新启动时,cloud-init 会将公钥添加到实例。如果您移除此用户数据脚本,则将恢复默认功能。

8.    选择保存

9.    依次选择操作实例状态启动

10.    当实例进入运行状态时,以新用户身份登录。新用户的默认行为与 ec2-user 相同。

注意:修改实例的用户数据使用 ModifyInstanceAttribute API 操作。您可以创建 AWS Identity and Access Management (IAM) 策略来限制此操作。