DEVELOP/AWS

AWS | WAF, DVWA, Amazon Inspector, NAT instance vs NAT Gateway 비교

Hanee_ 2023. 5. 3. 18:00

실행되고 있는 웹서버를 우선 멈춘다.

[ec2-user@ip-10-36-6-37 ~]$ sudo systemctl stop httpd

 

WAF

AWS WAF는 고객이 정의한 조건에 따라 웹 요청을 허용, 차단 또는 모니터링(계수)하는 규칙을 구성하여 공격으로부터 웹 애플리케이션을 보호하는 웹 애플리케이션 방화벽

  • IP 주소, HTTP 헤더, HTTP 본문, URI 문자열, SQL 명령어 주입 및 교차 사이트 스크립팅이 포함된다.
  • AWS WAF는 기본 서비스에서 웹 사이트에 대한 요청을 수신하면, 규칙과 비교하여 검사하도록 해당 요청을 AWS WAF로 전달한다. 요청이 규칙에 정의된 조건에 부합하는 경우, AWS WAF에서 기본 서비스에 정의한 작업에 따라 해당 요청을 허용 또는 차단하도록 지시한다.
  • AWS WAF는 AWS 고객이 웹 사이트와 애플리케이션을 위한 콘텐츠를 전달하기 위해 흔히 사용하는 서비스인 Amazon CloudFront 및 ALB(Application Load Balancer)와 긴밀히 통합된다. Amazon CloudFront에서 AWS WAF를 사용할 때는 전 세계 곳곳에서 최종 사용자에게 가까운 곳에 위치한 모든 AWS 엣지 로케이션에서 규칙이 실행된다. 즉, 보안으로 인해 성능이 저하되지는 않는다. 차단된 요청은 고객 웹 서버에 도달하기 전에 중지된다. Application Load Balancer에서 AWS WAF를 사용할 때는 규칙이 리전에서 실행되고 규칙을 사용해 인터넷과 직접 연결된 부분과 내부 로드 밸런서를 보호할 수 있다.

SQL 명령어 주입교차 사이트 스크립팅(XSS)과 같은 일반적인 공격 기술로부터 웹 사이트를 보호할 수 있다.

 

WAF 실습

취약점이 있는 환경을 구성해보자

DVWA를 활용할 것인데 DVWA(Damn Vulnerable Web Application)란 취약점 진단 및 모의해킹 공부/실습을 할 수 있도록 만들어진 취약한 웹 어플리케이션이다.

 

도커를 이용하여 간단하게 웹서버를 세팅해준다.

sudo yum install docker -y
sudo systemctl enable --now docker
sudo docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

db setup을 누르고 admin, password로 로그인하면 로그인 된다.

wget https://inspector-agent.amazonaws.com/linux/latest/install
sudo bash install

 

 

Amazon Inspector

지속적으로 스캔하는 취약성 관리 서비스

  • AWS취약성을 위한 워크로드 Amazon Inspector는 Amazon ECR (Amazon 엘라스틱 컨테이너 레지스트리) 에 있는 Amazon EC2 인스턴스와 컨테이너 이미지를 자동으로 검색하여 소프트웨어 취약성과 의도하지 않은 네트워크 노출이 있는지 검사한다.
  • 소프트웨어 취약점이나 네트워크 문제가 발견되면 Amazon Inspector에서 검색 결과를 생성한다. 
  • 검색 결과는 취약성을 설명하고, 영향을 받는 리소스를 식별하며, 취약성의 심각도를 평가하며, 수정 지침을 제공한다. Amazon Inspector 콘솔을 사용하여 계정에 대한 검색 결과에 대한 세부 정보를 여러 가지 방법으로 분석하거나 다른 항목을 통해 검색 결과를 보고 처리할 수 있다.

 

 

✅ aws inspector 구성하기

평가 템플릿을 정의하여 환경을 지속적으로 평가한다. 위 경우 15분마다 점검하도록 구성하였다.

 

앞서 구성한 사항들을 실행시킨다.

 

다음과 같이 설정한 환경에 대한 분석결과를 볼 수 있다.

 

 

 

Amazon SNS

A2A 및 A2P 메시징을 위한 완전관리형 게시/구독 서비스

  • 게시자에서 구독자(생산자 및 소비자라고도 함)로 메시지를 전송하는 관리형 서비스이다.
  • 게시자는 논리적 액세스 지점 및 커뮤니케이션 채널인 주제에 메시지를 전송하여 구독자와 비동기식으로 통신한다.
  • 클라이언트는 SNS 주제를 구독하고 Amazon Kinesis Data Firehose, Amazon SQS, AWS Lambda, HTTP, 이메일, 모바일 푸시 알림 및 모바일 문자 메시지(SMS)와 같이 지원되는 엔드포인트 유형을 사용하여 게시된 메시지를 수신할 수 있다.

 

✅ SNS 구성하기

메시지를 수신받을 구독을 생성한다. 이메일을 입력해준다.

 

알림이 발생하는 규칙을 생성한다. 

 

규칙에 따라 이벤트 유형에 따른 상황이 벌어지면 그 상황에 대해 메일로 알려주게 된다.

my-bastion 인스턴스를 체크하고 상태를 눌러 중지를 시켜본다

 

메일이 수신되는 것을 볼 수 있다.

 

 

cloudwatch log 실습

-> root 권한으로 진행해야한다!

[ec2-user@ip-10-36-6-37 ~]$ sudo su - root
[root@ip-10-36-6-37 httpd]# yum install -y httpd
[root@ip-10-36-6-37 httpd]# systemctl enable --now httpd
[root@ip-10-36-6-37 httpd]# yum install -y awslogs

