AWS CloudFormation을(를) 사용하여 보안 그룹 관리 - AWS CloudFormation

AWS CloudFormation을(를) 사용하여 보안 그룹 관리

다음 코드 조각은 AWS CloudFormation을(를) 사용하여 보안 그룹과 Amazon EC2 인스턴스를 관리하여 AWS 리소스에 대한 액세스를 제어하는 방법을 보여 줍니다.

보안 그룹과 Amazon EC2 인스턴스 연결

다음 예제 코드 조각은 AWS CloudFormation을(를) 사용하여 Amazon EC2 인스턴스를 기본 Amazon VPC 보안 그룹과 연결하는 방법을 보여 줍니다.

기본 VPC 보안 그룹과 Amazon EC2 인스턴스 연결

다음 코드 조각은 Amazon VPC, VPC 내의 서브넷, Amazon EC2 인스턴스를 생성합니다. VPC는 AWS::EC2::VPC 리소스를 사용하여 생성됩니다. VPC의 IP 주소 범위는 더 큰 템플릿에서 정의되며 MyVPCCIDRRange 파라미터에 의해 참조됩니다.

서브넷은 AWS::EC2:: Subnet 리소스를 사용하여 VPC 내에 생성됩니다. 서브넷은 MyVPC(으)로 참조되는 VPC와 연결됩니다.

EC2 인스턴스는 AWS::EC2::Instance 리소스를 사용하여 VPC와 서브넷 내에서 시작됩니다. 이 리소스는 인스턴스를 시작하는 데 사용할 Amazon Machine Image(AMI), 인스턴스를 실행할 서브넷, 인스턴스와 연결할 보안 그룹을 지정합니다. Fn::FindInMap 함수는 AWS::EC2::Instance 리소스의 ImageId을(를) 결정하기 위해 AWSRegionToAMI 매핑에서 값을 검색하는 데 사용됩니다.

보안 그룹 ID는 MyVPC 리소스에서 기본 보안 그룹을 검색하는 Fn::GetAtt 함수를 사용하여 가져옵니다.

인스턴스는 코드 조각에 정의된 MySubnet 리소스 내에 배치됩니다.

AWS CloudFormation을(를) 사용하여 VPC를 생성하는 경우 AWS은(는) VPC 내에 기본 보안 그룹을 포함한 기본 리소스를 자동으로 생성합니다. 하지만 AWS CloudFormation 템플릿 내에 VPC를 정의하면 템플릿을 생성할 때 이러한 기본 리소스의 ID에 액세스하지 못할 수 있습니다. 템플릿에 지정된 기본 리소스에 액세스하고 사용하려면 Fn::GetAtt와(과) 같은 내장 함수를 사용할 수 있습니다. 이 함수를 사용하면 AWS CloudFormation에서 자동으로 생성한 기본 리소스를 사용하여 작업할 수 있습니다.

JSON

"MyVPC": { "Type": "AWS::EC2::VPC", "Properties": { "CidrBlock": { "Ref": "MyVPCCIDRRange" }, "EnableDnsSupport": false, "EnableDnsHostnames": false, "InstanceTenancy": "default" } }, "MySubnet": { "Type": "AWS::EC2::Subnet", "Properties": { "CidrBlock": { "Ref": "MyVPCCIDRRange" }, "VpcId": { "Ref": "MyVPC" } } }, "MyInstance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Fn::FindInMap": [ "AWSRegionToAMI", { "Ref": "AWS::Region" }, "64" ] }, "SecurityGroupIds": [ { "Fn::GetAtt": [ "MyVPC", "DefaultSecurityGroup" ] } ], "SubnetId": { "Ref": "MySubnet" } } }

YAML

MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: Ref: MyVPCCIDRRange EnableDnsSupport: false EnableDnsHostnames: false InstanceTenancy: default MySubnet: Type: AWS::EC2::Subnet Properties: CidrBlock: Ref: MyVPCCIDRRange VpcId: Ref: MyVPC MyInstance: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - AWSRegionToAMI - Ref: AWS::Region - "64" SecurityGroupIds: - Fn::GetAtt: - MyVPC - DefaultSecurityGroup SubnetId: Ref: MySubnet

연결된 볼륨 및 보안 그룹을 포함하는 Amazon EC2 인스턴스를 생성합니다.

다음 코드 조각은 지정된 AMI에서 시작되는 AWS::EC2::Instance 리소스를 사용하여 Amazon EC2 인스턴스를 생성합니다. 인스턴스는 AWS::EC2::SecurityGroup 리소스를 사용하여 지정된 IP 주소로부터 포트 22로 들어오는 SSH 트래픽을 허용하는 보안 그룹과 연결됩니다. AWS::EC2::Volume 리소스를 사용하여 100GB Amazon EBS 볼륨을 생성합니다. 볼륨은 GetAtt 함수에 지정된 대로 인스턴스와 동일한 가용 영역에 생성되며 /dev/sdh 디바이스의 인스턴스에 마운트됩니다.

