AWS IAM으로 특정 리전만 접근 할 수 있는 IAM 사용자 작성해보기

2024.06.12

혹시 AWS 콘솔 페이지를 사용할 때 어느 순간에 작업을 하고 있던 리전에서 다른 리전으로 설정이 변경되어 있다거나 하는 경우가 있지 않으신가요?
저도 AWS를 공부한 지 얼마 안 되었을 때는 갑자기 리소스가 사라진 줄 알고 놀라거나 헤맨 적이 있었습니다.
그래서 특정 리전만 사용하고자 하는 분들이 이런 실수를 하지 않기 위해서 IAM을 사용해서 리전에 대한 권한을 허용, 제한하는 법을 블로그로 정리했습니다.

AWS 사용자의 종류

AWS는 크게 두 종류의 사용자로 나눠는데 루트 사용자와 IAM 사용자입니다.

루트 사용자 (Root User) 는 AWS의 계정을 생생할 때 받는 사용자로 콘솔화면에 로그인할 때 이메일 주소와 비밀번호로 로그인합니다.
모든 AWS 서비스에 대한 가장 강력한 권한을 가지고 있으며 계정과 결제와 같은 중요한 설정에 접근할 수 있는 사용자입니다.
그렇기 때문에 루트 사용자를 사용하면 실수로 원하지 않는 설정을 눌렀을때 큰 문제가 발생할 수 있기 때문에 사용을 최소화하는 게 좋습니다.

IAM 사용자 (IAM User) 는 AWS IAM 서비스를 통해 생성하는 사용자 계정입니다.
IAM 사용자란 리소스에 대한 액세스를 관리하고 제어하기 위한 개별적인 보안 주체입니다.
쉽게 얘기하면 AWS에 접근하는 주체로 로그인, 비밀번호를 할당받기 때문에 1인 1개를 가지고 있는 게 일반적입니다.
모든 권한을 가지고 있는 루트 사용자와 달리 필요한 권한만을 부여하여 일부의 AWS 서비스에만 접근할 수 있게 설정할 수 있습니다.

그래서 AWS 계정을 사용할 때는 가장 먼저 계정을 생성할 때 받는 루트 사용자의 로그인 정보(이메일, 비밀번호)로 콘솔화면에 로그인을 해서 그 후에 필요한 권한을 부여한 IAM 사용자를 작성해서 IAM 사용자로 새롭게 로그인해서 사용하게 일반적인 것같습니다. (루트 사용자는 IAM 사용자를 작성하거나 계정, 결제와 같은 중요한 설정 이외에는 사용하지 않는 걸 추천합니다.)

또한, 위의 두 사용자 모두 로그인 정보는 정보가 유출되지 않도록 잘 관리해야 합니다.
하지만 혹시 로그인 정보가 유출되었을 때 바로 로그인 되지 않도록 MFA (Multi-Factor Authentication) 으로 2단계 인증을 설정해두는 것을 권장합니다.
이번 블로그에서는 MFA 설정은 생략합니다.

MFA 설정 방법 및 필요한 권한 정보↓

사용자에 대해서 이해되셨나요? 이번 블로그에서는 특정 리전에만 접근 할 수 있는 IAM 사용자를 생성해보겠습니다.
먼저 IAM 사용자를 생성합니다.

IAM 사용자의 생성

일단 IAM 페이지의 사용자 페이지에 들어가서 새로운 사용자를 생성하겠습니다.
사용자 페이지에 들어가서 새로운 사용자를 생성합니다.

가장 먼저 임의로 사용자 이름을 입력합니다.
블로그에서는 「region-user」 라는 이름으로 생성하겠습니다.

오늘 생성하는 사용자를 사용해서 콘솔화면에 로그인을 할 예정이기 때문에 [AWS Management Console에 대한 사용자 액세스 권한 제공] 에 체크를 합니다.
체크를 하면 암호 설정에 대한 설정칸이 나오는데 블로그에서는 암호를 자동 생성해서 작성한 IAM 사용자로 최초 로그인을 할 시 암호를 변경하도록 설정하겠습니다.(기본 설정입니다.)
만약 내가 사용할 사용자라면 사용자 지정 암호를 설정해도 되지만 AWS계정을 여러명이 사용하고 있고 다른 사람이 사용할 IAM 사용자를 작성하는 경우라면 지금과 같은 설정을 통해서 실제 사용할 사람이 암호를 변경하도록 설정할 수 있습니다.

그리고 그 다음으로 권한을 설정할 수 있지만 일단은 아무 권한도 설정하지 않은 채 사용자를 생성하겠습니다.

다음으로 넘어가면 설정한 내용을 검토할 수 있습니다.
권한은 설정하지 않았기 때문에 권한 요약에 「리소스 없음」으로 표시되어 있는 것이 정상입니다.
설정한 것에 문제가 없으면 사용자를 생성합니다.

사용자가 생성되면 로그인 정보가 표시됩니다.
콘솔에 로그인 할 수 있는 URL과 사용자 이름, 비밀번호가 표시되고 오른쪽 아래의 버튼에 .csv 파일로도 다운로드 받을 수 있습니다.
생성한 로그인 정보로 콘솔에 접속할 거기 때문에 기억해둡시다.
또한 정확한 로그인 정보를 기억하기 위해 꼭 파일로 다운로드를 받는 걸 권장합니다.

