ラベル Apache の投稿を表示しています。 すべての投稿を表示
ラベル Apache の投稿を表示しています。 すべての投稿を表示

2017年3月21日火曜日

[小ネタ]NAT構成のVMに構成されたAD FSへiOSデバイスを登録する

こんにちは、富士榮です。

今回は完全に小ネタというか自分用のメモです。

普段、BootcampなMacbook AirにWindows 10を入れ、その上でVMware Workstationを動かして、AD FSやMIMを動かして検証してるんですが、VMやAzureだけでクローズできないネタを検証する場合です。

具体的にはiOSやAndroidデバイスなどをAD FSへデバイス登録してデバイス認証をしたい場合、以下が困ります。
・JailbreakしていないiOSだとhosts登録が出来ない
・色々と事情があってVMをNAT構成で動かしているので母艦PC以外からVMへアクセスできない

ということで、対処してみます。

と、言ってもやることは母艦にApacheを立ててForward Proxyにするだけなんですが。

◆Apacheをダウンロードして構成する

Apacheの本家からWindows用のbinaryのダウンロードは出来なくなっているので、本家からリンクされているサイトからダウンロードをして使います。
 http://httpd.apache.org/docs/current/platform/windows.html#down

母艦がWindows 10 Pro x64なので、64bit版をダウンロードしてきました。バージョンは現時点の最新版な2.4.25です。

zipアーカイブを解凍したら少々コンフィグをいじくります。(conf\httpd.confを編集します)
ポイントは、

  1. パスを合わせる
  2. Proxyに必要なモジュールをロードする
  3. Forward Proxyとして構成する
  4. ServerNameをつける

の4点です。

では順番に。

1.パスを合わせる

 変更箇所はServerRoot、DocumentRoot、ScriptAlias、cgi-binのディレクトリ設定の4か所です。単にForward Proxyとして使うだけなので変更しなくても問題はありませんエラーが出るので。以下の5行が変更対象です。今回、C:\Tools\Apache以下にモジュールを展開したので環境に合わせて編集します。
ServerRoot "C:/Tools/Apache/Apache24"
DocumentRoot "C:/Tools/Apache/Apache24/htdocs"

    ScriptAlias /cgi-bin/ "C:/Tools/Apache/Apache24/cgi-bin/"

2.Proxyに必要なモジュールをロードする

 必要なモジュールのLoadModule行のコメントアウトを外します。今回AD FSを使うのでhttpsのフォワードも必要なのでmod_proxy_connectも使います。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so

3.Forward Proxyとして構成する

 非常に雑な構成ですが、httpd.confの最後に以下を追記します。

  ProxyRequests On
  ProxyVia On
  Listen 8080
  AllowCONNECT 443
 
    Order deny,allow
    Deny from all
    Allow from all
 

4.ServerNameをつける

 これはしなくてもいい設定ですが、Apacheの起動時にワーニングが出るのでとりあえず設定しておきます。

ServerName hoge:80

取り敢えずここまで設定したらOKなので、起動しておきます。
私の場合は検証したい時だけ立ち上げれば良いので、サービス化はせずにコマンドプロンプトから直接起動します。

binディレクトリ配下でhttpd.exeを起動するだけです。


◆母艦からアクセスできるようする(hostsファイルの構成など)

母艦経由でVMへアクセスさせたいので、まずは母艦からアクセス出来るようにネットワークを構成をしてあげる必要があります。

多くの場合、適当な名前(.localとか)でドメインを構成していたりするので、母艦のhostsファイルを使って適切にアクセスできるように構成する必要があります。

後は、念のため母艦からAD FSへアクセスできることを確認しておきましょう。


◆iOS側のProxy設定をする

最後にiOSのWifi設定でProxyサーバに母艦PCを指定します。
尚、当然の事ながら母艦PCへの8080ポートの通信をWindows Firewallで開放しておく必要があります。

iPhoneの設定からWifiを開き、母艦PCと同じアクセスポイントへ接続していることを確認したら、母艦PCのIPアドレスとProxyサーバとして指定した8080番を指定します。


設定はこれで終了です。

◆DRSへアクセスしてデバイス登録する

この状態でiPhoneからAD FSのデバイス登録サービス(DRS)へアクセスして、プロファイルがインストールされるか確認してみます。

DRSのアドレスは
 https://ADFSServer/EnrollmentServer/otaprofile
