引言:为什么大家需要关注EC2的“门禁”记录?
大家好,在云计算的世界里,AWS EC2就像我们应用的“家”,为我们的服务提供了稳定可靠的运行环境。但是,大家是否曾想过,谁在什么时候“进出”过我们家的“大门”?每一次用户登录,尤其是通过SSH的访问,都是一个关键的安全事件。
对于运维和开发同学来说,实时监控这些登录事件至关重要。它不仅是安全审计的基本要求,更是快速发现未授权访问、暴力破解等潜在威胁的第一道防线。很多人可能会问,CloudWatch默认不是监控EC2吗?没错,但它默认监控的是CPU、网络、磁盘等性能指标,而不是实例内部的操作系统日志,比如SSH登录记录。
那么,如何才能让CloudWatch“看懂”EC2内部的日志呢?答案就是 CloudWatch Agent。今天,我们就来聊聊如何通过几条AWS CLI命令,快速部署CloudWatch Agent,将EC2的登录日志集中管理并设置告警,真正做到“事前预警,事后可追溯”。
核心思路:让CloudWatch Agent成为我们的“日志快递员”
要实现我们的目标,逻辑非常简单:
- 授权:首先,EC2实例需要有权限将日志发送给CloudWatch。我们通过创建一个IAM角色并授予相应权限来实现。
- 安装:在EC2实例上安装CloudWatch Agent。
- 配置:告诉Agent需要收集哪个日志文件(例如SSH登录日志),以及送到CloudWatch的哪个位置。
- 启动:启动Agent,开始日志的实时“快递”。
- 监控:在CloudWatch中查看日志并设置告警。
接下来,我们将一步步用AWS CLI来完成这个过程。
实战操作:三步搞定EC2登录监控
前提条件:
- 我们已经安装并配置好了AWS CLI。
- 我们有一台正在运行的EC2实例(本文以Amazon Linux 2为例)。
第一步:为EC2配置IAM角色(授权)
这是最关键也是最容易被忽略的一步。直接在EC2上配置Access Key是不安全的做法,最佳实践是使用IAM角色。
-
创建IAM角色 该角色需要信任EC2服务,允许EC2实例代入这个角色。
# 创建一个信任策略文件 trust-policy.json echo '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }' > trust-policy.json # 使用CLI创建角色 aws iam create-role --role-name EC2-CloudWatch-Agent-Role --assume-role-policy-document file://trust-policy.json -
为角色附加策略 我们需要为这个角色附加AWS托管的
CloudWatchAgentServerPolicy策略,该策略包含了Agent所需的全部权限。aws iam attach-role-policy --role-name EC2-CloudWatch-Agent-Role --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy -
创建实例配置文件并附加到EC2 最后,将这个角色“穿”在EC2实例上。
# 创建实例配置文件 aws iam create-instance-profile --instance-profile-name EC2-CloudWatch-Agent-Profile # 将角色添加到配置文件 aws iam add-role-to-instance-profile --instance-profile-name EC2-CloudWatch-Agent-Profile --role-name EC2-CloudWatch-Agent-Role # 将配置文件关联到我们的EC2实例 (将 "i-xxxxxxxxxxxxxxxxx" 替换为我们的实例ID) aws ec2 associate-iam-instance-profile --instance-id i-xxxxxxxxxxxxxxxxx --iam-instance-profile Name=EC2-CloudWatch-Agent-Profile实用建议:如果我们是创建新实例,可以在启动向导的“高级细节”部分直接选择创建好的IAM实例配置文件,更加方便。
第二步:在EC2上安装和配置Agent
现在,登录到我们的EC2实例,开始安装和配置Agent。
-
安装CloudWatch Agent 在Amazon Linux 2上,使用
yum即可轻松安装。sudo yum install amazon-cloudwatch-agent -y -
创建Agent配置文件 这是核心环节。我们需要创建一个JSON文件告诉Agent:
- 监控哪个文件:对于Amazon Linux/CentOS/RHEL,SSH登录日志是
/var/log/secure。对于Debian/Ubuntu,是/var/log/auth.log。 - 日志叫什么名字:在CloudWatch中创建一个名为
/ec2/ssh-login-logs的日志组。
在EC2实例上,创建一个名为
cw-agent-config.json的文件:{ "agent": { "run_as_user": "root" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/secure", "log_group_name": "/ec2/ssh-login-logs", "log_stream_name": "{instance_id}" } ] } } } }实用建议:
log_stream_name使用{instance_id}是一个非常好的实践,它能自动用实例ID作为日志流名称,方便我们区分不同实例的日志。 - 监控哪个文件:对于Amazon Linux/CentOS/RHEL,SSH登录日志是
第三步:启动Agent并验证
一切就绪,让我们启动Agent,让它开始工作!
-
使用配置启动Agent 运行以下命令,它会读取我们的配置文件,并启动Agent服务。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config -m ec2 -c file:./cw-agent-config.json -s看到
Successfully fetched config和amazon-cloudwatch-agent has been started就表示成功了。 -
验证日志
- 尝试从另一台终端SSH登录到这台EC2。
- 登录AWS控制台,导航到 CloudWatch > 日志组 (Log Groups)。
- 我们应该能找到名为
/ec2/ssh-login-logs的日志组。 - 点击进入,我们会看到以我们的实例ID命名的日志流。其中就记录了刚才的登录事件,例如包含 "Accepted password" 或 "Accepted publickey" 的日志行。
进阶玩法:创建告警
光有日志还不够,我们希望在每次登录时都能收到通知。这可以通过指标筛选器 (Metric Filters) 和 告警 (Alarms) 实现。
- 在CloudWatch的
/ec2/ssh-login-logs日志组页面,点击 “操作” -> “创建指标筛选器”。 - 筛选模式:输入
"Accepted publickey" OR "Accepted password",这个模式会匹配所有成功的SSH登录事件。 - 测试模式:选择我们的日志流,测试一下能否匹配到登录日志。
- 分配指标:为这个筛选器创建一个新的指标,例如命名为
SuccessfulSSHLogins。 - 创建告警:在指标创建完成后,直接点击 “创建警报”。
- 条件:设置为
SuccessfulSSHLogins指标在1分钟内>= 1时触发。 - 操作:配置一个SNS主题,将通知发送到我们的邮箱或手机。
- 条件:设置为
现在,每当有人成功登录我们的EC2,我们都会在几分钟内收到一封告警邮件!
结论
通过AWS CLI和CloudWatch Agent,我们用一种自动化、可复现的方式,快速搭建起了EC2登录事件的监控体系。这个简单的方案为我们提供了一个强大的安全审计和告警能力,将原本“看不见”的系统内部行为,转化为了“看得懂、可告警”的云上数据。
这只是一个开始。我们还可以将这些日志导出到S3进行长期归档,或使用Amazon OpenSearch、Splunk等工具进行更复杂的日志分析和可视化。希望这篇文章能帮助大家轻松加固自己的云上堡垒!