ブラウザでユーザー管理! pfSenseでMicrosoft ADを使ったClientVPNのMFA構成

ブラウザで操作できる管理画面を持つ「pfSense」というOSSのファイアウォールを使って、ClientVPNのMFA環境を作ってみたいと思います。
2020.04.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回作成した環境では、ユーザー登録作業など全ての作業をSSHで接続して行う必要がありました。

この作業自体は複雑ではないですが、ブラウザで操作できる管理画面が欲しい場面もあるかもしれません。 そこで今回は、ブラウザで管理画面を操作できる「pfSense」というOSSのファイアウォールを使ってみたいと思います。

検証する構成

構成自体は前回の内容と変わりません。図のようにシステム管理者はブラウザでpfSenseの管理画面にアクセスして作業ができます。

管理画面ではMFA用のユーザ管理のほか、アプリのコンフィグを参照できたり、サーバリソースの確認やOSユーザの管理など、管理作業に必要なことがおおよそ対応できるものになっています。

101-pfSense-ADConnector-VPC-Peering

実際に構築するのは、下記の通り必要最小限のリソースのみとします。

102-pfSense-ADConnector-VPC-Peering-test

pfSenseサーバの構築

「pfSense」はFreeBSDベースのディストリビューションで、AWSではMarketplaceから利用することが可能です。
そのため、EC2作成時にMarketplaceから指定してインスタンスを作成します。

01-marketplace

後は、EC2をラウンチするまで特別な作業はありません。

パスワードの確認

起動できたらブラウザから管理画面にログインしますが、ログインパスワードを知る必要があります。
パスワードは起動時にランダムに生成されるようですが、下記の公式ドキュメントによると、/etc/motdもしくはEC2のコンソールから「システムログの取得」で参照できるとあります。

しかし、/etc/motdにはパスワードらしきものが書かれていませんでした。

07-motd

ちなみに、SSHでec2-userでアクセスすることができますが、ドキュメントにはadminユーザでログインする旨の記載がありました。
adminでSSH接続すると、専用のメニューが表示されるので、ここでサーバの操作をするようです。

06-ssh

/etc/motdではパスワードが確認できなかったので、コンソールから「システムログの取得」の画面で確認しました。

08-system-log

管理画面へのアクセス

ブラウザでIPアドレスを指定して管理画面にアクセスします。

踏み台経由でプライベートIPでアクセスしてもいいですし、パブリックサブネットに作成した場合はグローバルIPなどでアクセスできます。 実際にアクセスするとHTTPSにリダイレクトされますが、自己証明書が使われているためブラウザに警告が表示されます。

05-privacy-err-chrome

先程確認したパスワードを入力してログインします。ユーザー名は「admin」です。

09-web-ui-login

管理画面で利用されている自己証明書は1年間有効なものになっているようなので、更新する必要があれば別途新しい自己証明書を作成して切り替える必要があるようです。

また、追加のモジュールをインストールすることでLet's Encryptによる自動更新も可能なようです。
(Let's Encryptを使う場合は、パブリックなドメインの利用やLet's Encrypt側からのアクセスも必要になるため、ネットワーク構成などを変更する必要が出てくるので注意が必要です)

初期セットアップ

初めてログインすると初期設定のウィザードが表示されるので、流れに沿って設定していきます。(Nextをクリック)

10-setup

もう一度「Next」をクリックします。

11-setup

ホスト名、ドメイン名、DNSサーバの設定を行います。ドメインとDNS名は必要に応じて設定してください。
DNSサーバの設定(Primary DNS Server, Secondary DNS Serverの箇所)には、リゾルバを指定します。

「Overrride DNS」にデフォルトでチェックが入っていますが、VPCのAmazon DNSが有効になっている場合は、自動的にAmazon DNSのIPに上書きされるようです。

そのため、DNSサーバの指定は今回は空欄のままとしました。

12-dns-empty

タイムゾーンは「Asia/Tokyo」を選択します。

13-ntp-tz

