AWS Systems Manager Session Managerのシェル操作をログ出力する
AWS Systems ManagerのSession Manager for Shell Accessを利用するとSSH/RDPなしにブラウザ、及び、CLIからEC2インスタンスにシェルアクセスできます。
- SSH不要時代がくるか!?AWS Systems Manager セッションマネージャーがリリースされました! | Developers.IO
- AWS Systems Manager Session Manager for Shell AccessでMacからLinux EC2インスタンスに端末でアクセスする | Developers.IO
- New – AWS Systems Manager Session Manager for Shell Access to EC2 Instances | AWS News Blog
本ブログではこの機能を利用した操作履歴をログ出力する方法をご紹介します。
ポイント
- セッション操作ログは以下に出力可能 (本ブログのスコープ)
- S3
- CloudTrail Logs
- セッション利用履歴は以下から確認可能
- 管理コンソールのSession Historyタブ
- SSM API(
$ aws ssm describe-sessions --state History
) - EC2インスタンス内のログ(
/var/log/amazon/ssm/amazon-ssm-agent.log
)
前提
Linuxインスタンスでは screen を利用して操作ログを取得します。screen は Amazon Linux含め、多くのディストリビューションではデフォルトでインストールされています。対象インスタンスでインストールされていない場合、
$ sudo yum install screen
$ sudo apt-get install screen
などで、screen をインストールしてください。
管理コンソールからログ出力設定
管理コンソールからSSM セッションマネージャーのログ設定を行なうには AWS Systems Manager → Session Manager → Preferences と遷移します。
この設定画面では、新規ログ出力先(S3/CloudWatch Logs)を自動で作成してくれないようです。 そのため、設定前に事前にログ出力先を作成します。
また、"Encrypt log data"のチェックボックスを有効にする場合、ログ出力先も暗号化されている必要があります。
Amazon S3 にログ出力
Amazon S3 バケットの作成
AWS Systems Managerと同じリージョンにS3バケットを用意します。
要件に応じて、サーバーサイド暗号を有効にしてください。
参考までに、KMS で暗号化する S3 バケットをAWS CLIから作成するには、次の様にします。
{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID":"arn:aws:kms:eu-central-1:12345:key/dummy" } } ] }
$ BUCKET=XXX $ aws s3 mb s3://$BUCKET make_bucket: XXX $ aws s3api put-bucket-encryption \ --bucket $XXX \ --server-side-encryption-configuration file://S3-SSE-KMS.json
S3 へのログ出力結果を確認
ファイル階層
$ aws s3 ls s3://BUCKET-NAME/ssm/ 2018-12-19 19:04:58 533 john-smith-03b6e6a2e0c17facf.log ... 2018-12-20 12:46:25 490 i-01234567890123456-00d40a4d7df69d84e.log ...
AWS外からIAMユーザー経由でセッションを始めると、そのIAMユーザー名で接頭するファイル名が作成されました。
IAMロール付きEC2内からセッションを始めると、そのEC2インスタンスIDで接頭するファイル名が作成されました。
ログファイルの中身
実行コマンドとその出力結果がまるっと保存されています。
$ aws s3 cp s3://BUCKET-NAME/ssm/john-smith-03b6e6a2e0c17facf.log - Script started on 2018-12-19 18:02:57+0000 log falsestration/john-smith-03b6e6a2e0c17facf/Standard_Stream/ipcTempFile. Error occurred fetching the seelog config file path: open /etc/amazon/ssm/seelog.xml: no such file or directory Initializing new seelog logger New Seelog Logger Creation Complete sh-4.2$ whoami ssm-user sh-4.2$ exit sh-4.2# exit exit Script done on 2018-12-19 18:04:02+0000
Amazon CloudWatch Logsにログ出力
ロググループの作成
AWS Systems Managerと同じリージョンにロググループを用意します。
要件に応じて、サーバーサイド暗号を有効にしてください。
なお、暗号設定は管理コンソールからは行えず、CLI/SDKから行う必要があります。 詳細は、次の記事を参照ください。
CloudWatch Logsへのログ出力結果を確認
ログストリーム
$ aws logs describe-log-streams \ --log-group-name /aws/ssm/session-manager \ --query 'logStreams[].logStreamName' [ "john-smith-03b6e6a2e0c17facf", ... "i-0d72c798e6a1bec1b-00d40a4d7df69d84e", ... ]
AWS外からIAMユーザー経由でセッションを始めると、そのIAMユーザー名で接頭するストリーム名が作成されました。
IAMロール付きEC2内からセッションを始めると、そのEC2インスタンスIDで接頭するストリーム名が作成されました。
イベントログの中身
実行コマンドとその出力結果がまるっと保存されています。
$ aws logs get-log-events \ --log-group-name /aws/ssm/session-manager \ --log-stream-name john-smith-03b6e6a2e0c17facf { "events": [ { "timestamp": 1545240920366, "message": "Script started on 2018-12-19 18:02:57+0000\n\u001b[?1034hsh-4.2...", "ingestionTime": 1545240920412 } ], "nextForwardToken": "f/...", "nextBackwardToken": "b/..." }
CloudWatch Logs Insight で利用状況を確認
CloudWatch Logs にログ出力すると、このログをもとに、CloudWatch Logs Insight で利用状況を確認出来ます。
15分ごとのセッション利用数を確認したい場合、次のSQLを投げます。
stats count(*) by bin(15m)
最後に
SSH と同じく、AWS Systems ManagerのSession Manager for Shell Access経由のシェルアクセスも忘れずにロギングしましょう。
ログの出力先として、アーカイブ目的では S3、ログをもとになにかアクションを取りたい場合は CloudWatch Logs を利用すると、運用が楽になるかと思います。
それでは。