如何将现有密钥添加到没有密钥对的实时 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
因此,处理无密钥对的方法和允许多个人进行控制登录的方法完全不同。
如果这些内容对这个问题稍微有用,那就太好了!如果没有,那就忽略我吧。