IAM 식별자
IAM 식별자
IAM은 사용자, 사용자 그룹, 역할, 정책, 서버 인증서를 다룰 때 몇 가지 식별자를 사용해요. 친근한 이름(friendly name), ARN, 고유 ID라는 세 가지 식별자를 언제 어떻게 쓰는지 정리해 주는 페이지예요.
출처: 문서
본문
IAM은 사용자, IAM 그룹, 역할, 정책, 서버 인증서에 몇 가지 서로 다른 식별자를 사용해요. 이 섹션은 각 식별자와 언제 어떤 것을 쓰는지 설명해 줘요.
친근한 이름과 경로
사용자, 역할, 사용자 그룹, 정책을 만들거나 서버 인증서를 업로드할 때 친근한 이름(friendly name)을 지정해요. 예로는 Bob, TestApp1, Developers, ManageCredentialsPermissions, ProdServerCert가 있어요.
IAM API나 AWS 명령줄 인터페이스(AWS CLI)로 IAM 리소스를 만들면 선택적으로 경로를 추가할 수 있어요. 단일 경로를 쓰거나 여러 경로를 폴더 구조처럼 중첩할 수도 있어요. 예를 들어 회사 조직 구조에 맞춰 중첩 경로 /division_abc/subdivision_xyz/product_1234/engineering/을 쓸 수 있어요. 그러면 그 경로의 모든 사용자가 정책 시뮬레이터 API에 접근하도록 정책을 만들 수 있어요. 이 정책은 "IAM: 사용자 경로에 따라 정책 시뮬레이터 API 접근" 예시를 참고하세요. 친근한 이름을 지정하는 방법에 대한 자세한 내용은 User API 문서를 참고하고, 경로 사용 예시는 IAM ARN을 참고하세요.
CloudFormation으로 리소스를 만들 때는 사용자, IAM 그룹, 역할, 고객 관리형 정책에 경로를 지정할 수 있어요.
사용자와 사용자 그룹이 같은 경로에 있어도 IAM은 사용자를 자동으로 그 그룹에 넣지 않아요. 예를 들어 Developers 사용자 그룹을 만드는 동시에 경로를 /division_abc/subdivision_xyz/product_1234/engineering/으로 지정했다고 해볼게요. Bob이라는 사용자를 만들면서 같은 경로를 넣어도 Bob이 자동으로 Developers 그룹에 들어가지는 않아요. IAM은 경로에 따라 사용자나 IAM 그룹 사이에 어떤 경계도 강제하지 않아요. 경로가 다른 사용자도 권한만 부여받았다면 같은 리소스를 쓸 수 있어요. AWS 계정의 IAM 리소스 수와 크기는 제한돼 있어요. 자세한 내용은 IAM 및 AWS STS 할당량을 참고하세요.
IAM ARN
대부분의 리소스는 Bob이라는 사용자나 Developers라는 사용자 그룹 같은 친근한 이름을 가져요. 하지만 권한 정책 언어는 다음 Amazon 리소스 이름(ARN) 형식으로 리소스를 지정하도록 요구해요.
arn:partition:service:region:account:resource
여기서:
- partition — 리소스가 있는 파티션을 식별해요. 표준 AWS 리전의 파티션은
aws예요. 다른 파티션에 리소스가 있다면 파티션은aws-partitionname이에요. 예를 들어 중국(베이징) 리전 리소스의 파티션은aws-cn이에요. 서로 다른 파티션의 계정 사이에는 접근을 위임할 수 없어요. - service — AWS 제품을 식별해요. IAM 리소스는 항상
iam을 사용해요. - region — 리소스의 리전을 식별해요. IAM 리소스의 경우 항상 비워 둬요.
- account — 하이픈 없는 AWS 계정 ID를 지정해요.
- resource — 이름으로 특정 리소스를 식별해요.
IAM과 AWS STS ARN은 다음 구문으로 지정할 수 있어요. IAM 리소스는 전역(global)이기 때문에 ARN의 리전 부분은 비어 있어요.
구문:
arn:aws:iam::account:root
arn:aws:iam::account:user/user-name-with-path
arn:aws:iam::account:group/group-name-with-path
arn:aws:iam::account:role/role-name-with-path
arn:aws:iam::account:policy/policy-name-with-path
arn:aws:iam::account:instance-profile/instance-profile-name-with-path
arn:aws:sts::account:federated-user/user-name
arn:aws:sts::account:assumed-role/role-name/role-session-name
arn:aws:sts::account:self
arn:aws:iam::account:mfa/virtual-device-name-with-path
arn:aws:iam::account:u2f/u2f-token-id
arn:aws:iam::account:server-certificate/certificate-name-with-path
arn:aws:iam::account:saml-provider/provider-name
arn:aws:iam::account:oidc-provider/provider-name
arn:aws:iam::aws:contextProvider/context-provider-name
아래 예시 중 상당수는 ARN의 리소스 부분에 경로를 포함하고 있어요. 경로는 AWS Management Console에서 만들거나 수정할 수 없어요. 경로를 쓰려면 AWS API, AWS CLI, Tools for Windows PowerShell로 리소스를 다뤄야 해요.
예시:
arn:aws:iam::123456789012:root
arn:aws:iam::123456789012:user/John
arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Jane
arn:aws:iam::123456789012:group/Developers
arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_A/Developers
arn:aws:iam::123456789012:role/S3Access
arn:aws:iam::123456789012:role/application_abc/component_xyz/RDSAccess
arn:aws:iam::123456789012:role/aws-service-role/access-analyzer.amazonaws.com/AWSServiceRoleForAccessAnalyzer
arn:aws:iam::123456789012:role/service-role/QuickSightAction
arn:aws:iam::123456789012:policy/UsersManageOwnCredentials
arn:aws:iam::123456789012:policy/division_abc/subdivision_xyz/UsersManageOwnCredentials
arn:aws:iam::123456789012:instance-profile/Webserver
arn:aws:sts::123456789012:federated-user/John
arn:aws:sts::123456789012:assumed-role/Accounting-Role/Jane
arn:aws:sts::123456789012:self
arn:aws:iam::123456789012:mfa/JaneMFA
arn:aws:iam::123456789012:u2f/user/John/default (U2F security key)
arn:aws:iam::123456789012:server-certificate/ProdServerCert
arn:aws:iam::123456789012:server-certificate/division_abc/subdivision_xyz/ProdServerCert
arn:aws:iam::123456789012:saml-provider/ADFSProvider
arn:aws:iam::123456789012:oidc-provider/GoogleProvider
arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/a1b2c3d4567890abcdefEXAMPLE11111
arn:aws:iam::123456789012:oidc-provider/server.example.org
arn:aws:iam::aws:contextProvider/IdentityCenter
다음 예시는 다양한 IAM·AWS STS 리소스 타입의 ARN 형식을 이해하는 데 도움을 주는 상세 예시예요.
-
계정의 IAM 사용자:
arn:aws:iam::123456789012:user/JohnNote — 각 IAM 사용자 이름은 고유해요. 사용자 이름은 로그인 과정처럼 사용자를 다룰 때는 대소문자를 구분하지 않지만, 정책이나 ARN의 일부로 쓸 때는 대소문자를 구분해요.
-
조직도를 반영한 경로를 가진 다른 사용자:
arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Jane -
IAM 사용자 그룹:
arn:aws:iam::123456789012:group/Developers -
경로가 있는 IAM 사용자 그룹:
arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_A/Developers -
IAM 역할:
arn:aws:iam::123456789012:role/S3Access -
서비스 연결 역할:
arn:aws:iam::123456789012:role/aws-service-role/access-analyzer.amazonaws.com/AWSServiceRoleForAccessAnalyzer -
서비스 역할:
arn:aws:iam::123456789012:role/service-role/QuickSightAction -
관리형 정책:
arn:aws:iam::123456789012:policy/ManageCredentialsPermissions -
Amazon EC2 인스턴스에 연결할 수 있는 인스턴스 프로필:
arn:aws:iam::123456789012:instance-profile/Webserver -
IAM에서 "Paulo"로 식별되는 AWS STS 페더레이션 사용자:
arn:aws:sts::123456789012:federated-user/Paulo -
"Accounting-Role" 역할을 "Mary"라는 역할 세션 이름으로 수임한 사람의 활성 세션:
arn:aws:sts::123456789012:assumed-role/Accounting-Role/Mary -
호출 세션에 대해 동작하는 API 호출(예: AWS STS SetContext API)에서 리소스로 사용될 때 호출자 자신의 세션:
arn:aws:sts::123456789012:self -
Jorge라는 사용자에게 할당된 다요소 인증 디바이스:
arn:aws:iam::123456789012:mfa/Jorge -
서버 인증서:
arn:aws:iam::123456789012:server-certificate/ProdServerCert -
조직도를 반영한 경로가 있는 서버 인증서:
arn:aws:iam::123456789012:server-certificate/division_abc/subdivision_xyz/ProdServerCert -
ID 공급자(SAML·OIDC):
arn:aws:iam::123456789012:saml-provider/ADFSProvider arn:aws:iam::123456789012:oidc-provider/GoogleProvider arn:aws:iam::123456789012:oidc-provider/server.example.org -
Amazon EKS OIDC ID 공급자 URL을 반영한 경로가 있는 OIDC ID 공급자:
arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/a1b2c3d4567890abcdefEXAMPLE11111 -
AWS IAM Identity Center 신뢰할 수 있는 ID 전파에서 사용되며 신뢰된 컨텍스트 어설션을 생성한 컨텍스트 공급자 ARN:
arn:aws:iam::aws:contextProvider/IdentityCenter
또 하나 중요한 ARN은 루트 사용자 ARN이에요. IAM 리소스는 아니지만 루트 사용자 ARN의 형식은 알아 두는 게 좋아요. 리소스 기반 정책의 Principal 요소에서 자주 쓰이거든요.
AWS 계정은 다음을 표시해요.
arn:aws:iam::123456789012:root
다음 예시는 Richard에게 자신의 액세스 키를 관리하도록 부여할 수 있는 정책이에요. 리소스가 IAM 사용자 Richard라는 점에 주목하세요.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "ManageRichardAccessKeys",
"Effect": "Allow",
"Action": [
"iam:*AccessKey*",
"iam:GetUser"
],
"Resource": "arn:aws:iam::*:user/division_abc/subdivision_xyz/Richard"
},
{
"Sid": "ListForConsole",
"Effect": "Allow",
"Action": "iam:ListUsers",
"Resource": "*"
}
]
}
Note — IAM 정책에서 ARN으로 리소스를 식별할 때 정책 변수를 포함할 수 있어요. 정책 변수는 ARN의 일부로 사용자 이름 같은 런타임 정보의 자리 표시자를 포함할 수 있어요. 자세한 내용은 IAM 정책 요소: 변수와 태그를 참고하세요.
ARN에서 와일드카드와 경로 사용
ARN의 리소스 부분에 와일드카드를 써서 여러 사용자, IAM 그룹, 정책을 지정할 수 있어요. 예를 들어 product_1234에서 일하는 모든 사용자를 지정하려면 아래를 써요.
arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/product_1234/*
이름이 app_로 시작하는 사용자들이 있다면 아래 ARN으로 전부 가리킬 수 있어요.
arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/product_1234/app_*
AWS 계정의 모든 사용자, IAM 그룹, 정책을 지정하려면 ARN의 user/, group/, policy/ 부분 뒤에 각각 와일드카드를 써요.
arn:aws:iam::123456789012:user/*
arn:aws:iam::123456789012:group/*
arn:aws:iam::123456789012:policy/*
사용자 ARN으로 arn:aws:iam::111122223333:user/*을 지정하면 아래 두 예시를 모두 매칭해요.
arn:aws:iam::111122223333:user/John
arn:aws:iam::111122223333:user/division_abc/subdivision_xyz/JaneDoe
하지만 사용자 ARN으로 arn:aws:iam::111122223333:user/division_abc*을 지정하면 아래 두 번째 예시는 매칭하지만 첫 번째는 매칭하지 않아요.
arn:aws:iam::111122223333:user/John
arn:aws:iam::111122223333:user/division_abc/subdivision_xyz/Jane
ARN의 user/, group/, policy/ 부분에는 와일드카드를 쓰지 마세요. 예를 들어 IAM은 아래를 허용하지 않아요.
arn:aws:iam::123456789012:u*
Note — ID 기반 정책에서 표준 6개 필드보다 적은 불완전한 ARN을 지정하면, AWS가 누락된 모든 필드에 와일드카드 문자(
*)를 추가해 ARN을 자동으로 완성해요. 예를 들어arn:aws:sqs를 지정하면arn:aws:sqs:*:*:*와 같아져서 모든 리전·계정의 모든 Amazon SQS 리소스에 접근 권한을 부여해요. 다만 AWS STSAssumeRole,AssumeRoleWithWebIdentity,AssumeRoleWithSAML요청에 전달하는 세션 정책은 불완전한 ARN을 지원하지 않아요. 세션 정책에서 불완전한 ARN을 쓰면MalformedPolicyDocumentException오류가 발생해요.
프로젝트 기반 사용자 그룹에서 경로와 ARN 사용 예시
경로는 AWS Management Console에서 만들거나 수정할 수 없어요. 경로를 쓰려면 AWS API, AWS CLI, Tools for Windows PowerShell로 리소스를 다뤄야 해요.
이 예시에서 Marketing_Admin 사용자 그룹의 Jules는 /marketing/ 경로 안에 프로젝트 기반 사용자 그룹을 만들어요. Jules는 회사 여러 부서의 사용자를 그 그룹에 배정해요. 이 예시는 사용자의 경로가 사용자가 속한 그룹과 관련이 없다는 것을 보여 줘요.
마케팅 그룹에 출시할 신제품이 있다고 해볼게요. 그래서 Jules는 /marketing/ 경로에 Widget_Launch라는 새 사용자 그룹을 만들어요. 그런 다음 그 그룹에 아래 정책을 배정해요. 이 정책은 example_bucket에서 이번 출시를 위해 지정된 부분의 객체에 접근 권한을 부여해요.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::example_bucket/marketing/newproductlaunch/widget/*"
},
{
"Effect": "Allow",
"Action": "s3:ListBucket*",
"Resource": "arn:aws:s3:::example_bucket",
"Condition": {"StringLike": {"s3:prefix": "marketing/newproductlaunch/widget/*"}}
}
]
}
그 다음 Jules는 이 출시에 참여하는 사용자를 그룹에 배정해요. /marketing/ 경로의 Patricia와 Eli, /sales/ 경로의 Chris와 Chloe, /legal/ 경로의 Alice와 Jim이 포함돼요.
고유 식별자
IAM이 사용자, 사용자 그룹, 역할, 정책, 인스턴스 프로필, 서버 인증서를 만들 때 각 리소스에 고유 ID를 부여해요. 고유 ID는 다음과 같아요.
AIDAJQABLZS4A3QDU576Q
대부분의 경우 IAM 리소스를 다루면서 친근한 이름과 ARN을 사용해요. 그래서 특정 리소스의 고유 ID를 알 필요가 없어요. 하지만 친근한 이름을 쓰기 어려운 상황에서는 고유 ID가 유용할 때가 있어요.
한 가지 예시는 AWS 계정에서 친근한 이름을 재사용하는 경우예요. 계정 안에서 사용자, 사용자 그룹, 역할, 정책의 친근한 이름은 고유해야 해요. 예를 들어 John이라는 IAM 사용자를 만들었다고 해볼게요. 회사는 Amazon S3를 쓰면서 직원마다 폴더가 있는 버킷을 갖고 있어요. IAM 사용자 John은 User-S3-Access라는 IAM 사용자 그룹의 멤버인데, 이 그룹은 사용자가 버킷의 자기 폴더만 접근할 수 있게 하는 권한을 가져요. IAM 사용자가 친근한 이름으로 S3에서 자기 홈 디렉터리에 접근하도록 ID 기반 정책을 만드는 방법은 "Amazon S3: IAM 사용자가 S3 홈 디렉터리에 프로그래밍 방식·콘솔로 접근 허용" 예시를 참고하세요.
John이라는 직원이 퇴사해서 IAM 사용자 John을 삭제했다고 해볼게요. 그런데 나중에 같은 이름의 새 직원 John이 입사해서 새 IAM 사용자 John을 만들었어요. 새 IAM 사용자 John을 기존 User-S3-Access IAM 사용자 그룹에 추가했어요. 그 그룹에 연결된 정책이 친근한 IAM 사용자 이름 John을 지정하고 있다면, 그 정책은 새 John이 이전 John이 남긴 정보에 접근할 수 있게 해 줘요.
일반적으로는 정책에서 리소스의 고유 ID 대신 ARN을 지정하는 걸 권장해요. 하지만 모든 IAM 사용자는 고유 ID를 가져요. 이전에 삭제한 친근한 이름을 재사용해 새 IAM 사용자를 만들어도 그렇지요. 예시에서 이전 IAM 사용자 John과 새 IAM 사용자 John은 서로 다른 고유 ID를 가져요. 사용자 이름만이 아니라 고유 ID로 접근을 허용하는 리소스 기반 정책을 만들 수 있어요. 그러면 직원이 접근해서는 안 되는 정보에 실수로 접근 권한을 부여할 가능성을 줄일 수 있어요.
다음 예시는 리소스 기반 정책의 Principal 요소에 고유 ID를 지정하는 방법을 보여 줘요.
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:role/role-name",
"AIDACKCEVSQ6C2EXAMPLE",
"AROADBQP57FF2AEXAMPLE"
]
}
다음 예시는 전역 조건 키 aws:userid를 써서 정책의 Condition 요소에 고유 ID를 지정하는 방법을 보여 줘요.
"Condition": {
"StringLike": {
"aws:userId": [
"AIDACKCEVSQ6C2EXAMPLE",
"AROADBQP57FF2AEXAMPLE:role-session-name",
"AROA1234567890EXAMPLE:*",
"111122223333"
]
}
}
고유 ID가 유용한 또 다른 예시는 IAM 사용자나 역할 정보의 자체 데이터베이스(또는 다른 저장소)를 운영하는 경우예요. 고유 ID는 만드는 각 IAM 사용자나 역할의 고유 식별자가 될 수 있어요. 앞선 예시처럼 이름을 재사용하는 IAM 사용자나 역할이 있을 때 그런 경우죠.
고유 ID 접두사 이해하기
IAM은 아래 접두사로 각 고유 ID가 어떤 타입의 리소스에 적용되는지 나타내요. 접두사는 생성 시점에 따라 달라질 수 있어요.
| 접두사 | 리소스 타입 |
|---|---|
| ABIA | AWS STS 서비스 베어러 토큰 |
| ACCA | 컨텍스트별 자격 증명 |
| AGPA | 사용자 그룹 |
| AIDA | IAM 사용자 |
| AIPA | Amazon EC2 인스턴스 프로필 |
| AKIA | 액세스 키 |
| ANPA | 관리형 정책 |
| ANVA | 관리형 정책의 버전 |
| APKA | 공개 키 |
| AROA | 역할 |
| ASCA | 인증서 |
| ASIA | 임시(AWS STS) 액세스 키 ID가 이 접두사를 사용하지만, 시크릿 액세스 키와 세션 토큰을 합쳐야만 고유해요. |
고유 식별자 가져오기
IAM 리소스의 고유 ID는 IAM 콘솔에서 볼 수 없어요. 고유 ID를 얻으려면 다음 AWS CLI 명령이나 IAM API 호출을 사용할 수 있어요.
AWS CLI:
get-caller-identityget-groupget-roleget-userget-policyget-instance-profileget-server-certificate
IAM API:
GetCallerIdentityGetGroupGetRoleGetUserGetPolicyGetInstanceProfileGetServerCertificate