[AWS] 권한(permission), IAM 정책(policy), IAM 역할(role)
1. Root 사용자, IAM 사용자
AWS에는 루트(root) 사용자와 루트 사용자에게 권한을 받은 IAM 사용자가 있습니다.
IAM은 Identity and Access Management의 약자이며, AWS에서 사용자를 생성하고 리소스에 대한 접근을 제어하기 위해 생성합니다.
보안을 위해 루트 사용자는 IAM 사용자를 생성하고 권한을 부여하는데에만 사용하는 것이 일반적이며, 대부분의 작업은 IAM 계정을 이용하는 것이 권장됩니다.
맨 처음 IAM 사용자를 생성하면 아무런 작업도 할 수 없는데, 루트 사용자가 IAM 사용자에게 어떠한 작업을 할 수 있도록 권한(permission)을 부여해 주어야 합니다.
이러한 권한을 부여할 때 사용자, 그룹에는 정책(Policy)을 AWS 리소스에는 역할(Role)을 부여하여 진행합니다.
여기서 말하는 권한(permission)이란 "특정 작업을 수행할 수 있는 능력"입니다.
예를 들면 S3버킷에 파일을 업로드하거나 EC2 인스턴스를 시작하는 권한 등이 있습니다.
2. IAM 정책(policy)
여러 개의 권한을 묶어서 정의한 규칙입니다.
주로 IAM 사용자 또는 IAM 그룹에게 권한을 부여하는 데 사용되고, 특정 리소스에 대한 액세스 권한을 정의하는 JSON 문서입니다.
IAM 정책 중 관리 권한 정책은 아래와 같습니다.
// AdministratorAccessPolicy
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
JSON 파일이며 IAM 사용자에게 지정할 시 모든 권한을 위임 받을 수 있습니다.
이외에도 S3에 대한 읽기 권한만을 제공하는 "S3ReadAccess", EC2 인스턴스 관리 권한을 정의하는 "EC2FullAccess" 등이 있습니다.
AdministratorAccess 정책은 S3ReadAccess 처럼 하나의 권한만을 제공하지 않고, EC2FullAccess와 AmazonS3FullAccess등을 포함하는 높은 수준의 권한입니다.
정책 마다 권한이 다르기 때문에 하나의 정책으로 여러개의 권한을 가지는 것이 가능합니다.
이러한 IAM 정책은 IAM 사용자에게 개별로 부여되거나, IAM 그룹에 부여하여 그룹에 속한 사용자들에게 일괄적으로 부여될 수 있습니다.
예를 들어 Max, Abudl, Lee는 모두 같은 개발자(developer) 그룹에 속해 있는데 개발자 그룹에 이러한 정책을 부여하여 3명 모두 같은 권한을 가질 수 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
위의 정책을 개발자(developer) 그룹에 연결하면 그룹에 속한 모든 사용자가 EC2와 S3에 대한 완전한 액세스를 가질 수 있습니다.
이렇게 정책을 부여할 때는 필요한 권한만을 부여하는 "최소 권한 정책"을 기본으로 제공되는 것이 원칙입니다.
3. IAM 역할(Role)
특정 작업을 수행하기 위한 "임시 자격 증명"입니다.
AWS 리소스(ex. EC2 인스턴스) 또는 다른 AWS 서비스에 권한을 부여하는 데 사용되며, 특정 작업을 수행하기 위해 임시 자격 증명을 제공하는 엔터티입니다.
예를 들어 EC2가 S3에 대한 읽기, 쓰기를 하고 싶은데 생성된 처음부터 가능하지 않습니다.
일반 사용자처럼 AWS 리소스도 다른 리소스나 서비스와 상호작용할 권한이 기본적으로 없습니다. 그래서 권한을 부여해 주어야 하는데 IAM 정책은 사용자에게 부여하는 것이라면, 리소스에는 "IAM 역할"을 사용해 권한을 부여할 수 있습니다.
EC2 인스턴스가 S3와 상호작용을 위해 역할을 생성하면, AmazonS3FullAccess와 같은 정책을 역할에 연결합니다. 그리고 생성된 역할을 EC2 인스턴스에 연결합니다. 이렇게 하면 EC2는 S3에 완전한 액세스 권한을 얻게됩니다.
과정 예시)
1. 역할 생성
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
JSON 문서는 역할을 정의하며, EC2 서비스가 이 역할을 "가정"할 수 있게 해줍니다.
*역할에서 Action을 보면 sts:AssumeRole이라고 되어있는데 이는 EC2 인스턴스가 이 역할을 "가정"할 수 있음을 의미합니다.
sts:AssumeRole의 정확한 의미는 특정 주체가 역할을 가정하며 그 역할에 정의된 권한을 임시로 사용할 수 있게 하는 작업입니다.
앞서 IAM 역할은 "임시 자격 증명"을 부여한다고 했는데 이러한 이유 때문입니다. (IAM 사용자는 고정된 자격 증명을 가지고 인증되기 때문에 필요하지 않습니다)
2. 정책 연결
// 정책 이름은 AmazonS3FullAccess
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
이 정책을 만들고 정책을 역할에 연결하면 s3에 접근할 수 있는 권한을 가진 역할이 됩니다.
역할을 EC2에 연결할 때는 AWS Console, AWS CLI, Terraform 등의 IaC 툴을 사용하여 수행할 수 있습니다.
그렇게 역할을 EC2에 연결하면, EC2 인스턴스는 S3에 대한 액세스 권한을 가지게 됩니다.
*(역할 생성 -> 역할에 특정 권한을 가진 정책 연결 -> 역할을 EC2 인스턴스에 연결)
헷갈리던 IAM 정책, IAM 역할을 정리해 보았습니다.