IAM 역할을 사용하여 특정 IP 주소에서 AWS Management Console로의 API 호출을 제한하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 10월 21일

AWS API 호출에 대한 액세스를 특정 IP 주소로 제한하려고 합니다. AWS Identity and Access Management(IAM) 역할을 사용하여 AWS Management Console에 대한 API 호출의 액세스를 제한하려면 어떻게 해야 합니까?

간략한 설명

IAM 정책의 조건 요소에 aws: SourceIp 전역 조건 키를 사용하여 특정 IP 주소로부터의 API 호출을 제한할 수 있습니다. 하지만 이렇게 하면 사용자를 대신하여 호출을 수행하는 AWS CloudFormation과 같은 AWS 서비스에 대한 액세스가 거부됩니다.

예를 들어, AWS CloudFormation이 Amazon Elastic Compute Cloud(Amazon EC2)를 호출하여 인스턴스를 중지하도록 허용하는 AWS 서비스 역할이 있다고 가정해 보겠습니다. 대상 서비스(Amazon EC2)가 원래 사용자의 IP 주소 대신 호출 서비스(AWS CloudFormation)의 IP 주소를 보게 되므로 요청이 거부됩니다. IAM 정책에서 평가하기 위해 호출 서비스를 통해 소스 IP 주소를 대상 서비스로 전달할 수 없습니다.

참고: aws: SourceIp 조건 키는 사용하지 않는 것이 좋습니다.

​해결 방법

IAM 사용자에 연결된 IAM 정책과 동일한 권한 세트가 있는 IAM 역할을 생성합니다. 요청이 지정된 IP 주소에서 오는 경우 IAM 사용자는 역할 sts: AssumeRole API를 맡을 권한만 갖게 됩니다. 이는 사용자가 역할을 맡으려고 할 때 aws: SourceIp 제한 검사가 수행되기 때문입니다. 사용자가 IAM 역할을 맡으면 해당 역할에 연결된 IAM 정책의 권한을 획득합니다. 역할에 연결된 IAM 정책은 aws: SourceIp 조건 키를 사용하지 않으므로 AWS 서비스에 대한 액세스가 허용됩니다.

다음 IAM 정책을 생성한 후 이 정책을 프로그래밍 방식의 액세스 권한을 가진 IAM 사용자에 연결합니다. 이 IAM 정책을 사용하면 IAM 사용자가 Bob이라는 이름을 가진 역할을 맡을 수(AssumeRole) 있습니다. Bob에게는 추가 권한이 필요하지 않습니다. 다른 모든 필수 권한은 IAM 사용자가 Bob이라는 역할을 성공적으로 맡을 때 부여됩니다.

참고: Bob을 사용자의 IAM 역할 이름으로 바꾸고 EXAMPLEIAMACCOUNTID를 사용자의 계정 ID로 바꿉니다.

샘플 IAM 사용자 정책

{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::EXAMPLEIAMACCOUNTID:role/Bob"
}
}

IAM 역할 Bob을 생성하여 IAM 사용자에게 권한을 위임합니다. IAM 역할 만들기(콘솔 사용)의 지침을 따릅니다. AWS 명령줄 인터페이스(AWS CLI) 또는 API를 사용할 수도 있습니다.

참고: 콘솔을 사용하여 역할을 생성하는 경우, Bob 신뢰 정책에 대한 이 예제와 유사하게 역할의 신뢰 정책을 수정하십시오. CLI create-role 또는 API CreateRole을 사용하면 신뢰 관계 정책 문서를 -assume-role-policy 문서 파라미터의 값으로 전달할 수 있습니다.

IAM Bob 역할 정책: 이 정책은 계정의 리소스에 대해 API 호출을 수행할 수 있는 권한을 가집니다.

IAM Bob 신뢰 정책: 이 샘플 신뢰 정책은 요청이 IP 주소 범위가 103.15.250.0/24 또는 12.148.72.0/23로부터 온 경우 사용자가 역할을 수임하도록 허용합니다.

참고: 이 요청은 지정된 IP 주소 범위 103.15.250.0/24 또는 12.148.72.0/23으로부터 와야 합니다. 그렇지 않으면 IAM 사용자가 역할을 수임하고 API를 호출할 수 없습니다.

샘플 IAM 역할 신뢰 정책

참고: EXAMPLEIAMUSERNAME을 원하는 IAM 사용자 이름으로 바꿉니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/EXAMPLEIAMUSERNAME"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/EXAMPLEIAMUSERNAME"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "103.15.250.0/24",
            "12.148.72.0/23"
          ]
        }
      }
    }
  ]
}

참고: 이 우회 방법에서는 작업이 IAM 사용자가 아니라 사용자가 맡은 IAM 역할에 의해 실행되기 때문에 CloudTrail 로그에 지장이 초래됩니다. IAM 사용자가 수행한 assumeRole API 호출은 IAM 사용자 아래의 CloudTrail 로그에 로깅됩니다. IAM 역할이 수행하는 모든 추가적인 API 호출은 CloudTrail 로그의 역할 이름 아래에 로깅됩니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?