能書き
自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールその2の続きです。Hyper-Vに構築したクライアントマシンもどきも使用します。
ログの蓄積や出力は journald を利用するのが systemd の流儀なのでしょう。私も以前少し調べてみた事があります。利便性を目指して開発が進み、長所も幾つかあるようです。
でもさぁ、これは明らかな欠陥だよねぇ。大量だからってログを捨てる仕様なんてさぁ!
短時間に大量のログが送付されると破棄するそうです。困るでしょう。短時間に大量のログが発生する状況というのは、異常事態が起きている可能性が非常に高い。そんな時のログは丁寧に追跡したいのが管理者の心情。それが不可能になります。
Ubuntu の中の人も同じ事を考えたかどうかは知りませんが、Ubuntu では rsyslog と logrotate と、更に logger もデフォルトでインストールされていて、journald と並行して動いている由。
恥ずかしながら rsyslog と logrotate と logger は、私、今まで利用した事がありませんでした。今回、その使い方や設定を調べたので、記事に纏めておきます。
参考文献
Qiita 率が高いですね。各記事の作者様に感謝。
rsyslog
- 第19回 ログを収集する(rsyslogの設定) - シェルスクリプトマガジン
- rsyslog.confの文法 - Qiita
- 【ログ出力設定】rsyslogとloggerコマンド。 - Qiita
- rsyslogでのTLS(SSL)によるセキュアな送受信 - Qiita
rsyslog は非常に高機能だそうです。その一端が下記の参考文献で紹介されています。
logrotate
logger
目標
各コマンドの使い方は、前述の参考文献を見ていただいた方が良いでしょう。とても分かり易い。枯れた技術ですし、私などがここで繰り返す意味は無さそうです。
作業目標としては、クライアントマシンから rsyslog サーバへの送信において、通信路を暗号化する事にします。家庭内 LAN での使用を前提として、成りすましは考慮しません。
その作業自体も前述の参考文献に纏まっていたので、それを Ubuntu22.04LTS で設定します。
サーバー設定
まずはサーバー側を設定します。
殆ど全てが root での実行です。 root になっておきましょう。
sudo -i
スナップショット
今回も新しいモジュールのインストールがありますので、スナップショットを撮っておきます。
zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
鍵の配置
秘密鍵と公開鍵は、既に作ってあるという事にします。作り方は以前の記事を参照して下さい。
認証局:
- 秘密鍵
/opt/CA/demoCA/pki/private/ca.key
- 公開鍵
/opt/CA/demoCA/pki/ca.crt
サーバーマシン secondary.home の証明書:
- 秘密鍵
/opt/CA/demoCA/pki/private/secondary.home.key
- 公開鍵
/opt/CA/demoCA/pki/issued/secondary.home.crt
クライアントへ送付する鍵はca.crt
(認証局の公開鍵)のみになります。これを送信用ディレクトリ/srv/publickey
内の、クライアントから操作できるサブディレクトリに置きます。ついでにファイル名を調整。
cp -p /opt/CA/demoCA/pki/ca.crt /srv/publickey/publickey/demoCA.crt
cp コマンドに-p
オプションを付けると、更新日時などを元ファイルと同一にしてくれます。逆に指定しない場合は、コピーした日時が更新日時になってしまいます。大抵は問題無いと思いますけども。私は気になるので。
publickey ユーザーが操作できるように権限を調整します。
cd /srv/publickey/publickey/
chgrp publickey demoCA.crt
chmod g+r demoCA.crt
権限を確認。
# ls -l demoCA.crt
-rw-r----- 1 root publickey 1184 Mar 10 09:05 demoCA.crt
サーバー側の rsyslog が参照する鍵は下記3点。
- 認証局の公開鍵
ca.crt
- 証明書の公開鍵
secondary.home.crt
- 証明書の秘密鍵
secondary.home.key
ディレクトリ /etc/rsyslog.d/tls
を作って、そこにこの3点を格納します。
mkdir /etc/rsyslog.d/tls
cd /etc/rsyslog.d/tls
cp -p /opt/CA/demoCA/pki/ca.crt .
cp -p /opt/CA/demoCA/pki/issued/secondary.home.crt .
cp -p /opt/CA/demoCA/pki/private/secodnary.home.key .
rsyslog が読めるように、その最小の権限を設定します。
chown syslog:syslog *
chmod 400 *
念の為に権限を確認。
# ls -l
total 15
-r-------- 1 syslog syslog 1184 Mar 10 09:05 ca.crt
-r-------- 1 syslog syslog 4601 Mar 10 18:20 secondary.home.crt
-r-------- 1 syslog syslog 1704 Mar 10 18:19 secondary.home.key
rsyslog・lmnsd_gtls モジュールのインストール
rsyslog の TLS 転送を行う為には拡張モジュール lmnsd_gtls が必要だそうです。
apt install rsyslog-gnutls
rsyslog 設定
いよいよ rsyslog の設定です。ポート番号は、一般的な 514 番ポートにします。
cd /etc/rsyslog.d
cat >80-rsyslog.conf <<___
module(
load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.Authmode="anon"
)
input(type="imtcp" port="514")
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/tls/ca.crt"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/tls/secondary.home.crt"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/tls/secondary.home.key"
)
___
再起動して、エラーが発生していない事を確認します。
systemctl restart rsyslog
systemctl status rsyslog
クライアント設定
今度はクライアント側です。前回構築した Hyper-V 上のゲストマシンを設定します。
スナップショット
こちらもスナップショットを撮っておきます。
sudo zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
鍵の配置
以前、公開鍵送付専用ユーザーを作成しましたので、それを利用してサーバー上の鍵を持ってきます。
sftp でpublickey/demoCA.crt
を取得します。取得したら、クライアント側の責任で削除します。
sftp publickey@secondary
cd publickey
get demoCA.crt
rm demoCA.crt
exit
ファイルの権限は取得したユーザーになっているので、これを一般的な/etc
内ファイルの権限に変えておきます。
sudo chown root:root demoCA.crt
sudo chmod 644 demoCA.crt
確認。
$ ls -l demoCA.crt
-rw-r--r-- 1 root root 1184 3月 11 15:00 demoCA.crt
調整した公開鍵を移動します。
sudo mkdir /etc/rsyslog.d/tls
sudo mv demoCA.crt /etc/rsyslog.d/tls/
rsyslog・lmnsd_gtls モジュールのインストール
クライアント側にも拡張モジュール lmnsd_gtls が必要だそうです。
sudo apt install rsyslog-gnutls
rsyslog 設定
サーバー側の設定と合わせるように、ポート番号やクライアント認証の設定を行います。
下記の設定の場合はファシリティ local0 だけがサーバー 172.16.1.3 に送信されます。
sudo -i
cat >/etc/rsyslog.d/80-local0.conf <<___
global(DefaultNetstreamDriverCAFile="/etc/rsyslog.d/tls/demoCA.crt")
local0.* action(type="omfwd" protocol="tcp" port="514"
Target="172.16.1.3"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="anon")
___
exit
再起動して、エラーが発生していない事を確認します。
sudo systemctl restart rsyslog
sudo systemctl status rsyslog
動作確認
ユーザー admin でlogger
コマンドを実行してみます。
hostname
whoami
logger -p local0.info hello,world
tail -n1 /var/log/syslog
クライアント側でもログが残ります。従って実行結果は、例えば下記のようになります。
$ hostname
hyperv
$ whoami
admin
$ logger -p local0.info hello,world
$ tail -n1 /var/log/syslog
Mar 11 16:21:55 hyperv admin: hello,world
サーバーにログが転送されているか、確認しましょう。
tail -n1 /var/log/syslog
クライアントと同じ内容が表示されれば成功です。
# tail -n1 /var/log/syslog
Mar 11 16:21:55 hyperv admin: hello,world
仕舞い
成功したら/etc
の内容をsvn commit
しましょう。
svn add /etc/rsyslog.d/*
svn ci /etc -m"rsyslog over tls"
sudo svn add /etc/rsyslog.d/*
sudo svn ci /etc -m"rsyslog over tls"
これで rsyslog と logrotate と logger を家庭内LANで使う為の最低限の環境が整いました。やったね