RSyslogによる構造化ログ転送の実装
概要
- 長年インフラエンジニアとして働いていると、ログ収集の重要性を痛感する場面が多々あります。今回は、複数サーバからのログ収集において、RSyslogを用いたセキュアな転送と効率的な管理方法について、実際の構築例を交えて解説します。
- 背景
最近の案件で、以下のような要件がありました:
複数サーバから特定ログファイルの収集
TLS暗号化による転送
ファイル名パターンに基づく自動振分け
定期的なログチェック(60秒間隔)
一見すると単純な要件に見えますが、実運用を考慮すると様々な考慮点が出てきます。
実装
- 環境構成
検証環境には Docker を利用しましたが、本番環境への適用も考慮した設計としています。
Copyrsyslog-dynamic/
├── certs/
├── conf/
│ ├── sender1.conf
│ ├── sender2.conf
│ └── receiver.conf
└── build_and_run.sh
- 送信側の設定
以下は、送信側サーバの設定例です。実際の運用では、この設定をテンプレート化し、各サーバの特性に応じて調整することを推奨します。
bashCopy# conf/sender2.conf
module(load="imfile" PollingInterval="60")
module(load="omfwd")
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/ca-cert.pem"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/server2-cert.pem"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/server2-key.pem"
)
input(type="imfile"
File="/LOG/reg_script_2.log"
Tag="reg_script_2:"
addMetadata="off"
PersistStateInterval="60")
template(name="SendTpl" type="string" string="%msg%\n")
action(
type="omfwd"
Target="receiver"
Port="6514"
Protocol="tcp"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="x509/certvalid"
template="SendTpl"
)
- 受信側の設定
受信側の設定が、この実装のキーポイントとなります。
bashCopy# conf/receiver.conf
module(load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1"
StreamDriver.Authmode="x509/certvalid")
input(
type="imtcp"
port="6514"
)
template(name="DynamicFile" type="string"
string="/LOG/remote/%syslogtag:R,ERE,1,BLANK:.*%.log")
if $syslogtag contains 'dev_script' or $syslogtag contains 'reg_script' then {
action(
type="omfile"
dynaFile="DynamicFile"
template="RSYSLOG_FileFormat"
dirCreateMode="0755"
fileCreateMode="0644"
)
} else {
action(
type="omfile"
file="/LOG/remote/other/%syslogtag:R,ERE,1,BLANK:.*%.log"
template="RSYSLOG_FileFormat"
dirCreateMode="0755"
fileCreateMode="0644"
)
}
処理フローとして以下の通りです。
正常系フロー:
送信サーバ 受信サーバ
| |
|-- ログ生成 ----------------->|
| |
|-- RSyslog読み取り ---------->|
| |
|-- タグ付け ----------------->|
| |
|-- TLS暗号化 ---------------->|
| |
|-- 転送 --------------------->|
| |-- タグ解析
| |
| |-- 振り分け
| |
| |-- ファイル保存
| | (/LOG/remote/[タグ名].log)
異常系フロー:
送信サーバ 受信サーバ
| |
|-- ログ生成 ----------------->|
| |
|-- RSyslog読み取り ---------->|
| |
|-- タグ付け ----------------->|
| |
|-- TLS暗号化 ---------------->|
| |
|-- 転送試行 ------------------>|
| |
|<- 転送失敗 ------------------|
| |
|-- ローカルキューに保存 ------>|
| |
|-- 再試行 -------------------->|
| |-- タグ解析失敗
| |
| |-- エラーログに保存
| | (/LOG/remote/error/unknown_tag.log)
実装のポイント
- 証明書管理
各サーバ固有の証明書を生成
適切な権限設定(644)の徹底
- ログ転送の最適化
不要なメタデータの削除(addMetadata="off")
ポーリング間隔の調整による負荷制御
- 動的ファイルルーティング
タグベースのファイル振分け
柔軟なパターンマッチング
###運用上の注意点
実運用にあたっては、以下の点に注意が必要です:
- ディスク容量の管理
logrotateの適切な設定
古いログの自動アーカイブ化
- パフォーマンスチューニング
キューサイズの調整
バッファリングの最適化
- 監視の実装
ログ転送の遅延検知
エラーログの定期チェック
トラブルシューティング
問題発生時は、まず以下のログを確認します:
# 受信サーバ
tail -f /var/log/syslog
# 送信サーバ
tail -f /var/log/syslog
よくある問題と対処:
- 証明書関連エラー
権限の確認(ls -l /etc/rsyslog.d/certs/)
証明書の有効期限確認
- ネットワーク接続性
ファイアウォール設定の確認
tcpdumpによる通信確認
今後の課題
- 大規模環境での検証
数百台規模でのパフォーマンス評価
キュー設定の最適化
- 監視・通知の強化
プロメテウスとの連携
アラート閾値の最適化
まとめ
RSyslogを用いたログ転送は、適切に設計・実装することで、セキュアかつ効率的なログ管理を実現できます。本実装例が、皆様の現場での参考になれば幸いです。
参考文献
RSyslog Official Documentation
IETF RFC 5424 - The Syslog Protocol
何か質問や改善点がありましたら、コメントにてお知らせください。