Lukasz 'Luke' Dorosz
← Blog
Poradnik · 23 lipca 2023

Konfiguracja AWS CloudTrail w trybie multi-account

Kolejne zadanie to konfiguracja AWS CloudTrail w trybie multi-account.

Kiedy Twoja AWS Organizations ma wiele kont AWS, warto wdrożyć jednolity sposób zbierania logów z usługi CloudTrail. W tym scenariuszu wykorzystane zostanie dedykowane konto AWS, na którym odkładane będą wszystkie logi dla całej multi-account-owej organizacji.

Dodatkowo z wykorzystaniem odpowiednich Resource based policy oraz Service Control Policy zabezpieczysz logi przed modyfikacjami lub skasowaniem.

Video tutorial


Co jest Ci potrzebne do wykonania tego zadania:

  • Uruchomiona AWS Organizations,
  • Dodatkowe konto AWS dedykowane na przechowywanie logów,
  • Tymczasowy dostęp do konta na logi, który pozwoli utworzyć niezbędną konfigurację,

KROKI DO WYKONANIA TEGO ZADANIA

KROK 1: Utworzenie bucketu na logi

Na przygotowanym wcześniej koncie AWS na logi tworzymy S3 bucket, który będzie przeznaczony na przechowywanie wszystkich logów z CloudTrail.

Na początek utwórz bucket w domyślnej konfiguracji, w dalszych krokach będziesz wprowadzał dodatkowe elementy.

KROK 2: Ustawienie uprawnień na bucket’cie

Aby wszystkie konta z organizacji miały możliwość zapisywać logi, niezbędne jest ustawienie odpowiednich uprawnień. W tym przypadku należy skonfigurować odpowiednią resource based policy na poziomie utworzonego wcześniej bucketu S3.

Poniżej znajduje się template takiego policy, w której trzeba zmodyfikować kilka elementów:

  • YOUR-BUCKET-NAME - tutaj podmienić na nazwę Twojego bucketu na logi,
  • AWS-ACCOUNT-ID - tutaj wstawić ID konta, na którym konfigurujesz CloudTrail,
  • YOUR-TRAIL-NAME - nazwę Trail’a, który utworzysz,
  • YOUR-ORG-ID - ID Twojej AWS Organizations,
  • YOUR-REGION - Region w którym tworzysz konfigurację,
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudtrail:YOUR-REGION:AWS-ACCOUNT-ID:trail/YOUR-TRAIL-NAME"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudtrail:YOUR-REGION:AWS-ACCOUNT-ID:trail/YOUR-TRAIL-NAME",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailOrganizationWrite20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/AWSLogs/YOUR-ORG-ID/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudtrail:YOUR-REGION:AWS-ACCOUNT-ID:trail/YOUR-TRAIL-NAME",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
Przykładowa S3 Bucket Policy dla konfiguracji CloudTraila organizacyjnego

KROK 3: Utworzenie konfiguracji CloudTrail

Teraz już czas na konfigurację samego ClouTraila. Ten krok należy wykonać na koncie, które wskazane zostało (w domyślnym wariancie będzie to konto MASTER) w opisie S3 Bucket Policy.

Opcjonalnie można również “wydelegować” zarządzanie CloudTrailem na inne konto niż konto Master.

Pamiętaj również, że nazwa traila, musi być zgodna z tym, co zostało określone w bucket policy (KROK 2).

KROK 4: Dodatkowe opcje zabezpieczenia logów CloudTrail

Pierwsza sprawa to oczywiście “odjęcie” uprawnień administracyjnych, które były konieczne do wprowadzenia konfiguracji.

Nadając dostęp w celu przeglądania logów, należałoby wprowadzić minimalne uprawnienia tylko i wyłącznie do odczytu. Poniżej znajdziesz przykład polityki z uprawnieniami tylko i wyłącznie do odczytu logów. Podpowiedź jak nadać taki dostęp znajdziesz w nagraniu Jak skonfigurować AWS IAM Identity Center (SSO)

