AWS를 사용하다가 "An error occurred (AccessDenied) when calling the.." 같은 오류를 본 적이 있을 것이다.
이 포스트에서는 이런 권한 오류를 해결하는 방법에 대해 알아보자.
1. 권한 확인하기
가장 먼저 확인해야 할 것은 IAM 권한이다.
만약 접근 권한이 부족하면, AWS는 필요한 권한이 없다는 것을 명확히 알려준다.
An error occurred (AccessDeniedException) when calling the CreateFunction operation: User: arn:aws:iam::123456789012:user/hamster is not authorized to perform: lambda:CreateFunction on resource: arn:aws:lambda:us-west-2:123456789012:function:example-function
위 메시지 같은 경우엔 'hamster'사용자가 lambda:CreateFunction 작업을 수행할 권한이 없다는 것을 의미한다.
즉, 이 사용자는 Lambda 함수를 생성할 수 있는 권한이 없다는 것이다.
이 경우, 부족한 권한을 부여하면 문제가 해결된다.
2. 존재하지 않는 서비스 접근
두 번째로 확인할 것은 접근하려는 서비스나 객체가 실제로 존재하는지 여부이다.
예를 들어, AWS Lambda에서 존재하지 않는 객체에 접근하려고 하면 이 오류가 발생할 수 있다.
3. Deny 권한 확인
세 번째로 확인할 것은 IAM 정책에 Deny 권한이 있는지 여부이다. AWS 서비스에서는 Deny 정책이 Allow 정책보다 우선시 되므로, Deny 권한이 있으면 권한이 부여되어 있더라도 접근이 거부될 수 있다.
4. MFA 정책
혹시 CLI 사용 시 다음과 같은 정책을 사용하고 있는지 확인하자:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": "iam:ListVirtualMFADevices",
"Resource": "*"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/*"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:GetMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {"aws:MultiFactorAuthPresent": "false"}
}
}
]
}
이 정책은 MFA 인증을 완료하지 않은 경우 모든 AWS 작업에 대한 접근을 거부한다.
만약 위와 유사한 정책을 사용하고 있다면, AWS STS GetSessionToken 작업을 사용하여 MFA 토큰을 얻고 이를 사용해 원하는 작업을 인증해야 한다.
MFA가 필요한 토큰 얻기
aws sts get-session-token --serial-number <mfa_arn> --token-code <mfa_code> --profile <user>
<mfa_arn>
: IAM에 등록된 MFA 디바이스의 ARN<mfa_code>
: MFA 디바이스에서 생성된 6자리 숫자 코드--profile <user>
: 특정 프로필을 사용하는 경우
예시:
aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/user --token-code 987654
다음과 같이 임시 자격 증명과 만료 시간(기본12시간)이 포함된 출력을 받게 된다:
{
"Credentials": {
"SecretAccessKey": "=+x+fmMPZctKSs0G36XK29fkLxhny8ryPSZeynY",
"SessionToken": "FwoGZXIvYXdzEDUaDNVWrcpK/4VEos9XmSKGAYbFAQWW4QOuGxGzj8TfP+fLPounTapZl0ElxPb+",
"Expiration": "expiration-date-time",
"AccessKeyId": "ASIAWIVXKNJNRIEV6NWA"
}
}
그런 다음, 받은 임시 자격 증명을 아래 형식으로 등록하여 사용하면 해결할 수 있다.
AWS_ACCESS_KEY_ID=ASIAWIVXKNJNRIEV6NWA
AWS_SECRET_ACCESS_KEY==+x+fmMPZctKSs0G36XK29fkLxhny8ryPSZeynY
AWS_SESSION_TOKEN=FwoGZXIvYXdzEDUaDNVWrcpK/4VEos9XmSKGAYbFAQWW4QOuGxGzj8TfP+fLPounTapZl0ElxPb+
임시 MFA 자격 증명 얻기에 관한 공식 AWS 가이드도 참고하자.
참고 자료
'Cloud > Aws' 카테고리의 다른 글
CloudWatch 와VPC Endpoints 연동하기 (0) | 2024.06.23 |
---|---|
AWS Lambda Python Layer 만들기 (0) | 2024.06.20 |
Amazon RDS PostgreSQL 로그를 Amazon S3로 자동 내보내기 (0) | 2024.06.20 |
Firehose를 이용한 CloudWatch Logs를 S3로 내보내기 (0) | 2024.06.20 |
S3 log를 Cloudwatch로 실시간 이동하기 (0) | 2024.06.18 |