管理画面へのログインパスワードの指定です。インスタンス作成時のものから変更したい場合は、ここで指定しましょう。

14-password

「Reload」をクリックして、ここまでの設定を反映します。

15-reload

反映完了まで少し待ちます。

16-in-progress

設定反映が完了したら、「Finish」をクリックして終了です。

17-finish-setup

初期設定が完了するとダッシュボードが表示されます。
設定したホスト名などの他、メモリ使用率などのサーバリソースも確認することができます。DNSサーバにはAmazon DNSのIPが入っていますね。

20-dashboard

FreeRADIUSのインストール

前回と同じようにMFAの実現は「FreeRADIS + Google Authenticator」になります。
今回は全て管理画面から実行できるので、メニューから「System」> 「Package Manager」をクリックします。

21-packages-manager

次の画面でインストール済みのもの、インストール可能なものを確認できます。ここでは「Available Packages」を表示します。

22-available-packages

「radius」などのキーワードで検索します。
「freeradius3」のパッケージが見つかったので「Install」をクリックしましょう。

23-install-freeradius

インストールの確認画面です。

24-confirm

インストールが始まったら少し待機します。

25-installing-radius

問題なくインストール完了しました。

26-completed-install

FreeRADIUSの設定

インストールが完了したら、前回同様に設定を行っていきます。(もちろん管理画面で行います)

インターフェイスの設定

メニューから「Service > FreeRADIUS」を選択して、RADIUSの設定画面を開きます。

27-select-freeradius

「Interfaces」画面を開きます。まだ何もないので「Add」で作成していきます。

項目 設定内容
Interface IP Address EC2インスタンスのプライベートIP
Port 1812
Interface Type Authentication
IP Version IPv4
Description Authentication(なんでもいいです)

28-add-interface-1

アカウンティング用のインターフェイスも作成します。

項目 設定内容
Interface IP Address EC2インスタンスのプライベートIP
Port 1813
Interface Type Accounting
IP Version IPv4
Description Accounting(なんでもいいです)

28-add-interface-2

一覧に、作成した2つのインターフェイスが表示されていればOKです。

28-add-interface-3

NASクライアントの設定

次にNAS(Network Access Server)クライアントを設定します。
メニューから「Service > FreeRADIUS」を選択します。

50-add-nas-client1

次の画面で「NAS / Clients」をクリックして表示されたら、「Add」でクライアントを登録します。

51-add-nas-client2

設定内容は以下のとおりです。
ここでの設定が/etc/raddb/clients.confに反映されます。

項目 設定内容
Client IP Address VPCのCIDR
Client IP Version IPv4
Client Shortname pfsenselocal(なんでもいいです)
Client Shared Secret 共有シークレット(任意のパスワード)
Client Protocol UDP
Client Type other
Require Message Authenticator No
Max Connections 16
NAS Login -
NAS Password -
Description pfsenselocal(なんでもいいです)

52-add-nas-client3

認証サーバの追加

次に、pfSenseにRADIUSサーバの登録を行います。
メニューから「System > User Manager」を選択します。

40-user-manager

次の画面で「Authentication Servers」を表示して、「Add」で追加します。

41-select-auth-server

項目 設定内容
Descriptive name myradius(なんでもいいです)
Type RADIUS
Protocol PAP
Hostname or IP address EC2インスタンスのプライベートIP
Shared Secret 共有シークレット。
NASクライアントで設定したClient Shared Secretと同じものを設定。
Services offered Authentication and Accounting
Authentication port 1812
Accounting port 1813
Authentication Timeout 5
RADIUS NAS IP Attribute WAN

42-add-auth-server

ユーザ設定(登録)

最後にVPN接続するユーザを登録します。登録するユーザはActive Directoryと同じユーザにしてください。
メニューから「Service > FreeRADIUS」を選択します。

50-add-nas-client1

次の画面で「Users」を表示して、「Add」でユーザを追加します。

30-add-users

ここでは、設定が必要なセクションのみピックアップして説明していきます。

