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

## RSyslogによる構造化ログ転送の実装
### 概要
- 長年インフラエンジニアとして働いていると、ログ収集の重要性を痛感する場面が多々あります。今回は、複数サーバからのログ収集において、RSyslogを用いたセキュアな転送と効率的な管理方法について、実際の構築例を交えて解説します。
- 背景
最近の案件で、以下のような要件がありました：

> 複数サーバから特定ログファイルの収集
TLS暗号化による転送
ファイル名パターンに基づく自動振分け
定期的なログチェック（60秒間隔）

一見すると単純な要件に見えますが、実運用を考慮すると様々な考慮点が出てきます。
### 実装
- 環境構成
検証環境には Docker を利用しましたが、本番環境への適用も考慮した設計としています。
```bash
Copyrsyslog-dynamic/
├── certs/
├── conf/
│   ├── sender1.conf
│   ├── sender2.conf
│   └── receiver.conf
└── build_and_run.sh
```
- 送信側の設定
以下は、送信側サーバの設定例です。実際の運用では、この設定をテンプレート化し、各サーバの特性に応じて調整することを推奨します。
```bash
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"
)
```

- 受信側の設定
受信側の設定が、この実装のキーポイントとなります。
```bash
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の適切な設定
古いログの自動アーカイブ化


- パフォーマンスチューニング

キューサイズの調整
バッファリングの最適化


- 監視の実装

ログ転送の遅延検知
エラーログの定期チェック



### トラブルシューティング
問題発生時は、まず以下のログを確認します：

```bash
# 受信サーバ
tail -f /var/log/syslog
```

```bash
# 送信サーバ
tail -f /var/log/syslog
```

### よくある問題と対処：

- 証明書関連エラー

権限の確認（ls -l /etc/rsyslog.d/certs/）
証明書の有効期限確認


- ネットワーク接続性

ファイアウォール設定の確認
tcpdumpによる通信確認



### 今後の課題

- 大規模環境での検証

数百台規模でのパフォーマンス評価
キュー設定の最適化


- 監視・通知の強化

プロメテウスとの連携
アラート閾値の最適化


### まとめ
RSyslogを用いたログ転送は、適切に設計・実装することで、セキュアかつ効率的なログ管理を実現できます。本実装例が、皆様の現場での参考になれば幸いです。
参考文献

RSyslog Official Documentation
IETF RFC 5424 - The Syslog Protocol


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