AWS Systems Manager Session Managerのアクティビティログを出力してみた

2022.11.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Session ManagerでEC2にアクセスした際の操作ログを出力する設定があるのでやってみました。

やること

ざっくりとやることは以下の3点です。

  1. ログ保管用S3の作成
  2. ログ記録設定
  3. EC2のIAMロールにS3へのアクセス権限を付与

Session Managerでの操作ログはCloudWatch Logsに出力するかS3に出力することができます。
セッションアクティビティのログ記録

今回はS3への出力を設定してみました。

設定

ログ保管用S3の作成

ログ保管用S3はCloudFormationを利用して作成しました。
使用したテンプレートは以下になります。

AWSTemplateFormatVersion: "2010-09-09"

Description: S3 Stack

Resources:
# ------------------------------------------------------------#
# S3
# ------------------------------------------------------------# 
  S3:
    Type: AWS::S3::Bucket
    Properties: 
      BucketEncryption: 
        ServerSideEncryptionConfiguration: 
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      BucketName: !Sub ${AWS::StackName}-${AWS::AccountId}
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True

公式ドキュメントにも記載されている通りログ保管用のS3は暗号化されている必要があるため21行目で暗号化設定をしています。

テンプレートファイルを作成したら以下のコマンドでS3を作成します。

aws cloudformation create-stack --stack-name スタック名 --template-body file://CloudFormationテンプレートファイル名

実行すると暗号化が有効になったS3が1つ作成されます。

ログ記録設定

ログ記録設定は以下の公式ドキュメントの通り設定します。
Amazon S3 を使用してセッションデータをログ記録する (コンソール)

マネジメントコンソールからSystems Managerのダッシュボードへ移動します。
移動後、左の項目から「セッションマネージャー」をクリックします。

画面が遷移したら「設定」をクリックします。

画面が遷移したら「編集」をクリックします。

「編集」をクリックすると設定変更ができるようになるので「S3 logging」欄で「Enable」にチェックを行い、出力先S3バケットの設定をします。
選択するS3バケットは上記項目で作成したS3を選択してください。

EC2のIAMロールにS3へのアクセス権限を付与

こちらの設定を行わないとSession Managerでの接続時に以下のエラーが発生します。

セッションが次の理由で終了されました。 Couldn't start the session because we are unable to validate encryption on Amazon S3 bucket. Error: AccessDenied: Access Denied status code: 403, request id:...

作成するポリシーは以下のものになります。
以下のポリシーは公式ドキュメントを参考に作成しました。
Session Manager、Amazon S3、CloudWatch Logs (コンソール) の許可を持つIAM ロールの作成
公式ドキュメントではSession Manager、CloudWatch Logsに必要なアクションがついていましたが、今回Session ManagerにはAmazonSSMManagedInstanceCoreというマネージドポリシーを利用するので削除しています。
CloudWatch Logsについては利用しないので削除しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "S3バケットのARN/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "KMSキーのARN"
        },
        {
            "Effect": "Allow",
            "Action": "kms:GenerateDataKey",
            "Resource": "*"
        }
    ]
}

EC2に設定するIAMロールをCloudFormationテンプレートにすると以下のようになります。

AWSTemplateFormatVersion: "2010-09-09"

Description: IAM Stack

Resources:
# ------------------------------------------------------------#
# IAM
# ------------------------------------------------------------# 
  IamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - Effect: Allow
            Principal: 
              Service: 
                - ec2.amazonaws.com
            Action: 
              - 'sts:AssumeRole'
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      RoleName: EC2Role

  IamPolicy:
    Type: AWS::IAM::Policy
    Properties: 
      PolicyDocument:
        Version: "2012-10-17"
        Statement: 
          - Effect: Allow
            Action:
              - "s3:PutObject"
            Resource: 
              - "S3バケットARN/*"
          - Effect: Allow
            Action:
              - "s3:GetEncryptionConfiguration"
            Resource: "*"
          - Effect: Allow
            Action:
              - "kms:Decrypt"
            Resource: "KMSキーARN"
          - Effect: Allow
            Action:
              - "kms:GenerateDataKey"
            Resource: "*"
      PolicyName: PutObject
      Roles: 
        - EC2Role
    DependsOn: IamRole

  IamInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: EC2Role
      Roles: 
        - !Ref IamRole

CloudFormation実行コマンドは以下のようになります。

aws cloudformation create-stack --stack-name スタック名 --template-body file://CloudFormationテンプレートファイル名 --capabilities CAPABILITY_NAMED_IAM

ログ出力確認

上記項目の設定が完了したらEC2にSession Managerでアクセスして操作した後にS3にログが出力されることを確認します。
EC2上で操作を行いしばらく待つとS3にログが出力されていることが確認できました。

さいごに

操作ログを残すのは重要なのでこういった設定は利用できる場合は利用する方が良いと思いました。