关于自定义Linux AMI初始化SSH密钥安装位置及配置控制权的技术问询
关于自定义Linux AMI初始化SSH密钥安装位置及配置控制权的技术问询
我来帮你拆解这个问题,从AWS实例初始化的核心机制说起:
一、首先明确:AWS靠什么注入SSH密钥?
AWS是通过cloud-init(部分旧版系统用ec2-init)这个初始化服务来处理实例启动时的SSH密钥注入、用户数据执行等配置的,这是主流Linux AMI(包括Oracle Linux 8)预装的核心组件。
二、密钥安装位置由什么决定?
密钥会被注入到哪个用户的~/.ssh/authorized_keys,完全由cloud-init的默认用户配置决定:
- 这个配置通常存放在
/etc/cloud/cloud.cfg或/etc/cloud/cloud.cfg.d/下的子文件中,找到system_info.default_user.name这个参数——它指定了cloud-init的默认操作用户。 - 不同发行版的AMI预设的默认用户不同:比如Amazon Linux默认是
ec2-user,Oracle Linux 8原生默认用户是opc,Ubuntu是ubuntu,这就是不同AMI对应不同默认用户名的原因。
回到你的问题:如果你的自定义AMI里,cloud-config配置的默认用户是ec2-user,那必须先在模板实例里创建这个用户(确保它存在且家目录权限正确),cloud-init才会把密钥注入到/home/ec2-user/.ssh/authorized_keys;如果默认用户是Oracle Linux原生的opc,那只要opc用户存在,密钥就会放到它的家目录下,不需要额外创建ec2-user。
三、我们对SSH密钥注入有哪些控制权?
当然有完全的控制权,常见的配置方式包括:
- 修改默认目标用户:编辑cloud-init的配置文件,把
system_info.default_user.name改成你自定义的用户名(比如myappuser),但要提前在模板实例里创建这个用户,设置好家目录和对应权限。 - 自定义密钥注入逻辑:通过实例启动时的用户数据(User Data) 传入脚本,比如可以把密钥同时注入到多个用户的
authorized_keys,或者指定到非默认路径。举个简单的用户数据脚本例子:
(注:也可以用cloud-init的原生模块语法来更规范配置,比如#!/bin/bash # 从元数据服务器获取实例绑定的公钥 PUBLIC_KEY=$(curl -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key) # 把密钥注入到myuser和opc两个用户的授权文件 echo "$PUBLIC_KEY" >> /home/myuser/.ssh/authorized_keys echo "$PUBLIC_KEY" >> /home/opc/.ssh/authorized_keys # 修正权限,确保SSH能正常读取 chmod 600 /home/myuser/.ssh/authorized_keys /home/opc/.ssh/authorized_keys chown myuser:myuser /home/myuser/.ssh/authorized_keys chown opc:opc /home/opc/.ssh/authorized_keysssh_authorized_keys模块,避免手动写脚本的权限问题) - 禁用自动密钥注入:如果不需要AWS自动注入密钥,有两种方式:
- 在
/etc/cloud/cloud.cfg里禁用ssh模块或者ssh_import_id模块; - 启动实例时不指定密钥对,cloud-init就会跳过密钥注入操作。
- 在
- 控制密钥追加/覆盖行为:默认情况下cloud-init会把新密钥追加到
authorized_keys末尾,如果你想覆盖原有内容,可以在cloud.cfg里配置ssh_authorized_keys_append: false。
针对Oracle Linux 8场景的额外提示
如果你是基于Oracle Linux 8的快照制作自定义AMI,要注意它的原生默认用户是opc——如果没修改cloud-init配置,新实例启动后密钥会出现在/home/opc/.ssh/authorized_keys里。如果一定要用ec2-user作为默认登录用户,记得做这两步:
- 在模板实例中创建
ec2-user用户:useradd -m ec2-user(-m参数自动创建家目录); - 编辑
/etc/cloud/cloud.cfg,找到system_info下的default_user配置段,把name字段改成ec2-user;
完成这两步后再创建AMI,后续用这个AMI启动的实例就会自动把密钥注入到ec2-user的家目录中了。
备注:内容来源于stack exchange,提问作者KJ7LNW
相关产品推荐
相关产品推荐

