NAS 자작의 종장이다.
HAProxy에 SSL 인증서를 적용해보자.
이미 와일드카드 SSL 인증서를 발급했다는 걸 전제로 글을 작성한다.
필자의 NAS에는 이미 와일드카드 SSL 인증서를 통해 WebDAV(apache)가 https로 서비스되고 있다.
하지만 이제부터는 HAProxy가 SSL 인증을 하게 되니 HAProxy 뒷단의 모든 서비스들은 SSL 인증이 필요하지 않게 된다.
SSL 키 병합
우선 Let’s Encrypt SSL 인증서를 HAProxy에서 사용할 수 있도록 병합한다.
풀체인키와 프라이빗키를 차례대로 병합하면 된다.
$ sudo bash -c "cat /etc/letsencrypt/live/<Domain>/fullchain.pem /etc/letsencrypt/live/<Domain>/privkey.pem > /etc/haproxy/certs/ssl.pem"
안타깝게도 이 작업은 SSL 인증서가 자동갱신되는 경우 마찬가지로 반복되어야 한다.
이를 위해 다음과 같이 cron을 수정해줄 수 있을 것이다.
# sudo crontab -e > 0 4 * * 0 /usr/local/bin/certbot renew --dns-route53 > 5 4 * * 0 /usr/sbin/cat /etc/letsencrypt/live/nas.hooni-playground.com/fullchain.pem /etc/letsencrypt/live/nas.hooni-playground.com/privkey.pem > /etc/haproxy/certs/ssl.pem > 6 4 * * 0 /usr/bin/systemctl restart httpd
원래는 따로 스크립트를 만들어 실행하는 것이 좋으나 귀찮은 관계로 세 줄에 걸쳐 cron을 작성했다.
HAProxy SSL 적용
본래 443포트에서 운영되던 웹서비스를 HAProxy 뒷단에서 운영해보고자 한다.
WebDAV가 예시가 될 수 있을 것이다.
HAProxy 서버에 SSL을 적용하기 때문에 기존의 웹서비스는 다시 http 기반으로 변경되어야 한다.
필자의 경우 기존의 서비스가 다시 80포트를 사용하도록 변경하였다. (80포트는 오픈되지 않음)
이제 오픈되어있지 않은 80포트의 서비스를 aaa.hooni-playground.com:443을 통해 접근할 수 있게 해보자.
이를 위해 /etc/haproxy/haproxy.cfg를 다음과 같이 수정한다.
(webdav를 겨냥한 설정이라 webdav 사용 시 반드시 사용해야 하는 설정들이 구성되어 있다)
global ca-base /etc/haproxy/certs # 병합된 SSL 키가 위치하는 디렉터리 crt-base /etc/haproxy/private # 어차피 현재 설정에서는 사용하지 않는다 frontend https mode tcp bind :443 ssl crt /etc/haproxy/certs/ssl.pem alpn h2,http/1.1 # Listen 포트와 SSL 키 위치, 프로토콜 http-request redirect scheme https code 301 unless { ssl_fc } # HTTPS redirection http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload;" http-request set-header X-Forwarded-Proto https acl is_aaa hdr_end(host) -i aaa.hooni-playground.com # 접근제어를 위한 도메인네임 http-request redirect scheme https drop-query append-slash if { path -m str /aaa } is_aaa # slash 없을 시 slash 추가하여 추가 리디렉션 회피 use_backend aaa if is_aaa backend aaa balance roundrobin server server1 127.0.0.1:80
한편 frontend https의 경우 mode http나 mode tcp 중 어느 것을 사용해도 무방한 것으로 보인다.
다만 mode http를 사용하더라도 https 헤더를 확인할 수 없기에 이왕이면 mode tcp를 사용할 것을 권장하는 듯 하다. [sf]
이후 aaa.hooni-playground.com를 DNS에 등록하여 hooni-playground.com의 CNAME을 가리키도록 설정하자.
이제 aaa.hooni-playground.com을 443 포트로 접속하면 hooni-playground.com 서버의 80포트에서 운영되는 서비스에 접속할 수 있다.
물론 위의 코드는 예시이기 때문에 실제로 접속해봐야 아무런 응답도 없을 것이다