Spring AmazonS3ClientBuilder MFA 사용

검색 능력이 미숙하여, 좋은 방법을 찾지 못해 작성한 글입니다.
관련된 다른 좋은 방법을 찾게되면 알려주세요!

— update
원인은 모르는 새에 추가되어있던 role의 policy 때문이었다.
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken",
"iam:DeleteVirtualMFADevice",
"iam:ChangePassword"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}

local 환경에서 aws cli 를 통해 s3 접근시 AccessDenied 가 발생하였다.

사내 인프라 팀에 의해 mfa policy 가 추가된 것인지. 평소 잘 쓰던 부분에서 문제가 발생하였다.

aws cli를 통해 mfa 세션을 사용하는 방법은 아래와 같다.

aws sts get-session-token --serial-number [MFA DEVICE ARN] --token-code [MFA TOKEN]
>>>
{
"Credentials": {
"AccessKeyId": [ACCESS KEY]
"SecretAccessKey": [SECRET ACCESS KEY]
"SessionToken": [SESSION TOKEN],
"Expiration": "2020-06-09T13:12:56+00:00"
}
}
export AWS_ACCESS_KEY_ID=[ACCESS KEY]
export AWS_SECRET_ACCESS_KEY=[SECRET ACCESS KEY]
export AWS_SESSION_TOKEN=[SESSION TOKEN]
*이외에 credential에 profile을 추가해서 사용하는 방법도 있다.

그런데 기존에 로컬 환경에서 기동하는 어플리케이션에서도 S3를 이용하고 있었기 때문에 , 동일한 문제로 AccessDenied 가 발생하였다.

s3Client 인스턴스 생성시 mfa 세션 credential을 주입해주면 된다는 생각에
위의 aws cli 흐름과 동일하게 mfa 세션을 획득하게끔 로직을 작성해보았다.

사용하는 방법은 아래와 같다.

AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new MfaCredentailProvider(region))
.build();

MfaCredentailProvider 생성자 메서드 내에서 refresh 하는 시점에
사용자로 부터 token 을 입력받게끔해두었다.

기록용으로 작성하고, 좋은 방법을 찾으면 지울 예정입니다.
좋은 방법좀 알려주세요. 검색해도 안나와서 시무룩.
-> 근본적인 원인(AMI policy)을 알게되어 삭제하려했는데. 혹시나.. 하는 생각에 남겨둔다.. 과연 쓸일이 있을지...

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store