
2017년 9월 17일, Accenture의 AWS S3 버킷 4개가 퍼블릭으로 노출되어 누구나 접근 가능한 상태였음이 발견되었다.
이 버킷들은 인증 없이 HTTP 요청만으로 접근 가능했으며, 브라우저를 통해 직접 데이터 다운로드가 가능한 상태였다.
노출된 버킷은 다음과 같다.
해당 버킷들은 모두 Accenture Cloud Platform(Azure/GCP도 포함)과 관련된 내부 운영 데이터 및 고객 데이터를 포함하고 있었으며, 발견 직후 Accenture 측에 발견한 UpGuard의 연구원이 제보하였고, 다음 날 접근이 차단되었다고 한다.
S3 버킷이 Public Read 상태로 설정됨
인증 없이 누구나 접근 가능
결과적으로 외부 공격자가 별도의 침투 과정 없이 데이터 확보 가능
즉, 공격자는 단순히 S3 URL을 아는 것만으로 내부 데이터에 접근할 수 있었다.
S3는 객체 저장소일 뿐이며, 별도의 보안 설정이 없으면 인터넷에 그대로 노출된다.
Accenture는 내부 시스템 데이터와 동일한 수준의 민감 정보를 S3에 저장하면서도, 네트워크 레벨의 보호를 적용하지 않았다.
버킷 내부에는 다음과 같은 정보가 포함되어 있었다.
각각의 버킷에 어떠한 데이터가 있었는지 상세히 나와있어 확인이 가능했는데, 내용은 다음과 같다.
당시 s3의 외부 접근이 가능했고 브라우저로 직접 다운로드가 가능했다는 점을 보았을때, 아마도 s3에 적용된 정책은 다음과 같이 매우 단순하게 모든 것을 허용하고 있었을 가능성이 높아보인다.
(아래에 사용된 s3 policy들은 모두 샘플로 제작한 것이다. accenture 사고에서 공개된 관련 자료는 아니다)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::acp-software/*"
}
]
}
우선 ACL과 Bucket policy의 차이점/개념에 대해 먼저 알아보자.
ACL은 객체 또는 버킷 단위로 허용만 제어하고 매우 단순한 권한 구조를 갖고 있다. 다만 이는 과거의 방식으로 최근에는 Bucket Policy 사용을 권장하고 있다고 한다.
| 구분 | ACL | Bucket Policy |
|---|---|---|
| 적용 범위 | Bucket / Object | Bucket |
| 표현 방식 | 단순 권한 | JSON 정책 |
| Allow / Deny | Allow만 가능 | Allow + Deny |
| 조건 제어 | 불가능 | 가능 (IP, VPC, TLS 등) |
| 세밀한 제어 | 어려움 | 매우 정교함 |
| 사용 권장 여부 | 거의 비권장 | 권장 |
따라서 이 사례에서는 Bucket Policy뿐 아니라, 아래와 같이 ACL 기반 퍼블릭 공개가 함께 있었을 수도 있다.
예를 들면,
이 경우 Bucket Policy가 아니더라도 외부 접근이 가능해질 수 있다.
이런 이유는 S3가 모든 정책을 합쳐서 평가하고, 그 중 하나라도 Allow가 있으면 접근이 가능해지기 때문이다.
이러한 정책들을 모두 고려하여 평가한다. 평가 기준은 다음과 같다.

따라서 퍼블릭 접근을 막으려면 1) allow가 없거나 2) 명시적 deny 정책이 하나라도 있거나 해야한다.
AccentureDeploymentRole만 읽고 쓰기가 가능하게 하려면 다음과 같이 설정할 수 있다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowOnlySpecificRoleReadWrite",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/AccentureDeploymentRole"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::acp-software/*"
},
{
"Sid": "AllowOnlySpecificRoleListBucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/AccentureDeploymentRole"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::acp-software"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyInsecureTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::acp-software",
"arn:aws:s3:::acp-software/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyRequestsNotFromApprovedVPCE",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::acp-software",
"arn:aws:s3:::acp-software/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-0abc123def4567890"
}
}
}
]
}
인프라를 분석해볼 때도 이런 s3, dynamodb같은 경우 vpc endpoint를 사용해 퍼블릭 접근을 막고 내부에서만 사용할 수 있도록 하는 것을 여러 차례 언급했었는데 이런식으로 bucket policy에도 명시하여 해당 엔드포인트로만 접근할 수 있도록 설정한다.
Bucket Policy 외에도, 다음과 같은 설정이 필요하다.
출처: