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, t3.micro Default is t3.micro. Type: String Default: t3.micro AllowedValues: - t2.nano - t3.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: t3.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 구성 실습을 마칩니다.
수고하셨습니다 :)