IAM에서 태그를 이용해서 Role Switch 해보기

이번에는 저번 IAM Role Switch와 policy에 이어서 IAM에서 태그를 이용해서 Role Switch를 해보았습니다. 추가로 AWS에서는 태그를 기반으로 권한을 정의하는 권한 부여 전략을 ABAC(Attribute-based access control)라고 합니다.
2020.05.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

이번에는 저번 IAM Role Switchpolicy에 이어서 IAM에서 태그를 이용해서 Role Switch를 해보겠습니다.

이전 글은

에서 확인할 수 있습니다.

태그란 무엇인가(Attribute(속성)이란?)

태그란

태그란 AWS에서는 Attribute(속성)라고도 부르고 있습니다. Attribute(속성)을 태그라고 생각하시면 됩니다. 그리고 태그란 쉽게 설명하면 EC2 인스턴스 등을 생성할 때 달아주는 태그입니다.

왜 태그를 이용해서 Role Switch 하는가

기존의 Role Switch는 하나의 Role(역할)에 필요한 policy(정책)를 만들어 관리했습니다.

수가 많지 않거나 중복되는 권한이 없다면 상관없이 새로운 policy(정책)를 만들어 새로운 Role(역할)을 만들면 됩니다.

하지만 만약 중복되는 권한이 있으면 어떻게 해야 할까요?

같은 policy(정책) 안에서 중복되지 않은 다른 권한을 주고 싶을 경우에는 어떻게 해야 할까요?

태그를 이용해 Role Switch를 하면 같은 policy(정책)를 연결한 서로 다른 Role(역할)에 다른 권한을 부여할 수 있습니다.

간단하게 나타내면 이런 느낌입니다.

기존의 Role Switch 입니다.

UserA UserB
Role(개발역할) Role(운영역할)
policy(개발정책) policy(운영정책)

screen

태그를 이용한 Role Switch 입니다.

UserA UserB
Role(개발역할) Role(운영역할)
policy(개발+운영 정책) policy(개발+운영 정책)

screen

추가로 AWS에서는 태그를 기반으로 권한을 정의하는 권한 부여 전략을 ABAC(Attribute-based access control)라고 합니다.

ABAC(Attribute-based access control)에 대해서 더 자세히 알고 싶으시다면 아래에 링크의 자료를 참고해주세요.^^

AWS용 ABAC란 무엇입니까?

Demo

그럼 직접 간단한 예제를 만들어 보겠습니다.

  • 목표
    • 두 개의 project를 수행하는 하나의 팀에 두 명의 User가 있습니다.
    • 두 개의 EC2 인스턴스는 각각 다른 project에 소속되어 있습니다.
    • Role(역할)을 통해 User는 해당 project의 EC2 인스턴스에 접속할 수 있습니다.

이와 같은 구성입니다.

screen

policy작성

- Demo-access-role

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::자신의Account-ID:role/Demo-*",
            "Condition": {
                "StringEquals": {
                    "iam:ResourceTag/Team": "${aws:PrincipalTag/Team}"
                }
            }
        }
    ]
}

위 정책은 Role Switch를 하기 전 자신이 만든 User나 User가 포함된 Group에 연결해주시면 됩니다.

정책의 의미입니다.

  • Principal: 연결하는 대상(User, Group등)
  • Resource: 이 Resource에 대한(arn:aws:iam::Account-ID:role/Demo-*는 Demo-로 시작하는 모든 Role(역할)을 말합니다.)
  • Action: Role에 연결된 권한을 사용할 수 있게 하는 행동
  • Effect: 허용한다.
  • Condition: Resource의 Team이라는 태그와 연결된 대상(Principal)의 Team이라는 태그가 같을 때 이 정책을 허용

위의 정책은 자습서: AWS에서 속성 기반 액세스 제어에 태그 사용를 참고하였습니다.

Account-ID는 내 계정에서 확인하실 수 있습니다.

- Demo-access-policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Project": "${aws:PrincipalTag/Project}"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:Describe*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": "*"
        }
    ]
}

