Home
home

3장 실습 - 보안 그룹과 네트워크 ACL 구성

1. CloudFormation을 통한 기본 인프라 배포

이번 실습의 기본 인프라 구성을 CloudFormation을 통해 스택을 생성하고 자원을 배포할 것입니다.
CloudFormation 템플릿 다운로드
아래 CloudFormation 템플릿 파일을 다운로드합니다.
CH3_LAB2.yaml
5.4 KB
Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter Type: AWS::EC2::KeyPair::KeyName ConstraintDescription: must be the name of an existing EC2 KeyPair. InstanceType: Description: Enter t2.nano, t2.micro Default is t2.micro. Type: String Default: t2.micro AllowedValues: - t2.nano - t2.micro LatestAmiId: Description: (DO NOT CHANGE) Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64' AllowedValues: - /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 Resources: # VPC Flow Log CNFlowLogRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: - vpc-flow-logs.amazonaws.com Action: - 'sts:AssumeRole' Path: / CNFlowLogPolicy: Type: AWS::IAM::Policy Properties: PolicyName: CNFlowLogPolicy PolicyDocument: Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents - logs:DescribeLogGroups - logs:DescribeLogStreams Resource: !GetAtt 'CNFlowLogGroup.Arn' Roles: - !Ref CNFlowLogRole CNFlowLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: CNvpcflowloggroup RetentionInDays: 1 CNFlowLog: Type: AWS::EC2::FlowLog DependsOn: MyVPC Properties: DeliverLogsPermissionArn: !GetAtt CNFlowLogRole.Arn LogGroupName: !Ref CNFlowLogGroup ResourceId: !Ref MyVPC MaxAggregationInterval: 60 ResourceType: VPC TrafficType: REJECT Tags: - Key: Name Value: FlowLogsForVPC LogFormat: '${srcaddr} ${srcport} ${dstaddr} ${dstport} ${protocol} ${action} ${instance-id}' # VPC MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.3.0.0/16 Tags: - Key: Name Value: LAB3-VPC MyIGW: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: LAB3-IGW MyIGWAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref MyIGW VpcId: !Ref MyVPC MyPublicRT: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref MyVPC Tags: - Key: Name Value: LAB3-PUBLIC-RT DefaultPublicRoute: Type: AWS::EC2::Route DependsOn: MyIGWAttachment Properties: RouteTableId: !Ref MyPublicRT DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref MyIGW MyPublicSN: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC AvailabilityZone: !Select [ 0, !GetAZs '' ] CidrBlock: 10.3.0.0/24 Tags: - Key: Name Value: LAB3-PUBLIC-SN MyPublicSNRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref MyPublicRT SubnetId: !Ref MyPublicSN # Security Group ServerSG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Server1 Security Group VpcId: !Ref MyVPC Tags: - Key: Name Value: SERVER-1-SG SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' CidrIp: 0.0.0.0/0 ServerSG2: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Server2 Security Group VpcId: !Ref MyVPC Tags: - Key: Name Value: SERVER-2-SG SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' CidrIp: 0.0.0.0/0 # EC2 Instance ServerEC2: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: !Ref LatestAmiId KeyName: !Ref KeyName Tags: - Key: Name Value: SERVER-1 NetworkInterfaces: - DeviceIndex: 0 SubnetId: !Ref MyPublicSN GroupSet: - !Ref ServerSG AssociatePublicIpAddress: true PrivateIpAddress: 10.3.0.10 UserData: Fn::Base64: !Sub | #!/bin/bash dnf install httpd -y systemctl start httpd && systemctl enable httpd echo "<h1>[인프런] Security Group & Network ACL TEST 1</h1>" > /var/www/html/index.html ServerEC22: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: !Ref LatestAmiId KeyName: !Ref KeyName Tags: - Key: Name Value: SERVER-2 NetworkInterfaces: - DeviceIndex: 0 SubnetId: !Ref MyPublicSN GroupSet: - !Ref ServerSG2 AssociatePublicIpAddress: true PrivateIpAddress: 10.3.0.20 UserData: Fn::Base64: !Sub | #!/bin/bash dnf install httpd -y systemctl start httpd && systemctl enable httpd echo "<h1>[인프런] Security Group & Network ACL TEST 2</h1>" > /var/www/html/index.html
YAML
복사
# CH3_LAB2.yaml 파일 내용
CloudFormation 스택 생성 설정
CloudFormation 서비스 → 스택 (메뉴 진입) → 스택 생성 (버튼 클릭)
1단계 - 스택 생성
템플릿 준비: 기존 템플릿 선택 (선택)
템플릿 소스: 템플릿 파일 업로드 (선택)
파일 선택 → 템플릿 파일 선택 (CH3_LAB2.yaml) → 열기
다음 (버튼 클릭)
2단계 - 스택 세부 정보 지정
스택 이름: LAB3-CF (입력)
InstanceType: t2.micro or t2.nano
KeyName: 각자 생성한 키 페어 (선택)
다음 (버튼 클릭)
3단계 - 스택 옵션 구성
기능: AWS CloudFormation에서 IAM 리소스를 생성할 수 있음을 승인합니다. (체크)
다음 (버튼 클릭)
4단계 - 검토 및 작성
설정된 정보 확인
전송 (버튼 클릭)
생성 자원 확인
VPC
VPC 서비스 → VPC (메뉴 진입) → LAB3-VPC (선택)
리소스 맵 (탭 진입)
플로우 로그 (탭 진입)
EC2 인스턴스
EC2 서비스 → 인스턴스 (메뉴 진입) → 대상 인스턴스 (선택)
보안 그룹
EC2 서비스 → 보안 그룹 (메뉴 진입) → 대상 보안 그룹 (선택)
인바운드 규칙 (탭 진입)
IAM 역할 & 정책
IAM 서비스 → 역할 (메뉴 진입) → 대상 역할 (클릭)
권한 정책: 대상 정책 (확장)
신뢰 관계 (탭 진입) → 신뢰할 수 있는 엔터티 (확인)
CloudWatch 로그 그룹
CloudWatch 서비스 → 로그 그룹 (메뉴 진입) → 대상 로그 그룹 (클릭)

