1.
중요도가 떨어지는(나중에는 중요해짐) 서버가 있는데 TLS 인증서 등록이 필요했다. 인증서를 발급받자니 약간의 돈이 들어가고 무엇보다 귀찮다. 짧으면 1년, 길어도 몇년에 한 번 재발급을 받고 등록을 해야 하니 관리가 필요해 귀찮은 일이다. 백그라운드 관리 포인트는 담당자 퇴사 시 인수 인계가 제대로 안 돼 문제가 발생할 확률도 높다.
2.
그러다 찾은 게 Let’s Encrypt. 유효 기간은 짧지만 무료로 쓸 수 있고 certbot이란 툴로 자동 갱신도 된다.
3.
3–1) 인증서 자동 갱신 등록
node 서버에 Let’s Encrypt에서 발급받은 인증서를 등록해 TLS 환경을 구축했다. 그리고 crontab에 인증서 자동 갱신을 걸어놨다. 시간은 매주 월요일 새벽 2시. 인증서 유효 기간이 30일 정도 남았을 때 실제 갱신을 한다. 매주 월요일에 자동 갱신을 하도록 걸어놨지만 남은 시간을 보고 알아서 한 번만 갱신한다.
# Crontab: 매주 월요일 새벽 2시 자동 갱신
0 2 * * 1 /usr/bin/certbot renew --quiet
3–2) 문제 발생: 갱신 파일 권한 문제
자동 갱신을 걸어놓고 두 달쯤 지났을때 서비스가 동작 안 한다는 컴플레인을 받았다. node 서버가 다운 되었다. 재시작 했더니 인증서 permission 문제가 발생하고 있다.
인증서를 갱신하면 아래 폴더에 파일들을 생성한다. 그런데 파일들이 root로 생성되어 있다.
# 인증서 경로
/etc/letsencrypt/archive/<domain>
# 인증서 갱신되어 생성된 파일들. 넘버링이 붙음
cert2.pem
chain2.pem
fullchain2.pem
root 로 생성되니 permission 문제가 발생한다. crontab에 인증서 갱신 후 권한을 변경하도록 추가했다.
# 인증서 권한 변경 추가
0 2 * * 1 /usr/bin/certbot renew --quiet && sudo chown -R ubuntu:ubuntu /etc/letsencrypt/archive/<domain>
3–3) 또 문제 발생: 똑같은 권한 문제
두 달쯤 지나니 또 같은 문제가 발생했다. 폴더에 가보니 여전히 새로운 인증서가 root로 생성되어 있다. crontab에 권한 변경 명령어를 추가했지만 동작을 안 했다. 권한을 변경하는 별도 쉘 스크립트를 만들어 동작하도록 했다.
# 쉘 스크립트 등록: /app/changeCertPermission.sh
#!/bin/bash
# 인증서 폴더 경로 지정
folder_path="/etc/letsencrypt/archive/<domain>"
# 소유자 변경
sudo chown -R ubuntu:ubuntu "$folder_path"
# crontab: 인증서 갱신 후 1분 후에 권한 변경 쉘 스크립트 실행
0 2 * * 1 /usr/bin/certbot renew --quiet
1 2 * * 1 /app/changeCertPermission.sh
3–4) 다시 문제 발생: 여전히 권한 문제
두 달 후 다시 같은 문제가 발생했다. 여전히 갱신된 인증서의 권한이 root로 되어 있다.
drwxr-xr-x 2 ubuntu ubuntu 4096 May 12 02:28 .
drwx------ 3 ubuntu ubuntu 4096 Nov 13 2023 ..
-rw-r--r-- 1 ubuntu ubuntu 1785 Nov 13 2023 cert1.pem
-rw-r--r-- 1 ubuntu ubuntu 1785 Jan 12 18:40 cert2.pem
-rw-r--r-- 1 ubuntu ubuntu 1785 Mar 13 02:32 cert3.pem
-rw-r--r-- 1 root root 1785 May 12 02:28 cert4.pem
-rw-r--r-- 1 ubuntu ubuntu 1826 Nov 13 2023 chain1.pem
-rw-r--r-- 1 ubuntu ubuntu 3749 Jan 12 18:40 chain2.pem
-rw-r--r-- 1 ubuntu ubuntu 1826 Mar 13 02:32 chain3.pem
-rw-r--r-- 1 root root 1826 May 12 02:28 chain4.pem
-rw-r--r-- 1 ubuntu ubuntu 3611 Nov 13 2023 fullchain1.pem
-rw-r--r-- 1 ubuntu ubuntu 5534 Jan 12 18:40 fullchain2.pem
-rw-r--r-- 1 ubuntu ubuntu 3611 Mar 13 02:32 fullchain3.pem
-rw-r--r-- 1 root root 3611 May 12 02:28 fullchain4.pem
-rw------- 1 ubuntu ubuntu 1704 Nov 13 2023 privkey1.pem
-rw------- 1 ubuntu ubuntu 1708 Jan 12 18:40 privkey2.pem
-rw------- 1 ubuntu ubuntu 1704 Mar 13 02:32 privkey3.pem
-rw------- 1 root ubuntu 1704 May 12 02:28 privkey4.pem
스크립트가 실행 안 된 것일까? crontab 로그를 뒤져보면 원하는 시간에 정상적으로 실행됐다. 권한 변경 쉘 스크립트의 실행 권한 문제가 아닐까? 아래와 같이 실행 권한을 줬다.
# 권한 주기 전
-rw-rw-r-- 1 ubuntu ubuntu 168 Apr 12 00:30 changeCertPermission.sh
# 실행 권한 부여
sudo chmod a+x changeCertPermission.sh
-rwxrwxr-x 1 ubuntu ubuntu 168 Apr 12 00:30 changeCertPermission.sh
3–5) 또또 문제 발생: node 재시작 문제
역시나 두 달 후 같은 문제가 발생했다. 이번에는 해외 여행 중이라 대응을 할 수 없었다. 팀원이 토요일 저녁 회사에 출근하고 카톡 주고 받으며 문제를 해결했다. 이번이 몇 번째인가? 도저히 쓸 수 없겠단 생각이 들었다. node 서비스의 중요도가 처음보다 높아지기도 했고 계속 같은 문제로 고생하는 것도 프로답지 못하다. 귀찮더라도 정식 인증서 발급받아 쓰는 게 낫겠다는 생각이 들었다. 마지막 조치만 테스트 해 보고 바꾸기로 했다.
인증서 갱신은 했는데 node 서버는 재시작을 안 해줬다. 그러니 node 가 유효기간 만료된 인증서를 바라보게 된다. 인증서 권한 변경하는 스크립트에 node를 kill 하는 내용을 추가했다. node는 pm2로 등록해놔서 데몬이 죽으면 자동으로 재시작 한다.
# 쉘 스크립트 내용 추가: /app/changeCertPermission.sh
#!/bin/bash
# 인증서 폴더 경로 지정
folder_path="/etc/letsencrypt/archive/<domain>"
# 소유자 변경
sudo chown -R ubuntu:ubuntu "$folder_path"
DEMON_NAME="node /app/app.js"
# 데몬의 PID 찾기
PID=$(ps aux | grep "$DEMON_NAME" | grep -v grep | awk '{print $2}')
# 데몬 kill
kill -9 "$PID"
추가로 crontab의 시간을 착각했다. AWS EC2 서버의 시간은 UTC로 돌아가고 있다. UTC 시간은 +9 시간을 해야 한국 시간(KST)이 된다.
# 아래 시간은 UTC, KST로 변환 시 월요일 오전 11시
0 2 * * 1 /usr/bin/certbot renew --quiet
1 2 * * 1 /app/changeCertPermission.sh
# 아래와 같이 변경: 월요일 새벽 2시
0 17 * * 0 /usr/bin/certbot renew --quiet
5 17 * * 0 /app/niceauth/changeCertPermission.sh
4.
8 개월간 4번의 문제를 겪고 이제는 정상적으로 돌아간다.
- 갱신된 인증서의 권한이 root
- 인증서 권한을 변경하는 스크립트에 실행 권한이 없음
- 서비스 재시작을 안 함
- UTC, KST 를 착각