AWS - Security (2): VPC Traffic Mirroring, WAF
이 포스트는 네트워크 환경에서 발생하는 트래픽을 복제 후 특정 장치로 전달하여 해당 정보를 모니터링할 수 있는 VPC Traffic Mirroring 과 웹 애플리케이션 전용 방화벽인 AWS WAF 에 대해 알아본다.
- 1. VPC Traffic Mirroring
- 2. AWS WAF (Web Application Firewall)
- 3. AWS WAF 를 통한 웹 애플리케이션 보안 테스트
아래는 이번 포스트에서 다뤄볼 범위 도식화이다.
1. VPC Traffic Mirroring
Traffic Mirroring 은 네트워크 환경에서 발생하는 트래픽을 복제 후 특정 장치로 전달하여 해당 정보를 모니터링할 수 있는 기능이다.
AWS 에서는 VPC Traffic Mirroring
을 통해 Traffic Mirroring 기능을 유사하게 지원한다.
VPC Flow Log 와 VPC Traffic Mirroring 차이는 아래와 같다.
항목 | VPC Flow Log | VPC Traffic Mirroring |
---|---|---|
수집 데이터 | VPC 상 네트워크 플로우를 로그 형태로 표현 | VPC 상 트래픽의 실제 네트워크 패킷 정보 수집 |
Target | S3 Bucket or CloudWatch Logs 로 전달 | 다른 ENI or NLB 로 전달 |
구조 | Record 형태로 제한된 필드 정보 제공 | 실제 네트워크 패킷 |
즉, VPC Flow Log 는 정형화된 필드로 이루어진 로그이고 VPC Traffic Mirroring 은 실제 네크워크 패킷이라는 것이다.
트래픽의 상세한 분석이 필요할 경우 VPC Traffic Mirroring 을 통해 실제 네트워크 패킷을 수집하여 활용한다.
1.1. VPC Traffic Mirroring 구성
1) Mirror Source
- Traffic Mirroring 을 수행할 대상
- VPC 내에 존재하는 AWS 리소스가 대상
- VPC Traffic Mirroring 은 ENI (Elastic Network Interface) or NLB 를 Mirror Source 로 사용 가능
2) Mirror Target
- Traffic Mirroring 을 통해 복제된 트래픽을 전달할 목적지 대상
- Source 와 다른 ENI or NLB 가 될 수 있음 (=Source 와 Target 은 동일한 대상이 될 수 없음)
3) Mirror Filter
- Mirror Filter 를 통해 트래픽 대상 정의
- 출발지/목적지 IP 대역 or 프로토콜 or 포트 번호 등을 지정하여 필터링 대상의 트래픽 지정
- Inbound or Outbound 형태로 방향성에 따라 지정
- Mirror Filter 내용이 없으면 대상이 없다는 의미로서 Traffic Mirroring 을 수행하지 않음
4) Mirror Session
- Traffic Mirroring 을 사용하는 Mirror Source 와 Mirror Target 간의 연결을 말하는 단위
- Mirror Session 을 통해 Source 와 Target 을 지정하고 Filter 를 연결하여 Traffic Mirroring 연결 구성을 생성
1.2. VPC Traffic Mirroring 동작
VPC Traffic Mirroring 설정은 Mirror Target 지정 → Mirror Filter 구성 → Mirror Session 생성(Source, Target, Filter 연결) 단계로 수행한다.
① 복제된 트래픽을 전달받을 Mirror Target 지정 (Target-EC2 의 ENI)
② Mirror Filter 구성 (출발지/목적지 IP 대역, 프로토콜, 포트 번호, Inbound/Outbound 지정)
③ Mirror Session 생성 (Mirror Source 지정, 생성한 Mirror Target 지정, Mirror Filter 지정)
④ SRC-EC2 에서 발생한 트래픽을 Mirror Filter 에서 매칭 여부 판단
⑤ Mirror Filter 에 매칭될 경우 해당 트래픽을 복제하여 Mirror Target 에 전달
이 때 해당 트래픽은 VXLAN Tunneling참고 에 의해 보호되어 전달됨
VXLAN (Virtual Extensible Local Area Network) 은 원본 데이터를 송수신할 때 VXLAN 헤더 정보를 감싸서 전달하는 터널링 방법을 사용 ↩
1.3. VPC Traffic Mirroring 제약사항
1) EC2 Instance 유형 제약
- Nitro 유형만 지원
- EC2 Nitro 유형은 Nitro 시스템에 구축된 인스턴스 참고
2) Mirror Source 와 Mirror Target 위치
- Mirror Source 와 Mirror Target 은 동일 VPC 이거나 다른 VPC 라면 VPC Peering 이나 Transit Gateway 를 통해 연결되어 있어야 함
3) Mirror Session 수
- 계정 당 1,000 개의 세션 제약이 있으며 ENI 당 3개의 세션 제약
4) 트래픽의 프로토콜 제약
- ARP, DHCP, NTP, EC2 메타데이터 등에 대해서는 Traffic Mirroring 불가
2. AWS WAF (Web Application Firewall)
WAF 는 웹 애플리케이션 보안에 특화된 전용 방화벽으로 SQL Injection 공격, XSS (Cross-Site Scripting) 공격, CSRF (Cross-Site Request Forgery) 공격 등과 같은 웹 서비스 취약점에 대한 공격을 탐지하고 차단하는 기능을 수행한다.
웹 접근 트래픽에 대한 페이로드 분석 및 패턴 기반의 필터링을 통해 공격을 탐지하고 차단한다.
2.1. AWS WAF
AWS WAF 는 AWS 에서 관리하는 웹 애플리케이션 전용 방화벽으로 SQL Injection 공격, XSS (Cross-Site Scripting) 공격, CSRF (Cross-Site Request Forgery) 공격 등과 같은 공격 패턴을 차단하는 보안 규칙 및 사용자 정의 특정 트래픽 패턴을 필터링하는 규칙을 생성하여 웹 애플리케이션에 도달하는 트래픽을 제어할 수 있다.
AWS WAF 는 CloudFront, ALB, API Gateway 배포 가능하다.
AWS WAF 는 빠른 규칙 전파 및 업데이트가 수행되며, 서비스 영향없이 유연하게 구성 가능하다.
최소 요금 및 사전 약정이 없기 때문에 사용한 만큼한 비용을 지불한다.
AWS WAF 의 모든 기능은 API 또는 AWS Management Console 을 사용해 구성 가능하다. 이를 통해 DevOps 에서 애플리케이션 개발하면서 웹 보안을 강화하는 애플리케이션별 규칙을 정의할 수 있다.
2.2. AWS WAF 주요 기능
1) 웹 트래픽 필터링
- 웹 취약점 공격을 차단하는 규칙을 생성하여 웹 트래픽을 필터링하도록 규칙 생성
- 여러 웹 사이트로 배포할 수 있도록 중앙에서 관리하는 웹 트래픽 필터링 규칙 집합 생성 가능
2) 자동화 및 유지 관리
- API 를 통해 규칙 자동 생성 및 유지 관리하고, 개발 및 설계 프로세스에 규칙 통합 가능
- AWS CloudFormation 템플릿으로 자동 배포 및 프로비저닝 가능
3) 가시성 보장
- CloudWatch 를 통해 다양한 지표 제공
- 임계값 초과 or 특정 공격이 발생하는 경우 사용자 지정 경보 가능
4) AWS Firewall Manager 와 통합
- AWS Firewall Manager 를 통해 AWS WAF 배포를 중앙에서 구성 및 관리 가능
- AWS Firewall Manager 는 정책 위반 여부를 자동으로 감사하고 이를 보고하여 즉각 대처 및 조치 가능
2.3. AWS WAF 구성
AWS WAF 는 단계별로 Web ACL
, Rule
, Statement
로 구성된다.
1) Web ACL
- AWS WAF 의 최상위 컴포넌트
- 하위 컴포넌트인 Rule 을 추가하여 AWS 리소스 보호
Web ACL
을 사용하여 CloudFront 배포, API Gateway REST API or ALB 가 응답하는 웹 요청을 세부적으로 제어Web ACL
의 하위 컴포넌트로는Rule
이 있으며,Web ACL
에 포함되는Rule
은 최대 100개까지 가능Rule
은 사전 정의된 규칙이나 사용자 정의 규칙을 선택하여 생성
2) Rule
Web ACL
의 하위 컴포넌트- 검사 기준을 정의하고 기준을 충복할 경우 수행할 작업(Match Action) 을 포함
- Rule 을 사용하여 일치 대상에 대해 요청을 차단하거나 허용 가능
- Rule 의 하위 컴포넌트로는
Statement
가 있으며, Rule 에 포함되는Statement
는 최대 5개까지 가능 - 각
Statement
에 대한 Match Action 수행 가능
3) Statement
- 웹 필터링의 상세 조건을 정의하는 컴퓨넌트
- 상세 조건은
Inspect
,Match Condition
,Transformation
,Action
으로 구분Inspect
: Inspection 대상 정의Match Condition
: Inspection 대상에 대한 분류 방법Transformation
(Optional): Match Condition 의 추가 옵션 부여Action
: 필터링 동작 방식 정의, Allow/Block/Count 중 선택
3. AWS WAF 를 통한 웹 애플리케이션 보안 테스트
웹 애플리케이션의 취약점이 있는 웹 서버 배포하여 모의 해킹 후 AWS WAF 에 의해 웹 취약점 공격을 점검하고 차단해본다.
- 기본 환경 구성
- CloudFormation 적용
- CloudFormation 을 통해 생성된 자원 확인
- 기본 환경에서 웹 취약점 공격
- 사전 작업
- Command Injection 공격
- XSS (Cross Site Script) 공격
- VPN 우회 접근
- AWS WAF 생성 및 배포
- Web ACL 생성
- Web ACL 배포 (ALB)
- 웹 취약점 공격 검증
- 웹 취약점 공격
- Web ACL 결과 차트 및 샘플 요청
- Resource 삭제
3.1. 기본 환경 구성
- CloudFormation 적용
- CloudFormation 을 통해 생성된 자원 확인
- 기본 환경에서 웹 취약점 공격
- 사전 작업
- Command Injection 공격
- XSS (Cross Site Script) 공격
- VPN 우회 접근
3.1.1. CloudFormation 적용
[CloudFormation] - [Stacks]
CloudFormation Template Download CloudFormation Template (펼쳐보기)
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.
LatestAmiId:
Description: (DO NOT CHANGE)
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 20.0.0.0/16
Tags:
- Key: Name
Value: jhMy-VPC
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: jhMy-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: jhMy-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: 20.0.0.0/24
Tags:
- Key: Name
Value: jhMy-Public-SN
MyPublicSN2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: 20.0.1.0/24
Tags:
- Key: Name
Value: jhMy-Public-SN-2
MyPublicSNRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN
MyPublicSNRouteTableAssociation2:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN2
WebSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: WEB Security Group
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: jhWeb-SG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
DVWAEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: jhDVWA-EC2
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref MyPublicSN
GroupSet:
- !Ref WebSG
AssociatePublicIpAddress: true
PrivateIpAddress: 20.0.0.10
UserData:
Fn::Base64: !Sub |
#!/bin/bash
hostname DVWA-EC2
yum install -y httpd mariadb-server mariadb php php-mysql php-gd
systemctl start mariadb httpd
systemctl enable httpd.service mariadb.service
echo -e "\n\nqwe123\nqwe123\ny\nn\ny\ny\n" | /usr/bin/mysql_secure_installation
mysql -uroot -pqwe123 -e "create database dvwa; GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost' IDENTIFIED BY 'qwe123'; flush privileges;"
wget https://github.com/ethicalhack3r/DVWA/archive/master.zip
unzip master.zip
mv DVWA-master/* /var/www/html/
mv DVWA-master/.htaccess /var/www/html/
cp /var/www/html/config/config.inc.php.dist /var/www/html/config/config.inc.php
sed -i "s/p@ssw0rd/qwe123/g" /var/www/html/config/config.inc.php
sed -i 's/allow_url_include = Off/allow_url_include = on/g' /etc/php.ini
chmod 777 /var/www/html/hackable/uploads
chmod 777 /var/www/html/config
chmod 666 /var/www/html/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt
systemctl restart httpd.service
ALBTG:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: jhALBTG
Port: 80
Protocol: HTTP
HealthCheckPath: '/login.php'
VpcId: !Ref MyVPC
Targets:
- Id: !Ref DVWAEC2
Port: 80
MyALB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Scheme: internet-facing
Name: jhMy-ALB
SecurityGroups:
- !Ref WebSG
Subnets:
- !Ref MyPublicSN
- !Ref MyPublicSN2
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref ALBTG
LoadBalancerArn: !Ref MyALB
Port: 80
Protocol: HTTP
key pair 생성은 AWS - Infra 의 3. 사전 준비 를 참고하세요.
DVWA (Damn Vulnerable Web Application)
웹 취약점을 연구할 수 있도록 취약하게 설정되어 있는 웹 애플리케이션 서비스 환경
위에서 Subnet-2 (20.0.1.0/24) 는 필요없는 듯..
3.1.2. CloudFormation 을 통해 생성된 자원 확인
- VPC
- jhMy-VPC
- IP CIDR: 20.0.0.0/16
- jhMy-VPC
- Public Subnet
- jhMy-Public-SN
- IP CIDR: 20.0.0.0/24
- AZ: ap-northeast-2a
- jhMy-Public-SN-2
- IP CIDR: 20.0.1.0/24
- AZ: ap-northeast-2c
- jhMy-Public-SN
- Public Routing Table
- jhMy-Public-RT
- 연결: jhMy-Public-SN, jhMy-Public-SN-2
- 라우팅 정보: 대상: 0.0.0.0/0, 타깃: jhMy-IGW
- jhMy-Public-RT
- IGW
- jhMy-IGW
- 연결: jhMy-VPC
- jhMy-IGW
- Public EC2 Instance
- jhDVWA-EC2
- 연결: jhMy-Public-SN
- Private IP: 20.0.0.10 (Public IP 사용)
- 데몬: HTTP 구성
- jhDVWA-EC2
- ALB
- jhMy-ALB
- 연결: jhDVWA-EC2
- 리스너: TCP 80
- jhMy-ALB
- Security Group
- jhWeb-SG
- 연결: jhDVWA-EC2, jhMy-ALB
- inbound rule
- SSH, HTTP(Source) - 0.0.0.0/0
- jhWeb-SG
3.1.3. 기본 환경에서 웹 취약점 공격
- 사전 작업
- Command Injection 공격
- XSS (Cross Site Script) 공격
- VPN 우회 접근
3.1.3.1. 사전 작업
DVWA EC2 에 접근 후 보안 레벨을 낮춘다.
ALB 의 DNS 주소로 웹 브라우저에서 접근한 후 좌측 메뉴에서 DVWA Security 메뉴에 접속하여 보안 등급을 Impossible 에서 Low 로 변경한다. (보안이 가장 취약한 등급으로 동작하도록)
3.1.3.2. Command Injection 공격
Command Injection 공격은 취약점을 이용하여 임의의 명령을 주입해 웹 서버의 정보를 탈취하는 공격 기법이다.
DVWA 좌측 메뉴의 Command Injection 메뉴에 진입한다.
해당 페이지는 IP 주소 입력 시 해당 IP 주소로 ping 을 테스트하는 용도이다.
8.8.8.8 ; cat /etc/passwd
를 입력하면 8.8.8.8 ping 테스트 결과와 함께 cat /etc/passwd 명령어로 인해 웹 서버에 있는 계정 목록이 모두 노출되고 있다.
즉, 의도하지 않은 명령어를 주입하여 웹 서버 리눅스 쉘에서 필요한 정보들을 확인할 수 있다.
3.1.3.3. XSS (Cross Site Script) 공격
XSS 공격은 의도적으로 입력한 정보를 일반 사용자가 출력할 때 악성 스크립트가 실행되도록 하는 공격 기법이다.
DVWA 좌측 메뉴의 XSS (Reflected) 메뉴에 진입한다.
해당 페이지는 단어 입력 시 ‘Hello XX’ 라고 출력하는 코드가 구성된 페이지이다.
<script>alert(document.cookie)</script>
를 입력하면 HTML 로 삽입한 자바스크립트가 실행되어 쿠키값을 팝업창으로 출력한다.
3.1.3.4. VPN 우회 접근
VPN 을 통해 우회하여 DVWA 인스턴스에 접속해본다.
크롬 확장 프로그램 중 Browsec 설치 후 네덜란드로 우회한 후 DVWA 웹 서버 접속 시 제한없이 정상적으로 접근이 되고 있다.
3.2. AWS WAF 생성 및 배포
- Web ACL 생성
- Web ACL 배포 (ALB)
3.2.1. Web ACL 생성
AWS WAF 설정을 위해 WebACL 을 생성한다.
[WAF & Shield] - [AWS WAF] - [Web ACLs] - [Create web ACL]
다음 스텝인 Add rules and rule groups 스텝에서 Add rules 중 Add managed rule groups 를 선택한다.
AWS managed rule groups 에서 아래 3개를 web ACL 에 추가한다.
- Anonymous IP list
- 직접적인 연결이 아닌 VPN 이나 Proxy, Tor node 에 의해 접근하는 대상을 차단
- Core rule set
- OWASP참고 에서 정의한 웹 주요 취약점을 탐지하여 차단
- SQL database
- 허가되지 않은 SQL Injection 공격을 탐지하여 차단
OWASP↩
오픈 소스 웹 애플리케이션 보안 프로젝트로 웹에 관한 정보 노출, 악성 파일 및 스크립트, 취약점 등을 연구하여 웹 애플리케이션의 취약점(OWASP TOP 10) 을 발표함
이제 사용자 정의 Rule 을 추가한다.
Add rules and rule groups 스텝에서 Add rules 중 Add my own rules and rule groups 를 선택한다.
이 후 스텝들은 모두 그대로 유지하여 생성한다.
3.2.2. Web ACL 배포 (ALB)
AWS WAF 의 Web ACL 은 CloudFront, ALB, API Gateway 에 배포할 수 있다. 지금은 ALB 에 배포하여 테스트한다.
[WAF & Shield] - [AWS WAF] - [Web ACLs] - [생성한 web ACL 선택] - [Associated AWS resources tab 진입] - [Add AWS resources 선택]
3.3. 웹 취약점 공격 검증
- 웹 취약점 공격
- Web ACL 결과 차트 및 샘플 요청
3.3.1. 웹 취약점 공격
이제 3.1.3.1. 사전 작업 에서 했던 웹 취약점 공격을 다시 확인해본다.
3.3.3.1. Command Injection 공격
DVWA 좌측 메뉴의 Command Injection 메뉴에 진입 시 403 Forbidden 이 출력되며 접근이 거부된다.
Web ACL Rule 중 사용자 정의 Rule 인 NoExecURI 에 의해 차단된다.
3.3.3.2. XSS (Cross Site Script) 공격
DVWA 좌측 메뉴의 XSS (Reflected) 메뉴에 진입 후 <script>alert(document.cookie)</script>
를 입력하면 403 Forbidden 이 출력되며 접근이 거부된다.
Web ACL Rule 중 Core rule set 에 의해 차단된다.
3.3.3.3. VPN 우회 접근
VPN 을 통해 우회하여 DVWA 인스턴스에 접속 시 403 Forbidden 이 출력되며 접근이 거부된다.
Web ACL Rule 중 Anonymous IP List 에 의해 차단된다.
여기선 WebACL 에서 생성한 Rule 에 대해 매칭되는 대상은 Block 으로 설정하여 403 Forbidden 으로 차단하고 있는 것이다.
Block 설정이 아닌 Count 설정을 통해 탐지 상태를 카운트 할 수도 있다.
3.3.2. Web ACL 결과 차트 및 샘플 요청
생성된 Rule 에 매칭된 대상에 대한 결과 차트를 CloudWatch 그래프 형태로 확인 가능하다.
[WAF & Shield] - [AWS WAF] - [Web ACLs] - [생성한 Web ACL 선택]
하단에 Sampled requests 에서 Allowed Request 와 Blocked Request 정보를 확인할 수 있다.
3.4. Resource 삭제
- Web ACL 배포 해제 ([WAF & Shield] - [AWS WAF] - [Web ACLs] - [생성한 Web ACL 선택] - [Associated AWS resources tab 진입] - [ABL 선택] - [Disassociate])
- Web ACL 삭제
- CloudFormation Stack 삭제 ([CloudFormation] - [Stacks] - [Delete])
CloudFormation Stack 이 삭제되면 위의 3.1.2. CloudFormation 을 통해 생성된 자원 확인 의 자원이 모두 삭제되었는지 확인한다.
참고 사이트 & 함께 보면 좋은 사이트
본 포스트는 김원일, 서종호 저자의 따라하며 배우는 AWS 네트워크 입문를 기반으로 스터디하며 정리한 내용들입니다.