0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RSyslogによる構造化ログ転送の実装

Posted at

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

何か質問や改善点がありましたら、コメントにてお知らせください。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?