사용자 페이지로 돌아가면 작성한 IAM 사용자가 리스트에 들어가 있습니다.
IAM 사용자의 생성이 완료되었습니다.

작성한 IAM 사용자로 로그인해보기

아직 작성한 IAM 사용자에 권한을 부여하지 않아서 할 수 있는건 아무것도 없지만 일단 로그인해보겠습니다.
아까 생성한 IAM사용자의 로그인 정보 중에서 로그인 할 수 있는 URL을 브라우저 검색창에 입력해서 들어가겠습니다.
URL를 통해 로그인 페이지에 들어가지면 [계정 ID(12자리) 또는 계정 별칭]에는 이미 계정ID가 설정되어 있을 겁니다.(없다면 입력해주세요.)
그러면 IAM 사용자의 사용자 이름과 암호를 입력해서 로그인을 합니다.

최초 로그인을 하면 암호를 변경하는 화면이 나옵니다.
위에서 IAM 사용자를 생성할 때 「사용자는 다음 로그인 시 새 암호를 생성해야 합니다」 의 설정을 했기 때문에 암호를 변경하는 화면이 나옵니다.
암호 변경 화면은 최초 로그인을 할때만 표시되고 실제로 사용할 암호로 변경한 후에 [비밀번호 변경 확인]버튼을 누르면 로그인이 됩니다.

로그인이 되면 콘솔 홈이 나옵니다!
하지만 아무런 권한이 없기 때문에 여러 화면에 「액세스 거부됨」 이라고 표시 되어 있을 것입니다.
VPC 페이지에 들어가봐도 권한이 없어서 아무것도 확인할 수 없습니다.

다른 리전을 확인해도 같습니다.

권한 부여해보기

로그인되는 걸 확인했으면 이번에는 권한을 부여해보겠습니다.
권한의 부여는 IAM 사용자를 생성한 사용자(루트 사용자 혹은 IAM 수정 권한을 부여받은 IAM 사용자)에서 설정할 수 있습니다.
그렇기 때문에 로그인했던 IAM 사용자는 로그아웃을 하고 아까 처음에 사용했던 사용자로 다시 로그인해서 진행해주세요.

모든 권한은 IAM의 정책 페이지에서 JSON 형식으로 작성합니다.

정책을 작성하면 위에서 작성한 IAM 사용자의 상세 페이지에 들어가서 [권한]태그에서 권한 정책의 권한 추가 버튼을 통해 추가합니다.

또한 권한을 추가할때는 직접 정책 연결을 선택해서 작성한 권한을 설정했습니다.

서울 리전만 접근할 수 있는 권한 부여

서울 리전만 접근할 수 있는 권한입니다.
서울 리전의 모든 서비스에 접근할 수 있지만 다른 리전에는 접근할 수 없습니다.

하이라이트 된 부분이 실제로 리전 접근을 허락하는 설정부분입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-2"
                }
            }
        }
    ]
}

서울, 버지니아의 복수 리전에 접근할 수 있는 권한 부여

이번에는 서울 리전과 버지나아 리전에 접근할 수 있는 권한입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:RequestedRegion": [
                        "ap-northeast-2",
                        "us-east-1"
                    ]
                }
            }
        }
    ]
}

반대로 버지니아 리전만 접근하지 못하게 권한 부여

이번에는 반대로 버지니아 리전에만 접근하지 못하도록 권한을 부여해보겠습니다.
먼저 「Deny」로 버지니아에 대한 접근을 거부하고 그 아래 「Allow」로 다른 리전에 대한 권한을 부여합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "us-east-1"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

서울 리전의 특정 서비스에만 접근할 수 있는 권한 부여

이번에는 좀 더 복잡하게 서울 리전의 특정 서비스에만 접근하도록 설정하겠습니다.
서비스에 따라 다양한 설정이 가능하지만 이번에는 EC2 페이지의 읽기 권한(readonly)만 설정한 권한입니다.
즉, 서울 리전의 EC2의 읽기만 가능한 권한입니다.
(AWS 관리형 규칙의 「AmazonEC2ReadOnlyAccess」을 참고했습니다.)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:Describe*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-2"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "elasticloadbalancing:Describe*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-2"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:ListMetrics",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:Describe*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-2"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "autoscaling:Describe*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-2"
                }
            }
        }
    ]
}

그러면 실제로 해당 IAM 사용자로 로그인을 하면 서울 리전의 EC2에 대한 페이지의 확인만 할 수 있게 됩니다.
실제로 권한이 적용되었는지 확인하는 부분은 생략하겠습니다.

이처럼 IAM 사용자에 권한을 부여하면 리전에 대한 권한을 제한할 수 있습니다.
AWS를 사용하면서 특정 리전만 사용하고 싶다거나, 반대로 특정 리전에 대한 접속을 제한하고 싶을 경우에는 리전 권한을 설정한 IAM 사용자를 사용해보시는 건 어떠신가요?