ec2에 배포한 Java 어플리케이션이 키 없이 다른 계정에 접근할 수 있다면?
액세스키, 시크릿키를 줄여 관리의 수고를 덜어줄 수있을 뿐 아니라, 노출의 위험 자체가 없어지니 보안적으로도 장점이 있다.
지난 포스팅에서 언급했듯이 이러한 이유들로 IAM 역할을 사용할 수 있다면, 이를 최대한 활용하고 싶고
개인적으로는 최대한 액세스키, 시크릿키를 사용하고 싶지 않다.
지난 포스팅에서는 단순히 logstash에서 AssumeRole을 이용하기 위해 IAM Role을 생성해주고,
Input 혹은 Output에 role arn을 지정해주는 간단한 설정만으로 액세스키, 시크릿키 없이 타계정 리소스 접근을 허용해주었는데
이번에는 Java 어플리케이션에서 AWS SDK를 이용하여 개발할 때 방법을 소개하고자 한다.
AWS SDK를 사용한다고 해서 무슨 특별한 차이점이 있겠느냐고 생각할 수 도있지만, 삽질을 몇시간했기 때문에 잊지않기 위해 남긴다.
먼저 삽질을 시작하게된 이유는 AssumeRole을 소개하는 AWS 공식 문서에서 소개한대로
AWS SDK에서 AssumeRole을 사용하기위해 임시 보안자격증명을 선언하고 이를 통해 타계정의 리소스에 접근하려했다는 점이다.
나와 같은 실수를 했다면 아마 아래와 같은 오류메세지를 만났을 것이다.
Cannot call GetSessionToken with session credentials
그리고 이 문구와 함께 403 에러라는 에러코드도 보여주는데, 403오류코드에 집착해 IAM 설정만을 들여다보았다.(삽질 대장정 시작)
IAM Role에 GetSessionToken 권한도 넣어보았지만 원하는 결과를 얻을 수 없었다.
이에 대한 해답은 의외의 곳에서 찾았다.
구글링하다가 찾은 스택오버플로우 링크인데, 나와 똑같은 문제를 고민하고 있는 질문에 아래와 같은 답변이 달려있었다.
According to AWS support, roles cannot request temporary credentials. Only actual Users can do that.
A work around is to use the role’s credentials. They get rolled over every hour, so they are temporary (albeit hard coded to 1 hour TTL)
애초에 IAM Role은 임시 자격증명을 요청할 수 없다는 것이다.
결국 AWS SDK 사용법이 잘못됐다는 것에 힌트를 얻어 role arn을 지정하여 AssumeRole Session을 받아오고, client를 생성할때 Credential을 지정해줌으로서 해결하였다.
STSAssumeRoleSessionCredentialsProvider stsCred =
new STSAssumeRoleSessionCredentialsProvider.Builder(Role ARN, Role Session Name).build();
AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard().withCredentials(stsCred).build();
IAM Role은 이미 Session Credential을 사용하고 있다.
AWS 콘솔에서 Role 설정화면에 들어가면 최대 CLI/API 세션 기간이라는 설정 항목을 볼 수 있는데,
이 항목을 사용자 지정 기간으로 선택하면 다음과 같은 힌트를 얻을 수 있다.
CLI/API 최대 세션 기간은 3,600 (1시간) 에서 43,200 (12시간) 사이여야 합니다.
이 역할을 수임하면 IAM에서 기본 시간 동안 유효한 임시 보안 자격 증명을 발급합니다.(기본으로 제공하는 시간은 따로 있음을 의미함)
최대 세션기간을 늘려 해당 역할을 수임하는 사람이 선택적으로 DurationSeconds 파라미터를 이용해 세션 연장을 요청하도록 허용합니다.(이 설정은 기본 세션에 초과하여 연장을 요청할때의 최대값임) 자세히 알아보기
위 공식 문서에서 제공하는 정보에 따르면
AssumeRole CLI/API의 자격 증명의 수명은 최소 15분~최대 (세션 기간 설정만큼) 이며, 기본은 1시간이다.
즉, 자격증명의 수명을 연장하기 위해서는 STSAssumeRoleSessionCredentials을 받아오기전에 duration seconds를 지정해주면 된다.
나 같은 경우에는 최대 시간을 1시간으로 지정해두었기 때문에, 기본 제공하는 세션 시간에서 연장할 수 없다.