처음 접했을 당시 가장 헷갈렸던 개념이 아닐까 싶다
assumeRole은 역할을 빌려주는 것, passRole은 역할을 전달하는 것
둘은 무슨 차이가 있을까? 최근 사이트 프로젝트에서 인프라 구축을 담당하고 있기에, 차근차근 다시금 적어보려고 한다
앞서 이야기했듯이, 역할을 임시로 빌려줄 수 있는 권한을 의미한다
주로 신뢰관계 정책을 설정할 때나, 역할을 전환할 때 사용한다
임시로 빌려주기 때문에 STS를 사용하기 때문에, sts:AssumeRole 이다
아래 예시를 보자
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "codedeploy.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
위의 의미는 codedeploy 서비스에 한해 AssumeRole, 즉 지금 생성한 권한을 빌려줄 수 있다는 것이다
같은 계정 내에서 역할을 바꾸고 싶을 경우 신뢰 정책을 책정하면 된다
현재 역할(A Role)은 AWS 리소스(B Role)를 역할을 맡을 수 있는 권한을 가진다
// B Role 신뢰관계 정책
{
"Sid": "Statement2”,
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": ""arn:aws:iam::{ACCOUNT_ID}:role/a_bucket_read_role""
}
}
다른 계정의 사용자로 전환하여 역할을 맡고 싶다면, 그 역할을 맡을 수 있다는 정책이 추가로 필요하다
A Role을 가진 사용자(111)과 B Role을 가진 사용자(222)가 있고, 111 사용자가 A Role에서 B Role로 전환하고 싶다고 하자
그럴때 A Role은 B Role을 빌려쓸 수 있다는 권한이 필요하다는 것이다
우선
// A Role 권한 정책
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::{ACCOUNT_ID}:role/b_bucket_read_role"
]
}
현재 역할(A Role)은 AWS 리소스(B Role)를 역할을 맡을 수 있는 권한을 가진다
// B Role 신뢰관계 정책
{
"Sid": "Statement2”,
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": ""arn:aws:iam::{ACCOUNT_ID}:role/a_bucket_read_role""
}
}
AWS 리소스(A Role)을 가지고 있다면 해당 역할(B Role)을 맡을 수 있다
역할을 할당하는 것에도 역시 권한이 필요하다. 우리가 콘솔로 직접 할당하기에 느끼지 못할 뿐이다
만약 직접 할당하는 것이 아니라 서비스를 사용하면서 자동으로 할당되는 경우 해당 권한이 필요하다
EC2 인스턴스를 시작한 후에 사용자가 EC2에 원하는 권한을 할당해주고 싶을 때가 있다
이 경우 다음과 같은 정책을 생성하여 사용자에게 연결해주면 된다
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole"
],
"Resource": "arn:aws:iam::account-id:role/EC2-roles-for-XYZ-*"
}]
}
역할들을 나열(GetRole)하여 Resource에 해당하는 역할만 할당(PassRole)하는 것을 허용한다
이외의 예시들은 AWS에 자세히 설명되어 있다
(https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_use_passrole.html)
간단히 요약하자면 assumeRole은 특정 리소스가 A 역할을 맡아서 수행할 수 있는지를 말하는 것이고,
passRole은 특정 리소스에 A 역할을 할당할 수 있는지를 말하는 것이다
헷갈릴 수 있으나 assumeRole은 다른 역할을 사용할 필요가 있을 때,
passRole은 리소스에 역할을 할당하고 싶을 때 사용한다