[root@ip-10-36-6-37 httpd]# vi /etc/awslogs/awslogs.conf

[/var/log/httpd/access_log]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/access_log
buffer_duration = 5000
log_stream_name = {instance_id}
log_group_name = /var/log/httpd/access_log

[/var/log/httpd/error_log]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/error_log
buffer_duration = 5000
log_stream_name = {instance_id}
log_group_name = /var/log/httpd/error_log

[root@ip-10-36-6-37 httpd]# systemctl enable --now awslogsd
[root@ip-10-36-6-37 httpd]# vi /etc/awslogs/awscli.conf

[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-2

[root@ip-10-36-6-37 httpd]# systemctl restart httpd
[root@ip-10-36-6-37 httpd]# systemctl restart awslogsd

 

웹서버를 접속하면 로그그룹에 로그가 아래와같이 남는 것을 볼 수 있다.

 

인스턴스에 역할을 수정하여 인스턴스 통해 로그를 볼 수 있다.

 

타겟그룹도 새로 설정해준다.

 

 

 

레코드를 생성하여 도메인을 사용하여 접속할 수 있도록 구성한다. 

 

[root@ip-10-36-6-37 httpd]# systemctl stop httpd
[root@ip-10-36-6-37 httpd]# docker container ls -a 
[root@ip-10-36-6-37 httpd]# docker container start dvwa
[root@ip-10-36-6-37 httpd]# docker container ls -a

현재 타겟그룹 unhealthy가 뜨는 상황

타겟그룹에 하나의 인스턴스만 있을 땐 health 체크가 안되도 그냥 접속이 가능하다. 하나만 있을 땐, 그냥 forwarding 시켜주는 특징이 있다. 

 

WAF ACLs 세팅하기

리전이 서울인지 확인해야한다.

 

 

 

 

[root@ip-10-36-6-37 ~]# docker container exec -it dvwa /bin/bash
root@4bdc064a2daa:/#

 

NAT 인스턴스

네트워크 주소 변환을 제공하는 고유한 AMI를 생성하고 자신의 AMI를 사용하여 EC2 인스턴스를 NAT 인스턴스로 시작할 수 있다. 퍼블릭 서브넷에 있는 NAT 인스턴스를 시작하여 프라이빗 서브넷에 있는 인스턴스가 인터넷 또는 다른 AWS 서비스로의 아웃바운드 IPv4 트래픽을 시작하되, 인터넷에서 시작된 인바운드 트래픽은 인스턴스가 수신하지 못하게 막을 수 있다. 

 

 

NAT 인스턴스 설정

 

 

 

[ec2-user@ip-10-36-35-83 ~]$ sudo sysctl -w net.ipv4.ip_forward=1
[ec2-user@ip-10-36-35-83 ~]$ sudo /sbin/iptables -t nat -A POSTROUTING -o enX0 -j MASQUERADE
[ec2-user@ip-10-36-35-83 ~]$ sudo yum install -y iptables-services
[ec2-user@ip-10-36-35-83 ~]$ sudo service iptables save

 

 

 

[root@bastion ~]# sudo timedatectl set-timezone Asia/Seoul

 

wp01로 접속했을 때, 현재는 ping이 나가지 않는 상황이다.

 

ping이 잘 나가는 모습이다.

 

 

그리고 https 접속이 가능하도록 하기 위해선 로드밸런서에서 https를 추가해주면 된다.

 

 

 

NAT 게이트웨이 vs NAT 인스턴스 비교

속성 NAT 게이트웨이 NAT 인스턴스
가용성 고가용성. 각 가용 영역의 NAT 게이트웨이는 중복적으로 구현

각 가용 영역에 하나의 NAT 게이트웨이를 만들어 아키텍처가 영역에 종속되지 않도록 함
스크립트를 사용하여 인스턴스 간의 장애 조치를 관리
대역폭 최대 100Gbps까지 확장 인스턴스 유형의 대역폭에 따라 차이
유지 관리 AWS에서 관리 유지 관리 작업을 수행할 필요가 없다. 사용자가 관리
성능 소프트웨어가 NAT 트래픽 처리에 최적화 NAT를 수행하도록 구성된 일반 AMI
보안 그룹 보안 그룹을 NAT 게이트웨이와 연결할 수 없다.

보안 그룹을 NAT 게이트웨이 기반 리소스와 연결하여 인바운드 및 아웃바운드 트래픽을 제어할 수 있다.
NAT 인스턴스 뒤의 리소스 및 NAT 인스턴스와 연결하여 인바운드 및 아웃바운드 트래픽을 제어
퍼블릭 IP 주소
생성할 때 퍼블릭 NAT 게이트웨이와 연결할 탄력적 IP 주소를 선택 탄력적 IP 주소 또는 퍼블릭 IP 주소를 NAT 인스턴스와 함께 사용

새 탄력적 IP 주소를 인스턴스와 연결하여 언제든지 퍼블릭 IP 주소를 변경할 수 있다.
프라이빗 IP 주소 게이트웨이를 만들 때 서브넷의 IP 주소 범위에서 자동으로 선택 인스턴스를 시작할 때 서브넷의 IP 주소 범위에서 특정 프라이빗 IP 주소를 할당
네트워크 ACL
네트워크 ACL을 사용하여 NAT 게이트웨이가 위치하고 있는 서브넷에서 보내고 받는 트래픽을 제어 네트워크 ACL을 사용하여 NAT 인스턴스가 위치하고 있는 서브넷에서 보내고 받는 트래픽을 제어