...
임시 자격 증명 생성 (AssumeRole)
임시 자격 증명은 사용자에게 특정 역할(Role)을 Assume(뜻: 제것으로 삼다)하여 역할에 부여된 권한을 행사 가능하게 하는 단기로 사용할 수 있는 자격 증명이다.
사용자가 Role을 Assume하다라는게 무슨말이냐면, 아래 사진과 같이 권한이 없는 IAM 유저가 어드민 모자(Role)를 쓰면(assume) 마치 사용자가 어드민 처럼 되서 어드민 권한을 행새 할 수 있다는 것을 뜻한다고 보면 된다.
그래서 이러한 모자를 쓰는 행위를 AssumeRole 이라고 한다.
몇분에서 몇시간 까지 지속시간이 정해져 있어서 '임시' 라는 말이 들어간 것이다.
만일 자격 증명이 만료된 이후에는 어떤 종류의 액세스도 허용되지 않는다.
필요한 시점에서 바로바로 생성해서 활용하고 이후 필요에 따라 재 발급도 가능하기 때문에 임시 자격 증명은 보안이 매우 뛰어나다.
따라서 실무에서는 최대한 장기 자격 증명(Access Key Id / Secret Access Key)보다는 임시 자격 증명을 최대한 활용하는게 좋은 방법이다.
이 포스팅에선, Node 프로젝트에서 AssumeRole을 통해 임시 자격증명(토큰)을 발급받은뒤 AWS S3 서비스에 일정기간 동안만 엑세스하는 실무 예제를 들어볼 예정이다.
큰 틀을 정리하자면 다음과 같다.
- 아무 권한이 없는 IAM 유저 생성하고 인라인으로 AssumeRole 정책 부여
- IAM 메뉴에서 AmazonS3FullAccess 할수있는 역할 생성
- Node 프로젝트에 아무 권한이 없는 IAM 유저의 장기 자격 증명(Access Key Id / Secret Access Key)을 등록 (아무 권한이 없는 자격증명이니 S3에 엑세스 불가)
- AWS SDK STS 를 통해 코드로 AssumeRole을 하고 임시 자격 증명을 발급
- Node 프로젝트의 자격 증명을 발급한 임시 자격 증명으로 업데이트하고 S3에 엑세스 시도
본 강의는 바로 Node.js 프로젝트에서 STS 클래스를 이용해 AssumeRole 하는 코드로 바로 진행할 예정이다.
따라서 1번과 2번 과정인 IAM 유저를 생성하고 AssumeRole 인라인 정책 부여 / IAM 메뉴에서 S3엑세스 역할 생성하는 방법은 다음 포스팅을 참고하길 바란다.
AWS STS AssumeRule 사용법
먼저 자신의 노드 프로젝트의 .env 파일에 아무 권한이 없는 IAM 유저의 장기 자격 증명(Access Key Id / Secret Access Key)을 등록해준다.
그리고 AWS S3 버킷 목록을 가져오는 코드를 실행하여 보자.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
//* aws region 및 자격증명 설정
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
const s3 = new AWS.S3();
//* 버킷 목록 가져오기
s3.listBuckets()
.promise()
.then((data) => {
console.log('S3 : ', JSON.stringify(data, null, 2));
});
AccessDenied: Access Denied 가 뜬다.
아무 권한이 없는 자격 증명으로 요청을 했으니 접근 제한 받는 것은 당연한 수순이다.
임시 자격 증명을 발급해서 S3에 접근하게 하는 식으로 해보자.
임시 자격 증명을 발급하기 위해서는 IAM Role의 ARN 값이 필요하다.
IAM 콘솔 메뉴로 들어가 역할 항목에서, 위 링크에서 만들었던 s3-assume-role 역할에 들어가면 확인 가능하다.
이 arn 값을 이용해 assumeRole을 할 것이다.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
//* 아무 권한 없는 유저 등록
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
const roleToAssume = {
RoleArn: 'arn:aws:iam::123123123123:role/s3-assume-role', // iam 역할의 arn 값을 넣는다.
RoleSessionName: `s3-assume-role_${new Date().getTime().toString()}`,
DurationSeconds: 900, // 900초 ~ 129,600초(36시간) 범위
};
//* Assume Role
async function assumeRole() {
const sts = new AWS.STS();
try {
const data = await sts.assumeRole(roleToAssume).promise();
console.log('Credentials : ', data);
console.log('토큰 만료 기간 : ', new Date(data.Credentials.Expiration).toTimeString());
return ({
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken,
});
} catch (error) {
console.log(error);
}
}
let roleCreds = await assumeRole();
const s3 = new AWS.S3(roleCreds); // 임시 자격 증명을 S3 클래스 인자로 넣는다.
//* 버킷 목록 가져오기
await s3
.listBuckets()
.promise()
.then((data) => {
console.log('S3 : ', JSON.stringify(data, null, 2));
})
.catch((error) => {
console.log(error, error.stack);
});
AWS ChainableTemporaryCredentials 사용법
AWS SDK 가 업데이트되면서 좀더 assumerole을 하기 쉽게 2018년 후반에 'ChainableTemporaryCredentials'로 알려진 새로운 자격 증명 공급자가 추가되었다.
정말 간단한 코드로 assumrole을 할수 있게 되었다.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
//* 아무 권한 없는 유저
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
const roleToAssume = {
RoleArn: 'arn:aws:iam::123123123123:role/s3-assume-role',
RoleSessionName: `s3-assume-role_${new Date().getTime().toString()}`,
DurationSeconds: 900, // 900초 ~ 129,600초(36시간) 범위
};
const credentials = new AWS.ChainableTemporaryCredentials({
params: roleToAssume,
});
const s3 = new AWS.S3({ credentials }); // 임시 자격 증명을 S3 클래스 인자로 넣는다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.