EC2를 대상으로 무작위 ip에서 공격이 있어 관련 내용을 기록하는 글입니다.
Cloud Flare에서 도메인을 관리 중인데 EC2에 여러가지 무작위 IP에서 공격 시도가 매일 들어오고 있는 상황 입니다.
찾아보니 로드밸런서를 통해 Private VPC에 애플리케이션 서버를 배포하고 Public VPC 진입접을 통해서만 접근이 가능 하도록 하는 방법과 Cloud Flare 에서 방화벽 설정으로 특정 이벤트를 차단하는 형태 두가지 방법이 있었습니다.
첫번째 방식은 Bastion Host 를 활용한 방식으로 게이트 역할을 하는 EC2를 하나 더 띄우는 형태 입니다.
돈이 두배지요
이 글에서는 두번째 방식으로 처리 하도록 하였습니다.
우선 IP를 후이즈에 검색 해보았습니다. 모든 아이피가 해외에서 관리되고 있는 아이피였습니다.
서비스를 해외에도 제공하려는 목적이 아니여서 우선 해외 IP의 접속을 차단 했습니다.
해외 IP 접속 차단
Cloud Flare 에서 보안 > WAF 항목으로 이동하여 해외 아이피에 대한 차단 방화벽을 설정 하였습니다.
- 규칙 이름을 설정하고 필드 > 국가를 선택 합니다.
- 한국 아이피와 다르면 차단하도록 연산자, 값, 수행할 동작을 지정했습니다.
해외 아이피를 차단하니 며칠간 무작위 공격 시도가 전혀 오지 않았습니다.
하지만 며칠 뒤 로그를 보니 어느순간부터 다시 공격 시도가 들어왔습니다.
처음엔 해당 IP들을 모두 Ban 해서 관리 하려고 했지만, 결국 공격자들은 자동화된 프로그램을 통해 IP를 변조한 뒤 공격하는 형태이기 때문에 이는 무의미한 작업이 될 수 있다고 판단 하였습니다.
URI 체크
현재 EC2에는 아래와 같은 형태의 요청이 무작위로 계속 오고 있습니다.
우선 Spring Boot 웹 애플리케이션 서버에서 엔드포인트를 /api로 지정하였기에 /api로 시작하지 않는 요청은 모두 차단하도록 방화벽 설정 하였습니다.
아래 방화벽 설정으로 EC2 특정 경로에 있는 파일을 GET 하는 요청은 대부분 차단될 것이라 생각됩니다.
IP 노출로 인한 직접 요청
해당 방식은 특정 도메인에 대한 보호 규칙이지 IP에 대한 보호규칙은 아니였습니다.
예를들어 api.server.com 이라는 도메인에 해당 보호 규칙을 설정하면 공격자가 api.server.com 으로 요청을 보내면 당연히 차단됩니다.
하지만 해당 도메인과 매핑된 IP를 얻게되면 해당 IP로 직접 요청을 보낼 수 있습니다.
이때는 Cloud flare 에서 설정한 규칙이 모두 작동하지 않습니다.
이미 IP가 노출 되었기 때문에 해당 IP로 공격 시도는 계속 될 것이라 생각하여 우선 IP를 다시 할당 받았습니다.
이후 EC2 내부로 오는 요청을 nginx가 제어하도록 하였습니다.
nginx.conf의 server 블럭아래에 ip직접 접근을 차단하는 조건을 걸어두었습니다.
# IP로 직접 접근 차단
if ($host ~* "^(\d{1,3}\.){3}\d{1,3}$") {
return 444;
}
이제 IP로 직접 요청을 보내는건 nginx에서 모두 막아주고 있는 상황입니다.
마치며
- Cloud flare 에서 "/api"로 시작하는 요청만 허용하고 나머지 요청은 차단
- 해외 접속 차단
- EC2에 설치한 Nginx로 IP 직접 요청 차단
추가로 Cloud flare의 프록시 설정으로 IP를 숨길 수 있게 되었습니다. 그래서인지 브라우저 접속한 유저의 실제 IP가 아닌 프록시로 변환된 IP가 nginx 로그에 뜨는 상황 입니다. 다음 글은 프록시로 변환되기 전 실제 IP를 받아와 로그에 남기는 방법에 대해 써볼 생각 입니다.