AWS IAM ACL 인증 메서드
AWS IAM ACL 인증 메서드
AWS Identity and Access Management (IAM) 인증 메서드 유형은 AWS IAM Roles와 Users가 Consul에 인증하여 Consul 토큰을 얻는 데 사용될 수 있게 해줘요. AWS IAM과 주요 auth method documentation에 대한 일반 지식을 가정해요.
출처: 문서
본문
AWS Identity and Access Management (IAM) 인증 메서드 유형은 AWS IAM Roles와 Users가 Consul에 인증하여 Consul 토큰을 얻는 데 사용될 수 있게 해줍니다.
이 페이지는 AWS IAM과 주요 auth method documentation에 설명된 개념에 대한 일반적인 지식을 가정합니다.
개요 (Overview)
Consul용 AWS IAM 인증 메서드는 Vault용 IAM 인증 메서드가 사용하는 접근 방식의 변형을 사용합니다. 특히 Consul용 IAM 인증 메서드는 클라이언트가 사전 서명된 AWS API 요청을 제공하도록 요구함으로써 Consul 서버에 AWS 자격 증명을 구성할 필요를 피합니다.
IAM 역할 또는 사용자는 특정 JSON 형식의 특정 서명된 AWS API 요청을 제시하여 인증합니다. 클라이언트는 AWS Signature v4 알고리즘을 사용해 자체 AWS 자격 증명으로 필요한 AWS API 요청에 서명합니다. 인증 메서드가 서명된 AWS API 요청을 받으면 이를 AWS로 전달합니다. AWS는 클라이언트의 서명을 검증하고, 서명이 유효하면 클라이언트의 ID 세부 정보로 응답합니다. sts:GetCallerIdentity 요청에 대해 AWS가 수행하는 서명 검증은 인증 메서드에 클라이언트 ID의 강력한 보증을 제공합니다. 인증 메서드는 클라이언트의 Amazon Resource Name(ARN)과 BoundIAMPrincipalARNs 목록을 비교하여 클라이언트가 로그인할 수 있는지 결정합니다.
구성 매개변수 (Config Parameters)
다음은 aws-iam 유형의 인증 메서드에 대한 auth method Config 매개변수입니다.
BoundIAMPrincipalARNs(array<string>: <required>)- 로그인이 허용된 IAM 역할 또는 IAM 사용자 ARN 목록. Consul에 인증하는 클라이언트는 이 목록의 ARN 중 하나와 일치하는 ARN을 가져야 합니다.EnableIAMEntityDetails=false이면 바인드 ARN은 역할 또는 사용자의 전체 경로를 포함해서는 안 되며 와일드카드는 지원되지 않습니다. 예를 들어arn:aws:iam::123456789012:user/MyUserName은 "MyUserName"이라는 IAM 사용자가 로그인하는 것을 허용하고,arn:aws:iam::123456789012:role/MyRoleName은 "MyRoleName"이라는 IAM 역할이 로그인하는 것을 허용합니다.EnableIAMEntityDetails=true이면arn:aws:iam::123456789012:role/path/to/MyRoleName처럼 전체 경로를 가진 바인드 ARN을 사용해야 합니다. 또한 ARN은 단일 후행 와일드카드를 포함할 수 있습니다. 예를 들어arn:aws:iam::123456789012:*는 계정123456789012의 모든 역할 또는 사용자가 로그인하는 것을 허용하고,arn:aws:iam::123456789012:role/path/to/roles/*는 경로/path/to/roles/의 역할만 허용합니다.
EnableIAMEntityDetails(bool: <false>)- 이는 인증 메서드가 태그와 전체 역할 또는 사용자 경로를 포함한 IAM 역할 또는 IAM 사용자 세부 정보를 가져올 수 있게 합니다. 활성화하면 클라이언트는consul login에-aws-include-entity옵션을 전달해야 합니다. 또한 로그인을 시도하는 IAM 역할 또는 사용자는 자신을 검색하기 위해 각각iam:GetRole또는iam:GetUser권한이 있어야 합니다. 이 설정은 IAM 사용자 또는 역할의 전체 경로와 태그를 가져오고BoundIAMPrincipalARNs에서 와일드카드를 사용하기 위해 필요합니다.IAMEntityTags(array<string>: [])- IAM 역할 또는 사용자에서 검색되어 바인딩 규칙에 사용할 수 있는 태그 키 목록. 태그는EnableIAMEntityDetails=true일 때만 지원됩니다. 기본적으로 바인딩 규칙에 태그가 제공되지 않습니다.IAMEntityTags목록의 각 태그는 바인딩 규칙에서entity_tags.<tag>를 사용해 참조할 수 있습니다. 예를 들어IAMEntityTags에service-name이 포함되고service-name태그가 IAM 역할 또는 사용자에 존재하면 바인딩 규칙에서entity_tags.service-name으로 태그 값을 참조할 수 있습니다. 태그가 IAM 역할 또는 사용자에 없으면 바인딩 규칙에서entity_tags.service-name은 빈 문자열로 평가됩니다.ServerIDHeaderValue(string: "")- 로그인 요청의X-Consul-IAM-ServerID헤더에 요구할 값. 설정되면 클라이언트는 인증 메서드에 로그인하는 데 사용되는 AWS API 요청에X-Consul-IAM-ServerID헤더를 포함해야 하며, 성공적으로 로그인하려면 클라이언트가 제공한 헤더 값이 이 설정과 일치해야 합니다. 설정하지 않으면 헤더가 요구되거나 검증되지 않습니다. 이는 다양한 유형의 재생 공격으로부터 보호하는 데 사용할 수 있습니다. 예를 들어 dev 서버로 보낸 서명된 요청이 프로덕션 서버로 다시 전송되는 경우입니다. 이를 Consul 서버의 DNS 이름으로 설정하는 것을 고려하세요. 설정되면 클라이언트는consul login명령에-aws-server-id-header-value옵션을 전달해야 합니다.MaxRetries(integer: 0)- AWS API 요청을 할 때 복구 가능한 오류에 사용할 최대 재시도 횟수.IAMEndpoint(string: "")-iam:GetRole과iam:GetUser요청이 전송되는 URL. 사설 엔드포인트나 네트워크 프록시를 통해 요청을 보내는 데 사용할 수 있습니다.STSEndpoint(string: "")-sts:GetCallerIdentity요청이 전송되는 URL. 사설 엔드포인트나 네트워크 프록시를 통해 요청을 보내는 데 사용할 수 있습니다.AllowedSTSHeaderValues(array<string>: [])-sts:GetCallerIdentity요청에 허용되는 추가 헤더 목록. 어떤 경우든 AWS STS가 기대하는 기본 헤더 목록은 허용됩니다.
샘플 (Sample)
{
"Name": "example-iam-auth",
"Type": "aws-iam",
"Description": "Example AWS IAM auth method",
"Config": {
"BoundIAMPrincipalARNs": ["arn:aws:iam::123456789012:role/MyRoleName"],
"EnableIAMEntityDetails": true,
"IAMEntityTags": ["consul-namespace"],
"ServerIDHeaderValue": "my.consul.server.example.com",
"MaxRetries": 3,
"IAMEndpoint": "https://iam.amazonaws.com/",
"STSEndpoint": "https://sts.us-east-1.amazonaws.com/",
"AllowedSTSHeaderValues": ["X-Extra-Header"]
}
}
신뢰된 ID 속성 (Trusted Identity Attributes)
인증 단계는 바인딩 규칙 선택자와 바인드 이름 보간에 사용할 다음 신뢰된 ID 속성을 반환합니다. 이 모든 속성은 보간할 수 있는 문자열이며 다음 선택자 연산을 지원합니다: Equal, Not Equal, In, Not In, Matches, Not Matches
| 속성 | 설명 | 요구 사항 |
| entity_name | IAM 역할 또는 사용자의 이름 | |
| entity_id | IAM 역할 또는 사용자의 고유 ID | |
| account_id | IAM 역할 또는 사용자의 AWS 계정 ID | |
| entity_path | IAM 역할 또는 사용자의 경로 | EnableIAMEntityDetails=true |
| entity_tags.<key> | IAM 역할 또는 사용자의 태그 값 | EnableIAMEntityDetails=true 및 IAMEntityTags가 <key>를 포함 |
IAM 정책 (IAM Policies)
EnableIAMEntityDetails=false일 때는 특정 IAM 정책이 필요하지 않습니다.
EnableIAMEntityDetails=true일 때 인증하는 클라이언트는 서명된 iam:GetRole 또는 iam:GetUser 요청을 제공해야 합니다. 이 요청은 클라이언트의 AWS 자격 증명으로 서명되므로, 클라이언트는 각각 역할 또는 사용자를 가져올 권한이 있어야 합니다.
- 인증하는 클라이언트가 IAM 역할이면 클라이언트는 자신의 역할을 가져오기 위해
iam:GetRole권한이 있어야 합니다. 다음은 이 권한을 부여하는 AWS IAM Policy 문서의 예시입니다.{ "Statement": [ { "Action": ["iam:GetRole"], "Effect": "Allow", "Resource": ["arn:aws:iam::123456789012:role/MyRoleName"] } ], "Version": "2012-10-17" } - 인증하는 클라이언트가 IAM 사용자이면 클라이언트는 자신의 역할을 가져오기 위해
iam:GetUser권한이 있어야 합니다. 다음은 이 권한을 부여하는 AWS IAM Policy 문서의 예시입니다.{ "Statement": [ { "Action": ["iam:GetUser"], "Effect": "Allow", "Resource": ["arn:aws:iam::123456789012:user/MyUserName"] } ], "Version": "2012-10-17" }
인증 절차 (Authentication Procedure)
EnableIAMEntityDetails=false이면 클라이언트는 다음 consul login 명령으로 로그인해야 합니다.
$ consul login -type aws-iam -aws-auto-bearer-token ...
sts:GetCallerIdentity요청을 형식화하고 서명- 요청 세부 정보를 JSON으로 형식화하여 bearer 토큰 생성
- bearer 토큰을 IAM 인증 메서드에 보내 인증
그렇지 않고 EnableIAMEntityDetails=true이면 클라이언트는 bearer 토큰에 서명된 iam:GetRole 또는 iam:GetUser 요청을 포함하기 위해 다음 consul login 명령으로 로그인해야 합니다.
$ consul login -type aws-iam -aws-auto-bearer-token -aws-include-entity ...
이 명령은 다음을 수행합니다.
- 자신의 역할 또는 사용자 이름을 결정하기 위해
sts:GetCallerIdentity요청 수행 - 새
sts:GetCallerIdentity요청 형식화 sts:GetCallerIdentity요청의 헤더에 서명된iam:GetRole또는iam:GetUser요청 삽입sts:GetCallerIdentity요청 서명- 요청 세부 정보를 JSON으로 형식화하여 bearer 토큰 생성
- bearer 토큰을 IAM 인증 메서드에 보내 인증
Consul 서버에서 IAM 인증 메서드는 Login to Auth Method API 요청 중에 다음 단계를 사용해 클라이언트의 ID를 검증합니다.
- bearer 토큰에서
sts:GetCallerIdentity요청 디코딩 - 선택적으로 인증 메서드 구성에서
EnableIAMEntityDetails=true이면 bearer 토큰에서iam:GetRole또는iam:GetUser요청 디코딩 sts:GetCallerIdentity요청을 AWS로 전송. 이 요청은 클라이언트가 사전 서명하므로 이 요청을 만드는 데 다른 자격 증명이나 권한이 필요하지 않습니다. AWS는 요청을 받으면 클라이언트의 서명을 검증합니다. 서명이 유효하면 AWS는 응답에서 클라이언트의 ID를 반환합니다. 이것은 클라이언트 ID의 강력한 보증입니다.- 선택적으로 인증 메서드 구성에서
EnableIAMEntityDetails=true이면 인증 메서드가iam:GetRole또는iam:GetUser요청을 AWS로 전송. 이 요청은 클라이언트가 사전 서명하므로 요청을 만드는 데 다른 자격 증명이나 권한이 필요하지 않습니다. 오직 클라이언트만iam:GetRole또는iam:GetUser권한이 필요합니다. AWS는 요청을 받으면 클라이언트의 서명을 검증합니다. 서명이 유효하면 AWS는 IAM 역할 또는 사용자 세부 정보를 반환합니다. 이 응답은 클라이언트 ID의 보증이 아닙니다. 요청에 어떤 역할 또는 사용자 이름이든 포함될 수 있기 때문입니다. 따라서 인증 메서드는 IAM 역할 또는 사용자가sts:GetCallerIdentity응답과 일치하는 고유 ID를 갖도록 요구합니다. - 마지막으로 인증 메서드가 인증 결정을 내립니다. 클라이언트의 IAM 역할 또는 사용자 ARN이 구성된
BoundIAMPrincipalARNs중 하나와 일치하면 클라이언트는 로그인이 허용됩니다.