정책의 의미입니다.

  • 1번째: EC2의 Project 태그와 적용된 (Role, User등)의 Project 태그가 일치할 때 EC2접속을 허용합니다.
  • 2번째: EC2 내의 모든 리소스를 확인할 수 있습니다.
  • 3번째: EC2의 태그 생성/삭제를 거부합니다.

위의 정책은 이제 만들게 된 Role(역할)에 연결해주면 됩니다.

위의 정책은 태그를 사용하여 Amazon EC2 리소스에 대한 액세스를 제어하는 IAM 정책을 생성하려면 어떻게 해야 합니까? 를 참고하였습니다.

IAM의 Policy에 대해서 더 자세히 알고 싶으신 분은 IAM의 Policy에 대해서를 참고해주세요.

User생성

이제 User를 생성해줍니다.

  • User는 2명
  • 해당 User 또는 User가 포함된 Group에 꼭 Demo-access-role 정책을 연결해 줍니다.

이규칙을 지키고 해당 User를 생성 후.

User에 태그를 연결해 줍니다.

User_1이라는 User에 태그를 달아주었습니다.

screen

다음 User에게도 태그를 달아줍니다. 저는 User_2라는 User에 마찬가지로 태그를 달아주었습니다.

Role 만들기

다음은 Role(역할)을 만들어 주겠습니다.

기본적인 방법은 Role Switch를 할때와 같습니다. IAM으로Role Switch하기

screen

Account-ID는 자신의 계정 ID 입니다. (ex) 123456789012)

screen

역할에는 처음에 만든 정책을 연결합니다. (Demo-access-policy를 연결)

screen

이제 Role(역할)의 이름을 정하겠습니다. (주의점: 처음 User에 연결한 정책을 기억하시나요? 그 정책에서 허용되는 Role(역할)은 Demo-가 붙은 역할뿐입니다.)이름은 Demo- 로 시작하면 상관없습니다.

screen

이제 태그를 지정합니다.

  • Team 태그: 처음에 User를 만들 때 지정한 Condition 때문입니다. (Resource의 Team이라는 태그와 연결된 대상(Principal)의 Team이라는 태그가 같을 때 이 정책을 허용한다. 라는 조건 때문에 Team 태그를 지정합니다.)
  • Project: 이후 확인할 EC2를 구별할 때 사용합니다.

RoleSwitch

정말 간단합니다.

만든 Role(역할)에 들어가시면 Give this link to users who라는 곳에 URL이 있습니다. 일단 카피해 둡니다. 그리고 만든 User로 로그인합니다.

screen

그럼 이런 창을 보실 수 있습니다. 바로 확인을 누르시면 됩니다.

screen

성공하였다면 이렇게 Role Switch를 하실 수 있습니다.

IAM의 Role Switch에 대해서 더 자세히 알고 싶으신 분은 제가 작성한 IAM으로 Role Switch 하기 를 참고해주세요.

확인

자 이제 제대로 태그로 구별되어 EC2를 동작시킬 수 있는지 확인해보겠습니다.

screen

그전에 먼저 EC2 두 개를 만들어줍니다. (저는 Amazon Linux 2로 만들어 주었습니다. 이유:EC2 Instance Connect (browser-based SSH connection)를 이용하기 위해서)

그리고

  • EC2_A Project 라는 태그에 projectA를 달아줍니다.
  • EC2_B Project 라는 태그에 projectB를 달아줍니다.

먼저 Role에 연결된 정책이 제대로 동작하는 지 확인해보겠습니다. (3번째 Effect Deny으로 설정대로 태그를 생성/삭제할 수 없습니다.)

screen

정책은 잘 적용된거 같습니다.

이제 접속을 해봅니다.

  • EC2_A접속

screen

  • EC2_B접속

screen

와 같은 결과를 얻을 수 있습니다. Role 의 Project 태그를 projectA로 설정하였기 때문에 Project 태그가 projectA인 EC2_A에만 접속 가능한 것을 확인할 수 있습니다.

참고자료

AWS용 ABAC란 무엇입니까?

AWS에서 속성 기반 액세스 제어에 태그 사용

EC2 Instance Connect가 속성 기반 접근 제어(ABAC)을 지원

태그를 사용하여 Amazon EC2 리소스에 대한 액세스를 제어하는 IAM 정책을 생성하려면 어떻게 해야 합니까?