공부/AWS

[AWS] Session Manager 중앙 집중식 로깅 구현 : SSM Session Manager Cross Account S3 Logging

haejang 2022. 8. 28. 21:25
728x90
728x90

 

 

Session Manager Logging은 세션 접속한 동안의 명령까지도 모두 로깅으로 남는다.

Multi Account AWS 환경에서 각 계정의 Session Manager Logging을 로깅 계정의 S3로 쌓도록 설정해보자.

Encrypt 설정은 하지 않는다. 하게 되면 S3 Bucket 정책 등이 달라져야 할 것이다.

 

# Architecture


 

# 1. SSM Logging 설정


Console에서 하는 법

Systems Manager > Session Manager > Preferences 에서 설정 가능 (CLI, IaC등 API로는 불가)

Bucket 이름과 Prefix를 지정해준다

 

API(CLI or IaC)로 하는 법

SSM-SessionManagerRunShell 문서를 직접 수정

Console에서 해당 문서는 Systems Manager > Documents > SSM-SessionManagerRunShell 로 확인 가능

SSM-SessionManagerRunShell 문서 이름을 클릭

문서의 기본값. 여기서 수정할 수는 없다,,

여기서 s3EncryptionEnabledfalse로 설정하고, s3BucketName이랑 s3KeyPrefix만 설정해주면 된다

CLI는 update-document 명령으로 가능할 듯 하다 (안해봄)

테라폼 코드는 아래와 같다

resource "aws_ssm_document" "this" {
  name            = "SSM-SessionManagerRunShell"
  document_type   = "Session"
  document_format = "JSON"

  content = jsonencode({
    schemaVersion = "1.0"
    description   = "Document to hold regional settings for Session Manager"
    sessionType   = "Standard_Stream"
    inputs = {
      kmsKeyId                    = ""
      s3BucketName                = "{S3_name}"
      s3KeyPrefix                  = "{Prefix}"
      s3EncryptionEnabled         = false
      cloudWatchLogGroupName      = ""
      cloudWatchEncryptionEnabled = true
      cloudWatchStreamingEnabled  = true
      idleSessionTimeout          = "20"
      runAsEnabled                = false
      runAsDefaultUser            = ""
      shellProfile = {
        linux   = ""
        windows = ""
      }
    }
  })
}

여기서 주의할 점은, 이미 존재하는 문서이기 때문에 import로 문서를 땡겨온 후 작업을 해야 한다;;

terraform import aws_ssm_document.this SSM-SessionManagerRunShell

 

 

# 2. S3 Bucket Policy


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SSMPutLogs",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::{account1_id}:root",
                    "arn:aws:iam::{account2_id}:root"
                ]
            },
            "Action": [
                "s3:PutObjectAcl",
                "s3:PutObject",
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::{S3_name}",
                "arn:aws:s3:::{S3_name}/*"
            ]
        }
    ]
}

Logging Account의 ID는 안적어줘도 된다.

 

 

# 3. EC2 Role Policy


Session Manager를 사용한다면 기본적으로 AmazonEC2RoleforSSM 이란 Policy는 붙어있을 것이다.

그렇다면 추가적으로 아래의 권한만 더 붙여주면 된다.

{
    "Sid": "SSMlogBucket",
    "Effect": "Allow",
    "Action": [
        "s3:PutObjectAcl"
    ],
    "Resource": "arn:aws:s3:::{S3_name}/*"
}

 

 

 

 

Ref

 

 

 

728x90
728x90