AWS - Security (2): VPC Traffic Mirroring, WAF


이 포스트는 네트워크 환경에서 발생하는 트래픽을 복제 후 특정 장치로 전달하여 해당 정보를 모니터링할 수 있는 VPC Traffic Mirroring 과 웹 애플리케이션 전용 방화벽인 AWS WAF 에 대해 알아본다.


아래는 이번 포스트에서 다뤄볼 범위 도식화이다.

이번 포스트 범위 도식화


1. VPC Traffic Mirroring

Traffic Mirroring네트워크 환경에서 발생하는 트래픽을 복제 후 특정 장치로 전달하여 해당 정보를 모니터링할 수 있는 기능이다.
AWS 에서는 VPC Traffic Mirroring 을 통해 Traffic Mirroring 기능을 유사하게 지원한다.

VPC Flow Log 와 VPC Traffic Mirroring 차이는 아래와 같다.

항목VPC Flow LogVPC Traffic Mirroring
수집 데이터VPC 상 네트워크 플로우를 로그 형태로 표현VPC 상 트래픽의 실제 네트워크 패킷 정보 수집
TargetS3 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 연결) 단계로 수행한다.

VPC Traffic Mirroring 동작

① 복제된 트래픽을 전달받을 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 유형 제약

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) 공격 등과 같은 웹 서비스 취약점에 대한 공격을 탐지하고 차단하는 기능을 수행한다.
웹 접근 트래픽에 대한 페이로드 분석 및 패턴 기반의 필터링을 통해 공격을 탐지하고 차단한다.

WAF 동작


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 는 빠른 규칙 전파 및 업데이트가 수행되며, 서비스 영향없이 유연하게 구성 가능하다.
최소 요금 및 사전 약정이 없기 때문에 사용한 만큼한 비용을 지불한다.
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 로 구성된다.

AWS WAF 구성

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 - Infra3. 사전 준비 를 참고하세요.

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
  • 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
  • Public Routing Table
    • jhMy-Public-RT
      • 연결: jhMy-Public-SN, jhMy-Public-SN-2
      • 라우팅 정보: 대상: 0.0.0.0/0, 타깃: jhMy-IGW
  • IGW
    • jhMy-IGW
      • 연결: jhMy-VPC
  • Public EC2 Instance
    • jhDVWA-EC2
      • 연결: jhMy-Public-SN
      • Private IP: 20.0.0.10 (Public IP 사용)
      • 데몬: HTTP 구성
  • ALB
    • jhMy-ALB
      • 연결: jhDVWA-EC2
      • 리스너: TCP 80
  • Security Group
    • jhWeb-SG
      • 연결: jhDVWA-EC2, jhMy-ALB
      • inbound rule
        • SSH, HTTP(Source) - 0.0.0.0/0

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 명령어로 인해 웹 서버에 있는 계정 목록이 모두 노출되고 있다.

Command Injection 공격

즉, 의도하지 않은 명령어를 주입하여 웹 서버 리눅스 쉘에서 필요한 정보들을 확인할 수 있다.


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 웹 서버 접속 시 제한없이 정상적으로 접근이 되고 있다.

VPN 우회 접근


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]

Web ACL 생성 (1): AWS Resource 연결

다음 스텝인 Add rules and rule groups 스텝에서 Add rulesAdd 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 rulesAdd my own rules and rule groups 를 선택한다. Web ACL 생성 (2): 사용자 정의 Rule 추가 Web ACL 생성 (3): 생성된 4개의 Rule 확인

이 후 스텝들은 모두 그대로 유지하여 생성한다.


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 선택]

Web ACL 과 AWS Resource 연결


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 선택]

Web ACL Rule 에 대한 Allow/Block 그래프

하단에 Sampled requests 에서 Allowed Request 와 Blocked Request 정보를 확인할 수 있다.

Web ACL 샘플 요청 정보


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 네트워크 입문를 기반으로 스터디하며 정리한 내용들입니다.






© 2020.08. by assu10

Powered by assu10