はじめに
「境界型防御はもはや時代遅れ、これからはゼロトラストだから既存のサービスにも多要素認証導入して!あと多要素認証導入されていないサービスは社外からはVPN経由でないと利用できないようにしといて」という無茶ぶりがあったとする。
VPNならいいのかよ?というツッコミは置いといて、なんとか対策を考える。
Azure AD
Azure AD Premium P1だと「条件付きアクセス」、P2なら「リスクベースの条件付きアクセス」が使えるので、希望する条件で多要素認証を利用するように設定できる。
多要素認証を求められた場合にも、Microsoft Authenticatorアプリで承認するだけなので、利用者の負担も軽いのが良い。
せっかくなので新規に多要素認証対応のIdPを構築したりせず、この仕組みを利用することにする。
設定
今回リバースプロキシサーバを用意し、アクセス時にはAzure ADで認証OKならサービスを利用できるようにする。リバースプロキシサーバのFQDNは proxy.example.com、サービス提供サーバを service.example.com とする。
本設定にはAzure Portalでのアプリ登録が必須のため、管理者の協力が必要となる。
Azureへのアプリ登録
Azure ADを使って認証したいウェブサイトについて、Azure Portalでアプリとして登録する。
OnenID Connectモジュールの設定
リバースプロキシサーバでApache httpdにOpenID Connectモジュールを設定する。
RHEL 7の場合はyumコマンドでモジュールを追加できる。
# yum install mod_auth_openidc
OpenID Connect用の設定を、アプリとして登録した内容に合わせて変更する。OIDCRedirectURIの値は https://proxy.example.com/oidc/auth のようなURLにしておく。
OIDCRedirectURI <Azure Portalで登録したアプリ用リダイレクトURL>
OIDCClientID <Azure Portalで確認したアプリ用ClientID>
OIDCClientSecret <Azure Portalで生成したアプリ用Secret>
OIDCProviderMetadataURL https://login.microsoftonline.com/<テナントID>/.well-known/openid-configuration
OIDCCryptoPassphrase <適当に決定>
OIDCScope openid
OIDCAuthRequestParams prompt=select_account
OIDCAuthRequestParams domain_hint=<your-azure-ad.domain>
OIDCResponseType code
OIDCRemoteUserClaim upn
サービス提供サーバのリバースプロキシとして動作するよう設定する。
ProxyRequests Off
ProxyPass / https://service.example.com/
ProxyPassReverse / https://service.example.com/
SSLProxyEngine on
<Location />
AuthType openid-connect
Require valid-user
</Location>
以上の設定をした後で https://proxy.example.com/ にアクセスすると、Azure ADを利用した認証画面が表示される。条件付きアクセスの設定によっては、多要素認証を求められる。
OIDCAuthRequestParams domain_hint=<your-azure-ad.domain>
で制限しているため、当該ドメイン以外の個人用MSアカウントなどは、ログイン済みでも表示されなくなっている。
参考にしたサイト
https://heartbeats.jp/hbblog/2017/08/mod-auth-openidc.html
https://heartbeats.jp/hbblog/2017/08/mod-auth-openidc-azure-ad.html