Certbot ログローテート設定

# 概要
letsencryptのSSL証明書の自動更新ログが、かなり貯まっている事に気づいた。このログのローテート設定をしていなかったのでしておく。
管理しているサーバがたくさんあり、それぞれＯＳバージョンもcertbotバージョンも違うのメモしておく。
**残すログファイルは約4ヶ月分の120世代にします。**

# サーバOSとCertbotバージョンの一覧
全部で11台、OS種類は4種類、Certbot種類は7種類でしたが、CentOS7.9以降はcertbotをパッケージ管理システム「Snap」でインストールしたので、自動更新で実行されるサービスファイルの場所と書き方が少し違うだけだった。なので設定方法としては2パターンです。

<table>
  <caption>サーバOSとCertbotバージョン</caption>
  <tr><th>サーバ名</th><th>OS Ver</th><th>Certbot Ver</th></tr>
  <tr><td>b-srv02</td><td>CentOS 7.5</td><td>certbot 1.11</td></tr>
  <tr><td>k-srv10</td><td>CentOS 7.5</td><td>certbot 1.11</td></tr>
  <tr><td>k-srv21</td><td>CentOS 7.5</td><td>certbot 1.11</td></tr>
  <tr><td>k-srv25</td><td>CentOS 7.9</td><td>certbot 1.29.0</td></tr>
  <tr><td>k-srv40</td><td>RockyLinux 8.7</td><td>certbot 2.7.4</td></tr>
  <tr><td>k-srv41</td><td>RockyLinux 8.7</td><td>certbot 2.5.0</td></tr>
  <tr><td>k-srv43</td><td>RockyLinux 8.7</td><td>certbot 2.5.0</td></tr>
  <tr><td>k-srv44</td><td>RockyLinux 8.7</td><td>certbot 2.8.0</td></tr>
  <tr><td>k-srv45</td><td>RockyLinux 8.7</td><td>certbot 2.7.4</td></tr>
  <tr><td>k-srv46</td><td>RockyLinux 8.7</td><td>certbot 2.6.0</td></tr>
  <tr><td>y-srv02</td><td>RockyLinux 8.6</td><td>certbot 2.6.0</td></tr>
</table>

# ローテート設定
## パターン1
certbotをsnapでインストールしてないパターンの設定手順です。

### ログファイル数を確認
```
[root]# ls -al /var/log/letsencrypt/ |wc -l
925
```
### 不要ログを削除
不要な古いログ、末尾が121番以降ログを削除。
正規表現が得意でないので、121番号以降を一発で検索できないので分けて行う。
```
[root]# find /var/log/letsencrypt/ -type f |grep -E "letsencrypt.log.[2-9][0-9][0-9]"| xargs rm -f
[root]# find /var/log/letsencrypt/ -type f |grep -E "letsencrypt.log.1[3-9][0-9]"| xargs rm -f
[root]# find /var/log/letsencrypt/ -type f |grep -E "letsencrypt.log.12[1-9]"| xargs rm -f
[root]# ls -la /var/log/letsencrypt/letsencrypt.log* |wc -l
124
```
### timerが実行するサービスファイルを探す
定期実行はtimerサービスで管理されているので、timerが実行するサービスファイルを探します。
```
[root]# ls -la /etc/systemd/system/timers.target.wants/
lrwxrwxrwx   1 root root   43  3月  6  2019 certbot-renew.timer -> /usr/lib/systemd/system/certbot-renew.timer
```
シンボリックリンクが貼られているファイルがあるディレクトリをみる
```
[root]# ls -la /usr/lib/systemd/system/ |grep cert
-rw-r--r--   1 root root   284  1月  6  2021 certbot-renew.service
-rw-r--r--   1 root root   195  1月  6  2021 certbot-renew.timer
```
### サービスファイルを編集
/usr/lib/systemd/system/certbot-renew.serviceのExecStartのコマンドに`-max-log-backups 120`を追加します。
```
[root]# vi /usr/lib/systemd/system/certbot-renew.service
[Service]
EnvironmentFile=/etc/sysconfig/certbot
Type=oneshot
ExecStart=/usr/bin/certbot renew --noninteractive --no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS
↓ ※ここを変更
ExecStart=/usr/bin/certbot renew --noninteractive --max-log-backups 120 --no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS
```
daemon-reloadでサービスファイルを再読み込みさせる。
※これ忘れがち
```
[root]# systemctl daemon-reload
```

## パターン2
certbotをsnapでインストールしたから、timerが実行するサービスファイル名が違うのと、サービスファイル内の変数ExecStartのコマンドが少し違うだけです。

### timerが実行するサービスファイルを探す
```
[root]# ls -la /etc/systemd/system/timers.target.wants/
lrwxrwxrwx   1 root root   44  8月  3  2022 snap.certbot.renew.timer -> /etc/systemd/system/snap.certbot.renew.timer

[root]# ls -la /etc/systemd/system/ |grep cert
-rw-r--r--   1 root root 12288  8月  4  2022 .snap.certbot.renew.timer.swp
-rw-r--r--   1 root root   479  8月  3  2022 snap.certbot.renew.service
-rw-r--r--   1 root root   321  3月 29  2023 snap.certbot.renew.timer
-rw-r--r--   1 root root   302  8月  3  2022 var-lib-snapd-snap-certbot-2192.mount
```

### サービスファイルを編集
同じ様にExecStartのコマンドに`-max-log-backups 120`を追加します。
```
[root]# vi /etc/systemd/system/snap.certbot.renew.service
[Service]
EnvironmentFile=-/etc/environment
ExecStart=/usr/bin/snap run --timer="00:00~24:00/2" certbot.renew
↓ ※ここを変更
ExecStart=/usr/bin/snap run --timer="00:00~24:00/2" certbot.renew --max-log-backups 120
```
daemon-reloadでサービスファイルを再読み込みさせる。
※これ忘れがち
```
[root]# systemctl daemon-reload
```

# 備考
あとは数日後にログの数が120個までになっているか確認する。
## オプション --max-log-backups を付けて即実行
```
snap run certbot.renew --max-log-backups 120
```
で確認するが、これはtimerが実行したわけではないので、変数ExecStart内のコマンドの書き方があっているか分からないので、やっぱり数日後に確認するしかない。