2022年4月9日土曜日

WireGuardの接続・切断のログをファイルに出力させる手順

WireGuardはOSSのVPNソフトウェアであり、ソースコードが4,000行程度と非常にコンパクトで、Linuxのカーネルモジュールとして動作するという特徴がある。

WireGuardにてVPN環境を構築する手順については、以下別記事で記載している。

WireGuardはVPN接続した際に、wgコマンドで接続状態を確認することができる。例えば、以下実行例ではpeer: YYYYYYYYの接続対象は、1時間36分前に接続があったことを確認できる (★箇所)。

# wg
interface: wg0
  public key: XXXXXXXX
  private key: (hidden)
  listening port: 51820

peer: YYYYYYYY
  endpoint: 12.34.56.78:52852
  allowed ips: 10.0.1.21/32
  latest handshake: 1 hours, 36 minutes, 38 seconds ago ★
  transfer: 150.96 KiB received, 903.67 KiB sent

しかし、WireGuardは接続・切断のログはファイルに出力されないため、アクセスログが残らないことからセキュリティ上問題となる場合がある。

そこで今回は、WireGuardの接続・切断のログをファイルに出力させる手順を記載する。

環境

今回はRHELクローンであるAlmaLinuxにて構築を行ったが、CentOSや本家RHELでも同様の手順で構築できるだろう。

  • OS : AlmaLinux release 8.5 (Arctic Sphynx)

WireGuardログ出力手順

1. kernelのDynamic debugを有効にする

WireGuardは設定ファイルなどではログを出力させることはできず、kernelのDynamic debugと呼ばれるデバッグログの出力機能を用いることによって、ログの出力が可能となる。

なお、Secure Bootが有効となっている場合は、本設定は「Operation not permitted」のエラーで失敗するため、Secure Bootを解除する必要がある。

Dynamic debugによるログの有効化・無効化は以下コマンドで実施できる。有効化されているかどうかは、/sys/kernel/debug/dynamic_debug/controlgrepし、=pという文字列が含まれているかどうかで確認できる (無効化されている場合は、=_という文字列になる)。

有効化

# echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control
# cat /sys/kernel/debug/dynamic_debug/control | grep -e 'wireguard.*=p'
/home/phil/rpmbuild/BUILD/wireguard-linux-compat-1.0.20211208/src/noise.c:818 [wireguard]wg_noise_handshake_begin_session =p "%s: Keypair %llu created for peer %llu\012"
/home/phil/rpmbuild/BUILD/wireguard-linux-compat-1.0.20211208/src/noise.c:125 [wireguard]keypair_free_kref =p "%s: Keypair %llu destroyed for peer %llu\012"
/home/phil/rpmbuild/BUILD/wireguard-linux-compat-1.0.20211208/src/device.c:420 [wireguard]wg_netns_pre_exit =p "%s: Creating namespace exiting\012"
~(以下略)~

無効化

# echo module wireguard -p > /sys/kernel/debug/dynamic_debug/control
# cat /sys/kernel/debug/dynamic_debug/control | grep -e 'wireguard.*=p'
★無効化されている場合は何も表示されない。

公式サイトではmodprobe wireguardを実行しエラーがない場合は、Dynamic debugによるログの有効化を行う手順になっている。本記事では、公式サイトのコマンドを採用する。

# modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

2. 再起動時にDynamic debugを有効にする

Dynamic debugは一時的な設定であり、再起動すると設定は無効化される。そこで、cronを使ってOS起動時にDynamic debugを有効にするコマンドを実行するよう設定する。modprobeコマンドは絶対パスで記載する点に注意しよう。

# crontab -l
@reboot /usr/sbin/modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

設定後は一度OSを再起動して問題なく実行されることを確認しておこう。

# reboot
# tail -10 /var/log/cron
~(中略)~
Apr  1 06:51:04 t3036vpns CROND[1132]: (root) CMD (/usr/sbin/modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control)

3. rsyslogにて/var/log/messagesに出力させる

これでWireGuard接続時にログは出力されるようになり、journalctlではi以下のように接続ログが表示されるようになる。

# journalctl -n 10 --no-pager
~(中略)~
 4月 01 06:02:06 t3036vpns kernel: wireguard: wg0: Receiving handshake initiation from peer 1 (12.34.56.78:59755)
 4月 01 06:02:06 t3036vpns kernel: wireguard: wg0: Sending handshake response to peer 1 (12.34.56.78:59755)
 4月 01 06:02:06 t3036vpns kernel: wireguard: wg0: Keypair 4 created for peer 1
 4月 01 06:02:17 t3036vpns kernel: wireguard: wg0: Sending keepalive packet to peer 1 (12.34.56.78:59755)

しかし、このままでは/var/log/messagesには出力されないため、rsyslogの/var/log/messagesの設定にkern.debugを追加する。

# vi /etc/rsyslog.conf
~(中略)~
*.info;mail.none;authpriv.none;cron.none;kern.debug     /var/log/messages
~(以下略)~

# systemctl restart rsyslog

4. 動作確認

最後に、実際にWireGuardで接続・切断した際のログ出力を確認しておこう。

まずは接続時のログは以下となる。Receiving handshake initiationのメッセージにてWireGuardの接続が開始されたことを確認できる。

# tail -f /var/log/messages
~(中略)~
Apr  1 08:03:35 t3036vpns kernel: wireguard: wg0: Receiving handshake initiation from peer 1 (12.34.56.78:59511)
Apr  1 08:03:35 t3036vpns kernel: wireguard: wg0: Sending handshake response to peer 1 (12.34.56.78:59511)
Apr  1 08:03:35 t3036vpns kernel: wireguard: wg0: Keypair 2 created for peer 1
Apr  1 08:03:47 t3036vpns kernel: wireguard: wg0: Sending keepalive packet to peer 1 (12.34.56.78:59511)

切断時のログは以下となる。WireGuardは、接続対象から応答がなくなってから20回接続確認を行い、すべて失敗したらあきらめて (did not complete after 20 attempts, giving up) 切断するようだ。最終的なWireGuardの切断は、Zeroing out all keysのメッセージにて確認できる。

# tail -f /var/log/messages
~(中略)~
Apr  1 08:08:13 t3036vpns kernel: wireguard: wg0: Handshake for peer 1 (12.34.56.78:59511) did not complete after 5 seconds, retrying (try 19)
Apr  1 08:08:13 t3036vpns kernel: wireguard: wg0: Sending handshake initiation to peer 1 (12.34.56.78:59511)
Apr  1 08:08:19 t3036vpns kernel: wireguard: wg0: Handshake for peer 1 (12.34.56.78:59511) did not complete after 5 seconds, retrying (try 20)
Apr  1 08:08:19 t3036vpns kernel: wireguard: wg0: Sending handshake initiation to peer 1 (12.34.56.78:59511)
Apr  1 08:08:24 t3036vpns kernel: wireguard: wg0: Handshake for peer 1 (12.34.56.78:59511) did not complete after 20 attempts, giving up
Apr  1 08:13:00 t3036vpns kernel: wireguard: wg0: Zeroing out all keys for peer 1 (12.34.56.78:59511), since we haven't received a new one in 540 seconds
Apr  1 08:13:00 t3036vpns kernel: wireguard: wg0: Keypair 2 destroyed for peer 1

以上で、WireGuardの接続・切断のログをファイルに出力させる手順は完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