# IAM 태그(TAG)기반 관리

## ABAC (Attribute-based access control)

ABAC(Attribute-based access control 속성 기반 액세스 제어)는 속성을 기반으로 권한을 정의하는 권한 부여 전략입니다. AWS에서는 이러한 속성을 태그라고 합니다. IAM 보안 주체 (사용자 또는 역할) 및 AWS 리소스에 태그를 연결할 수 있습니다. 그런 다음 태그 조건 키를 사용하여 해당 태그를 기반으로 보안 주체에 권한을 부여하는 정책을 정의할 수 있습니다. 태그를 사용하여 AWS 리소스에 대한 액세스를 제어하면 AWS 정책에 대한 변경 사항이 줄어들면서 관리의 편의성과 보안강화를 함께 가져올 수 있습니다. ABAC 정책은 각 개별 리소스를 나열해야 하는 기존 AWS 정책보다 매우 유연합니다.

## 태그(Tag)기반 액세스 권한 정의

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MKXfd1OlZxKt_-Kjf5a%2F-MKZDXFcQkU05uQub86J%2Fimage.png?alt=media\&token=79040084-78c8-4bc1-a173-8883681bfe4d)

### 1.EC2 인스턴스 생성

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_BC7NofI9sNnfKcKr%2F-MK_Exn73y8x2kffpJxu%2Fimage.png?alt=media\&token=362025c0-7565-4a19-9281-b39c791241f1)

4개의 EC2 인스턴스를 현재 계정에서 생성합니다.&#x20;

"AWS 관리 콘솔 - EC2" 메뉴에서 아래와 같이 4개의 EC2 인스턴스를 생성합니다.

{% hint style="info" %}
EC2 인스턴스의 생성방법은 <https://awskocaptain.gitbook.io/imd-general/ec2/ec2-linux> 를 참조합니다.
{% endhint %}

아래와 같은 Tag:Name과 Value를 갖는 4개의 인스턴스를 구성하며 , 추가적으로 Tag를 생성합니다.

* dev1-crm-01
* dev1-crm-02
* dev2-msa-01
* dev2-msa-02

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MKZHqE8WH41K0z6pJy_%2F-MKZoQO-lz7gvDDnoQFX%2Fimage.png?alt=media\&token=84e51162-7e55-49e5-903b-f3919476d178)

아래와 같이 만들어진 EC2 인스턴스의 추가적인 Tag를 구성합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MKZHqE8WH41K0z6pJy_%2F-MKZoiNZJjUnKtq2sKqo%2Fimage.png?alt=media\&token=20d9c6ed-ab72-4e72-ae25-477b2a4bad14)

EC2 인스턴스 Tag Key와 Value

| EC2 Instance   | Tag Key | Tag Value      |
| -------------- | ------- | -------------- |
| dev1-crm-01,02 | name    | dev1-crm-01,02 |
|                | team    | dev1           |
|                | project | crm            |
| dev2-msa-01,02 | name    | dev2-msa-01,02 |
|                | team    | dev2           |
|                | project | msa            |

### 2. 위임 정책 구성

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_BC7NofI9sNnfKcKr%2F-MK_FE4ZQxqVt_yKzZxB%2Fimage.png?alt=media\&token=8e23b20f-4975-4805-bd47-0464fd6e4a2a)

각 그룹 또는 사용자에게  위임 역할을 구성합니다. dev1,dev2 2개의 위임정책을 구성하며, 이 때 사용되는 Resource의  ARN은 다음과 같습니다.

```
arn:aws:iam::ACCOUNT-ID:role/ROLE-NAME
```

"AWS 관리 콘솔 - IAM - 정책 - 정책생성"을 선택하여, 각 목적에 맞는 위임정책을 생성합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MKZHqE8WH41K0z6pJy_%2F-MKZqa5_ByT0alh5Fsy2%2Fimage.png?alt=media\&token=a7876bc0-4cc0-4f6f-a4fb-bd5a739b431e)

dev1-sts-assume 정책을 아래와 같이 JSON 파일로 직접 생성합니다.&#x20;

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_-zf1iYuRONEWqIiA%2Fimage.png?alt=media\&token=d2c106f0-71d8-4391-871d-d95f79569d67)

아래 코드를 복사해서 JSON 코드에 입력합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::841260513405:role/dev1-role",
            "Condition": {
                "StringEquals": {
                    "iam:ResourceTag/team": "dev1"
                }
            }
        }
    ]
}
```

위임정책의 이름은 "dev1-sts-assume" 이라고 정의합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_0AfAQ6ZTA1wf19f0%2Fimage.png?alt=media\&token=1da2e099-4cae-4ea2-afb9-03c24a688b95)

앞서 생성한 위임정책과 동일하게 , dev2 그룹을 위한 dev2-sts-assume 정책을 아래 JSON 코드를 복사해서 생성합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::841260513405:role/dev2-role",
            "Condition": {
                "StringEquals": {
                    "iam:ResourceTag/team": "dev2"
                }
            }
        }
    ]
}
```

