1. CloudFormation을 통한 기본 인프라 배포
이번 실습의 기본 인프라 구성을 CloudFormation을 통해 스택을 생성하고 자원을 배포할 것입니다.
CloudFormation 템플릿 다운로드
•
아래 CloudFormation 템플릿 파일을 다운로드합니다.
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 형태의 대상을 선택합니다.
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 구성 실습을 마칩니다.
수고하셨습니다 :)