0.はじめに
次回の案件でRockyLinuxを使用することから備忘録として残します。
コマンド等に誤りがありましたらコメント等でご指摘いただけると幸いです…
今回は初級者の方にも共有したい内容のため実行結果までを含め、できるだけ丁寧に実践していきます。
1.環境
・Proxmox VE 9.1 上で構築
・RockyLinux v8.10(syslogサーバ側 192.168.0.93/24 )
・RockyLinux v8.10(クライアント側 192.168.0.90/24 )
別の記事でNTP、NFSサーバについても記述していますので今回使用しない VM も記載されています。
また、この記事では何も構築されていない真っ白な状態であることが前提です。
2.syslog(rsyslog)とは?
外部サイトにはなってしまいますが、個人的にはこのサイトでの開設が一番わかりやすいと思いました。
・要点
syslogは、ネットワーク機器やサーバのログをUDP/TCPポート514でサーバへ送信し、集中管理するための標準プロトコル。
ログは発生元を示すFacilityと重要度を示すSeverity(emerg〜debug)で分類され、ログの管理や振り分けに利用される。
今回は上記のようなsyslogを複数機器から送信したものを「rsyslog」を利用してまとめて管理するサーバ、通称syslogサーバを構築いたします。
3.サーバ側の構築(rsyslog)
★全体の流れ
①rsyslogは起動している?
②rsyslog.conf の設定変更&反映
③ファイアウォールの穴あけ
④rsyslogへ設定の反映、再起動
3-1.syslogはインストール・起動している?
下記コマンドで確認してみましょう。
# rpm -qa | grep rsyslog
rsyslog-gssapi-8.2102.0-15.el8_10.1.x86_64
rsyslog-relp-8.2102.0-15.el8_10.1.x86_64
rsyslog-8.2102.0-15.el8_10.1.x86_64
rsyslog-gnutls-8.2102.0-15.el8_10.1.x86_64
# ps aux | grep syslog
avahi 772 0.0 0.2 61964 4976 ? Ss 01:38 0:00 avahi-daemon: running [syslog.local]
dbus 774 0.1 0.3 61420 7060 ? Ss 01:38 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 1147 0.0 0.4 218696 7768 ? Ssl 01:38 0:00 /usr/sbin/rsyslogd -n
gdm 1363 0.0 0.2 59792 4644 ? Ss 01:38 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
kame 2124 0.0 0.2 59792 4544 ? Ss 01:38 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 2205 0.0 0.0 222012 1036 pts/0 R+ 01:41 0:00 grep --color=auto syslog
# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-03-09 01:38:21 EDT; 5min ago
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
Main PID: 1147 (rsyslogd)
Tasks: 3 (limit: 11017)
Memory: 5.1M
CGroup: /system.slice/rsyslog.service
mq1147 /usr/sbin/rsyslogd -n
Mar 09 01:38:21 syslog systemd[1]: Starting System Logging Service...
Mar 09 01:38:21 syslog rsyslogd[1147]: [origin software="rsyslogd" swVersion="8.2102.0-15.el8>
Mar 09 01:38:21 syslog systemd[1]: Started System Logging Service.
Mar 09 01:38:21 syslog rsyslogd[1147]: imjournal: journal files changed, reloading... [v8.21>
通常rsyslogはデフォルトでインストール・起動しています。
私の環境ではインストールされており、起動していました。
起動している場合は新規でインストール不要となります。
※ディストリビューションやバージョンの違いによってインストールが必要な場合や、rsyslogの挙動について知りたい方は下記のQiitaの記事を見ていただいた方がわかりやすいと思います。
AlmaLinuxにrsyslogをインストールする
3-2.rsyslog.conf の設定変更&反映
/etc/rsyslog.conf のデフォルト設定を退避します。
# cp /etc/rsyslog.conf /etc/rsyslog.conf.org
/etc/rsyslog.conf の設定変更を行っていきます。
各パラメータについては変更内容の後に記述しています。
# vi /etc/rsyslog.conf
Syslogを受信する設定のパラメータです。
利用環境に合わせてTCP、UDPの有効化を行います。
また、受信するホストごとにディレクトリを自動作成するように追記。
ーーーー有効化した項目(通信方法TCP、UDPの選択)ーーーー
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
ーーーー#### GLOBAL DIRECTIVES #### 内に追記ーーーー
# ---ここから追記---
# リモートログ用ディレクトリの自動作成
$CreateDirs on
# ホストごとにログ保存するテンプレート
template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
# /etc/rsyslog.d 読み込み
include(file="/etc/rsyslog.d/*.conf" mode="optional")
ーーーー#### RULES #### 内に追記ーーーー
# リモートログ保存(ホストごと)
*.* ?RemoteLogs
また、設定パラメータの全体は ↓ こちらになります。
設定全体像(開いてみる)
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### MODULES ####
module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
SysSock.Use="off") # Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
module(load="imjournal" # provides access to the systemd journal
UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
#### GLOBAL DIRECTIVES ####
# Where to place auxiliary files
# rsyslogの作業ディレクトリ
global(workDirectory="/var/lib/rsyslog")
# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
# ---ここから追記---
# リモートログ用ディレクトリの自動作成
$CreateDirs on
# ホストごとにログ保存するテンプレート
template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
# /etc/rsyslog.d 読み込み
include(file="/etc/rsyslog.d/*.conf" mode="optional")
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# リモートログ保存(ホストごと)
*.* ?RemoteLogs
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# ### sample forwarding rule ###
#action(type="omfwd"
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1" # unique name prefix for spool files
#queue.maxdiskspace="1g" # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on" # save messages to disk on shutdown
#queue.type="LinkedList" # run asynchronously
#action.resumeRetryCount="-1" # infinite retries if host is down
# Remote Logging (we use TCP for reliable delivery)
# remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")
3-3.ファイアウォールの穴あけ
ファイアウォールの穴あけ作業になります。
/etc/rsyslog.conf で有効化した通信方法を許可します。
TCP、UDPどちらも書きますので使用される方を解放してください。
今回は実験的にどちらも開けております。
firewall-cmd --add-port=514/udp --permanent
firewall-cmd --add-port=514/tcp --permanent
firewall-cmd --reload
開けれたか確認します。
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: cockpit dhcpv6-client ssh
ports: 514/udp 514/tcp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
ssコマンドでも確認してみます。
ss -tuln | grep 514
udp UNCONN 0 0 0.0.0.0:514 0.0.0.0:*
udp UNCONN 0 0 [::]:514 [::]:*
tcp LISTEN 0 25 0.0.0.0:514 0.0.0.0:*
tcp LISTEN 0 25 [::]:514 [::]:*
ポートが開かれていることが確認できました。
3-4.rsyslogへ設定の反映、再起動
rsyslogを再起動して設定を反映しましょう。
systemctl restart rsyslog.service
systemctl status rsyslog.service
これでsyslogサーバ側の設定はいったん完了になります。
一旦ここでディレクトリ構造の確認。
/etc/rsyslog.conf に設定した保存先について確認します。
理解している方は読み飛ばしていただいて問題ありません。
global(workDirectory="/var/lib/rsyslog")
rsyslogが動作中に使用する作業用ディレクトリを指定します。
メッセージのキュー(一時保存)ファイルや、ログの読み取り位置を記録するステートファイルなどがここに保存されます。
あらかじめディレクトリが存在している必要があり、適切に設定することでデータの損失を防ぎます。
$CreateDirs on
ログを出力する際に、指定した保存先のディレクトリが存在しない場合に自動生成する設定です。
後述のテンプレートなどで動的にフォルダ名を分ける場合、これがないと書き込みエラーになるため必須となります。
デフォルトは off なので、ホスト別などにログを振り分ける際は明示的に on にします。
template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
受信したログをどのパスにどのようなファイル名で保存するかを定義する雛形です。
この設定では %HOSTNAME%(送信元ホスト名)や %PROGRAMNAME%(プログラム名)を変数として利用しています。
これにより、/var/log/remote/サーバーA/sshd.log のように、送信元ごとに整理されたログ管理が可能になります。
include(file="/etc/rsyslog.d/*.conf" mode="optional")
/etc/rsyslog.d/ ディレクトリ内にある設定ファイルを読み込むための記述です。
メインの rsyslog.conf を汚さずに、アプリケーションごとの個別設定を別ファイルで管理できるようになります。
mode="optional" を指定することで、ディレクトリが空だったりファイルが無くてもエラーを出さずに起動します。
/var/log/remote/
├ client
│ ├ sshd.log
│ ├ cron.log
│ └ systemd.log
│
├ nfs
│ ├ rpcbind.log
│ └ nfsd.log
│
└ ntp
└ chronyd.log
上記は今回の私のラボ環境になるので例としてイメージしていただければ幸いです。
4.クライアント側の構築
4-1.rsyslog.conf の編集
送信するサーバの情報、1文のみの追記になります。
TCP、UDPで記述する内容が異なります。
vi /etc/rsyslog.conf
私は、#### MODULES #### 内の最下部に追記しました。
ーーーー(TCPの場合)ーーーー
*.* @192.168.0.93:514
ーーーー(UDPの場合)ーーーー
*.* @@192.168.0.93:514
送信先サーバーの設定を記入できたらrsyslogを再起動します。
systemctl restart rsyslog.service
systemctl status rsyslog.service
再起動したことを確認しましょう。
4-2.ログをsyslogサーバに送ってみる。
syslogサーバーにテストとしてログを送信してみます。
logger "test syslog from client"
syslogサーバーでログを受信できているか確認してみます。
※ 今回は192.168.0.90 ホスト名:cliantから送信しています。
サーバー側の操作になります。
~スペースの都合上結果とコマンドを同時に書きます~
# ls -l /var/log/remote/
total 0
drwx------ 2 root root 114 Mar 23 21:57 cliant
drwx------ 2 root root 216 Mar 23 20:31 syslog
※ cliantのディレクトリが作成されたことを確認
# ls -l /var/log/remote/cliant/
total 40
-rw------- 1 root root 61 Mar 23 23:06 root.log
※ 今回はrootユーザで実行したため root.log が対象になります。
# cat /var/log/remote/cliant/root.log
Mar 24 12:06:03 cliant root[261742]: test syslog from client
※クライアントで実行したloggerコマンドの内容がサーバ側で確認できました!
これで終わりになります。
5.さいごに
sysslogサーバはどこの現場でも利用されるので覚えていて損はないと思います。
rsyslog.conf には特定のログだけ送るようにする設定値などもあるのでその辺の確認を今度はしたいと思います。
# 認証ログだけ送信
authpriv.* @@192.168.0.93:514
# cronだけ
cron.* @@192.168.0.93:514
実は書いてる途中に体調を崩したり、実家に行ったりで、10日以上空いてしまったため書きっぷりがちぐはぐだと思います。
とりあえず自分の備忘としても書ききりたかったので、投げやり感はありますが一応これで終わりにしたいと思います。
読んでいただき、ありがとうございました。
不明点や、誤りがあればコメントしていただけると幸いです…
