Elastic-Load-Balancing

NLBを使ったSyslog転送の暗号化

はじめに

こんにちは、ディーネットの山田です。

ELBにあるNLBのTLSリスナーを使って通信の暗号化を検証してみました。

構成図

構成図としては簡単ですが、以下のようになっております。

設定内容

1. ELBでTLSリスナーの設定について

事前準備: ACMでSSL証明書を発行

NLBのTLSリスナーで使う証明書は、事前にACM(AWS Certificate Manager)で発行しておきます。

NLBのリスナー設定

NLBのリスナーはTLSプロトコルとして構成し、上記で発行したACM証明書を割り当てています。

TLSの終端をNLB側で行うことで、EC2上のrsyslog自体には証明書やCipherスイートの管理を持たせず、プレーンなTCP受信のみで済むようにしています。

ターゲットグループの「クライアントIPアドレスの保持」について

NLBのターゲットグループには「クライアントIPアドレスの保持」(Preserve client IP addresses)という設定があります。
これを有効にしておくと、EC2側(rsyslog)で受信するTCP接続の送信元IPが、NLBのIPではなく実際のクライアントの送信元IPのまま届きます。
今回のようにログの送信元を正しく記録したいケースでは重要な設定です。

実際に検証ログでも、NLB経由にもかかわらず送信元がNLBのIPではなくクライアント自身のグローバルIPで記録されていることが確認できます。

2. EC2でrsyslogのログ記録設定について

EC2側には、rsyslogをインストールし、6514/tcpでTCP受信するモジュールを設定しています。
受信したログはそのままにファイル出力するだけのシンプルな構成です。

# cat /etc/rsyslog.d/10-remote-tcp.conf
module(load="imtcp")
input(type="imtcp" port="6514" ruleset="remote_syslog")

ruleset(name="remote_syslog") {
    action(type="omfile" file="/var/log/syslog/syslog.log")
    stop
}

検証内容

1. 外部からrsyslogのポートに対して簡単なスクリプトを組んで送信してみます

手元の端末からNLBのFQDN宛にTLS経由でsyslogメッセージを送信する、簡単なシェルスクリプトを用意しました。
「openssl s_client」でTLSハンドシェイクを行い、RFC3164形式のメッセージを流し込む形です。

#!/bin/bash
#
# TLS(TCP) syslog test sender
# Usage: ./send_syslog_tls.sh "test message"
#
set -euo pipefail

HOST="{NLBのFQDN}"
PORT="6514"
HOSTNAME_TAG="$(hostname)"
MESSAGE="${1:-Test syslog message via TLS from $(hostname) at $(date '+%Y-%m-%d %H:%M:%S')}"

# RFC3164形式のsyslogメッセージを組み立て (PRI=134: local0.info)
TIMESTAMP="$(date '+%b %e %H:%M:%S')"
SYSLOG_LINE="<134>${TIMESTAMP} ${HOSTNAME_TAG} test-sender: ${MESSAGE}"

echo "送信先: ${HOST}:${PORT}"
echo "送信内容: ${SYSLOG_LINE}"
echo "---"

# openssl s_clientでTLSハンドシェイク後にメッセージを送信
echo -e "${SYSLOG_LINE}\r\n" | openssl s_client \
  -connect "${HOST}:${PORT}" \
  -quiet \
  -no_ign_eof

echo "---"
echo "送信完了"

2. ログが記録されたことを確認します

EC2内のログファイルを確認したところ、送信元IP(NAT越しの送信元グローバルIP)付きで正しくメッセージが記録されていました。

実際に記録されたログ内容です。

# cat /var/log/syslog/syslog.log
Jul  1 01:46:44 xxx.xxx.xxx.xxx  7月  1 10:46:44 localhost.localdomain test-sender: Test syslog message via TLS from localhost.localdomain at 2026-07-01 10:46:44
Jul  1 01:49:29 xxx.xxx.xxx.xxx  7月  1 10:49:29 localhost.localdomain test-sender: Test syslog message via TLS from localhost.localdomain at 2026-07-01 10:49:29
Jul  1 01:57:58 xxx.xxx.xxx.xxx  7月  1 10:57:58 localhost.localdomain test-sender: Test syslog message via TLS from localhost.localdomain at 2026-07-01 10:57:58

送信のたびにタイムスタンプ・送信元ホスト名が記録されており、NLB経由のTLS通信からEC2上のrsyslogまで正しくログが到達していることが確認できました。

まとめ

  1. ELBのNLBで、TLSリスナーを使うことで、暗号化通信を容易にすることができました。
  2. rsyslogなどのソフトウェアにてTLS化することもできますが、TLSバージョンやCipherなどを細かく設定するのは、大変なので、NLBにオフロードすることで少しでも設定管理を楽にすることができました。
  3. 今回の検証では、opensslコマンドを活用してTLS暗号化された通信経路でSyslogを発行しましたが、実際にはPoC等でアプライアンス機器等から正しく転送されるか検証することをおすすめします。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA