LoginSignup
0
0

私的サーバー構築日誌:rsyslogとlogrotateとlogger

Posted at

能書き

私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。

以前も同じネタを記事にしましたが、今回はちょっと記述の順番などを変えたり、実験用クライアントマシンをLXDコンテナにしたりしてます。


ログの蓄積や出力はjournaldを利用するのがsystemdの流儀なのでしょう。私も以前少し調べてみた事があります。利便性を目指して開発が進み、長所も幾つかあるようです。

でもさぁ、これは明らかな欠陥だよねぇ。大量だからってログを捨てる仕様なんてさぁ!

短時間に大量のログが送付されると破棄するそうです。困るでしょう。短時間に大量のログが発生する状況というのは、異常事態が起きている可能性が非常に高い。そんな時のログは丁寧に追跡したいのが管理者の心情。それが不可能になります。

Ubuntuの中の人も同じ事を考えたかどうかは知りませんが、Ubuntuではrsysloglogrotateと、更にloggerもデフォルトでインストールされていて、journaldと並行して動いている由。

恥ずかしながらrsysloglogrotateloggerは、私、今まで利用した事がありませんでした。今回その使い方や設定を調べたので、纏めておきます。

目標

  • クライアントマシンからrsyslogサーバへの送信において、通信路を暗号化する
    • 家庭内 LAN での使用を前提として、成りすましは考慮しない
    • クライアントマシンとしてはLXDコンテナを利用する

この作業自体も(クライアントマシンとしてLXDコンテナを使う以外は)前述の参考文献に纏まっていたので、それをUbuntu22.04LTSで設定します。

各コマンドの詳しい使い方は、参考文献群を見ていただいた方が良いでしょう。枯れた技術ですし、私などがここで繰り返す意味は無さそうです。

参考文献

rsyslog

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 が必要だそうです。

LXDコンテナ内
apt install rsyslog-gnutls

鍵の配置

公開鍵送付専用ユーザーを使用してサーバー上の鍵を持ってきます

sftp でpublickey/demoCA.crtを取得します。取得したら、クライアント側の責任で削除します。

LXDコンテナ内
sftp transporter@primary.home
LXDコンテナ内:sftp操作
cd publickey
get demoCA.crt
rm demoCA.crt
exit

ファイルの権限を一般的な/etc内ファイルの権限に変えておきます。

LXDコンテナ内
chmod 644 demoCA.crt

確認。

LXDコンテナ内
ls -l demoCA.crt

結果はこうなります。

LXDコンテナ内
# ls -l demoCA.crt
-rw-r--r-- 1 root root 729 Oct 25 09:13 demoCA.crt

調整した公開鍵を移動します。

LXDコンテナ内
mkdir /etc/rsyslog.d/tls
mv demoCA.crt /etc/rsyslog.d/tls/

rsyslog設定

サーバー側の設定と合わせるように、ポート番号やクライアント認証の設定を行います。
下記の設定の場合はファシリティlocal0だけがサーバー(というかコンテナホスト)192.168.0.1に送信されます。

LXDコンテナ内
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に詳しい方からのコメントをお待ちしてます。

再起動して、エラーが発生していない事を確認します。

LXDコンテナ内
systemctl restart rsyslog
systemctl status rsyslog

動作確認

loggerコマンドを実行してみます。

LXDコンテナ内
hostname
whoami
logger -p local0.info hello,world
tail -n1 /var/log/syslog

クライアント(loggerコマンドを実行した環境)側でもログが残ります。最初の実行では、証明書の公開鍵と秘密鍵が指定されていない事に対する警告も出てしまいますが。従って実行結果は、例えば下記のようになります。

LXDコンテナ内:実行結果例
# 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 ]

サーバーにログが転送されているか、確認しましょう。

LXDコンテナ内
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で使う為の最低限の環境が整いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0