ですが、当然インターネットにしか繋がっていないiPhoneからVMで動いているAD FSへアクセスは出来ず、DRSへ到達できません。

しかし、今回母艦に立てたProxyを経由することでVM上のAD FSへアクセスでき、無事にプロファイルがインストールできます。



当然、デバイスクレームの取得もできるので、手元でアクセス制御のテストも行うことが出来ます。



まぁ、Azure上にIaaSを立ててインターネットからもアクセス出来るようにすればいいんでしょうが、iOSからアクセスできるようにちゃんとDNS登録が必要だったり、特にDRSの場合はenterpriseregistrationの名前が解決できる証明書を用意しなければいけなかったりするので、手元で済ませられれば手軽なのでこういう方法もありかな~と思っています。

2017年1月8日日曜日

CentOS+Apacheの認証をAzure AD/OpenID Connectで行う

こんにちは、富士榮です。

某普通な人がnode.jsとPAMを使ったApache+Azure ADの認証(Basic認証)の記事を書いていたので、そういえばPingIdentityの人が作ってるmod_auth_openidc使ってなかった事を思い出したのでやってみました。

 参考)割と普通なブログ
  Linux+Apache の認証で Azure Active Directory を利用する
  http://normalian.hatenablog.com/entry/2017/01/08/031209


やりたいことは、CentOSにホストされたApache上のWebコンテンツへのアクセスAzure ADで保護する、という非常にシンプルなシナリオです。
※意外と実案件でもこの手の引き合い多いんですよね。オンプレのWebサーバでスタティックコンテンツの場合はAzure AD WAP(Web Application Proxy)で提案しちゃうことが多いんですけどね。

◆環境(必要なもの)

CentOSは手元に転がっていたVMをそのまま流用しました。
uname -aの結果はこんな感じ。ちなみに面倒なのでSELinuxとFirewallは無効にしてあります。
[root@oidc conf]# uname -a
Linux oidc.eidentity.local 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

mod_auth_openidcは最新版(2.1.3)のrpmが以下からダウンロードできますが、色々と前提となるパッケージなどを入れる必要があったので、ついでにソースからコンパイルしてしまいました。
 https://github.com/pingidentity/mod_auth_openidc/releases

以下が必要となるパッケージ群です。

yumでインストールするもの。(*-develがこんなに必要だったのはコンパイルしたからです)

  • git
  • httpd-devel
  • curl-devel
  • jansson-devel
  • openssl-devel
  • autoconf
  • automake

rpmでインストールするもの
  • cjose-0.4.1-1.el7.centos.x86_64.rpm
    • mod_auth_openidcと同じくここからダウンロードできます。
ソースからコンパイルするもの

  • hiredis
  • mod_auth_openidc


◆モジュールの導入手順

上記に記載したyumでインストールするものをyum installでまずはインストールします。
手順は書くまでもありませんが、以下の通りです。(だいぶ省略してます)
#yum install git
# yum install httpd-devel
# yum install curl-devel
# yum install jansson-devel
# yum install openssl-devel
# yum install autoconf
# yum install automake

同様にrpmでインストールするcjoseについても導入します。
# rpm -i cjose-0.4.1-1.el7.centos.x86_64.rpm


最後にコンパイルするモジュール群です。
まずはHiredisです。githubのレポジトリをクローンしてmakeします。
適当なディレクトリで以下のコマンドを実行します。
# git clone http://github.com/redis/hiredis
# cd hiredis
# make
# make install


そして、本命のmod_auth_openidcです。こちらもHiredisと同じくgit cloneして最新のソースを元にインストールしていきます。
git clone https://github.com/pingidentity/mod_auth_openidc/releases
cd mod_auth_openidc
./autogen.sh
./configure
make
make install

これで、/etc/httpd/modulesにmod_auth_openidc.soが出来上がります。


◆設定手順

設定は大きくは2つに分かれます。
 1つ目は、Apache自体にmod_auth_openidcを組み込む
 2つ目は、mod_auth_openidc自体の設定と対抗となるAzure ADへのクライアント登録
です。

順に解説していきます。

1.Apache自体にモジュールを組み込む

単純に出来上がったモジュールをロードします。
今回は認証関係のモジュールを読み込んでいる/etc/httpd/conf.modules.d/00-base.confへ以下を追記しました。
LoadModule auth_openidc_module modules/mod_auth_openidc.so



