AWS IAM Role


AWS IAM Role

1. IAM Role

AWS IAM(Identity and Access Management) Role은 AWS의 리소스에 접근하기 위한 역할(Role)을 관리하기 위해 필요하다. 아무나 리소스에 접근할 수 없으며 리소스에 접근 할 수 있는 역할을 가진 유저, 서비스 등만 접근이 가능하다.

일반적인 상황에서 사용하는 IAM Role의 사용은 아래와 같다.

  1. 어떤 AWS Service가 같은 계정에 있는 AWS Service에 접근하는 경우
  2. 어떤 AWS Service가 다른 계정에 있는 AWS Service에 접근하는 경우
  3. Third-party web 자격증명에서 접근이 필요한 경우
  4. SAML 2.0 연동을 위한 인증이 필요한 경우

2. Create Role

  1. Trust Relationship (Principle) 롤을 생성하게 되면 사용자는 신뢰할 수 있는 객체(Trusted Entity)를 선택해야 한다. 어떤 Trust Entity가 내 Role을 Assume 받아 사용할 수 있는지를 관리한다.

Trust Entity는 AWS Service, AWS account, WEB Identity, SAML 2.0 federation, Custom trust policy 총 5가지의 항목이 있다. 상황에 맞춰서 적절한 신뢰할 수 있는 객체를 넣어주면 된다. 선택된 항목의 리소스에 한하여 AssumeRole이 가능하다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "eks.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  1. Permission 역할을 가진 Principle이 할 수 있는 정책이 정의 되어 있다.
    {
     "Version": "2012-10-17",
     "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "autoscaling:DescribeAutoScalingGroups",
                 "autoscaling:UpdateAutoScalingGroup",
                 "ec2:AttachVolume",
                 "ec2:AuthorizeSecurityGroupIngress",
                 "ec2:CreateRoute",
                 "ec2:CreateSecurityGroup",
                 ......
             ],
             "Resource": "*"
         },
         {
             "Effect": "Allow",
             "Action": "iam:CreateServiceLinkedRole",
             "Resource": "*",
             "Condition": {
                 "StringEquals": {
                     "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
                 }
             }
         }
     ]
    }
    

이러한 조합으로 역할이 정의되고 이 역할을 가진 서비스는 Permission에 정의된 Action들을 할 수 있다.

2. Assume Role

A라는 사용자가 sts:AssumeRole 권한을 가지고 있고 만약 특정 Role이 A유저에 대한 Trust Relationship이 설정되어 있다면 A라는 사용자는 특정 Role로 역할을 변경할 수 있다. 이 때 사용하는 것이 Assume Role(Switch Role)이다. 특정 Role로 변경이 되면 해당 Role에 설정된 모든 정책에 따른 권한을 위임 받아 사용할 수 있다.

ASSUME_ROLE_CREDENTIALS=$(aws sts assume-role --role-arn arn:aws:iam::558846430793:role/test-role --role-session-name test --region ap-northeast-2)
export AWS_ACCESS_KEY_ID=$(echo $ASSUME_ROLE_CREDENTIALS | jq .Credentials.AccessKeyId | sed 's/"//g')
export AWS_SECRET_ACCESS_KEY=$(echo $ASSUME_ROLE_CREDENTIALS | jq .Credentials.SecretAccessKey | sed 's/"//g')
export AWS_SESSION_TOKEN=$(echo $ASSUME_ROLE_CREDENTIALS | jq .Credentials.SessionToken | sed 's/"//g')


3. Null Condition

키의 유무를 판단하기 위해 단독으로 사용하는 조건이다. 중요한 것은 true이면 키와 값이 없어야 하고, false이면 키와 값이 없어야 한다.

{
  "Version": "2012-10-17",
  "Statement":{
      "Action":"ec2:*",
      "Effect":"Allow",
      "Resource":"*",
      "Condition":{"Null":{"aws:TokenIssueTime":"true"}}
  }
}

Condition operator to check existence of condition keys
임시자격증명을 사용할 경우 aws:TokenIssueTime 키 값이 존재한다. true이기 때문에 키와 값이 없어야 하는데 존재하므로 해당 조건을 만족하지 못한다.

아래의 내용을 이해하기 위한 사전 지식 사항

  • AWS load balancer controller는 resource생성 시 ‘elbv2.k8s.aws/cluster: ${clusterName}’ Tagging을 한다.
  • Null조건은 조건은 키의 유/무를 판단하기 위해 사용되는 조건 이며 true와 false를 사용한다. true이면 키와 값이 없어야 하고, false이면 키와 값이 없어야 한다.
  • Null 안에 2개의 조건은 AND로 연산한다. Evaluation logic for conditions with multiple keys or values
  • aws:RequestTag/key-name는 AWS 리소스에 태그를 지정하거나 태그를 제거하는 요청에서 어떤 태그 키 값 페어를 전달할 수 있는지를 지정한다. aws:ResourceTag/key-name는 리소스에 연결된 태그를 기반으로 리소스에 대한 액세스를 허용할지 여부를 결정한다. Controlling access to AWS resources using tags
  1. 예시: AWS load balancer controller가 ELB생성 요청할 때 사용하는 정책
    {
     "Effect": "Allow",
     "Action": [
         "elasticloadbalancing:CreateLoadBalancer",
         "elasticloadbalancing:CreateTargetGroup"
     ],
     "Resource": "*",
     "Condition": {
         "Null": {
             "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
         }
     }
    }
    
    • “aws:RequestTag/elbv2.k8s.aws/cluster”: “false” 조건의 의미는 ELB 생성시 태그 등록 요청에 ‘elbv2.k8s.aws/cluster’키와 값이 존재해야 조건을 만족한다는 의미이다.
    • 이에 따라 AWS load balancer controller는 resource생성 시 ‘elbv2.k8s.aws/cluster: ${clusterName}’ Tagging을 한다고 이해하면 된다. 이 태그 생성 요청이 없으면 ELB생성 권한이 없기 때문이다.
  2. 예시: NLB, ALB, TargetGroup에 Tag를 추가 하고 삭제할 때 사용하는 정책
    {
     "Effect": "Allow",
     "Action": [
         "elasticloadbalancing:AddTags",
         "elasticloadbalancing:RemoveTags"
     ],
     "Resource": [
         "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
         "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
         "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
     ],
     "Condition": {
         "Null": {
             "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
             "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
         }
     }
    }
    
    • ‘aws:ResourceTag/elbv2.k8s.aws/cluster”: “false’의미는 자신을 통해 생성된 리소스를 구별하기 위해 리소스 태그에 ‘elbv2.k8s.aws/cluster’키와 값이 존재해야 한다는 조건을 설정한다.
    • “aws:RequestTag/elbv2.k8s.aws/cluster”: “true”의미는 이미 생성된 리소스에 태깅을 변경할 때 ‘elbv2.k8s.aws/cluster’ 태깅은 변경하면 안되기 때문에 요청 태그에 해당하는 키가 없어야 한다는 조건을 설정한다.

5. 참고

  • Federation IAM supports identity federation for delegated access to the AWS Management Console or AWS APIs, such as an Amazon S3 bucket or an Amazon DynamoDB table. With identity federation, external identities (federated users) are granted secure access to resources in your AWS account without having to create IAM users. These external identities can come from your corporate directory (for example Windows Active Directory).




Ref: https://aws.amazon.com/ko/blogs/security/how-to-use-trust-policies-with-iam-roles/

Tag: [ aws  iam  role  ]