You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于自定义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,或者指定到非默认路径。举个简单的用户数据脚本例子:
    #!/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_keys
    
    (注:也可以用cloud-init的原生模块语法来更规范配置,比如ssh_authorized_keys模块,避免手动写脚本的权限问题)
  • 禁用自动密钥注入:如果不需要AWS自动注入密钥,有两种方式:
    1. 在/etc/cloud/cloud.cfg里禁用ssh模块或者ssh_import_id模块;
    2. 启动实例时不指定密钥对,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作为默认登录用户,记得做这两步:

  1. 在模板实例中创建ec2-user用户:useradd -m ec2-user(-m参数自动创建家目录);
  2. 编辑/etc/cloud/cloud.cfg,找到system_info下的default_user配置段,把name字段改成ec2-user;
    完成这两步后再创建AMI,后续用这个AMI启动的实例就会自动把密钥注入到ec2-user的家目录中了。

备注:内容来源于stack exchange,提问作者KJ7LNW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:19:30