Cloud/AWS

[AWS] Source IP 기반 AWS Console 접근 제어

EndiYou 2025. 1. 31. 11:45

AWS Console에 접속하는 단말기의 IP를 기반으로 접근을 제어하는 방법


1. IAM Policy의 Condition 조건 설정

AWS Web Console은 웹으로 접근하는 서비스 이기 때문에 대한 접근을 모두 차단할 수는 없다. 그 대신, IAM Policy의 Condition을 이용해 특정 IP에서 접근 및 로그인 한 경우에만 할당된 권한을 행사할 수 있도록 구성할 수 있다.

회사 Office Network 또는 Home Network 접속만 허용하기 위해 아래와 같은 IAM Policy를 설정할 수 있다.

IAM Policy Condition Sample

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.0.113.0/24"
                ]
            }
        }
    }
}

 


 

2. Forward Access Session (FAS)로 인해 발생하는 권한 이슈 해결 방법

AWS 공식 문서에서 제시하는 Sample 정책을 설정할 경우 Forward Access Session 방식으로 사용자를 대신해 작업하는 AWS Service에 대한 접근이 차단되어 권한 이슈가 발생한다.

 

Forward Access Session (FAS)

AWS Service가 사용자를 대신해 작업을 진행하는 과정에 사용자의 ID, Policy, Session Attributes를 전달받아 사용하는 기술이다. 예를 들어 Amazon S3가 SSE-KMS를 이용해 객체를 암·복호화 하는 과정에 사용자를 대신해 AWS KMS를 접근할 때 사용자가 Amazon S3를 접근하는데 사용한 IAM 보안주체의 권한을 전달 받아 그 권한을 이용해서 AWS KMS에 접근하는 방식을 Forward Access Session 이라고 한다.

 

Forward Access Session 동작 과정

AWS Service가 사용자를 대신해서 FAS 작업을 요청할 경우 aws:CalledVia, aws:CalledViaFirst, aws:CalledViaLast 조건 키의 값이 FAS 작업을 요청한 AWS Service 주체의 정보로 채워진다. Amazon S3가 SSE-KMS로 객체를 암·복호화 하는 과정에서 Amazon S3가 AWS KMS로 요청을 보낼 때 "aws:CalledVia"의 값이 ["s3.amazonaws.com"]로 채워져서 AWS KMS에게 전달된다.

이 때 조건 키의 값은 FAS 작업 요청이 발생될 때 마다 해당 AWS Service의 값이 추가된다. AWS CloudFormation이 DynamoDB를 생성하는 과정에는 "aws:CalledVia"의 값이 ["cloudformation.amazonaws.com"]로 채워지고, DynamoDB가 다시 AWS KMS를 호출하는 과정에는 ["cloudformation.amazonaws.com", "dynamodb.amazonaws.com"]로 채워진다.

 

Forward Access Session로 인해 발생하는 권한 이슈

IAM Policy의 Deny 조건문에서 SourceIp, VPC Endpoint를 사용하는 경우 FAS 작업 요청이 거부될 수 있다. Amazon S3가 사용자를 대신에서 AWS KMS에 작업 요청을 보낼 때 사용자의 IP가 아닌 S3의 IP가 전달되기 때문에, AWS 공식문서에서 제시한 IAM Policy Condition Sample를 그대로 사용할 경우 Amazon S3의 IP가 포함이 되어 있지 않기 때문에 권한 이슈가 발생한다.

 

Forward Access Session을 허용하는 IAM Policy Condition Sample

  • Forward Access Session 전체를 허용하는 IAM Policy Condition Sample
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.0.113.0/24"
                ]
            },
            "BoolIfExists": {
                "aws:ViaAWSService": "true"
            }
        }
    }
}
  • 특정 AWS Service의 작업 요청을 허용하는 IAM Policy Condition Sample
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.244.212.31/32"
                ]
            },
            "ForAnyValue:StringEquals": {
                "aws:CalledVia": ["cloudformation.amazonaws.com", "dynamodb.amazonaws.com"]
            }
        }
    }
}
  • 특정 Action 단위로 예외 조항을 넣기 위한 NotAction 항목 활용
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "NotAction": [
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt",
            "kms:GenerateDataKey",
            "kms:GenerateDataKeyWithoutPlaintext",
            "kms:DescribeKey",
            "iam:PassRole",
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "logs:DescribeLogGroups",
            "logs:DescribeLogStreams",
            "ec2:DeleteFlowLogs",
            "ec2:CreateFlowLogs",
            "ec2:DescribeFlowLogs"
        ],
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.244.212.31/32"
                ]
            }
        }
    }
}