General Configration

今回はOTPを使いますが、その場合は「General Configration」ではパスワードは入力しないように注意してください。(OTPを有効にしている状態では、パスワード指定してもユーザ作成できません)

項目 設定内容
Username ADに登録されているユーザ名
Password 空欄
Password Encryption デフォルトのままでOKです。(Cleartext-Password)

31-no-passwpod

One-Time Password Configrataion

続けて「One-Time Password Configrataion」を設定します。

項目 設定内容
One-Time Password チェックを入れます
OTP Auth Method Google-Authenticator
Init-Secret 「Generate OTP Secret」をクリックすると入力されます
PIN 適当な数字を4-8桁で入力
Time Offset 0
QR Code 「Generate QR Code」をクリックすると表示されます

QRコードが表示されたら、スマホのMFAアプリでユーザ登録しておきましょう。
上記で登録したPINコードは、Google Authenticatorを使う場合は必須で、6桁のOTPコードの頭に付けて利用します。
例えば、「PINコードが1234」で「OTPコードが987654」であれば、この2つをくっつけて「1234987654」となります。

32-otp-config

ここで表示されたQRコードをスマホのMFAアプリスキャンすると下記のようにFreeRADIUSのロゴが自動で選択されました。(後で任意のものに変更可能です)

37-mfa-app

ここまでの内容で問題なければ「Save」をクリックしてユーザー作成します。

33-save

「cmtest001」というユーザーが作成できました。

32-added-user

Microsoft ADの設定

前回同様、Microsoft ADを作成します。

Microsoft ADの作成

下記の手順については、前の記事と同じですので作業内容についてはそちらを参照してください。

  • Microsoft ADの作成
  • セキュリティグループの設定

MFAの有効化

これも手順は前回と同様です。次の箇所が変更点となります。

  • RADIUSサーバのIPは、pfSenseサーバのプライベートIP
  • 共有シークレットコードは、本記事の「認証サーバの追加」で指定した「Shared Secret」のもの

38-directory-conf

ClientVPNの設定 / Microsoft ADへのユーザ追加

「ClientVPNの設定」と「Microsoft ADへのユーザ追加」も、前の記事と同じ手順になるので割愛いたします。

VPNクライアントから接続テスト

前回同様にMacでTunnelblickから接続してみます。
ユーザ名、パスワードの入力は前回と同様です。

60-tunnelblick-connect

MFAコードの入力では、pfSense上で設定した通り「PINコード + OTPコード」の形で入力します。

61-enter-pin-mfa-code

62-mfa-app

VPN接続できたら、pfSenseサーバにプライベートIPで接続してみます。
プライベートIPで専用のCLIインターフェイスにアクセスできることが確認できました。

63-ssh-pfsense

pfSenseサーバの冗長化

前回の記事と同様、実運用を考えるとやはりMulti-AZでpfSenseサーバを冗長化したいというニーズもあると思います。

pfSenseはHA機能を持っていますが、CARPでマルチキャストを使うためAWSでは利用できません。
ただ、サーバ間で設定を同期する機能は持っているようなので同期設定を有効にして、Microsoft ADのMFA設定の中で「RADIUSサーバのIPをカンマで複数登録」すればよさそうです。

こちらは機会があれば試してみたいと思います。

ただ、利用シーンを考えると頻繁にユーザの登録や変更が発生することは無いと思うので、AMI取得等で日次バックアップを行い、何かあった場合は最新のバックアップAMIから復元する、といった運用でもいいかもしれません。
(運用レベルに応じて検討いただければと思います)

最後に

今回の内容で、実際の作業としてサーバにSSHすることは一切なく、すべてブラウザから操作することができました。
コマンドラインでの作業も難しくはないですが、ブラウザからの操作だけで作業できるようにしたいという場合は検討してみていただければと思います。

今回はpfSenseを使いましたが、類似するアプリケーションもいくつか見つけたので、そちらも機会があれば試してみたいと思います。

以上です。

参考リンク