それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

aptで入れたcertbot にhttpd 壊されたので注意のために記事書いた

証明書の管理をcertbot にまかせていました。

lets encrypt が一般化し、ChromeHTTPSを標準化して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 の自動更新は動作しない。

そのために、毎月手作業で更新していたのだが、それすらめんどくさくなってCDNHTTPSを利用している。つまりcertbot はインストールしたまま放置してたのだ。

そして、事件は起きてしまった。

certbot が証明書を自動更新しようとしてapache/nginxの設定を書き換えて死んでいく。

そのためにHTTPのアクセスはHTTPSにリダイレクトされるようにされているしもうめちゃくちゃ。。

apt の certbot は怖い。

  • http → httpsのリダイレクトを書き加えられる
  • certbot の sytemd タイマーが定期的に動作してくる
  • certbothttpd のプロセスを利用して更新を試み失敗したまま放置

割と面倒くさい。

自動更新が動作しない環境であれば、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 の順番がおかしかったので修正