Amazon EBS 볼륨 생성에 대한 자세한 내용은 Amazon EBS 볼륨 생성을 참조하세요.

JSON

"Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ], "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "192.0.2.0/24" } ] } }, "NewVolume": { "Type": "AWS::EC2::Volume", "Properties": { "Size": "100", "AvailabilityZone": { "Fn::GetAtt": [ "Ec2Instance", "AvailabilityZone" ] } } }, "MountPoint": { "Type": "AWS::EC2::VolumeAttachment", "Properties": { "InstanceId": { "Ref": "Ec2Instance" }, "VolumeId": { "Ref": "NewVolume" }, "Device": "/dev/sdh" } }

YAML

Ec2Instance: Type: AWS::EC2::Instance Properties: SecurityGroups: - !Ref InstanceSecurityGroup ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 192.0.2.0/24 NewVolume: Type: AWS::EC2::Volume Properties: Size: 100 AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone] MountPoint: Type: AWS::EC2::VolumeAttachment Properties: InstanceId: !Ref Ec2Instance VolumeId: !Ref NewVolume Device: /dev/sdh

인그레스 규칙이 있는 보안 그룹 생성

다음 예제 코드 조각은 AWS CloudFormation을 사용하여 특정 인그레스 규칙이 있는 보안 그룹을 구성하는 방법을 보여 줍니다.

SSH 및 HTTP 액세스를 위한 인그레스 규칙이 있는 보안 그룹 생성

다음 코드 조각은 AWS::EC2::SecurityGroup 리소스를 사용하는 두 가지 보안 그룹 인그레스 규칙을 설명합니다. 첫 번째 인그레스 규칙은 계정 번호가 1111-2222-3333인 AWS 계정이 소유한 MyAdminSecurityGroup이라는 기존 보안 그룹에서의 SSH(포트 22) 액세스를 허용합니다. 두 번째 인그레스 규칙은 동일한 템플릿에서 생성된 MySecurityGroupCreatedInCFN이라는 다른 보안 그룹에서의 HTTP(포트 80) 액세스를 허용합니다. Ref 함수는 동일한 템플릿에 생성된 보안 그룹의 논리명을 참조하는 데 사용됩니다.

첫 번째 인그레스 규칙에서는 SourceSecurityGroupNameSourceSecurityGroupOwnerId 속성 모두에 값을 추가해야 합니다. 두 번째 인그레스 규칙에서 MySecurityGroupCreatedInCFNTemplate은(는) 동일한 템플릿에 생성된 다른 보안 그룹을 참조합니다. 논리명 MySecurityGroupCreatedInCFNTemplate이(가) 더 큰 템플릿에서 지정한 보안 그룹 리소스의 실제 논리명과 일치하는지 확인합니다.

보안 그룹에 대한 자세한 내용은 Linux 인스턴스에 대한 Amazon EC2 Amazon 보안 그룹Windows 인스턴스에 대한 Amazon EC2 Amazon 보안 그룹을 참조하세요.

JSON

"SecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Allow connections from specified source security group", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "SourceSecurityGroupName": "MyAdminSecurityGroup", "SourceSecurityGroupOwnerId": "1111-2222-3333" }, { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "SourceSecurityGroupName": { "Ref": "MySecurityGroupCreatedInCFNTemplate" } } ] } }

YAML

SecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Allow connections from specified source security group SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' SourceSecurityGroupName: MyAdminSecurityGroup SourceSecurityGroupOwnerId: '1111-2222-3333' - IpProtocol: tcp FromPort: '80' ToPort: '80' SourceSecurityGroupName: Ref: MySecurityGroupCreatedInCFNTemplate

지정된 CIDR 범위에서의 HTTP 및 SSH 액세스에 대한 인그레스 규칙이 있는 보안 그룹 생성

다음 코드 조각은 두 가지 인바운드 규칙이 있는 Amazon EC2 인스턴스용 보안 그룹을 생성합니다. 인바운드 규칙은 지정된 CIDR 범위에서 지정된 포트로 들어오는 TCP 트래픽을 허용합니다. 규칙을 지정하는 데 AWS::EC2::SecurityGroup 리소스가 사용됩니다. 각 규칙마다 프로토콜을 지정해야 합니다. TCP의 경우 포트 또는 포트 범위도 지정해야 합니다. 소스 보안 그룹 또는 CIDR 범위를 지정하지 않으면 스택이 성공적으로 시작되지만 규칙이 보안 그룹에 적용되지 않습니다.

보안 그룹에 대한 자세한 내용은 Linux 인스턴스에 대한 Amazon EC2 Amazon 보안 그룹Windows 인스턴스에 대한 Amazon EC2 Amazon 보안 그룹을 참조하세요.

