[AWS] Session Manager 중앙 집중식 로깅 구현 : SSM Session Manager Cross Account S3 Logging
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 문서 이름을 클릭
여기서 s3EncryptionEnabled
는 false
로 설정하고, 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
- https://github.com/aws/amazon-ssm-agent/issues/186
- https://binx.io/2022/01/26/how-to-set-up-aws-session-manager-logging-cross-account/ (Encrypt 필요한 경우 참조)