2. 보안 그룹을 통한 Stateful 접근 제어

인스턴스에 구성된 보안 그룹에 Stateful 접근 제어 동작을 확인합니다.
SERVER-1-SG 보안 그룹에 아웃바운드 규칙 삭제
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-1-SG (체크)
아웃바운드 규칙 (탭 진입) → 아웃바운드 규칙 편집 (버튼 클릭)
모든 트래픽, 0.0.0.0/0 → 삭제 (버튼 클릭)
사용자 PC → SERVER-1 통신
사용자 PC에서 SERVER-1에 SSH 접근 시도
사용자 PC에서 SERVER-1에 HTTP 접근 시도
SERVER-1-SG 보안 그룹에 인바운드 규칙 확인
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-1-SG (체크)
인바운드 규칙 (탭 진입)
SERVER-1-SG 보안 그룹에 인바운드 규칙 편집
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-1-SG (체크)
인바운드 규칙 (탭 진입) → 인바운드 규칙 편집 (버튼 클릭)
규칙 추가 (버튼 클릭)
HTTP, 0.0.0.0/0 → 규칙 저장 (버튼 클릭)
VPC Flow Logs 레코드 확인
SERVER-1의 ENI ID 확인
EC2 인스턴스 → SERVER-1 (선택)
네트워킹 (탭 진입) → 네트워크 인터페이스 ID (확인)
CloudWatch 로그 그룹 확인
CloudWatch 서비스 → 로그 그룹 (메뉴 진입) → 대상 로그 그룹 (클릭)
대상 로그 스트림 (클릭)
이벤트 필터링: 사용자 PC의 퍼블릭 IP 주소 (입력)
로그 스트림은 위에서 확인 ENI ID 형태의 대상을 선택합니다.
이벤트 필터링에 사용자 PC의 퍼블릭 IP 주소는 https://ipinfo.io/ip로 접근해서 확인합니다.
SERVER-1 → 외부 인터넷 통신
curl ipinfo.io/ip --connect-timeout 3
Bash
복사
# SERVER-1에서 HTTP 접근
dig +short ipinfo.io
Bash
복사
# SERVER-1에서 도메인 주소 조회
SERVER-1-SG 보안 그룹에 아웃바운드 규칙 확인
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-1-SG (체크)
아웃바운드 규칙 (탭 진입)
SERVER-1-SG 보안 그룹에 아웃바운드 규칙 편집
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-1-SG (체크)
아웃바운드 규칙 (탭 진입) → 아웃바운드 규칙 편집 (버튼 클릭)
규칙 추가 (버튼 클릭)
HTTP, 0.0.0.0/0 → 규칙 저장 (버튼 클릭)
SERVER-1-SG, SERVER-2-SG 보안 그룹에 모든 통신 규칙 추가
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-1-SG (체크)
인바운드 규칙 (탭 진입) → 인바운드 규칙 편집 (버튼 클릭)
규칙 추가 (버튼 클릭)
모든 트래픽, 0.0.0.0/0 → 규칙 저장 (버튼 클릭)
아웃바운드 규칙 (탭 진입) → 아웃바운드 규칙 편집 (버튼 클릭)
규칙 추가 (버튼 클릭)
모든 트래픽, 0.0.0.0/0 → 규칙 저장 (버튼 클릭)
EC2 서비스 → 보안 그룹 (메뉴 진입) → SERVER-2-SG (체크)
인바운드 규칙 (탭 진입) → 인바운드 규칙 편집 (버튼 클릭)
규칙 추가 (버튼 클릭)
모든 트래픽, 0.0.0.0/0 → 규칙 저장 (버튼 클릭)
아웃바운드 규칙 (탭 진입) → 아웃바운드 규칙 편집 (버튼 클릭)
규칙 추가 (버튼 클릭)
모든 트래픽, 0.0.0.0/0 → 규칙 저장 (버튼 클릭)

