没有关联的密钥对,将密钥对添加到没有密钥对的 EC2

没有关联的密钥对,将密钥对添加到没有密钥对的 EC2

如何将现有密钥添加到没有密钥对的实时 EC2 实例?

我尝试使用会话管理器vi /.ssh/authorized_keys并添加该对的公钥,但出现此错误:

"~/.ssh/authorized_keys"
"~/.ssh/authorized_keys" E212: Can't open file for writing

这是否必须使用控制台来完成?

No associated key pair
This instance is not associated with a key pair. Without a key pair, you can't connect to the instance through SSH.
You can connect using EC2 Instance Connect with just a valid username. You can connect using Session Manager if you have been granted the necessary permissions.

答案1

由于您已配置了 Systems Manager,因此您已成功了一半。唯一阻碍您成功的是 Systems Manager Session 会按 和 来打开会话,ssm-user您需要sudo -u ec2-user -i先按 来登录,然后按ec2-user来执行后续步骤。

~ec2-user/.ssh然后,如果目录不存在,您可能必须创建该目录并将其 chmod 设置为 700。

最后,您可以将公钥添加到~ec2-user/.ssh/authorized_keys文件并将 chmod 设置为 600。

这应该够了吧 :)

答案2

不确定这种方法有多有效...

如果您使用用户数据脚本从某处(比如参数存储)提取公钥,然后添加用户并设置该用户的.ssh目录,那么您就可以有效地通过 SSH 登录,而无需将密钥对直接附加到 EC2(这样)...我认为。

我们有一个堡垒服务器,它允许我们使用 AWS 创建到特定终端的隧道,并且有一个允许 PTY 的选项,因此您实际上可以通过 SSH 连接到堡垒。如果没有该选项,您只能通过 SSH 隧道通过堡垒连接到一组受控服务。

用户数据脚本中的函数(我们使用 shell 脚本而不是 YAML)。

#!/bin/bash -xe

build_user ()
{
    # Extract parameters
    # ==================

    # SSH Username / Parameter Store key, TTY Allowed, Permission group
    local username="$1"
    local tty=$2
    local permGroup="PERM_GROUP_$3"


    # Define working variables
    # ========================

    # Get the collection of tunnels from the permission group
    local tunnels="$${!permGroup}"

    # SSH Directory, authorised_keys filename, and default SSH restrictions
    local sshDirectory="/home/$username/.ssh"
    local sshAuthorizedKeyFile="$sshDirectory/authorized_keys"
    local sshRestrictions="restrict,port-forwarding"

    # Create account
    echo "Create account for $username"
    useradd "$username" || echo "The account $username already exists."
    if [ ! -d "$sshDirectory" ]; then
        mkdir -p "$sshDirectory"
        chmod 700 "$sshDirectory"
    fi


    # Define the SSH restrictions
    # ===========================

    # Allow TTY if allowed
    if [ "$tty" == "true" ]; then
        local sshRestrictions="$sshRestrictions,pty"
    fi

    # Add allowed tunnels based upon permission group
    for tunnel in $${tunnels[@]}; do
        sshRestrictions="$sshRestrictions,permitopen=\"$tunnel\""
    done


    # Build and set the correct permissions on the authorized_keys file
    # =================================================================
    echo "# $username" > "$sshAuthorizedKeyFile"
    SSH_KEYS=$(aws ssm get-parameter --name /BASTION/SSH_PUBLIC_KEYS/$username --region $AWS_REGION --with-decryption --query 'Parameter.Value' --output text)
    echo "$SSH_KEYS" | while IFS= read -r ssh_key; do
        echo "$sshRestrictions $ssh_key" >> "$sshAuthorizedKeyFile"
    done
    chmod 600 "$sshAuthorizedKeyFile"
    chown -R "$username":"$username" "$sshDirectory"
}

除了函数之外,我们还生成了一些调用/设置(我们为此使用了 Terraform)。

# Define the permission groups
# ============================
%{ for perm_group,perms in bastion_perm_groups ~}
PERM_GROUP_${upper(perm_group)}="%{ for perm in perms }${perm} %{ endfor }"
%{ endfor ~}

# Get the AWS Region we are deployed in
# =====================================
AWS_REGION=$(curl http://169.254.169.254/latest/meta-data/placement/region)

# Create users and their authorized_keys
# ======================================
%{ for name, user in bastion_users ~}
build_user ${name} ${user.tty} ${upper(user.perm_group)}
%{ endfor ~}

因此,我们有一个权限组列表(实际上是 READ_ONLY 和 READ_WRITE)。每个组都列出了大量 RDS 和 Redis 端点。

用户是一个姓名列表,如果他们有 PTY 访问权限,则以true/开头false,然后是他们需要拥有的组名。

最终结果是目录中的目录列表/home,每个用户一个,.ssh/authorized_keys每个用户目录中控制他们可以通过 SSH 执行的操作。

很多东西都是我们自己提供的。安全吗?好吧。我认为如果你知道自己在做什么,你总能避开各种麻烦。但用户列表受到严格控制,还有其他安全元素未在此处详述。

通过将其作为启动 EC2 的用户数据脚本(我们目前正在通过自动缩放组使用启动配置,并计划转移到启动模板),如果重新启动或更换,则脚本将运行,因此您不会失去 SSH 隧道功能。 IP 地址可能会发生变化,因此 EIP 在这里很有用。

如果您不想重新部署堡垒机,而想进行更新,可以运行以下命令:

curl http://instance-data/latest/user-data | sudo sh

因此,处理无密钥对的方法和允许多个人进行控制登录的方法完全不同。

如果这些内容对这个问题稍微有用,那就太好了!如果没有,那就忽略我吧。

相关内容