TL;DR
- 令和に踏み台サーバーを作成する
- Amazon Linux 2023AMIとSSM Agentを利用したEC2
- 証跡を取得する
About
EC2とSSMのセッションロギングを使用して証跡を取得することが目的。
ECS/Fargateでも同様のことが可能ですが、SSM AgentがプリインストールされているAMIのEC2を使い捨てる方が運用コスト的や構築コスト的に楽なためEC2を選択。
How To
アーキテクチャ
Instance Profileの作成
assumerole.json
$ cat <<EOL > assumerole.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOL
$ export EC2SSMRole=EC2SSMBastionRole $ aws iam create-role \ --role-name ${EC2SSMRole} \ --assume-role-policy-document file://assumerole.json $ aws iam create-instance-profile \ --instance-profile-name ${EC2SSMRole} $ aws iam add-role-to-instance-profile \ --role-name ${EC2SSMRole} \ --instance-profile-name ${EC2SSMRole}
$ aws iam attach-role-policy \ --role-name ${EC2SSMRole} \ --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore $ aws iam attach-role-policy \ --role-name ${EC2SSMRole} \ --policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
実行ログを格納するためのロググループを作成
$ export LOGS_GROUP_NAME="/ssm/ec2/session" $ aws logs create-log-group \ --log-group-name ${LOGS_GROUP_NAME} $ aws logs put-retention-policy \ --log-group-name ${LOGS_GROUP_NAME} \ --retention-in-days 7
SSMのセッションロギングを有効化
System Manager > Session Managerから編集を押下し、EC2の実行ログをCloudWatch Logsへ送信を有効化。
この作業はCLIやCFnから設定ができないためコンソールから実行。
Tips
- S3へのアーカイブも可能
- セッション終了時にログのアーカイブを行ってくれるが、大きく形式が異なることとセッションの状態管理が難しくログを完全に保存できない可能性を考慮する必要があります。
CloudWatch Logsの考慮点
- 標準入力には非対応
SSMへの接続はVPCエンドポイントでも可能。
- しかし、ssmのエンドポイントを3つ用意する必要がある。
- NAT Instance
- $0.062/h
- $0.062/GB
- ref: Logically Isolated Virtual Network - Amazon VPC Pricing - Amazon Web Services
- Resource Endpoint
- $0.084/h = $0.028/h * 3
- $0.01/GB
- 最初の1PBまで。
- ref: AWS PrivateLink Pricing – AWS
EC2の作成
- Security Groupの作成
- インバウンドは無し
- アウドバウンドはデフォルトの
0.0.0.0
の設定
- Private SubnetにEC2を作成
- SSM AgentがデフォルトでインストールされているAMIを選択
- インスタンスタイプは任意のものに
- 作成したインスタンスプロファイルを設定
- Security Groupを設定
SSMでの接続とログの確認
先述したEC2の作成が終了後、 aws ssm start-session
でログイン
$ aws ssm start-session \ --target <INSTANCE ID>
いくつかコマンドを試しに打って、ログを確認。
実行者がログストリームに表示されていることを確認。
実行したログとその出力結果を確認。
ログのアーカイブ
CWLogsのサブスクリプションフィルターを使用し、Firehoseを経由してS3へアーカイブするのがベターかもしれないです。
Refs
- SSM Agent がプリインストールされている AMIs を見つける - AWS Systems Manager
- セッションロギングの有効化と無効化 - AWS Systems Manager
- SSM Session Managerの設定(ロギングなど)をCloudFormationで行う | クラウド・AWSのIT技術者向けブログ SKYARCH BROADCASTING
所感
現状の運用でEC2が存在し、key pairを使用したEC2を改修するために行ったのが動機です。
誰がログインしたかを確認したかったため、セッションロギング機能を使ったところ予想以上に優秀でしたまる