JSON

"ServerSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Allow connections from specified CIDR ranges", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "CidrIp": "192.0.2.0/24" }, { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "192.0.2.0/24" } ] } }

YAML

ServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow connections from specified CIDR ranges SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 192.0.2.0/24 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 192.0.2.0/24

인그레스 규칙이 있는 교차 참조 보안 그룹 생성

다음 코드 조각은 AWS::EC2::SecurityGroup 리소스를 사용하여 두 개의 Amazon EC2 보안 그룹 SGroup1SGroup2을(를) 생성합니다. 두 보안 그룹 간의 통신을 허용하는 인그레스 규칙은 AWS::EC2::SecurityGroupIngress 리소스를 사용하여 생성됩니다. SGroup1Ingress은(는) 소스 보안 그룹 SGroup2에서 포트 80으로 들어오는 TCP 트래픽을 허용하는 SGroup1의 인그레스 규칙을 설정합니다. SGroup2Ingress은(는) 소스 보안 그룹 SGroup1에서 포트 80으로 들어오는 TCP 트래픽을 허용하는 SGroup2의 인그레스 규칙을 설정합니다.

JSON

"SGroup1": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "EC2 instance access" } }, "SGroup2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "EC2 instance access" } }, "SGroup1Ingress": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "GroupName": { "Ref": "SGroup1" }, "IpProtocol": "tcp", "ToPort": "80", "FromPort": "80", "SourceSecurityGroupName": { "Ref": "SGroup2" } } }, "SGroup2Ingress": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "GroupName": { "Ref": "SGroup2" }, "IpProtocol": "tcp", "ToPort": "80", "FromPort": "80", "SourceSecurityGroupName": { "Ref": "SGroup1" } } }

YAML

SGroup1: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Instance access SGroup2: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Instance access SGroup1Ingress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupName: !Ref SGroup1 IpProtocol: tcp ToPort: 80 FromPort: 80 SourceSecurityGroupName: !Ref SGroup2 SGroup2Ingress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupName: !Ref SGroup2 IpProtocol: tcp ToPort: 80 FromPort: 80 SourceSecurityGroupName: !Ref SGroup1

보안 그룹 인그레스 규칙이 있는 Elastic Load Balancer 생성

다음 템플릿은 지정된 가용 영역에 AWS::ElasticLoadBalancing::LoadBalancer 리소스를 생성합니다. AWS::ElasticLoadBalancing::LoadBalancer 리소스는 포트 80에서 HTTP 트래픽을 수신하고 포트 80에서 인스턴스로 직접 요청을 보내도록 구성됩니다. Elastic Load Balancer는 인스턴스 간에 들어오는 HTTP 트래픽의 로드 밸런싱을 담당합니다.

또한 이 템플릿은 로드 밸런서와 연결된 AWS::EC2::SecurityGroup 리소스를 생성합니다. 이 보안 그룹은 포트 80에서 들어오는 TCP 트래픽을 허용하는 단일 인그레스 규칙(ELB ingress group(으)로 설명됨)으로 생성됩니다. 이 인그레스 규칙의 소스는 로드 밸런서 리소스에서 속성을 검색하는 Fn::GetAtt 함수를 사용하여 정의됩니다. SourceSecurityGroupOwnerId은(는) Fn::GetAtt을 사용하여 로드 밸런서 소스 보안 그룹의 OwnerAlias을(를) 가져옵니다. SourceSecurityGroupName은(는) Fn::Getatt을(를) 사용하여 ELB 소스 보안 그룹의 GroupName을(를) 가져옵니다.

이 설정은 ELB와 인스턴스 간의 보안 통신을 보장합니다.

로드 밸런싱에 대한 자세한 내용은 Elastic Load Balancing 사용 설명서를 참조하세요.

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "MyELB": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "AvailabilityZones": [ "aa-example-1a" ], "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ] } }, "MyELBIngressGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "ELB ingress group", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "SourceSecurityGroupOwnerId": { "Fn::GetAtt": [ "MyELB", "SourceSecurityGroup.OwnerAlias" ] }, "SourceSecurityGroupName": { "Fn::GetAtt": [ "MyELB", "SourceSecurityGroup.GroupName" ] } } ] } } } }

YAML

AWSTemplateFormatVersion: '2010-09-09' Resources: MyELB: Type: 'AWS::ElasticLoadBalancing::LoadBalancer' Properties: AvailabilityZones: - aa-example-1a Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP MyELBIngressGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: ELB ingress group SecurityGroupIngress: - IpProtocol: tcp FromPort: '80' ToPort: '80' SourceSecurityGroupOwnerId: Fn::GetAtt: - MyELB - SourceSecurityGroup.OwnerAlias SourceSecurityGroupName: Fn::GetAtt: - MyELB - SourceSecurityGroup.GroupName