모두 생성이 완료되면 위임정책을 확인합니다.&#x20;

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_0soqpgR_DDhwRvS-%2Fimage.png?alt=media\&token=caa8d6f7-916f-4781-be24-e2e748061904)

### 3. 역할(Role)을 위한 정책 구성

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_BC7NofI9sNnfKcKr%2F-MK_FVcKJrBnePMofzYN%2Fimage.png?alt=media\&token=dbcd1972-2d89-4078-8129-f05b2040d66c)

EC2에 접근하기 위한 역할(Role)에 대한 정책을 구성합니다. 미리 생성된 4개의 인스턴스는 이미 2개의 그룹으로 나뉘어져 있습니다. 1개는 Dev1 그룹 개발자들이 인스턴스에 접속할 수 있도록 정책을 구성하고, 1개는 Dev2 그룹 개발자들이 인스턴스에 접속할 수 있도록 정책을 구성합니다.

아래 JSON Code는 Dev1 그룹이 위임정책을 통해 Role에 접근할 때 , 연결될 정책입니다.  EC2 인스턴스의 "tag key -team, value - dev1", "tag key - project, value - crm" 태그가 있는 경우 접속을 허용합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/team": "dev1",
                    "ec2:ResourceTag/project": "crm"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:Describe*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": "*"
        }
    ]
}
```

JSON 편집기를 통해 위의 코드를 복사해서 붙여넣습니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_1-I80eI8tfO9O99A%2Fimage.png?alt=media\&token=5558f09a-1804-439b-8cb9-7bf6259512e1)

정책의 이름을 "dev1-role-policy"라고 정의합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_1A4DToSFBK-zBSc0%2Fimage.png?alt=media\&token=4f5f49d5-79be-4d2f-91bc-9a0b8093c7b3)

아래 JSON Code는 Dev2 그룹이 위임정책을 통해 Role에 접근할 때 , 연결될 정책입니다.  EC2 인스턴스의 "tag key -team, value - dev2", "tag key - project, value - msa" 태그가 있는 경우 접속을 허용합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/team": "dev2",
                    "ec2:ResourceTag/project": "msa"
                    
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:Describe*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": "*"
        }
    ]
}
```

2개의 정책생성이 완료되면, 아래와 같이 모든 정책이 구성완료 됩니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_1SOOmRwprFXvGaSx%2Fimage.png?alt=media\&token=8649e146-88dd-4429-a5b7-e68864ca6d75)

### 4. 역할 만들기

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_BC7NofI9sNnfKcKr%2F-MK_Fi_fBz6H3GojHoAW%2Fimage.png?alt=media\&token=4b78c82a-4a3e-46b4-a0f3-26b4d58f11b2)

&#x20;이제 역할을 정의합니다.&#x20;

**"AWS 관리 콘솔 - IAM - 역할 - 역할 만들기" 를 선택합니다.**

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_1YmaKS8tkdz8QL2q%2Fimage.png?alt=media\&token=586a292a-7eab-4492-9854-ad77d6d28b83)

다른 AWS 계정을 선택하고, 현재 계정  ID를 입력합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_-ld3xT_IbiBkN-Ip%2F-MK_1ewAhI2XIIFLRxxG%2Fimage.png?alt=media\&token=8d9b706d-ad66-4d38-87ad-63e714fc9210)

앞서 [역할을 위한 정책 구성](#3-role) 단계에서 이미 정책을 생성하였습니다. 모든 단계를 건너 뛰고, 검토 단계에서 역할 이름을 정의합니다. 역할 이름을 dev1-role, dev2-role 을 각각 생성합니다.&#x20;

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2G7q3dPGKDNfreDF%2F-MK_2Ii4x9Moo-qA9Bsl%2Fimage.png?alt=media\&token=ecc6f008-fe3a-455d-a6d9-ddc08d871414)

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_2TN9ECkX8MxKVn_-%2Fimage.png?alt=media\&token=e3bf12ad-28dc-4b96-bdc4-e337ad7d8f58)

이제 생성된 각 dev1-role, dev2-role에 정책을 연결해 줍니다.

* dev1-role : dev1-role-policy
* dev2-role : dev2-role-policy

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_2ZOei1b6OvZ-PIjE%2Fimage.png?alt=media\&token=9674247f-cc23-4173-9292-c9ff2353af30)

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_2f2-o75BtnJP-6wE%2Fimage.png?alt=media\&token=b59eaa30-73b3-4ede-9a30-1a8423144e19)

dev1-role,dev2-role에 태그를 설정합니다.

