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 🫡