Wprowadź tylko odpowiedni zmiany:

YOUR-BUCKET-NAME - tutaj podmienić na nazwę Twojego bucketu na logi

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "s3:ListBucket"
            ],
            "NotResource": [
                "arn:aws:s3:::YOUR-BUCKET-NAME",
                "arn:aws:s3:::YOUR-BUCKET-NAME/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET-NAME",
                "arn:aws:s3:::YOUR-BUCKET-NAME/*"
            ]
        }
    ]
}
Przykład uprawnień do odczytu do bucketu.

Dodatkowe zabezpieczenia logów z użyciem Service Control Policy

Poniżej przykład takiej SCP, którą możesz nałożyć na swoje konto z logami. To, co musisz zrobić to ustawić:

Dodatkowo można jeszcze na poziomie organizacji skonfigurować i nałożyć na to konto Service Control Policy, które będzie również chronić te logi przed jakimikolwiek modyfikacjami.

  • YOUR-BUCKET-NAME - tutaj podmienić na nazwę Twojego bucketu na logi,
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Action": [
                "s3:UpdateJobStatus",
                "s3:UpdateJobPriority",
                "s3:RestoreObject",
                "s3:ReplicateTags",
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:PutStorageLensConfigurationTagging",
                "s3:PutStorageLensConfiguration",
                "s3:PutReplicationConfiguration",
                "s3:PutObjectVersionTagging",
                "s3:PutObjectVersionAcl",
                "s3:PutObjectTagging",
                "s3:PutObjectRetention",
                "s3:PutObjectLegalHold",
                "s3:PutObjectAcl",
                "s3:PutMetricsConfiguration",
                "s3:PutLifecycleConfiguration",
                "s3:PutJobTagging",
                "s3:PutInventoryConfiguration",
                "s3:PutEncryptionConfiguration",
                "s3:PutBucketWebsite",
                "s3:PutBucketVersioning",
                "s3:PutBucketTagging",
                "s3:PutBucketRequestPayment",
                "s3:PutBucketPublicAccessBlock",
                "s3:PutBucketPolicy",
                "s3:PutBucketOwnershipControls",
                "s3:PutBucketObjectLockConfiguration",
                "s3:PutBucketNotification",
                "s3:PutBucketLogging",
                "s3:PutBucketCORS",
                "s3:PutBucketAcl",
                "s3:PutAnalyticsConfiguration",
                "s3:PutAccountPublicAccessBlock",
                "s3:PutAccessPointPolicy",
                "s3:PutAccelerateConfiguration",
                "s3:ObjectOwnerOverrideToBucketOwner",
                "s3:DeleteStorageLensConfigurationTagging",
                "s3:DeleteStorageLensConfiguration",
                "s3:DeleteObjectVersionTagging",
                "s3:DeleteObjectVersion",
                "s3:DeleteObjectTagging",
                "s3:DeleteObject",
                "s3:DeleteJobTagging",
                "s3:DeleteBucketWebsite",
                "s3:DeleteBucketPolicy",
                "s3:DeleteBucketOwnershipControls",
                "s3:DeleteBucket",
                "s3:DeleteAccessPointPolicy",
                "s3:DeleteAccessPoint",
                "s3:CreateJob",
                "s3:CreateAccessPoint",
                "s3:BypassGovernanceRetention",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET-NAME/*"
            ]
        }
    ]
}
Przykład SCP do wdrożenia na koncie z Logami

BRAWO!

Twoje logi CloudTrail są teraz odpowiednio zbierane i zabezpieczone 🫡

Ostatnia aktualizacja: 5 kwietnia 2024

W czym mogę Ci pomóc?

Napisz, czego potrzebujesz, a ja sprawdzę i powiem, co i jak.

Zobacz też: architektura i doradztwo AWS albo szkolenia AWS dla zespołu.