* dev1-role : tagkey-team, value-dev1 / tagkey-project, value-crm
* dev2-role : tagkey-team, value-dev2 / tagkey-project, value-msa

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_3OwfKs9GX32_EFnB%2F-MK_9dAU0owpUUk1Wp8R%2Fimage.png?alt=media\&token=6c2cd25f-f191-424c-831b-c476123394f7)

### 5. 그룹에 정책 연결

각 그룹에 [위임정책구성](#2)에서 생성한 정책을 연결해 줍니다.

* **Dev1 - dev1-sts-assume**
* **Dev2 - dev2-sts-assume**
* **Test - dev1-sts-assume**

그룹을 선택합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_2xNPQsLLPUNE0kJ2%2Fimage.png?alt=media\&token=2b68082a-33b9-4043-aa4f-de295bbefab3)

해당그룹의 **"권한-정책연결"**&#xC744; 선택합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_32FnvD8KAyt9g5EH%2Fimage.png?alt=media\&token=c9e633db-0857-4495-ba06-6efc9680cbf0)

각 그룹에 적절한 정책을 선택합니다.&#x20;

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_3D9pHHlXIxje2DYN%2Fimage.png?alt=media\&token=d37d231d-268c-44c0-a50a-9213d7cad651)

정상적으로 정책이 연결되었는지 확인합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_2L1ZFOcoMB1AQsJq%2F-MK_3Kc7oBFWAizDslSs%2Fimage.png?alt=media\&token=f8f995fe-7fc0-4b27-b93c-f73ed7fdd1a0)

### 6. 태그기반의 정책 확인

사용자 "hawkeye", "hulk","thor"가 EC2 인스턴스 태그 dev1-crm을 포함하는 인스턴스에 정상적으로 접속되는지 확인합니다. 또한 EC2 인스턴스 태그 dev2-msa 에 접속되는지 확인합니다.

사용자 "ironman","blackpanther"가 EC2 인스턴스 태그 dev2-msa를 포함하는 인스턴스에 정상적으로 접속되는지 확인합니다. 또한 EC2 인스턴스 태그 dev1-crm에 접속되는지 확인합니다.

먼저 dev1 그룹의 사용자를 통해 로그인합니다. (hawkeye 또는 hulk) 사용자 메뉴에서 "역할전환"을 선택합니다.

<div align="left"><img src="https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_dVxsbK1eGO1woWto%2Fimage.png?alt=media&#x26;token=fcb8b334-044b-4a9a-ba1e-7c3d18f7ef8d" alt=""></div>

역할전환에서 현재 계정ID와 [역할만들기](#4)에서 생성한 역할 이름을 선택하고, 역할 전환을 진행합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_dhF9R1TIS66Yl4Ml%2Fimage.png?alt=media\&token=5e9626de-b18b-4c36-ba39-fab3d29dc1ac)

정상적으로 역할전환(Role Switch)가 이뤄졌습니다.

<div align="left"><img src="https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_dl3bSQtuvH7AETzk%2Fimage.png?alt=media&#x26;token=de627089-f2e2-43b8-9dd0-1bf5c3c9bd95" alt=""></div>

이제 "dev1-role"을 통해서 dev1 인스턴스들만 연결이 가능한지 확인합니다. dev1-crm-01 또는 02 인스턴스를 선택합니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_e17oFaALxvAMaQyU%2Fimage.png?alt=media\&token=79ab9076-872a-4bc1-b5fd-f714a0d98559)

연결을 선택하고 진행합니다.

{% hint style="warning" %}
알람이 보이는 이유는, 현재 역할과 연결된 정책에는 ec2의 접속 권한만 설정되어 있기 때문입니다.
{% endhint %}

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_eA21dIyAYGtjzwmQ%2Fimage.png?alt=media\&token=0a341032-d532-491f-835a-b126b776ac65)

아래와 같이 정상적으로 연결됩니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_eIcaE_AjkaSqs6TL%2Fimage.png?alt=media\&token=ca384cbc-23de-403b-bc5a-8b61d3ad85b4)

이제 dev1-role 의 역할 정책에 정의되어 있지 않은 dev2 인스턴스들을 연결해 봅니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_eW79K4xmj3SiWP7Z%2Fimage.png?alt=media\&token=20eca70e-5f75-4c9a-bd0c-e73963d11574)

dev1-role의 역할에는 접속 권한이 없으므로 접속되지 않습니다.

![](https://2617780336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKJhtKXpyXmaafkO7Me%2F-MK_NqLtM2qDLxzotZBk%2F-MK_ehO7Lx9EgXyJjorC%2Fimage.png?alt=media\&token=0e533ea4-c9bd-469e-ab00-99b71cb3dabf)

그룹 "Test"의 사용자 "hulk", 그룹 "Dev2"의 사용자 "ironman", "blackpanther"등도 시험해 봅니다.

교차계정에서의 태그(Tag)
