오예 !!!
[AWS] WordPress blog 생성 및 DDoS attack 방어 (5) 본문
지금까지 worrdpress 인스턴스를 생성하고, RDS 및 S3와 연결하였으며, 이 인스턴스를 복제하여 여러 인스턴스를 만들었다.
이 과정이 궁금하다면 지난 게시글을 참고 바란다.
(1. https://kwonppo.tistory.com/26)
(2. https://kwonppo.tistory.com/27)
(3. https://kwonppo.tistory.com/28)
(4. https://kwonppo.tistory.com/29)
이번 게시글에서는 DDoS 공격을 방어하기 위해 로드 밸런싱과 Auto Scaling을 구성할 것이다.
DDoS 공격이 무엇이냐 하면, 특정 서버에 대량의 요청을 보내 서버를 마비시킴으로써 서비스 가용성을 해치는 공격이다.
로드 밸런싱을 수행하기 전, 기존 인스턴스에게 한번 대량의 요청을 보내보겠다.
EC2 management console로 가서 Attack server를 만든다.
이때, 애플리케이션 및 OS 이미지(Amazon Machine Image)로는 Ubuntu를 선택하겠다.

자세한 인스턴스 구성은 다음과 같이 설정하였다.
| - 인스턴스 유형: t2.micro (free tier eligible) - 키 페어: "키 페어 없이 계속 진행(권장되지 않음)" 선택 - 네트워크 설정: wordpress 인스턴스와 다른 VPC 선택 & default 보안 그룹 사용 - 그 외의 경우에는 default 값 사용 |
Attack server를 만들었다면 이제 이 인스턴스를 연결한다.
Attack server 인스턴스를 선택한 후, 연결 버튼을 누른다.
이번에는 브라우저 기반 SSH 연결 방법을 통해 인스턴스를 연결하였다.

인스턴스 연결이 성공하면 다음과 같은 콘솔창이 뜬다.

여기에 다음과 같은 명령어를 입력한다.
| $ ab -n 500 -c 100 http://<your-wordpress-server-ip> |
예를 들면 다음과 같다.
& ab -n 500 -c 100 http://12.345.67.89/
이 명령어는 500개의 요청이 서비스될 때까지 100개의 요청을 동시에 wordpress 서버에게 보내겠다는 의미이다.
명령어를 입력하면 request가 굉장히 느리게 처리되고, 블로그 접속 또한 굉장히 지연됨을 확인할 수 있다.
명령이 다 수행되고 나면 다음과 같은 결과를 볼 수 있다.

위 사진의 밑줄 친 부분은 평균 connection time을 의미하며, 그 값이 5897ms임을 확인할 수 있다.
이제 이 connection time을 로드 밸런싱과 Auto Scaling을 통해 단축시켜 볼 것이다.
우선 대상 그룹을 먼저 생성해준다.
대상 그룹 탭에 가서 대상 그룹 생성 버튼을 눌러준다.

다음과 같이 대상 그룹 이름을 입력하고, 대상 유형은 인스턴스로, VPC는 wordpress 인스턴스와 같은 VPC로 설정해주었다.

대상 그룹을 생성해주었으니 이제 대상을 추가해주어야 한다.
다음과 같이 앞서 만든 대상 그룹을 선택한 후, 하단에서 "대상" 탭을 선택한다. 여기서 "편집" 버튼을 누른다.

대상 그룹의 대상으로써 넣고자 하는 인스턴스를 추가해준다.
아래 인스턴스 목록에서 원하는 인스턴스를 체크 후 "등록된 항목에 추가" 버튼을 누르면 "등록된 대상"에 해당 인스턴스가 추가됨을 볼 수 있다.

대상 등록 추가를 완료하였다면 "저장" 버튼을 눌러준다.
이제 로드 밸런서를 생성해주어야 한다.
로드밸런서 탭에 가서 "로드 밸런서 생성" 버튼을 클릭한다.

로드 밸런서 유형으로 Appllication Load Balancer를 선택해준다.

로드 밸런서 이름을 입력하고, 가용 영역은 다음과 같이 wordpress 인스턴스가 속한 VPC와, 그에 속한 모든 subnet으로 설정해주었다.

3단계 보안 그룹 구성에서는 다음과 같이 wordpress 인스턴스에서 사용하는 보안그룹을 선택해주었다.

4단계 라우팅 구성에서는 앞서 생성하였던 대상 그룹을 선택해주었다.

그 외 나머지는 모두 default로 한 후 로드 밸런서를 생성해주었다.
이제 Auto Scaling을 구성해보겠다.
Auto Scaling 그룹 탭으로 가서 Auto Scaling 생성 버튼을 눌러준다,

Auto Scaling 그룹 이름을 입력해주고, 시작 템플릿으로 저번 게시글에서 생성한 시작 템플릿을 선택해주었다.

인스턴스 시작 옵션 선택에서는 다음과 같이 wordpress 인스턴스가 속한 vpc를 선택해주었고, 가용 영역 및 서브넷으로는 해당 vpc에 속한 모든 서브넷을 선택하였다.

고급 옵션 구성에서는 다음과 같이 "기존 로드 밸런서에 연결"을 선택하였고, 앞서 생성한 대상 그룹을 선택해주었다.

그룹 크기는 다음과 같이 모두 5로 설정을 해주었다.
이렇게 할 경우 인스턴스 5개가 자동으로 생성되며, 대상 그룹에 자동으로 추가된다.
(참고로 그룹 크기는 원하는 용량에 따라 조절하면 된다.)
나머지는 모두 default로 설정해주고 Auto Scaling 그룹을 생성하였다.
5개의 인스턴스가 자동으로 생성되고, 이들이 자동으로 대상 그룹에 추가됨을 확인할 수 있다.
이제 다시 Attack server를 이용해서 DDoS 공격을 수행해보겠다.
우선 앞서 생성한 로드 밸런서의 DNS를 이용하여 복사한다.

이 DNS를 이용하여 Attack server 인스턴스 콘솔에 다음과 같이 명령어를 입력한다.
| $ ab -n 500 -c 100 http://<your-load-balancer-DNS>/ |
예를 들면 다음과 같다.
ab -n 500 -c 100 http://loadbalancer-111111111.ap-northeast-1.elb.amazonaws.com/
명령을 수행한 결과는 다음과 같다.

로드 밸런싱과 Auto Scaling을 구성하기 전보다 average connection time이 단축되었음을 알 수 있으며, request가 굉장히 빠르게 처리되고, 블로그에 접속 또한 빠르게 진행됨을 볼 수 있다.
이렇게 하여 AWS를 이용하여 Wordpress 블로그를 생성하고, DDoS 공격을 방어해보았다.
전체적인 클라우드 아키텍처는 다음과 같다.

How blog works
- 사용자가 blog에 글을 게시하면 그에 관한 data가 RDS의 database에 저장되고, 이미지는 S3 bucket에 저장된다. 서로 다른 wordpress 인스턴스가 같은 RDS database와 S3 bucket을 공유하기 때문에, 실시간으로 블로그 내용이 동기화된다.
How to defend against the attack on the blog
- Elastic Load Balancer는 incoming applicaion traffics를 EC2 instance에 대해 자동으로 distribute해주는 방식으로 load balancing을 수행한다. 이때, load balancer가 자동으로 EC2 instance의 health check를 수행하기 때문에 healthy instance로만 traffic이 route된다.
- EC2 intances는 모두 같은 Auto scaling group에 속해 auto scaling을 수행한다. Auto scaling을 통해 CloudWatch metrics를 기반으로 load pattern에 맞추어 EC2 capacity를 scale up하거나 scale down할 수 있다.
- 본 cloud architecture에서는 총 6개의 EC2 instance가 Elastic load balancer의 target으로써 동작하며, auto scaling의 대상이 된다. ELB를 통해 6개의 instance에 대해 자동으로 incoming traffic을 분산시켜주고, Auto scaling을 통해 load patter에 맞추어 자동으로 capacity를 scaling하는 방식으로 blog에 대한 attack을 defend할 수 있다.
(사담)
클라우드 컴퓨팅 수업의 일환으로 진행한 과제였는데, Wordpress 블로그를 생성하는 것 뿐만 아니라, 내가 아는 모든 방법을 동원하여 대량의 요청에 대한 Connection time을 단축시키고자 이것저것 시도하다보니 AWS에 대해 더 많은 것을 배울 수 있었다.
특히 처음에 wordpress 인스턴스를 생성할 때 그냥 ubuntu를 선택한 후 wordpress를 다운받는 방식으로 진행하였는데, 이때 진짜 별별 에러를 많이 만나면서 많은 것을 배울 수 있었다.
하지만 이런 방식으로 하는 것보다 wordpress AMI를 선택해주는 간단한 방법을 사용하는 것이 훨씬 더 효율적이라는 것을 알고 많이 낙심하기도 했었다.......
아무튼 재밌는 과제였다.
'💻 > 클라우드 컴퓨팅' 카테고리의 다른 글
| [AWS] Hadoop MapReduce 기반 word Counter 구현하기 (0) | 2022.12.19 |
|---|---|
| [AWS] Hadoop MapReduce 기반 알파벳 Counter 구현하기 (0) | 2022.12.01 |
| [AWS] WordPress blog 생성 및 DDoS attack 방어 (4) (0) | 2022.11.23 |
| [AWS] WordPress blog 생성 및 DDoS attack 방어 (3) (0) | 2022.11.23 |
| [AWS] WordPress blog 생성 및 DDoS attack 방어 (2) (0) | 2022.11.23 |