[AWS] Gophish로 침해대응(악성메일) 훈련 진행기 5

이전글

[AWS] Amazon SES와 Gophish로 침해대응(악성메일) 훈련 진행기 1

[AWS] zoho 메일 서비스와 Gophish로 침해대응(악성메일) 훈련 진행기 2

[AWS] SES 샌드박스 해제 신청기

[AWS] EC2와 Gophish로 침해대응(악성메일) 훈련 진행기 3

[AWS] Gophish로 침해대응(악성메일) 훈련 진행기 4

 

들어가며

침해대응 훈련의 디테일을 위해 랜딩페이지의 HTTPS 통신을 적용한다. 통신구간 인증서를 이용한 공개키 암호화를 적용하여 브라우저 오류 메시지를 없애고 암호화하여 데이터를 전송한다.

 

구성

환경은 Rocky Linux 9 환경이다.

nginx 리버스 프록시를 이용하여 고피시 프레임워크와 랜딩페이지를 구성한다. 이전글을 참고하면 고피시 프레임워크는 podman 컨테이너 환경에서 구동중이다. nginx 서버도 컨테이너로 구동하고 연결을 확인한다.

사실 온프렘에 구동해도 상관없다. 공부할겸 삽질을 좀 더해봤다.

 

 

Certbot

Certbot을 설치하기 전에 의존성을 가진 패키지를 먼저 설치한다.

dnf install epel-release mod_ssl
dnf install certbot python3-certbot-apache

 

Certbot이 도메인 소유주를 확인하는 방법은 다음 세가지가 있다.

1. standalone - 가상 웹서버를 가동하여 도메인 소유주 확인

2. webroot - 웹서버 내 특정 경로에 파일을 업로드하여 도메인 소유주 확인

3. dns - dns 레코드에 확인을 위한 값을 입력하여 도메인 소유주 확인

 

추가 서버 구동이나, 기존 동작중인 서버의 재기동이 불필요하며 와일드 카드 서브도메인의 사용이 가능한 dns 방식을 사용한다. 구동중인 WAS 서버에 따라 옵션을 주면 자동으로 설정을 변경해주는 기능도 지원하지만 컨테이너 볼륨에 직접 마운트해야하니 '--manual' 옵션을 사용한다. 

 

# certbot certonly --manual --prefereed-challenges=dns -d {사용할 도메인}
certbot certonly --manual --prefereed-challenges=dns -d peanutz.site

 

와일드카드 문자열(*)을 사용하면 하위 도메인 전체에 대한 인증서를 발급할 수 있다.

도메인을 입력하면 사용자의 이메일을 입력받는다. 약관에 동의하고(필수) 소식을 수신하겠냐는 질문(선택)에는 거절한다.

이후에는 IP 로깅을 허용하겠느냐는 질문이며, 허용(Y)하면 TXT 필드에 등록할 내용이 출력된다.

Please deploy a DNS TXT record under the name
_acme-challenge.peanutz.site with the following value:

2kpEcddow4pEj1xHS4EAwAVMTjSTZ595o1zi...

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

 

DNS 필드 관리 페이지에서 같은 내용을 등록한다.

 

TXT 필드 값 인증이 완료되면 인증서가 발급된다.

발급된 인증서는 /etc/letsencrypt/live/{도메인명} 아래에 위치한다. 

 

Nginx 서버 설정

 

컨테이너를 구동할 때 서버 설정 파일된 경로와 인증서 경로를 볼륨으로 할당하여 인식하도록 해야한다. nginx 이미지를 내려받아 임시 컨테이너를 구동한 후 로컬로 파일을 복사하는 방법으로 마련한다.

그 후 적절히 경로를 설정해주고 볼륨으로 마운트한다. podman network 설정으로 고피시 컨테이너와 nginx 컨테이너간 통신이 가능하도록 설정했다.

podman run -d --name nginx-proxy 
-p 80:80 -p 443:443 
--network nginx-network 
-v /home/usr/worker_docker/nginx_proxy/nginx:/etc/nginx 
-v /home/usr/worker_docker/nginx_proxy/cert:/etc/ssl/certs 
nginx

 

ssl을 위한 default.conf 설정은 다음과 같다. proxy_pass 키워드로 트래픽을 내부 컨테이너로 전달하게 하기 위해서 삽질을 많이 했다^^. 결국 컨테이너 명을 전달하면 도메인처럼 사용되는 것 같았고 컨테이너를 구동하는 순서가 중요했다. nginx 컨테이너가 구동할 때 지정한 도메인(컨테이너명)을 찾을 수 없으면 에러가 나면서 종료된다.

1. gophish 컨테이너 구동

2. nginx 컨테이너 구동

위 순서대로 구동해야 한다.

server {
  listen 443 ssl;
  server_name gophish_subdomain_wierfcwq222.peanutz.site;

  ssl_certificate /etc/ssl/certs/peanutz.site/fullchain1.pem;
  ssl_certificate_key /etc/ssl/certs/peanutz.site/privkey1.pem;

  location / {
    proxy_pass https://sneaky-gophish:3333;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header Referer "";
    proxy_set_header X-Forwarded-Proto "";
  }
}


server{
 listen 443 ssl;
 server_name landingpage_subdomain.peanutz.site;

 ssl_certificate /etc/ssl/certs/peanutz.site/fullchain1.pem;
 ssl_certificate_key /etc/ssl/certs/peanutz.site/privkey1.pem;

 location / {
    proxy_pass http://sneaky-gophish:80;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded_Proto "";
    proxy_set_header Referer "";

 }

}

 

결과

발급된 인증서가 서버에 정상적으로 등록되었음을 확인할 수 있다. certbot으로 발급한 인증서는 무료이기도 하고 쉽게 발급할 수 있다보니 유효기간이 길지 않다(3개월). 3개월 주기로 갱신하는 작업이 필요하다.

반응형