3. 네트워크 ACL을 통한 Stateless 접근 제어

서브넷에 구성된 네트워크 ACL에 Stateless 접근 제어 동작을 확인합니다.
기본 네트워크 ACL 확인
VPC 서비스 → 네트워크 ACL (메뉴 진입)
VPC ID: LAB3-VPC (대상 선택)
인바운드 규칙 (확인)
아웃바운드 규칙 (확인)
신규 네트워크 ACL 생성 및 서브넷 연결
신규 네트워크 ACL 생성
VPC 서비스 → 네트워크 ACL (메뉴 진입) → 네트워크 ACL 생성 (버튼 클릭)
이름: LAB3-NACL (입력)
VPC: LAB3-VPC (선택)
네트워크 ACL 생성 (버튼 클릭)
서브넷 연결
LAB3-NACL (체크) → 서브넷 연결 (탭 진입) → 서브넷 연결 편집 (버튼 클릭)
이용 가능한 서브넷: LAB3-PUBLIC-SN (체크)
변경 사항 저장 (버튼 클릭)
사용자 PC → SERVER-1 통신
사용자 PC에서 SERVER-1에 SSH 접근 시도
사용자 PC에서 SERVER-2에 SSH 접근 시도
네트워크 ACL의 인바운드 규칙 추가
VPC 서비스 → 네트워크 ACL (메뉴 진입) → LAB3-NACL (선택)
인바운드 규칙 (탭 진입) → 인바운드 규칙 편집 (버튼 클릭) → 새 규칙 추가 (버튼 클릭)
규칙 번호: 100
유형: SSH(22)
소스: 0.0.0.0/0
허용/거부: 허용
변경 사항 저장 (버튼 클릭)
네트워크 ACL의 아웃바운드 규칙 추가
VPC 서비스 → 네트워크 ACL (메뉴 진입) → LAB3-NACL (선택)
아웃바운드 규칙 (탭 진입) → 아웃바운드 규칙 편집 (버튼 클릭) → 새 규칙 추가 (버튼 클릭)
규칙 번호: 100
유형: 사용자 지정 TCP
포트 범위: 1024-65535
소스: 0.0.0.0/0
허용/거부: 허용
변경 사항 저장 (버튼 클릭)
SERVER-1 → 외부 인터넷 통신
curl wttr.in/seoul --connect-timeout 3
Bash
복사
# 외부 인터넷 통신 (curl)
네트워크 ACL의 아웃바운드 규칙 추가
VPC 서비스 → 네트워크 ACL (메뉴 진입) → LAB3-NACL (선택)
아웃바운드 규칙 (탭 진입) → 아웃바운드 규칙 편집 (버튼 클릭) → 새 규칙 추가 (버튼 클릭)
규칙 번호: 110
유형: HTTP(80)
소스: 0.0.0.0/0
허용/거부: 허용
변경 사항 저장 (버튼 클릭)
네트워크 ACL의 인바운드 규칙 추가
VPC 서비스 → 네트워크 ACL (메뉴 진입) → LAB3-NACL (선택)
인바운드 규칙 (탭 진입) → 인바운드 규칙 편집 (버튼 클릭) → 새 규칙 추가 (버튼 클릭)
규칙 번호: 110
유형: 사용자 지정 TCP
포트 범위: 1024-65535
소스: 0.0.0.0/0
허용/거부: 허용
변경 사항 저장 (버튼 클릭)

4. 생성 자원 삭제

네트워크 ACL 삭제
서브넷 연결 해제
VPC 서비스 → 네트워크 ACL (메뉴 진입) → LAB3-NACL (선택)
서브넷 연결 (탭 진입) → 서브넷 연결 편집 (버튼 클릭)
선택한 서브넷: LAB3-PUBLIC-SN (대상 삭제)
변경 사항 저장 (버튼 클릭)
네트워크 ACL 삭제
VPC 서비스 → 네트워크 ACL (메뉴 진입) → LAB3-NACL (선택)
작업 → 네트워크 ACL 삭제 (선택)
삭제 (입력) → 삭제 (버튼 클릭)
CloudWatch 로그 그룹 삭제
CloudWatch 서비스 → 로그 그룹 (메뉴 진입) → 대상 로그 그룹 (선택)
작업 → 로그 그룹 삭제 (선택)
삭제 (버튼 클릭)
CloudFormation 스택 삭제
CloudFormation 서비스 → 스택 (메뉴 진입)
대상 스택 선택 → 삭제 (버튼 클릭)
약 3분 내외 시간 소요
여기까지 3장 실습 - 보안 그룹과 네트워크 ACL 구성 실습을 마칩니다.
수고하셨습니다 :)