[学習フェーズ]
障害対応や調査の際、サーバーのログを確認し切り分けを行います。
しかし、企業として複数のサーバーを運用している場合、それぞれのログを1台1台確認する方法は手間となります。
そこで、企業はsyslogサーバーという「サーバーのログ収集を専門とするサーバー」を運用している場合があります。
これにより、サーバーログを一元管理することが可能です。

AWS CloudWatchとの棲み分け
syslogサーバーを運営するには、サーバーが1台必要です。
オンプレミス環境の場合は、そのまま物理サーバー1台をsyslogサーバーとして設定を行いますが、AWSの場合「CloudWatch」というログ収集専門のサービスもあります。
一見、「CloudWatchを使えばよいじゃん」となりますが、syslogサーバーとCloudWatchそれぞれ適切な利用シーンがあります。
例えば、以下のようなケースがあります。
観点 | syslogを選定する理由 | CloudWatch優位点 |
---|---|---|
既存資産の活用 | オンプレミス時代からsyslogサーバーを中心としたSIEM(例:Splunk, ArcSight, QRadar)基盤がある。運用プロセスを変えたくない。 | AWS内完結型の設計、新規構築しやすい |
社内統制・監査要件 | 社内規定で「ログはまずsyslogで集約」「社内DC・SOCセンターへの転送」などが必須化されている。特に金融・公共・製造大手に多い。 | CloudWatchはAWSアカウント内に閉じるため外部SIEM連携には追加連携開発が必要 |
ネットワーク要件 | UDP/TCP 514という標準ポートを使えるため、非AWSシステム(オンプレ、他クラウド)と統一できる。 | CloudWatchはHTTPS/API通信のみ、外部連携時に別途エージェントやAPI実装が必要 |
運用ノウハウ | 社内にsyslog運用の専門知識・スクリプト・解析ツールが蓄積されている。 | AWS側に運用を寄せることでオンプレ側知識は不要になる |
コスト最適化 | syslogはEC2上の処理なので固定費(インスタンス代・EBS代)のみ。CloudWatchはログ量課金(約$0.50/GB)がかかる。長期・大量ログではEC2運用の方が安価になる場合がある。 | CloudWatchはマネージドで運用負荷が低く、総合コストは割安になることが多い |
カスタマイズ性 | syslogはログ転送・加工・分岐ルールを自由に書ける(rsyslog.conf)。 | CloudWatchはカスタムルールが制限され、Lambda連携などで補う必要あり |
特にセキュリティ部門が強い企業ほど「AWSの標準ツールではなく、企業共通のログ基盤で管理」という方針が選ばれるケースが目立ちます。
[実践フェーズ]
今回はAWS EC2を2台構築しsyslogサーバーのハンズオンを行います。
1台目:syslogサーバー(ログを収集する側)
2台目:クライアントサーバー(ログを送る側)
実務では、クライアントサーバーが複数台存在しています。
1. syslogサーバー用EC2の起動
EC2インスタンス起動
- AMI: Amazon Linux 2023
- インスタンスタイプ: t2.micro(テスト用)
- サブネット: 任意(同じVPC内)
- セキュリティグループ:
- インバウンド → TCP/514、UDP/514、SSH/22
rsyslogのインストールと起動
AL2023ではdnf
を使います。
sudo dnf install -y rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog
rsyslog設定ファイルを編集
・設定ファイルを開く
sudo vi /etc/rsyslog.conf
・以下を追加(またはコメント解除)
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
・保存して終了(viの場合は:wq
)
ログ保存先を設定
特定のファイルに受信ログを保存したい場合:
echo '$template RemoteLogs,"/var/log/remote.log"' | sudo tee -a /etc/rsyslog.conf
echo '*.* ?RemoteLogs' | sudo tee -a /etc/rsyslog.conf
rsyslog再起動
sudo systemctl restart rsyslog
netstat
(またはss
)でポート514が開いているか確認:
sudo ss -tulnp | grep 514
514番ポートがLISTEN状態ならOKです。
2. clientサーバー用EC2の起動
クライアントEC2を起動
- AMI: Amazon Linux 2023
- インスタンスタイプ: t2.micro
- 同じVPC・サブネット
- セキュリティグループ:
- アウトバウンド → TCP/514、UDP/514 をsyslogサーバー側に向けて許可
- インバウンド → SSH/22(管理用)
クライアント側でrsyslog設定
SSHでログイン後、以下を実行。
rsyslogインストール
sudo dnf install -y rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog
送信設定ファイル作成
sudo vi /etc/rsyslog.d/remote.conf
ファイル内に以下を記載:
*.* @@<syslogサーバーのプライベートIP>:514 # TCP送信 ex) *.* @@1.2.3.4:514
*.* @<syslogサーバーのプライベートIP>:514 # UDP送信 ex) *.* @1.2.3.4:514
設定反映
sudo systemctl restart rsyslog
(検証)テスト送信
クライアント側で:
logger "クライアントEC2からのテストメッセージ"
サーバー側で:
sudo tail -f /var/log/remote.log
ここでメッセージが確認できれば、通信・設定とも成功です。
+α サーバー側で指定したエラーレベル以下のログ破棄する設定
loggerコマンドはlevel5(NOTICE)ログとなるため、5以上のログを出力しない設定にしてみましょう。
/etc/rsyslog.conf にて、
ファイル末尾の以下に箇所に設定します。
# INFO(6)、DEBUG(7)、NOTICE(5)を破棄
if ($syslogseverity <= 5) then stop
# 既存設定
$template RemoteLogs,"/var/log/remote.log"
*.* ?RemoteLogs
ハンズオンと同様の手順でロガーコマンドを打ち、syslog側でログが表示されないことを確認しましょう。
※if ($syslogseverity <= 5) then stop を一番下に入れると、ログが振り分けられた後に、5以上のログをストップすることになるため、うまくいきません。
confファイルは上から順番に処理されていることを意識しましょう。
+α 重要度・送信元IPで保存先を分ける
/etc/rsyslog.conf にて
if $fromhost-ip == '10.0.1.10' and $syslogseverity-text == 'error' then /var/log/client1_error.log
if $fromhost-ip == '10.0.1.20' then /var/log/client2.log
→ クライアント(サーバー)単位・エラーレベル単位でファイル分け。
サーバーをもう1台追加し、別々のファイルに分けてみましょう。