能書き
私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。
以前も同じネタを記事にしましたが、今回はちょっと記述の順番などを変えたり、実験用クライアントマシンをLXDコンテナにしたりしてます。
ログの蓄積や出力はjournald
を利用するのがsystemdの流儀なのでしょう。私も以前少し調べてみた事があります。利便性を目指して開発が進み、長所も幾つかあるようです。
でもさぁ、これは明らかな欠陥だよねぇ。大量だからってログを捨てる仕様なんてさぁ!
短時間に大量のログが送付されると破棄するそうです。困るでしょう。短時間に大量のログが発生する状況というのは、異常事態が起きている可能性が非常に高い。そんな時のログは丁寧に追跡したいのが管理者の心情。それが不可能になります。
Ubuntuの中の人も同じ事を考えたかどうかは知りませんが、Ubuntuではrsyslog
とlogrotate
と、更にlogger
もデフォルトでインストールされていて、journald
と並行して動いている由。
恥ずかしながらrsyslog
とlogrotate
とlogger
は、私、今まで利用した事がありませんでした。今回その使い方や設定を調べたので、纏めておきます。
目標
- クライアントマシンからrsyslogサーバへの送信において、通信路を暗号化する
- 家庭内 LAN での使用を前提として、成りすましは考慮しない
- クライアントマシンとしてはLXDコンテナを利用する
この作業自体も(クライアントマシンとしてLXDコンテナを使う以外は)前述の参考文献に纏まっていたので、それをUbuntu22.04LTSで設定します。
各コマンドの詳しい使い方は、参考文献群を見ていただいた方が良いでしょう。枯れた技術ですし、私などがここで繰り返す意味は無さそうです。
参考文献
rsyslog
- 第19回 ログを収集する(rsyslogの設定) - シェルスクリプトマガジン
- rsyslog.confの文法 - Qiita
- 【ログ出力設定】rsyslogとloggerコマンド。 - Qiita
- rsyslogでのTLS(SSL)によるセキュアな送受信 - Qiita
rsyslog
は非常に高機能だそうです。その一端が下記の参考文献で紹介されています。
logrotate
今回は操作しません。記事が複雑になり過ぎるので。下記の参考文献が非常に分かり易くなっていましたのでそちらをどうぞ。
logger
logger
についてはmanを読むのが一番良さそうです。
サーバー設定
まずはサーバー側を設定します。
スナップショット
今回も新しいモジュールのインストールがありますので、スナップショットを撮っておきます。
sudo zfs snapshot tank/root/ubuntu@$(date +%Y%m%d_%H%M%S)_before_rsyslog_tls
rsyslog・lmnsd_gtls モジュールのインストール
rsyslogのTLS転送を行う為には拡張モジュールlmnsd_gtlsが必要だそうです。
sudo apt install rsyslog-gnutls
/etc
を確認。何も変化はありませんでした。
sudo svn st /etc
サーバーの鍵の配置
秘密鍵と公開鍵は、既に作ってあるという事にします。作り方は以前の記事を参照して下さい。
認証局:
- 秘密鍵
/home/cert/demoCA/pki/private/ca.key
- 公開鍵
/home/cert/demoCA/pki/ca.crt
サーバーマシンprimary.homeの証明書:
- 秘密鍵
/home/cert/demoCA/pki/private/primary.home.key
- 公開鍵
/home/cert/demoCA/pki/issued/primary.home.crt
サーバー側の rsyslog が参照する鍵は下記3点。
- 認証局の公開鍵
ca.crt
- 証明書の公開鍵
primary.home.crt
- 証明書の秘密鍵
primary.home.key
ディレクトリ /etc/rsyslog.d/tls
を作って、そこにこの3点を格納します。
sudo mkdir /etc/rsyslog.d/tls
sudo -u cert cp -p /home/cert/demoCA/pki/ca.crt /tmp/demoCA.crt
sudo -u cert cp -p /home/cert/demoCA/pki/issued/primary.home.crt /tmp
sudo -u cert cp -p /home/cert/demoCA/pki/private/primary.home.key /tmp
cp コマンドに-p
オプションを付けると、権限や更新日時などを元ファイルと同一にしてくれます。逆に指定しない場合は、コピーした日時が更新日時になってしまいます。大抵は問題無いと思いますけども。私は気になるので。
sudo chown syslog: /tmp/demoCA.crt /tmp/primary.home.crt /tmp/primary.home.key
sudo mv /tmp/demoCA.crt /tmp/primary.home.crt /tmp/primary.home.key /etc/rsyslog.d/tls
念の為に権限を確認。
ls -l /etc/rsyslog.d/tls
結果はこうなります。
$ ls -l /etc/rsyslog.d/tls
total 15
-rw------- 1 syslog syslog 729 Aug 27 20:01 demoCA.crt
-rw------- 1 syslog syslog 2928 Oct 25 17:10 primary.home.crt
-rw------- 1 syslog syslog 306 Oct 25 17:09 primary.home.key
rsyslog設定
ポート番号は、一般的な 514 番ポートにします。
cd /etc/rsyslog.d
cat | sudo tee 80-rsyslog.conf >/dev/null <<___
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/demoCA.crt"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/tls/primary.home.crt"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/tls/primary.home.key"
)
___
再起動します。
sudo systemctl restart rsyslog
エラーが発生していない事を確認します。
sudo systemctl status rsyslog
クライアントへ送付する鍵の用意
クライアントへ送付する鍵はca.crt
(認証局の公開鍵)のみになります。これを送信用ディレクトリ/srv/transport
内の、クライアントから操作できるサブディレクトリに置きます。ついでにファイル名を調整。
sudo -u cert cp -p /home/cert/demoCA/pki/ca.crt /tmp/demoCA.crt
sudo chown transporter: /tmp/demoCA.crt
sudo -u transporter mv /tmp/demoCA.crt /srv/transport/publickey
/tmp
ディレクトリ内では、ファイルの所有者とroot以外はそのファイルを削除できません。その為に/tmp/ca.crt
の所有者を変更してからmv
コマンドを実行します。
権限を確認。
ls -l /srv/transport/publickey
こんな風になっている筈です。
$ ls -l /srv/transport/publickey
total 5
-rw------- 1 transporter transporter 729 Aug 27 20:01 demoCA.crt
クライアント設定
今度はクライアント側です。
LXDコンテナ
今回はLXDコンテナを使用します。
lxc launch images:ubuntu/jammy rsyslog-test --device eth0,ipv4.address=192.168.0.2
LXDコンテナが稼働したら、中に入ります。
lxc shell rsyslog-test
rsyslog・lmnsd_gtls モジュールのインストール
クライアント側にも拡張モジュール lmnsd_gtls が必要だそうです。
apt install rsyslog-gnutls
鍵の配置
公開鍵送付専用ユーザーを使用してサーバー上の鍵を持ってきます。
sftp でpublickey/demoCA.crt
を取得します。取得したら、クライアント側の責任で削除します。
sftp transporter@primary.home
cd publickey
get demoCA.crt
rm demoCA.crt
exit
ファイルの権限を一般的な/etc
内ファイルの権限に変えておきます。
chmod 644 demoCA.crt
確認。
ls -l demoCA.crt
結果はこうなります。
# ls -l demoCA.crt
-rw-r--r-- 1 root root 729 Oct 25 09:13 demoCA.crt
調整した公開鍵を移動します。
mkdir /etc/rsyslog.d/tls
mv demoCA.crt /etc/rsyslog.d/tls/
rsyslog設定
サーバー側の設定と合わせるように、ポート番号やクライアント認証の設定を行います。
下記の設定の場合はファシリティlocal0
だけがサーバー(というかコンテナホスト)192.168.0.1に送信されます。
cat >/etc/rsyslog.d/80-local0.conf <<___
global(DefaultNetstreamDriverCAFile="/etc/rsyslog.d/tls/demoCA.crt")
local0.* action(type="omfwd" protocol="tcp" port="514"
Target="192.168.0.1"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="anon")
___
但し、認証局の公開鍵は、指定しなくても動作するように見えます。この1行目(global
の行)は、不要かも知れません。rsyslogに詳しい方からのコメントをお待ちしてます。
再起動して、エラーが発生していない事を確認します。
systemctl restart rsyslog
systemctl status rsyslog
動作確認
logger
コマンドを実行してみます。
hostname
whoami
logger -p local0.info hello,world
tail -n1 /var/log/syslog
クライアント(logger
コマンドを実行した環境)側でもログが残ります。最初の実行では、証明書の公開鍵と秘密鍵が指定されていない事に対する警告も出てしまいますが。従って実行結果は、例えば下記のようになります。
# hostname
rsyslog-test
# whoami
root
# logger -p local0.info hello,world
# tail -n3 /var/log/syslog
Oct 25 12:27:23 rsyslog-test root: hello,world
Oct 25 12:27:23 rsyslog-test rsyslogd: warning: certificate file is not set [v8.2112.0 try https://www.rsyslog.com/e/2330 ]
Oct 25 12:27:23 rsyslog-test rsyslogd: warning: key file is not set [v8.2112.0 try https://www.rsyslog.com/e/2331 ]
サーバーにログが転送されているか、確認しましょう。
exit
tail -n1 /var/log/syslog
logger
コマンドで指定した内容が表示されれば成功です。
$ tail -n1 /var/log/syslog
Oct 25 12:27:23 rsyslog-test root: hello,world
仕舞い
成功したら/etc
の内容を確認しましょう。
sudo svn st /etc
今回は、ここまでで追加した内容になります。
$ sudo svn st /etc
? /etc/rsyslog.d/80-rsyslog.conf
? /etc/rsyslog.d/tls
Subversion追加。
sudo svn add /etc/rsyslog.d/*
コミットしましょう。
sudo svn ci /etc -m"rsyslog over tls"
実験に使ったLXDコンテナも削除しておきましょう。
lxc stop rsyslog-test
lxc delete rsyslog-test
これでrsyslogとlogger(とlogrotate)を家庭内LANで使う為の最低限の環境が整いました。