ブラウザでユーザー管理! pfSenseでMicrosoft ADを使ったClientVPNのMFA構成
前回作成した環境では、ユーザー登録作業など全ての作業をSSHで接続して行う必要がありました。
この作業自体は複雑ではないですが、ブラウザで操作できる管理画面が欲しい場面もあるかもしれません。 そこで今回は、ブラウザで管理画面を操作できる「pfSense」というOSSのファイアウォールを使ってみたいと思います。
検証する構成
構成自体は前回の内容と変わりません。図のようにシステム管理者はブラウザでpfSenseの管理画面にアクセスして作業ができます。
管理画面ではMFA用のユーザ管理のほか、アプリのコンフィグを参照できたり、サーバリソースの確認やOSユーザの管理など、管理作業に必要なことがおおよそ対応できるものになっています。
実際に構築するのは、下記の通り必要最小限のリソースのみとします。
pfSenseサーバの構築
「pfSense」はFreeBSDベースのディストリビューションで、AWSではMarketplaceから利用することが可能です。
そのため、EC2作成時にMarketplaceから指定してインスタンスを作成します。
後は、EC2をラウンチするまで特別な作業はありません。
パスワードの確認
起動できたらブラウザから管理画面にログインしますが、ログインパスワードを知る必要があります。
パスワードは起動時にランダムに生成されるようですが、下記の公式ドキュメントによると、/etc/motd
もしくはEC2のコンソールから「システムログの取得」で参照できるとあります。
しかし、/etc/motd
にはパスワードらしきものが書かれていませんでした。
ちなみに、SSHでec2-user
でアクセスすることができますが、ドキュメントにはadmin
ユーザでログインする旨の記載がありました。
admin
でSSH接続すると、専用のメニューが表示されるので、ここでサーバの操作をするようです。
/etc/motd
ではパスワードが確認できなかったので、コンソールから「システムログの取得」の画面で確認しました。
管理画面へのアクセス
ブラウザでIPアドレスを指定して管理画面にアクセスします。
踏み台経由でプライベートIPでアクセスしてもいいですし、パブリックサブネットに作成した場合はグローバルIPなどでアクセスできます。 実際にアクセスするとHTTPSにリダイレクトされますが、自己証明書が使われているためブラウザに警告が表示されます。
先程確認したパスワードを入力してログインします。ユーザー名は「admin」です。
管理画面で利用されている自己証明書は1年間有効なものになっているようなので、更新する必要があれば別途新しい自己証明書を作成して切り替える必要があるようです。
また、追加のモジュールをインストールすることでLet's Encryptによる自動更新も可能なようです。
(Let's Encryptを使う場合は、パブリックなドメインの利用やLet's Encrypt側からのアクセスも必要になるため、ネットワーク構成などを変更する必要が出てくるので注意が必要です)
初期セットアップ
初めてログインすると初期設定のウィザードが表示されるので、流れに沿って設定していきます。(Nextをクリック)
もう一度「Next」をクリックします。
ホスト名、ドメイン名、DNSサーバの設定を行います。ドメインとDNS名は必要に応じて設定してください。
DNSサーバの設定(Primary DNS Server, Secondary DNS Serverの箇所)には、リゾルバを指定します。
「Overrride DNS」にデフォルトでチェックが入っていますが、VPCのAmazon DNSが有効になっている場合は、自動的にAmazon DNSのIPに上書きされるようです。
そのため、DNSサーバの指定は今回は空欄のままとしました。
タイムゾーンは「Asia/Tokyo」を選択します。
管理画面へのログインパスワードの指定です。インスタンス作成時のものから変更したい場合は、ここで指定しましょう。
「Reload」をクリックして、ここまでの設定を反映します。
反映完了まで少し待ちます。
設定反映が完了したら、「Finish」をクリックして終了です。
初期設定が完了するとダッシュボードが表示されます。
設定したホスト名などの他、メモリ使用率などのサーバリソースも確認することができます。DNSサーバにはAmazon DNSのIPが入っていますね。
FreeRADIUSのインストール
前回と同じようにMFAの実現は「FreeRADIS + Google Authenticator」になります。
今回は全て管理画面から実行できるので、メニューから「System」> 「Package Manager」をクリックします。
次の画面でインストール済みのもの、インストール可能なものを確認できます。ここでは「Available Packages」を表示します。
「radius」などのキーワードで検索します。
「freeradius3」のパッケージが見つかったので「Install」をクリックしましょう。
インストールの確認画面です。
インストールが始まったら少し待機します。
問題なくインストール完了しました。
FreeRADIUSの設定
インストールが完了したら、前回同様に設定を行っていきます。(もちろん管理画面で行います)
インターフェイスの設定
メニューから「Service > FreeRADIUS」を選択して、RADIUSの設定画面を開きます。
「Interfaces」画面を開きます。まだ何もないので「Add」で作成していきます。
項目 | 設定内容 |
---|---|
Interface IP Address | EC2インスタンスのプライベートIP |
Port | 1812 |
Interface Type | Authentication |
IP Version | IPv4 |
Description | Authentication(なんでもいいです) |
アカウンティング用のインターフェイスも作成します。
項目 | 設定内容 |
---|---|
Interface IP Address | EC2インスタンスのプライベートIP |
Port | 1813 |
Interface Type | Accounting |
IP Version | IPv4 |
Description | Accounting(なんでもいいです) |
一覧に、作成した2つのインターフェイスが表示されていればOKです。
NASクライアントの設定
次にNAS(Network Access Server)クライアントを設定します。
メニューから「Service > FreeRADIUS」を選択します。
次の画面で「NAS / Clients」をクリックして表示されたら、「Add」でクライアントを登録します。
設定内容は以下のとおりです。
ここでの設定が/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(なんでもいいです) |
認証サーバの追加
次に、pfSenseにRADIUSサーバの登録を行います。
メニューから「System > User Manager」を選択します。
次の画面で「Authentication Servers」を表示して、「Add」で追加します。
項目 | 設定内容 |
---|---|
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 |
ユーザ設定(登録)
最後にVPN接続するユーザを登録します。登録するユーザはActive Directoryと同じユーザにしてください。
メニューから「Service > FreeRADIUS」を選択します。
次の画面で「Users」を表示して、「Add」でユーザを追加します。
ここでは、設定が必要なセクションのみピックアップして説明していきます。
General Configration
今回はOTPを使いますが、その場合は「General Configration」ではパスワードは入力しないように注意してください。(OTPを有効にしている状態では、パスワード指定してもユーザ作成できません)
項目 | 設定内容 |
---|---|
Username | ADに登録されているユーザ名 |
Password | 空欄 |
Password Encryption | デフォルトのままでOKです。(Cleartext-Password) |
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」となります。
ここで表示されたQRコードをスマホのMFAアプリスキャンすると下記のようにFreeRADIUSのロゴが自動で選択されました。(後で任意のものに変更可能です)
ここまでの内容で問題なければ「Save」をクリックしてユーザー作成します。
「cmtest001」というユーザーが作成できました。
Microsoft ADの設定
前回同様、Microsoft ADを作成します。
Microsoft ADの作成
下記の手順については、前の記事と同じですので作業内容についてはそちらを参照してください。
- Microsoft ADの作成
- セキュリティグループの設定
MFAの有効化
これも手順は前回と同様です。次の箇所が変更点となります。
- RADIUSサーバのIPは、pfSenseサーバのプライベートIP
- 共有シークレットコードは、本記事の「認証サーバの追加」で指定した「Shared Secret」のもの
ClientVPNの設定 / Microsoft ADへのユーザ追加
「ClientVPNの設定」と「Microsoft ADへのユーザ追加」も、前の記事と同じ手順になるので割愛いたします。
VPNクライアントから接続テスト
前回同様にMacでTunnelblickから接続してみます。
ユーザ名、パスワードの入力は前回と同様です。
MFAコードの入力では、pfSense上で設定した通り「PINコード + OTPコード」の形で入力します。
VPN接続できたら、pfSenseサーバにプライベートIPで接続してみます。
プライベートIPで専用のCLIインターフェイスにアクセスできることが確認できました。
pfSenseサーバの冗長化
前回の記事と同様、実運用を考えるとやはりMulti-AZでpfSenseサーバを冗長化したいというニーズもあると思います。
pfSenseはHA機能を持っていますが、CARPでマルチキャストを使うためAWSでは利用できません。
ただ、サーバ間で設定を同期する機能は持っているようなので同期設定を有効にして、Microsoft ADのMFA設定の中で「RADIUSサーバのIPをカンマで複数登録」すればよさそうです。
こちらは機会があれば試してみたいと思います。
ただ、利用シーンを考えると頻繁にユーザの登録や変更が発生することは無いと思うので、AMI取得等で日次バックアップを行い、何かあった場合は最新のバックアップAMIから復元する、といった運用でもいいかもしれません。
(運用レベルに応じて検討いただければと思います)
最後に
今回の内容で、実際の作業としてサーバにSSHすることは一切なく、すべてブラウザから操作することができました。
コマンドラインでの作業も難しくはないですが、ブラウザからの操作だけで作業できるようにしたいという場合は検討してみていただければと思います。
今回はpfSenseを使いましたが、類似するアプリケーションもいくつか見つけたので、そちらも機会があれば試してみたいと思います。
以上です。
参考リンク
- pfSenseとGoogle Authenticator
- pfSenseをAWSで作成
- pfSenseの冗長化