次に、保護対象とするコンテンツを決めていきます。
今回は単純にOpenID Connectを使ってAzure ADからアイデンティティ情報が取れていれば良いので、cgi-binディレクトリを保護対象として、環境変数にid_tokenの中身がちゃんと入ってきているかどうかを確認したいと思います。

/etc/httpd/conf/httpd.confに以下を追記します。
<Location /cgi-bin/>
   AuthType openid-connect
   Require valid-user
</Location>


もちろん、/var/www/cgi-binへテスト用のcgiファイルを置き、実行権限を付ける必要はあります。
今回は単純に環境変数を見たいだけなので、以下のスクリプトを置いています。
#!/bin/perl
print "Content-type: text/html\n\n";
print "<TABLE BORDER=\"1\">\n";

for $key (sort(keys(%ENV))) {
    print "<TR><TD><TT>$key</TT></TD><TD><TT>$ENV{$key}</TT></TD></TR>\n";
}

print "</TABLE>\n";
exit;


2.モジュールの設定(RPとしての設定)とAzure ADの設定(IdPとしての設定)

まず、Azure ADへクライアント登録を行います。

RPへ登録するために欲しい情報は、

  • client_id
  • client_secret

の2点で、これらはAzure ADへアプリケーション登録をすることにより取得が可能になります。

また、Azure ADへアプリケーション(つまりはOAuthクライアント)を登録する際に必要なのは、redirect_uri(アプリケーションのURL)です。

アプリケーションの追加をすると以下のパラメータを聞いてきますので、それぞれを設定します。

  • アプリケーション名: 任意の名前
  • アプリケーション・タイプ: Web app / APIを指定
  • サインオンURL: アプリケーションのURL(今回はhttp://oidc.eidentity.local/cgi-bin/にしています)
登録が終わると以下のダッシュボードが表示され、この中にあるアプリケーションIDがApache側へ設定するclient_idとなりますので、コピーしておきます。


次はclient_secretです。
ダッシュボードのAll settingsからキーを選択して新規にキーを生成し、保存をクリックすると表示されるのがclient_secretです。画面を遷移すると二度と表示できないので、ちゃんとコピーしておきます。


基本的にこれで情報はそろうのですが、最後にもう一つ。
mod_auth_openidcがリダイレクトしたり通信するIdPのエンドポイント情報を取得するためのメタデータURLが必要となりますので、これを確認しておきます。

以下のURLなので特に気にすることもありませんが、覚えておきます。
 https://login.windows.net/{ドメイン名}/.well-known/openid-configuration


では、最後となるhttpd.confへの設定追加をしていきます。
必要なのは以下のパラメータです。

  • OIDCProviderMetadataURL: Azure ADのメタデータURLを指定
  • OIDCClientID: Azure ADに登録したクライアントIDを指定
  • OIDCClientSecret: Azure ADに登録したクライアントシークレットを指定
  • OIDCRedirectURI: Azure ADに登録したアプリケーションのURLを指定
  • OIDCScope: スコープを指定。openid email profileあたりで問題なし
  • OIDCCryptoPassphrase: 必須なので適当にしてい


こんな感じになります。

OIDCProviderMetadataURL https://login.windows.net/pharaoh.onmicrosoft.com/.well-known/openid-configuration
OIDCClientID 0fa5bfc6-61da-47c1-9223-02f136594d09
OIDCClientSecret 6/2TYCeboBUgDB7rluxFmpLE8fYL45zgwhk38RTY5/E=
OIDCRedirectURI http://oidc.eidentity.local/cgi-bin/
OIDCScope "openid email profile"
OIDCCryptoPassphrase Password



これで設定は完了です。
早速テストしてみます。

◆動作確認

単純に先ほどAzure ADで保護したcgiにアクセスしてみます。

いきなりAzure ADのログイン画面へリダイレクトされますので、ログインします。

するとプロファイルへのサインインとアクセスに関する同意が求められるので同意します。


同意すると、cgiへリダイレクトされ、正しくアイデンティティ情報が取得できているのがわかります。
(OIDC_CLAIM_*という環境変数がid_tokenから取得された情報です)



かなり構成も簡単なので、レガシーなWebコンテンツやCGIなどが残っている場合は、今回紹介した方法でAzure ADとの連携を導入してみてはいかがでしょうか?