IT/AWS

S3 bucket policy "Invalid principal in policy"

촌초니 2023. 8. 27. 14:21

AWS를 운영하다보면 S3 bucket policy를 업데이트해야하는데,

간혹 "Invalid principal in policy"라는 에러가 발생하고 에러난 부분을 자세히 살펴보면

아래와 같이 S3 bucket policy에 알 수 없는 문자열이 있는 경우가 있다.

"Principal": {
  "AWS": [
    "AIDAJQABLZS4A3QDU576Q"
  ]
}

AWS IAM에는 고유ID라는게 모든 리소스에 할당된다.

예를 들어, test_user 라는 IAM user를 생성하면 고유ID가 생성되고 이 user를 삭제하고 다시 test_user라는 IAM user를 만들면 겉으로 보기엔 같은 test_user로 보이지만, 실제 고유ID가 다르기때문에 시스템에서는 다른 user로 인식한다.

 

일반적으로 IAM policy나 Bucket Policy에서는 arn을 사용하기 때문에 이 고유ID는 몰라도 크게 상관은 없다.

그러나 가끔 위 내용처럼 나도 모르는 사이에 bucket policy에 고유ID가 들어가는 경우가 있다.

 

관련문서를 보면 이런 내용이 있다.

관련 문서 링크 : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_elements_principal.html

 

AWS JSON 정책 요소: Principal - AWS Identity and Access Management

역할 신뢰 정책의 Principal 요소에 특정 IAM 사용자를 가리키는 ARN이 포함되어 있으면, IAM은 정책을 저장할 때 ARN을 사용자의 고유한 보안 주체 ID로 변환합니다. 그러면 누군가가 해당 사용자를 제

docs.aws.amazon.com

Principal에 대한 설명

위 내용을 조금 풀어 설명하자면, 기본적으로 Principal에 arn을 넣는다. 실제 시스템에는 고유ID로 변환되어 저장되지만, 콘솔상에서는 이를 다시 역변환하기때문에 고유ID로 표시되지않고 arn으로 보여진다.

그러나 role이나 user 등 리소스가 삭제된 경우에는 이 관계가 깨지기때문에 고유ID로 보여지게 되는것이다.

즉, 삭제된 유저나 Role일 확률이 높다.

 

그렇다고 무작정 해당 고유ID를 지울수도 없고, 그냥 두자니 policy 업데이트가 되지않고.. 난감한 상황이 되기때문에..

 

아래 cli로 실제 우리가 관리하는 어카운트에 해당 고유ID로 되어있는 Role이나 User 등 리소스가 있는지 체크해야한다.

 

아, 그 전에 고유ID마다 User인지 Group인지 Role인지 등등 어떠한 리소스인지 먼저 파악을 해야한다. 파악이 되지않은 상태에서는 IAM의 모든 리소스를 조사해야하기때문에 불필요한 시간과 노력이 많이 들기 때문이다.

 

각 고유ID는 아래 표에서 보여지는 것처럼 어떠한 리소스인지 확인이 가능하다.

 

관련문서 : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids

 

IAM 식별자 - AWS Identity and Access Management

IAM 식별자 IAM은 사용자, 사용자 그룹, 역할, 정책 및 서버 인증서에 대해 몇 가지 다른 식별자를 사용합니다. 이 단원에서는 그러한 식별자와 각 식별자를 사용하는 경우를 설명합니다. 표시 이

docs.aws.amazon.com

 

이번 경우에는 AIDA라고 시작하기때문에 User라고 볼 수 있고, 우리 어카운트의 User를 대상으로 해당 고유ID가 있는지를 조사하고 만약 없다면 삭제된 User가 맞으니 Policy에서 삭제해도 된다.

 

고유ID는 아래 CLI나 SDK에서 확인 가능하다.

 

aws iam list-users
import boto3

client = boto3.client('iam')

response = client.list_users()

print (response)

검색 후 없는 리소스로 확인됐을시 삭제를 통해 오류 해결이 가능하다.

 

 

그리고, 참고할만한 문서 : https://repost.aws/knowledge-center/s3-invalid-principal-in-policy-error