Raspberry Pi 3B+ をsyslogサーバにする

先月、Wifiルーターを入れ替えましたが、このWifiルーターはログ転送が出来るものでした。そこで、最近殆ど出番が無いRaspberry Pi 3B+(以降RasPi) をsyslogサーバにして、WifiルーターのログをRasPiに保存してみることにします。

syslogサーバにログを転送することで、Wifiルーターのログは10000行までだった。とか、メモリ上に記録するため電源が落ちたタイミングでクリアされちゃった。等の不測の状況からログを守る事が出来ます。

ざっくり検証用の内容となっています。実際に現場で使う場合は、他のセキュリティ対策も必ず行なってからご利用ください。

RasPi環境準備

以下の環境で確認しました。

  • RasPi 3B+
  • USBメモリ起動
  • Ubuntu Server 20.04 LTS

Raspberry Pi Imager で起動USBを作成する

いつもの通り、Raspberry Pi Imagerを使ってOSイメージを作って行こうとしましたが。。。

ああ。そうでした。Ubuntuではエラーが出るのを忘れていました。(USBメモリによってはエラーにならないものもあるようです。)

balenaEtcherで起動USBを作成する

balenaEtcherはUbuntuの起動USBが作成出来ます。まずはUbuntu 20.04.2 for Raspberry Pi をダウンロードしておきます。

Install Ubuntu on a Raspberry Pi | Ubuntu
Ubuntu is an open-source operating system for cross-platform development, there's no better place to get started than wi(続きを読む)

balenaEtcherを起動して、ダウンロードしたOS、インストール先USBを指定して、Flash!をクリックします。

無事完成です。

USB起動

作成したUSBメモリでRasPiを起動しましょう。

初回ログイン時は、ユーザ:ubuntu、パスワード:ubuntuでログインが出来ます。ログイン時にパスワード変更が求められるので複雑なパスワードに変更します。

ファイアウォールの設定(ufw)

とりあえずufwの設定をしておきます。sshなどを使う方はルールを適時追加してください。

sudo ufw disable
sudo ufw default deny
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 514
sudo ufw allow proto udp from 192.168.1.0/24 to any port 514
sudo ufw enable

rsyslogのセットアップ

ようやく本題のsyslogサーバのセットアップを行なっていきます。syslogサーバとして、rsyslogを使いました。

rsyslogインストール

sudo apt-get install rsyslog -y 

バージョン確認

$ rsyslogd -v
rsyslogd  8.2001.0 (aka 2020.01) compiled with:
	PLATFORM:				aarch64-unknown-linux-gnu
	PLATFORM (lsb_release -d):		
	FEATURE_REGEXP:				Yes
	GSSAPI Kerberos 5 support:		Yes
	FEATURE_DEBUG (debug build, slow code):	No
	32bit Atomic operations supported:	Yes
	64bit Atomic operations supported:	Yes
	memory allocator:			system default
	Runtime Instrumentation (slow code):	No
	uuid support:				Yes
	systemd support:			Yes
	Config file:				/etc/rsyslog.conf
	PID file:				/run/rsyslogd.pid
	Number of Bits in RainerScript integers: 64

See https://www.rsyslog.com for more information.

状態確認

$systemctl status rsyslog 

● rsyslog.service - System Logging Service
     Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-02-08 11:48:06 UTC; 1min 39s ago
TriggeredBy: ● syslog.socket
       Docs: man:rsyslogd(8)
             https://www.rsyslog.com/doc/
   Main PID: 3778 (rsyslogd)
      Tasks: 4 (limit: 974)
     CGroup: /system.slice/rsyslog.service
             └─3778 /usr/sbin/rsyslogd -n -iNONE

systemd[1]: Starting System Logging Service...
rsyslogd[3778]: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from s>
systemd[1]: Started System Logging Service.
rsyslogd[3778]: rsyslogd's groupid changed to 110
rsyslogd[3778]: rsyslogd's userid changed to 104
ubuntu rsyslogd[3778]: [origin software="rsyslogd" swVersion="8.2001.0" x-pid="3778" x-info="http>
lines 1-17/17 (END)

設定の編集

/etc/rsyslog.confに設定を行います。オリジナルのファイルはバックアップしておきましょう。

sudo cp /etc/rsyslog.conf /etc/rsyslog.conf.org
sudo vim /etc/rsyslog.conf

以下のようにファイルを編集しました。(必要に応じて変更してください)

# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

# allowed
$AllowedSender UDP, 127.0.0.1, 192.168.1.0/24
$AllowedSender TCP, 127.0.0.1, 192.168.1.0/24

# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

# logs
$template ClinetMessage,"/var/log/rsyslog/%fromhost%/messages.log"
*.* -?ClinetMessage

変更箇所は、MODULESのコメントを外す、$AllowSenderの追記、$template の追記になります。

(左が変更後、右が変更前です)

rsyslog.confの編集が終わったらrsyslogを再起動します。

$ sudo systemctl restart rsyslog

動作確認

rsyslogのステータスにエラーが表示されていなければOK です。

$ systemctl status rsyslog 

あとはクライアント側(wifiルーター、PCなど)にログ転送を仕込んで完成です。

正常に動作した場合、var/log/rsyslog/配下に、クライアント側のログが転送されているのが確認出来ると思います。

うまく行かない場合

ログが転送されて来ない場合は、以下をご参考にしてみてください。

  • ファイアウォールの確認
    • UFWを一時的に停止し、ログが転送されるかどうか切り分ける
    • UFWのログを参照し、転送されたログがブロックされていないこと
  • rsyslogの確認
    • systemctl status rsyslogに何かエラーが含まれているかどうか
    • /etc/rsyslog.confの編集内容の確認
  • クライアント側の確認
    • 設定の見直し。転送先IPの確認など。