在AWS云平台的实际运维中,我们经常遇到这样的场景:当Elastic Beanstalk(EB)环境自动创建EC2实例后,需要为这些实例批量添加特定用户账号。传统的手动操作方式既低效又容易出错,特别是在需要管理数十上百台实例时。通过代码自动化实现用户添加,不仅能提升运维效率,还能确保配置的一致性。
这个方案特别适合以下场景:
实现这个需求主要有三种技术路线:
EB扩展文件方案:
.ebextensions配置目录UserData脚本方案:
Systems Manager方案:
对于大多数场景,我推荐采用EB扩展文件方案,因为:
下文将重点讲解这种实现方式。
在应用根目录创建.ebextensions文件夹,新建add_user.config文件:
yaml复制commands:
create_user:
command: |
USERNAME="audit_user"
if ! id -u $USERNAME >/dev/null 2>&1; then
useradd -m -s /bin/bash $USERNAME
mkdir -p /home/$USERNAME/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2E... audit_user@company" > /home/$USERNAME/.ssh/authorized_keys
chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh
chmod 700 /home/$USERNAME/.ssh
chmod 600 /home/$USERNAME/.ssh/authorized_keys
usermod -aG wheel $USERNAME
fi
关键参数说明:
USERNAME:自定义的用户名useradd命令的-m参数确保创建家目录-s /bin/bash指定默认shellwheel组赋予sudo权限(根据实际需求调整)安全最佳实践:
bash复制ssh-keygen -t ed25519 -f audit_user_key -C "audit_user@company"
authorized_keys标准的部署包结构应包含:
code复制my-app/
├── .ebextensions/
│ └── add_user.config
├── application.py
└── requirements.txt
使用EB CLI部署:
bash复制eb deploy --staged
通过EB环境变量实现环境区分:
yaml复制commands:
create_user:
command: |
USERNAME="${USERNAME:-default_user}"
# 剩余配置保持不变...
在EB控制台设置环境变量:
USERNAME=dev_auditUSERNAME=prod_audit如需设置密码登录(不推荐),可添加:
yaml复制 set_password:
command: |
echo "$USERNAME:SecurePass123!" | chpasswd
passwd -e $USERNAME
安全建议:
修改sudo权限配置:
bash复制echo "$USERNAME ALL=(ALL) NOPASSWD: /usr/bin/less,/usr/bin/tail" > /etc/sudoers.d/$USERNAME
这表示:
问题1:用户已存在导致创建失败
if ! id -u条件问题2:权限配置不正确
ls -ld /home/$USERNAMEcode复制drwx------ 4 audit_user audit_user 4096 Jun 1 10:00 /home/audit_user
问题3:SSH登录被拒绝
tail -f /var/log/auth.logstat -c "%a %U:%G" /home/$USERNAME/.ssh/authorized_keys获取扩展文件执行日志:
bash复制eb logs --all | grep -A 20 "Running command create_user"
关键字段说明:
[INFO]表示成功执行[ERROR]需重点关注错误堆栈定期轮换密钥:
网络访问控制:
yaml复制resources:
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 10.0.1.0/24
审计日志记录:
bash复制echo "session required pam_loginuid.so" >> /etc/pam.d/sshd
实例元数据保护:
bash复制aws ec2 modify-instance-metadata-options \
--instance-id i-1234567890abcdef0 \
--http-tokens required \
--http-endpoint enabled
在EB环境配置中添加:
json复制{
"aws:autoscaling:launchconfiguration": {
"UserData": "IyEvYmluL2Jhc2gKdXNlcmFkZCAtbSAtcyAvYmluL2Jhc2ggYXVkaXRfdXNlcgo="
}
}
Base64编码注意事项:
bash复制base64 -w0 userdata.sh
创建SSM文档:
json复制{
"schemaVersion": "2.2",
"parameters": {
"username": {"type": "String"},
"publicKey": {"type": "String"}
},
"mainSteps": [...]
}
批量执行命令:
bash复制aws ssm send-command \
--instance-ids i-1234567890 \
--document-name "AddUserAccount" \
--parameters '{"username":["audit_user"]}'
添加用户清理脚本:
yaml复制files:
"/etc/cron.daily/user_cleanup":
mode: "000755"
content: |
#!/bin/bash
if [[ $(date +%u) -eq 6 ]]; then
userdel -r temp_user 2>/dev/null
fi
使用AWS Config规则:
json复制{
"ConfigRuleName": "ec2-audit-user-check",
"Source": {
"Owner": "AWS",
"SourceIdentifier": "INCOMING_SSH_DISABLED"
},
"InputParameters": "{\"approvedUsers\":\"audit_user\"}"
}
使用InSpec编写测试用例:
ruby复制describe user('audit_user') do
it { should exist }
its('groups') { should include 'wheel' }
end
describe file('/home/audit_user/.ssh/authorized_keys') do
its('content') { should match /ssh-ed25519/ }
end
执行测试:
bash复制inspec exec test.rb -t ssh://audit_user@ec2-instance
通过这个完整的实施方案,我们不仅解决了基础的用户添加需求,还构建了包含安全加固、自动化维护在内的完整生命周期管理体系。在实际项目中,建议根据具体需求选择适合的组件组合使用。