만자의 개발일지

[AWS] IAM Custom Policy 생성하기 본문

AWS

[AWS] IAM Custom Policy 생성하기

박만자 2022. 2. 17. 15:24
예를들어 회사에서 AWS를 사용하는 경우 각각의 부서 및 직원에게 계정을 부여해야 하는 상황이다.
각각의 부서마다 사용하는 서버가 다르다고 가정했을 때 어떤 한 부서가 다른 부서의 서버를 마음대로 조작할 수 있으면 안될 것이다. 이렇게 각각의 부서 및 직원에게 자신들의 사용하는 리소스에만 접근할 수 있도록 IAM에서 Policy를 커스터마이징 할 수 있다.

 

들어가기 앞서 IAM에대한 이해가 필요하면 아래 글을 참고하길 바랍니다.

https://yoo11052.tistory.com/99

 

[AWS] IAM이란

IAM IAM(AWS Identity and Access Management)은 AWS리소스를 사용하도록 인증 및 권한 부여된 대상을 제어합니다. 예를 들어 출입이 허가된 인원들은 출입 카드를 통해 출입하거나, 리스트에 방문 기록을 하

yoo11052.tistory.com

 

IAM Custom Policy 생성하기

먼저 AWS 콘솔에 접속한 후 IAM을 검색하여 들어가줍니다.

그 다음 왼쪽 메뉴에 Policies로 들어가 줍니다.

 

그 다음 오른쪽 상단에 Create Policy를 클릭해 줍니다.

 

IAM Policy의 경우 JSON파일로 구성되어 있기 때문에 직접 커스터마이징 하기위해 Visual editor가 아닌 JSON을 선택해 줍니다.

 

IAM Policy는 크게 Version과 Statement로 나뉩니다.

Version 속성의 경우 두가지 버전이 존재합니다.

  • 2012-10-17 : 현재 사용되는 버전이며, 항상 Version을 2012-10-17로 설정해야 합니다. 설정하지 않을 경우 policy variables등의 기능을 사용할 수 없습니다.
  • 2008-10-17 : 이전 버전입니다. AWS는 이전 버전 사용을 권장하고 있지 않습니다. policy variables등의 기능을 지원하지 않고, ${aws:username} 과 같은 전역 조건 키도 변수로 인식되지 않고 문자열로 인식됩니다.

 

Statement는 Policy에서 가장 중요한 속성입니다.

Statement 속성으로 전체적인 Policy를 정의할 수 있고, 한개 또는 각각을 배열의 요소로 지정해 줄 수 있습니다.

Statement의 구성요소는 다음과 같습니다.

  • Sid : statement ID로 각각의 Statement를 구분하는 구분자 역할을 합니다.
  • Principal : 해당 Statement를 적용할 대상을 지정합니다.
  • Resource : 대상이 사용할 리소스를 지정합니다.
  • Action : 리소스에 대한 행동을 지정합니다.
  • Effect : 리소스 접근의 허용 여부를 지정합니다. 기본적으로 리소스 접근은 거부(Deny)됩니다.
  • Condition : 리소스 접근에 대해 조건을 지정합니다. (프로그래밍에서의 if문 같은 역할)

 

Policy의 구조에 대해 알았으니 이제 직접 Policy를 커스터마이징 해봅시다.

상황은 다음과 같습니다.

EC2의 Tag중 owner tag의 값이 자신의 계정명으로 되어있는 EC2만 시작/정지/삭제 만 가능해야합니다.
owner tag의 값이 자신의 계정명과 다르다면 해당 EC2에 대한 작업은 모두 불가능해야합니다.

 

IAM editor에 다음과 같은 코드를 입력해줍니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ec2DescribeAll",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ownEC2",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/owner": [
                        "${aws:username}"
                    ]
                }
            }
        }
    ]
}

 

ec2DescribeAll Statement는 IAM계정에서 다른 모든 계정의 EC2목록을 불러오기 위함입니다.

Resource를 전체("*")로 지정해 줌으로써 내 계정 뿐만아니라 다른 모든 계정의 EC2목록을 불러올 수 있습니다.

이는 Root계정에서 EC2를 생성하고 IAM계정으로 접속해 테스트하기위해 설정해 주었습니다.

 

ownEC2 Statement는 해당 Policy의 메인이 되는 Statement입니다. 

Action에서 다음과 같이 EC2에 대한 시작/정지/삭제 권한을 부여 하였습니다.

그리고 Resource의 경우 내 계정뿐만아니라 다른계정에서 생성한 EC2에도 접근은 할 수 있어야 하기에

전체("*")로 지정해 주었습니다.

Condition을 해석해보면 EC2의 Tag중 owner라는 이름을 가진 Tag의 값(aws:ResourceTag/owner)이 자신의 계정명(${aws:username})과 일치한다면(StringEqauls) 해당 Resource에 대한 Action을 허용하겠다 라는 뜻입니다.

 

EC2 Action에 관한 내용은 해당 AWS 공식문서에 자세히 나와있습니다.

