AWS Organization 을 이용한 Source 기반 권한 제어

JIPA
6 min readJan 29, 2022

--

AWS 서비스를 이용하다보면 필연적으로 AWS IAM 에 대한 의존도가 많아지고 각 IAM 사용자나 역할에 적용해야하는 IAM 정책이 점점 복잡해지는 것을 알 수 있습니다. 이렇게 정책이 복잡해지는 이유는 보안에서 흔히 이야기하는 “최소 권한 원칙" 을 준수하기 위하여 좀 더 세밀한 정책을 구현해야하기 때문인데요. 간단하게 정책을 작성해서 훌륭한 “최소 권한 원칙" 을 만들어낼 수 있다면 가장 최선이겠지만 현실적으로는 그런 이상적인 정책을 구현하는 것이 어려운 것이 사실입니다.

이번 포스팅에서는 일반적으로 클라우드 이용환경에서 많이 요구하는 자격증명의 권한을 Source 를 기반으로 제어하는 여러가지 방법 중 AWS Organizations 에서 제공하는 SCP(Service Control Policy) 를 이용하는 방법을 살펴보려고 합니다.

AWS Organizations 의 SCP 를 이용한 권한제어의 장점은 조직에 연결되어 있는 모든 계정의 자격증명(Root 계정을 포함한 모든 IAM 자격증명)에 대해 권한을 제한할 수 있다는 것입니다. 즉, Source IP 기반 권한 제어를 IAM 서비스를 기반으로 적용하게 되면 각 Root Account 에 대해서는 Source I를 제한할 수 없지만 SCP 를 사용한다면 하나의 Policy 를 이용하여 IAM 의 자격증명 뿐만 아니라 Root 에 대한 Source 기반 권한 제한이 가능하다는 장점이 있습니다. 또한, IAM 으로 Source IP 기반 권한 제한을 하는 경우 IAM 사용자에 대해서는 Group 으로 구성된 자격증명에 대해 Group 에 IAM Policy 를 할당하여 Source 를 제한할 수 있지만 IAM 역할의 경우에는 Group 이라는 개념을 적용할 수 없기 때문에 IAM Policy 를 할당하는 과정에 번거로움이 있을 수 있습니다. 하지만 SCP 의 경우에는 Account Level 로 Source 기반 권한 제어가 가능하기 때문에 여러 IAM Group 에 정책을 할당한다거나 여러 IAM 역할에 정책을 부여하지 않아도 Source 기반 권한 제어를 효율적으로 적용하실 수 있습니다.

그럼 본격적으로 SCP 를 이용하여 Source 기반 권한 제어를 구현해보도록 하겠습니다.

아래는 Source 기반 권한 제어를 위해 작성된 SCP Example 인데요. 각 항목에 대해 어떤 조건들을 담고 있는지 살펴 보도록 하겠습니다.

이 정책은 크게 3가지 Condition(BoolIfExists, NotIPAddressIfExists, StringNotLikeIfExists)을 이용하여 권한을 제한하는 것을 구현하고 있습니다.

각각의 Condition 들은 나름대로의 목적을 가지고 정책에 적용이 되어 있는 것인데요. 각 Condition 들이 어떠한 목적을 가지고 정책에 적용이 되어 있는지 살펴보도록 하겠습니다.

  1. BoolIfExists
"BoolIfExists": {    "aws:ViaAWSService": "false"}

: API 가 호출되었을 때 API 호출이 AWS Service 를 통하여 호출되었는지를 검사하기 위한 Condition 입니다. 위 예시의 경우 Condition 조건의 값이 “false” 로 명시되어 있기 때문에 AWS Service 에서 호출하는 API 의 경우(AWS Service 에서 API 가 호출되는 경우에는 ViaAWSService 값이 “True” 입니다.)에는 매칭되지 않게 됩니다. 따라서, 이 Condition 을 만족할 수 없으므로 Source IP 매칭 여부와 관계없이 AWS Service 에서 호출하는 API 는 차단되지 않습니다.

2. NotIPAddressIfExsits

"NotIpAddressIfExists": {   "aws:SourceIp": [       "175.208.248.0/24",       "4.3.2.1/32"   ]}

: API 가 호출되었을 때 API 호출에 사용된 Source IP 를 검사하기 위한 Condition입니다. “NotIpAddressIfExists” 가 사용되었고 “aws:SourceIp” 가 사용되었기 때문에 API 요청의 출발지 IP 가 공인 IP 이면서 Condition 에 지정된 IP List 가 아닌 경우에 조건을 만족하게 됩니다. AWS Service 가 아닌 IAM 사용자 or IAM 역할이 호출하는 API 는 ViaAWSService 값이 “false” 이므로 IAM 사용자나 역할이 지정된 Source IP 가 아닌 다른 공인 IP 를 이용하여 API 사용을 시도한다면 차단되게 됩니다.

3. StringNotLikeIfExists

"StringNotLikeIfExists": {    "aws:SourceVPCe": [        "vpce-05749ffrandomid",        "vpce-0e73b15randomid",        "vpce-0ac3b3crandomid"    ]}

: 마지막 Condition 은 VPC Endpoint 기반의 사용을 제한하기 위한 용도로 사용됩니다. 우리가 AWS API 를 사용하는 환경을 보면 인터넷을 통해서 외부에서 Public Endpoint 를 이용하여 API 를 이용하는 경우도 있지만 보안이 좀 더 강화된 환경에서는 VPC Endpoint 를 생성한 후 Private Network 에서도 AWS API 를 이용하는 경우를 볼 수 있습니다. 이처럼 VPC Endpoint 를 이용하는 환경이라면 보안의 관점에서 봤을 때는 VPC Endpoint 도 새로운 API 접근을 위한 접속 경로로 생각할 수 있는데요. 첫번째와 두번째 Condition 이 외부에서 사용하는 API 의 사용을 Source 를 기반으로 제한하는 용도로 사용이 되는 것이라면 이 세번째 Condition 은 VPC 내부에서 인가되지 않은 VPC Endpoint 를 이용하여 API 를 사용하는 경우를 차단하고자하는 Source 기반 권한 제어 Condition 이라고 생각하시면 될 것 같습니다. 이 Condition 의 경우에는 API 호출 시 사용된 VPC Endpoint 의 ID 정보를 기반으로 지정된 VPC Endpoint ID 가 아닌 경우에는 “True” 판단이 되어 API 사용을 차단하게 됩니다.

이 포스팅에서는 SCP 를 이용하여 간단하게 조직내의 AWS 계정에서 API 를 사용할 수 있는 권한을 Source 기반으로 제어할 수 있는 정책을 살펴보았는데요. SCP 는 이러한 Source 기반 제어 뿐만 아니라 조직 전체의 다양한 보안 영역에 대한 Guardrail 역할을 수행하는데 효율적인 방안을 제공하기 때문에 AWS Organizations 를 이용하실 수 있는 환경이라면 적극적으로 활용하시기를 권고드립니다.

감사합니다.

--

--

JIPA
JIPA

Written by JIPA

Always Day 1. Security is job zero.

No responses yet