INTRO
ubuntu 22.04 + apache2 서버에 certbot을 이용하여
let's encrypt기관의 무료 인증서를 발급받아
웹 사이트에 https 보안을 사용해 볼 것이다.
다만 우분투에 직접 Apache 서버를 띄운 환경이 아닌,
도커 컨테이너로 띄운 환경에서 적용해 볼 것이다.
1. Let's Encrypt, certbot이란?
- 갑작스럽게 Let's Encrypt 에 대한 설명이 등장했는데,
- 이는 SSL/TLS 보안 인증서를 발급해주는 비영리 기관이다.
- https 프로토콜을 사용하기 위해서는,
- http 프로토콜에 SSL/TLS 보안 프로토콜을 적용시켜야 한다.
(SSL은 1995년에 출시된 보안 프로토콜, 이를 보완하여 v2 까지 출시된 뒤 , v3.1부터 TLS라는 명칭으로 변경되어 오늘날에 이름)
(만화로 재미있게 설명한 사이트가 있어 첨부)
https://howhttps.works/ko/https-ssl-tls-differences/
- SSL/TLS 보안 프로토콜에는 인증서가 필요하며,
- 신뢰할 수 있는 인증기관에서 이를 발급받아 사용한다.
- 인증기관에는 강력한 보안을 적용한 인증 서버가 있고,
- 인증 서버에서는 인증서를 통해 보안을 보증한다.
- 보안 프로토콜을 적용하게 되면, 사용자가 입력한 민감 정보들이 암호화되어 서버로 전송되고,
- 서버에서는 발급받은 인증서를 통해 이를 복호화 하여 사용하기때문에
- 중간에서 정보가 탈취되더라도, 인증서를 가지고 있지 않으면 쓸모 없는 정보가 되어버린다.
- 일반적인 실무에서 진행하는 프로젝트들은 이런 기관들에서 유료로 인증서를 발급받아 보안을 적용하는데,
- 필자와 같이 개인적인 공부 목적 / 프로토타입 개발 등에 유료로 인증서를 발급받기엔 부담이 있다.
(일반적으로 몇 천원 부터 ~ 몇 십만원 정도 까지 발급비용이 발생)
- Let's Encrypt라는 비영리기관에서는 무료로 SSL/TLS 인증서를 발급해준다.
- 그리고 이를 손쉽게 발급하고 적용하도록 도와주는 프로그램이 Certbot이며,
- 우리는 Ubuntu 환경에 Certbot을 설치하여 인증서를 발급받고 적용시켜 볼 것이다.
2. UFW 를 사용한 방화벽 열기
- UFW(Uncomplicated Firewall)는 리눅스 데비안 계열에서 사용하는 방화벽 관리 프로그램이다.
- apt-get install 로 쉽게 설치가 가능하다.
- 직접적으로 iptables에 규칙을 추가해도 되지만, 해당 프로그램을 사용하는것이 명령에 사용에 있어 더 편리하다.
- 필자의 현재 구조는 아래와 같다.
- https 포트인 443과, http 포트인 80 포트를 모두 열어줘야하는데
- 현재 도커 컨테이너에 아파치 서버를 올린 형상이므로,
- 외부 방화벽과 컨테이너의 방화벽 모두 ufw를 이용하여 열어주었다.
$ sudo apt-get install ufw
$ sudo ufw allow 443/tcp
$ sudo ufw allow 80/tcp
$ sudo ufw enable
$ sudo ufw status
- 도커 내부 환경에 접속하여 방화벽을 제어할 때는 아래처럼 --privileged 옵션을 적용하여 접속해야 권한이 생간다.
sudo docker exec -it --privileged [container id] bash
3. certbot 설치
- apache서버가 떠있는 docker container에 접속한다.
- 참고로 apache 서버 이름이 CentOS 에서는 httpd, Ubuntu환경에서는 apache2이다.
sudo docker exec -it --privileged [container id] bash
- 하기 명령어를 이용하여 certbot을 설치하고,
- certbot을 이용하여 발급받은 인증서를 본인의 서버 환경에 적용해주는 패키지도 함께 설치한다.
$ sudo apt update
$ sudo apt install certbot python3-certbot-apache
4. 인증서 발급
- 하기 명령어를 통해 인증서를 발급받는다.
- 인증서를 생성하게 되면, /etc/apache2/sites-avainable 경로에 있는 (도메인).conf파일에 본인의 도메인이 추가되게 된다.
- 필자는 docker wordpress 이미지를 이용하여 apache서버를 자동 생성했기때문에,
- 해당 config파일의 이름이 ~default~.conf로 생성되었다.
$ sudo certbot --apache
# 긴급 보안 및 공지용 이메일 입력
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): (Email 주소 입력)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# 약관 동의
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:Y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# 개인정보제공동의(No 선택해도 진행 가능)
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:N
Account registered.
No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated) (Enter 'c' to cancel): (본인의 도메인 입력)
Requesting a certificate for (도메인)
Performing the following challenges:
http-01 challenge for (도메인)
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://(도메인)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/(도메인)/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/(도메인)/privkey.pem
Your certificate will expire on 2023-02-06. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again with the "certonly" option. To non-interactively
renew *all* of your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
- 이후 본인의 도메인에 접속해보면 https보안이 적용되어 있는 것을 확인할 수 있다.
- 발급받은 인증서는 90일의 유효기간이 있고,
- 이를 갱신하는 명령어는 아래와 같다.
$ sudo certbot renew --dry-run
- 필자의 환경대로 설치했다면, /etc/cron.d 폴더 내
- crontab으로 하루 2회씩 수행되는 스크립트가 설치되어있을것이다.
- 이는 만료일이 30일 이하로 남은 인증서들을 체크하여 갱신해준다.
/etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
#
# Important Note! This cronjob will NOT be executed if you are
# running systemd as your init system. If you are running systemd,
# the cronjob.timer function takes precedence over this cronjob. For
# more details, see the systemd.timer manpage, or use systemctl show
# certbot.timer.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
마무리
Ubuntu + apache 기반의 서버에서 https보안을 위한 SSL/TLS 인증서를 발급받아 적용시키는 방법에 대해 포스팅했다.
개인적인 프로젝트를 진행할 때에는 매우 유용하게 쓰이니 알아두면 좋을 것 같다.
또한 apache 기반이 아닌 Nginx 기반에서도 비슷한 방법으로 사용 가능하며, 아래 사이트에서 방법 확인이 가능하다.
-퍼가실 때는 출처를 꼭 같이 적어서 올려주세요!
'DevOps > [Linux]' 카테고리의 다른 글
[Linux] Swap memory 설정하기 (0) | 2022.11.23 |
---|---|
[Linux Ubuntu] sudo: command not found 해결하기 (0) | 2022.11.10 |
[Ubuntu] AWS EC2 file / directory 를 로컬로 옮기기 (0) | 2022.10.13 |
[Linux] Ububtu Iptables 이용하여 Port Redirect하기(PREROUTING) (0) | 2021.12.20 |
[인프라 기초] CentOS 실습해보기 -4(파일시스템,dnf) (0) | 2021.02.19 |