https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html

 

Actions, resources, and condition keys for Amazon EC2 - Service Authorization Reference

 

docs.aws.amazon.com

 

다음으로 진행하기 앞서 AWS에는 Condition Key 라는 것이 있습니다.

  • aws:ResourceTag/owner
  • aws:username

등과 같이 Condition Key를 사용항여 AWS내 리소스 정보를 불러올 수 있습니다.

Condition Key도 Condition Key와 Global Condition Key 두가지로 나뉩니다.

일반적인 Condition Key는 aws:ResourceTag/owner와 같이 특정 리소스에서만 사용되는 Key를 뜻합니다.

반대로 Global Condition Key는 aws:username과 같이어떤 리소스에서든 사용될 수 있는 Key를 말합니다.

https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#AvailableKeys

 

AWS global condition context keys - AWS Identity and Access Management

If you use condition keys that are available only in some circumstances, you can use the IfExists versions of the condition operators. If the condition keys are missing from a request context, the policy can fail the evaluation. For example, use the follow

docs.aws.amazon.com

 

 

다 작성하셨다면 Next tags버튼을 눌러 다음으로 넘어가 줍니다.

별도의 태그는 지정해주지 않도록 하겠습니다. 

원래라면 지정해주는게 이상적이긴 합니다.

 

Name과 Description은 본인이 원하는 대로 작성한 후 Create policy 버튼을 눌러 정책을 생성해 줍니다.

 

잘 생성된 것을 볼 수 있습니다.

 

이제 Root계정에서 EC2를 생성한 후 방금 만든 Policy를 활용해 IAM User를 만들어 권한이 올바르게 부여됬는지 테스트 해보도록 하겠습니다.

 

EC2 생성

Root 계정으로 접속 후 콘솔에 EC2를 접속하여 들어가 줍니다.

 

EC2가 시작/정지/삭제 가 되는지만 확인할 것이기 때문에 별다른 인스턴스의 설정은 건너 뛰도록하겠습니다.

필자는 프리티어인 t2.micro와 Amazon Linux 2를 사용하였습니다.

인스턴스는 총 두개를 만들어 주도록 하겠습니다.

 

첫번째 인스턴스는 다음과같이 Tag명을 지정해주고

 

두번째 인스턴스는 다음과같이 Tag명을 지정해 주었습니다.

 

잘 생성된 것을 볼 수 있습니다.

 

그 다음 위에서 만든 Policy로 IAM User 생성한 후 IAM User로 접속해 보도록 하겠습니다.

IAM User 생성

다시 콘솔에 IAM을 검색한 후 들어가 줍니다.

 

왼쪽 메뉴에 Users로 들어가주신 후 Add users버튼을 클릭합니다.

 

User명은 employee1로 지정해 주시고 다음과 같이 옵션을 지정해 줍니다.

 

그 다음 아까 위에서 생성한 Policy를 지정해 줍니다.

 

태그는 건너뛰고 다음으로 와서 Create user 버튼을 눌러 IAM User를 생성해 줍니다.

 

잘 생성된 것을 볼 수 있습니다.

 

 

이제 IAM User로 접속하여 권한이 잘 부여되었는지 테스트 해보도록 하겠습니다.

테스트

그 다음 방금 만든 IAM User로 접속해 줍니다.

 

IAM User로 접속한 후 EC2 목록에 가면 다음과 같이 뜰 것입니다.

Alarm status가 뻘겋게 표시되는 이유는 권한이 없기 때문이니 안심하셔도 됩니다.

 

먼저 onwer Tag의 값이 employee2인 인스턴스를 정지 시켜봅시다.

 

아래와 같이 뻘겋게 에러가 표시된다면 성공적으로 권한이 부여된 것입니다.

onwer Tag의 값이 현재 계정명인 employee1과 일치 하지 않기 때문에 정지가 되면 안됩니다.

 

그 다음으로 이번엔 onwer Tag의 값이 employee1인 인스턴스를 정지 시켜봅시다.

 

owner Tag의 값이 현재 계정명인 employee1과 일치하기 때문에 정상적으로 정지된것을 볼 수 있습니다.

 

쓰다보니 길어져 시작/삭제에 대한 테스트는 넣지 못했지만 아마 정상적으로 작동할 것입니다.

이와같이 IAM Policy를 잘 다룬다면 사용자마다 접근할 수 있는 리소스를 분리 할 수 있고, 다른 사용자의 리소스에 접근 하지 못하도록 보안체계를 더욱 높일 수 있습니다.

 

'AWS' 카테고리의 다른 글

[AWS] API Gateway란  (0) 2022.02.21
[AWS] AWS Lambda란  (0) 2022.02.18
[AWS] AWS Athena로 ALB Log 분석하기  (0) 2022.02.17
[AWS] CloudWatch Logs Metric filter 생성하기  (0) 2022.01.26
[AWS] EC2에서 Spring Boot 프로젝트 실행  (0) 2022.01.24
Comments