AWS Systems Manager Session Managerのシェル操作をログ出力する

AWS Systems ManagerのSession Manager for Shell Accessを利用するとSSH/RDPなしにブラウザ、及び、CLIからEC2インスタンスにシェルアクセスできます。

本ブログではこの機能を利用した操作履歴をログ出力する方法をご紹介します。

ポイント

  • セッション操作ログは以下に出力可能 (本ブログのスコープ)
    • 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のログデータを暗号化する

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 を利用すると、運用が楽になるかと思います。

それでは。

参考