공개 S3 버킷이 있는지 확인하는 Step Functions
21084 단어 awss3serverlessstepfunctions
혹시라도 S3 버킷이 공개 액세스로 설정되어 있다면 다른 방법을 사용하여 식별하고 비공개로 만들 수 있습니다.
워크플로 이해
이 블로그 게시물에서는
ListBuckets
, GetPublicAccessBlock
및 PutPublicAccessBlock
의 Step Functions SDK 통합과 함께 Amazon S3 을 사용할 것입니다. 또한 Simple Notification Service SDKPublish
를 사용하여 공개 액세스 권한이 있는 버킷 정책을 알립니다.
ListBuckets 상태
먼저
ListBuckets
SDK API를 사용하여 해당 계정의 모든 버킷을 나열합니다.
GetPublicAccessBlock 상태
그리고 Step Functions의
Map
흐름을 사용하여 각 버킷을 GetPublicAccessBlock
로 반복하면 다음으로 설정되는 매개변수 세트 BlockPublicAcls
, BlockPublicPolicy
, IgnorePublicAcls
, RestrictPublicBuckets
가 반환됩니다. false
버킷에 공개 액세스 권한이 있는 경우.
오류가 발생하는 경우 이 단계에는 통과하고 다음 항목을 계속할 수 있는 catch 블록이 있습니다.
선택 상태
이 조건을 확인하기 위해 배수 및 문과 함께
Choice
를 사용합니다.
조건이 충족되지 않으면 통과 상태로 진행합니다.
{
"And": [
{
"Variable": "$.res.PublicAccessBlockConfiguration.BlockPublicAcls",
"BooleanEquals": false
},
{
"Variable": "$.res.PublicAccessBlockConfiguration.BlockPublicPolicy",
"BooleanEquals": false
},
{
"Variable": "$.res.PublicAccessBlockConfiguration.IgnorePublicAcls",
"BooleanEquals": false
},
{
"Variable": "$.res.PublicAccessBlockConfiguration.RestrictPublicBuckets",
"BooleanEquals": false
}
],
"Next": "SNS Publish"
}
SNS 게시 상태
조건이 충족되면 버킷에 공개적으로 액세스할 수 있습니다. JSON 페이로드는 SNS 주제에 게시되어 그에 따라 캡처 및 처리됩니다.

PutPublicAccessBlock 상태
SNS 주제를 통지한 후
PutPublicAccessBlock
SDK API를 사용하여 모든 공개 액세스를 차단하도록 버킷도 변경합니다.
완전한 상태 머신은 다음과 같습니다.
{
"Comment": "State machine to identify public buckets and make them private",
"StartAt": "ListBuckets",
"States": {
"ListBuckets": {
"Type": "Task",
"Parameters": {},
"Resource": "arn:aws:states:::aws-sdk:s3:listBuckets",
"Next": "Map",
"ResultPath": "$.s3ListBuckets"
},
"Map": {
"Type": "Map",
"End": true,
"Iterator": {
"StartAt": "GetPublicAccessBlock",
"States": {
"GetPublicAccessBlock": {
"Type": "Task",
"Parameters": {
"Bucket.$": "$.s3JSON.Name"
},
"Resource": "arn:aws:states:::aws-sdk:s3:getPublicAccessBlock",
"ResultPath": "$.res",
"Catch": [
{
"ErrorEquals": [
"States.ALL"
],
"Next": "Pass"
}
],
"Next": "Choice"
},
"Choice": {
"Type": "Choice",
"Choices": [
{
"And": [
{
"Variable": "$.res.PublicAccessBlockConfiguration.BlockPublicAcls",
"BooleanEquals": false
},
{
"Variable": "$.res.PublicAccessBlockConfiguration.BlockPublicPolicy",
"BooleanEquals": false
},
{
"Variable": "$.res.PublicAccessBlockConfiguration.IgnorePublicAcls",
"BooleanEquals": false
},
{
"Variable": "$.res.PublicAccessBlockConfiguration.RestrictPublicBuckets",
"BooleanEquals": false
}
],
"Next": "SNS Publish"
}
],
"Default": "Pass"
},
"SNS Publish": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:sns:publish",
"Parameters": {
"Message.$": "$",
"TopicArn": "arn:aws:sns:us-east-1:228628157461:ErrorNotification"
},
"Next": "PutPublicAccessBlock",
"ResultPath": "$.sns"
},
"PutPublicAccessBlock": {
"Type": "Task",
"End": true,
"Parameters": {
"Bucket.$": "$.s3JSON.Name",
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"BlockPublicPolicy": true,
"IgnorePublicAcls": true,
"RestrictPublicBuckets": true
}
},
"Resource": "arn:aws:states:::aws-sdk:s3:putPublicAccessBlock"
},
"Pass": {
"Type": "Pass",
"End": true
}
}
},
"ItemsPath": "$.s3ListBuckets.Buckets",
"Parameters": {
"s3Index.$": "$$.Map.Item.Index",
"s3JSON.$": "$$.Map.Item.Value"
},
"ResultPath": "$.s3Buckets"
}
}
}
워크플로 실행
워크플로 실행은 상태 시스템에 대한 특정 입력 없이 작동합니다. 실행을 위해 상태 머신은 us-east-1에서 실행되고 SDK는 us-east-1 리전의 버킷과 함께 작동합니다.
상태 머신이 시작되면 계정의 모든 버킷이 나열되고 각 버킷을 반복하여 공개 액세스 여부를 확인합니다. 버킷에 공개 액세스 권한이 있는 경우 흐름에 따라 SNS 주제가 게시되고 모든 공개 액세스를 차단하여 버킷도 비공개로 설정됩니다.

SNS 주제의 일부로 이메일 JSON으로 알림을 받는 이메일 구독자가 있습니다.
실행이 시작되기 전에 공개 버킷을 식별했습니다.

상태 머신을 실행한 후 공개적으로 액세스할 수 있는 동일한 버킷이 이제 비공개입니다.

결론
종종 S3 버킷을 비공개로 관리하고 확인하는 것은 지루한 작업이며, Step Functions 및 SDK와 S3의 통합을 통해 프로세스를 간소화할 수 있습니다.
3월 14일(3월 14일)에 가까워지면서 S3의 16번째 생일이기도 한 PI Day로 널리 알려져 있으며 축하 행사가 있습니다AWS Pi Day 2022.
Reference
이 문제에 관하여(공개 S3 버킷이 있는지 확인하는 Step Functions), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/awscommunity-asean/step-functions-to-check-if-you-have-public-s3-buckets-5dje텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)