FortiGate VM の syslog 出力機能を利用して EC2(syslog サーバー)にログ出力してみた

2022.09.01

こんにちは、大前です。

AWS 上に起動した FortiGate VM 上で取得されるログを syslog として別 EC2 に出力する機会がありましたので、内容を紹介させていただきます。

構成

以下の簡易的な構成で検証しました。FortiGate VM / syslog サーバ / 疎通確認用サーバ で計 3台の EC2 を構築しています。


今回は以下 AMI を利用して FortiGate VM を立ち上げました。

また、syslog サーバ / 疎通確認用サーバ はともに Amazon Linux 2 を利用しています。構成図には記載していませんが、VPC Endpoint を立てて Session Manager で接続可能な状態としています。

やってみた

0.FortiGate VM と疎通確認用サーバの構築

事前準備として FortiGate VM と疎通確認用サーバの構築が必要ですが、以下ブログの手順に従って構築しました。


上記ブログに手順が簡潔にまとまっているため、一通り実施することで下記状態の環境が構築ができるはずです。FortiGate VM からのログ出力設定については、出力先となる syslog サーバーの IP アドレスが必要になりますので、まだ実施しません。

1.syslog サーバの構築

続いて、FortiGate VM syslog サーバを構築します。

Amazon Linux 2 の EC2 を構築し、今回はプライベートサブネット上に配置します。特殊な設定は不要ですが、FortiGate VM は UDP 514 を利用して syslog を出力するため、Security Group で FortiGate VM からの UDP 514 が受け付けられる様にしておきます。


続いて、構築した EC2 を syslog サーバーとして利用するため、/etc/rsyslog.conf を修正します。修正ポイントは以下になります。

  • syslog を受け付けられる様にするため、$ModLoad imudp 等のコメントアウトを外す(16-17行目、20-21行目)※FortiGate VM は UDP 514 で syslog を送信してくるため、TCP のコメントアウトはそのままでも良いかもしれません。
  • FortiGate VM から送られる syslog に対するルールを追加(41行目)

今回は facility が local0 のログを /var/log/fortilog に出力するように設定しています。後述しますが、FortiGate VM 側の設定で syslog 出力に利用する facilityを変更し、上記のルールに合致するようにします。

$ cat /etc/rsyslog.conf
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

(中略)

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

(中略)

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

# FortiGate syslog
local0.*                                                /var/log/fortilog

(省略)


/etc/rsyslog.conf を更新したら、rsyslog を再起動しておきます。

sudo systemctl restart rsyslog


syslog サーバの設定については、下記ブログを参考にしました。

2.FortiGate VM の syslog 出力設定

最後に、FortiGate VM 側で syslog 出力設定を行います。

管理画面にログインし、「ログ&レポート」→「ログ設定」からログ設定画面を開きます。「ログを syslog へ送信」を有効化した上で、「IPアドレス/FQDN」に syslog サーバーとして構築した EC2 のプライベート IP アドレスを記載します。とりあえずログが出力されて欲しいので、「ログ設定」については "すべて" としておきます。最後に、「適用」をクリックしたらログ出力先の設定は完了です。


続いて、syslog サーバーの /etc/rsyslog.conf で定義したルールに合致する様に FortiGate VM から出力される syslog の facility を変更します。

同じく管理画面にて、画面右上あたりにある CLI アイコンをクリックして CLI コンソールを開きます。


CLI コンソールが開いたら、下記コマンドを実行し、出力される syslog の facility を変更します。(今回は "local0" に変更)

Fortigate1 # config log syslogd setting
Fortigate1 (setting) # set facility local0
Fortigate1 (setting) # end


下記画像の様に、get log syslogd setting をして変更内容が反映されていれば OK です。画像では変更前から "local0" になっていますが、いろいろ作業した後に取得したスクリーンショットなので誤りです。(本来はデフォルトで "local7" が利用されています)

3. syslog が出力されることを確認

設定が一通り完了したので、疎通確認サーバーから適当に ping 等を実行したところ、下記のように syslog サーバー上の /var/log/fortilogにログが出力される事が確認できました。

おわりに

FortiGate VM の syslog 出力機能を利用して、syslog サーバーとして構築した EC2 上に syslog を出力してみました。

EC2 上に syslog を出力してしまえば、あとは syslog サーバー上で CloudWatch Agent や Fluentd を利用して S3 や CloudWatch Logs に FortiGate VM のログをためていくことも可能かと思います。


以上、AWS 事業本部の大前でした。

参考