証明書の管理をcertbot にまかせていました。
lets encrypt が一般化し、ChromeがHTTPSを標準化してHSTSを覚えるようになってきて、HTTPS化の流れは避けられない。
さらにあれから2年がたつ、以前はcertbot が手軽に使えるので、証明書の管理に使ってた。
certbot のインストールと証明書の取得。
インストール
sudo apt install certbot
取得
sudo certbot certonly -d takuya.example.com
nginx と apache2 がダウンする事態が発生。
こうやって運用を初めて2ヶ月たった、ある日、apacheが死んでることが発覚。すぐに再起動して事なきを得た。 しかし、数時間後に再びダウンする。エラーログを調べてもわからない。
nginxに切替えてみた。しかし再び毎日ダウンする自体になり頭を抱えていた。
apt で入れたcertbot はサービスを伴う。
攻撃でも食らってるのかとDoSを疑ったり、アクセスログやサーバーのログを調べているうちに気付いた。
これ certbot が自動更新で落ちてる。。。。
disableをして事なきを得た
takuya@:~$ sudo systemctl disable certbot.service takuya@:~$ sudo systemctl disable certbot.timer
systemd に登録された certbot のサービス
certbot を apt で入れた場合に、次の自動更新のサービスが展開される。
そう、certbotのせいだった。
この自動更新の動作が、apache/nginxを停止し、証明書の更新用に起動して失敗して放置し、そのままnginx/ apache が停止したままになるのだ。
それも数時間おきに。
takuya@:~$ sudo systemctl status certbot.timer ● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; disabled; vendor preset: enabled) Active: active (waiting) since Tue 2018-05-01 13:17:46 JST; 2 days ago
takuya@:~$ sudo systemctl status certbot.service ● certbot.service - Certbot Loaded: loaded (/lib/systemd/system/certbot.service; static; vendor preset: enabled) Active: inactive (dead) since Thu 2018-05-03 12:19:42 JST; 6h ago Docs: file:///usr/share/doc/python-certbot-doc/html/index.html https://letsencrypt.readthedocs.io/en/latest/ Process: 30575 ExecStart=/usr/bin/certbot -q renew (code=exited, status=0/SUCCESS) Main PID: 30575 (code=exited, status=0/SUCCESS) CPU: 545ms 5月 03 12:19:41 myhost systemd[1]: Starting Certbot... 5月 03 12:19:42 myhost systemd[1]: Started Certbot.
しかし、certbotは80/443 に直接アクセスが出来ない。
私はiptables でポートを変えててマッピングしてたり、リバースプロキシを挟んでいるので、certbot の自動更新は動作しない。
そのために、毎月手作業で更新していたのだが、それすらめんどくさくなってCDNのHTTPSを利用している。つまりcertbot はインストールしたまま放置してたのだ。
そして、事件は起きてしまった。
certbot が証明書を自動更新しようとしてapache/nginxの設定を書き換えて死んでいく。
そのためにHTTPのアクセスはHTTPSにリダイレクトされるようにされているしもうめちゃくちゃ。。
apt の certbot は怖い。
- http → httpsのリダイレクトを書き加えられる
- certbot の sytemd タイマーが定期的に動作してくる
- certbot が httpd のプロセスを利用して更新を試み失敗したまま放置
割と面倒くさい。
自動更新が動作しない環境であれば、certbot を apt で入れるべきではないのかもしれない。
2018-07-23 追加
https のサービスをいったん止めて再起動させればいい感じかもしれない
/lib/systemd/system/certbot.timer にタイマーの記述
takuya@:~$ cat /lib/systemd/system/certbot.timer [Unit] Description=Run certbot twice daily [Timer] OnCalendar=*-*-* 00,12:00:00 RandomizedDelaySec=3600 Persistent=true [Install] WantedBy=timers.target
/lib/systemd/system/certbot.service にコマンドの記述
takuya@:~$ cat /lib/systemd/system/certbot.service [Unit] Description=Certbot Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html Documentation=https://letsencrypt.readthedocs.io/en/latest/ [Service] Type=oneshot #ExecStart=/usr/bin/certbot -q renew ExecStart=certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start" PrivateTmp=true
systemdを再設定 .
sudo systemctl daemon-reload sudo systemctl status certbot.service sudo systemctl status certbot.timer sudo systemctl start certbot.service sudo systemctl status certbot.service sudo systemctl status certbot.timer
しばらく様子を見る
2018-08-07
crontab にした
* */12 * * * bash -c ' { systemctl stop apache2 nginx ; certbot -q renew; systemctl start apache2 nginx; }'
2018-08-07 systemd の記述を修正
reload の順番がおかしかったので修正