[파이썬] 파이썬 애플리케이션의 AWS Lambda 보안 설정

AWS Lambda는 서버리스 컴퓨팅 환경에서 실행되는 코드를 위한 서비스로서, 파이썬 애플리케이션을 실행할 수 있습니다. 그러나 Lambda 함수를 안전하게 구성하지 않으면 보안상의 위협에 노출될 수 있습니다. 이 글에서는 파이썬 애플리케이션의 AWS Lambda 보안 설정에 대해 알아보겠습니다.

IAM 역할 설정

Lambda 함수의 IAM 역할은 AWS 리소스에 액세스하기 위한 권한을 정의합니다. 이 역할은 Lambda 함수에 필요한 권한을 가진 정책을 연결하여 생성할 수 있습니다.

예를 들어, S3에 업로드 된 이미지를 처리하는 Lambda 함수의 경우, S3 버킷에 읽기 및 쓰기 권한을 부여해야 합니다. 다음은 IAM 역할의 정책을 설정하는 예제입니다.

import boto3
from botocore.exceptions import ClientError

def create_lambda_execution_role():
    try:
        iam_client = boto3.client('iam')
        
        # IAM 역할 생성
        iam_client.create_role(
            RoleName='LambdaExecutionRole',
            AssumeRolePolicyDocument='''{
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "lambda.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
                }
              ]
            }'''
        )
        
        # 정책 연결
        iam_client.attach_role_policy(
            RoleName='LambdaExecutionRole',
            PolicyArn='arn:aws:iam::aws:policy/AmazonS3FullAccess'
        )
        
        print("IAM 역할이 생성되었습니다.")
        
    except ClientError as e:
        print("IAM 역할을 생성하는 도중 에러가 발생하였습니다.")
        print(e.response['Error']['Message'])

위의 코드는 boto3 라이브러리를 사용하여 IAM 역할을 생성하고 정책을 연결하는 예제입니다. 이를 실행하면 IAM 역할이 생성되고 Amazon S3에 대한 전체 액세스 권한이 추가됩니다.

VPC 구성

Lambda 함수가 VPC에서 실행되도록 구성하면, 애플리케이션과 관련된 리소스에 액세스 할 수 있는 더 높은 보안 수준을 제공할 수 있습니다.

예를 들어, RDS 데이터베이스를 사용하는 Lambda 함수의 경우, VPC 내에 있는 RDS 인스턴스에 액세스해야 합니다. 다음은 Lambda 함수를 VPC 내에서 실행할 수 있도록 구성하는 예제입니다.

import boto3

def configure_lambda_vpc():
    ec2_client = boto3.client('ec2')
    lambda_client = boto3.client('lambda')
    
    # VPC 생성
    vpc_response = ec2_client.create_vpc(
        CidrBlock='10.0.0.0/16',
        AmazonProvidedIpv6CidrBlock=True
    )
    vpc_id = vpc_response['Vpc']['VpcId']
    
    # 인터넷 게이트웨이 생성
    igw_response = ec2_client.create_internet_gateway()
    igw_id = igw_response['InternetGateway']['InternetGatewayId']
    
    # VPC와 인터넷 게이트웨이 연결
    ec2_client.attach_internet_gateway(
        VpcId=vpc_id,
        InternetGatewayId=igw_id
    )
    
    # 서브넷 생성
    subnet_response = ec2_client.create_subnet(
        CidrBlock='10.0.0.0/24',
        VpcId=vpc_id
    )
    subnet_id = subnet_response['Subnet']['SubnetId']
    
    # VPC에 라우팅 테이블 연결
    ec2_client.create_route_table(
        VpcId=vpc_id
    )
    
    # Lambda 함수를 VPC 내에서 실행하도록 구성
    lambda_client.update_function_configuration(
        FunctionName='my_lambda_function',
        VpcConfig={
            'SubnetIds': [subnet_id]
        }
    )
    
    print("Lambda 함수가 VPC에서 실행될 수 있도록 구성되었습니다.")

위의 코드는 boto3 라이브러리를 사용하여 VPC를 생성 및 구성하고, Lambda 함수를 VPC 내에서 실행하도록 설정하는 예제입니다. 이를 실행하면 VPC, 인터넷 게이트웨이, 서브넷이 생성되고 Lambda 함수가 VPC 내에서 실행되도록 구성됩니다.

암호화 및 보안 그룹 설정

AWS Lambda 함수는 데이터 및 리소스의 보안을 위해 다양한 암호화 및 보안 그룹 설정을 제공합니다.

  1. 암호화: Lambda 함수가 사용하는 데이터가 암호화되도록 설정할 수 있습니다. S3 버킷에 저장된 데이터를 Lambda 함수 내에서 액세스하는 경우, 데이터를 암호화하여 보호할 수 있습니다.
    # Lambda 함수 내에서 S3 암호화 사용 설정
    lambda_client.put_function_encryption_config(
        FunctionName='my_lambda_function',
        EncryptionConfig={
            'S3EncryptionMode': 'ENCRYPT_S3'
        }
    )
    
  2. 보안 그룹: Lambda 함수의 보안 그룹은 필터링 규칙을 설정하여 특정 IP 주소 또는 포트에 대한 액세스를 제어할 수 있습니다. 예를 들어, 특정 IP 주소에서의 액세스만 허용하고 나머지는 차단할 수 있습니다.
    import boto3
       
    def configure_lambda_security_group():
        ec2_client = boto3.client('ec2')
        lambda_client = boto3.client('lambda')
           
        # 보안 그룹 생성
        security_group_response = ec2_client.create_security_group(
            GroupName='LambdaSecurityGroup',
            Description='Security group for Lambda function',
            VpcId='vpc-12345678'
        )
        sg_id = security_group_response['GroupId']
           
        # 인바운드 액세스 규칙 추가
        ec2_client.authorize_security_group_ingress(
            GroupId=sg_id,
            IpPermissions=[
                {
                    'IpProtocol': 'tcp',
                    'FromPort': 80,
                    'ToPort': 80,
                    'IpRanges': [
                        {'CidrIp': '0.0.0.0/0'}
                    ]
                }
            ]
        )
    
        # Lambda 함수 보안 그룹 설정
        lambda_client.update_function_configuration(
            FunctionName='my_lambda_function',
            VpcConfig={
                'SecurityGroupIds': [sg_id]
            }
        )
           
        print("보안 그룹이 생성되었고 Lambda 함수에 적용되었습니다.")
    

위의 코드는 boto3 라이브러리를 사용하여 암호화 및 보안 그룹을 설정하는 예제입니다. 이를 실행하면 Lambda 함수 내에서 S3 암호화가 활성화되고, 특정 IP 주소에서의 액세스만 허용하는 보안 그룹이 생성되고 Lambda 함수에 적용됩니다.

결론

AWS Lambda를 사용하여 파이썬 애플리케이션을 실행할 때, 보안 설정은 매우 중요합니다. IAM 역할 설정, VPC 구성, 암호화 및 보안 그룹 설정을 통해 Lambda 함수의 보안을 강화할 수 있습니다. 이러한 설정을 적절하게 구성하여 안전한 Lambda 함수를 개발하도록 합시다.