第一弾として、こちらの記事で、macOS上のVirtualBoxでOpenAMをインストールして動くところまでを記載しました。この記事では、このOpenAMをSAMLのIdPとして用い、AWSマネジメントコンソールにログインできるようにするところまでを記述します。
この構成にした背景を少々。
- 多くの企業では、ハイブリッドクラウド環境が採用されており、オンプレミスにも従来から利用している多くのアプリケーションが残っている。
- この状況では、それらのアプリケーションへのログイン認証のための統合ID環境もオンプレミスに残っているケースが多いと思われる(少なくとも私のいる会社ではそう)ため、今回のOpenAMはクラウド上に配置したくなかった。
- 大企業であれば、その統合ID環境をクラウドでもそのまま利用できるように拡張したい要求があり、フェデレーションやシングル・サイン・オンを検討する必要がある。
- OpenAMをクラウド上ではなく、macOSの中のVirtualBoxでひっそりと動かすとなると、ID情報を提供するIdP(Identity Provider: 今回のOpenAM)と、それに依存し、アプリケーション・サービスを提供するSP(Service Provider: 今回のAWS)は相互通信できない。
- フェデレーションのプロトコルとしては、OpenID ConnectとSAMLがメジャーであるが、SAMLは大企業での使用がより一般的で、IdPとSPが相互通信できる必要がない。
- OpenID Connectでは、Authentication Code FlowとImplicit Code Flowとの2つのフローがあり、前者では、IdPとSPの相互通信が必要。
#参考
#OpenAMの初期設定
こちらの最後から開始して、OpenAMの初期設定を行います。
「新しい設定の作成」をクリック。
license agreementにチェックを入れて、「次へ」をクリック。
デフォルトの管理ユーザとなるamAdminのパスワードを入力して設定し、「次へ」をクリック。
「Cookieドメイン」を「samlidp.kawajun.local」(OpenAMホストのFQDN名)とし、「次へ」をクリック。
「ポート」、「管理者ポート」、「JNXポート」が以下のようになっていなければそのように入力し、「次へ」をクリック。
「OpenAMのユーザーデータストア」にチェックを入れて、「次へ」をクリック。
何もいじらず、「次へ」をクリック。
デフォルトのポリシーエージェントユーザのパスワードを入力、設定して、「次へ」をクリック。
何もいじらず、「設定の作成」をクリック。
「お待ちください... 設定しています...」がしばらく表示され、設定が進む。
成功すると、「設定が完了しました」と表示されるので、「ログインに進む」をクリック。もし、ここで失敗した場合、/home/tomcat配下のopenamをリネーム、必要に応じて、サーバのリスタートを試みてからやり直す。
#OpenAMによるSAML IdPの構成
ここからいよいよOpenAM上にSAMLの設定を行なっていきます。上でセットアップしたデフォルトアドミン(amAdmin)とそのパスワードにより、OpenAMにログインします。TLS/SSLによる暗号化通信をしていないため、「この接続は安全ではありません」の警告が出ますが、検証目的のため、ここでは無視します。
ログインに成功すると、以下のような画面になるので、SAMLのRealm(レルム)の設定として、"Top Level Realm"をクリックします。
今回、フェデレーション・プロトコルとしてSAMLを使うので、"Create SAMLv2 Provider"をクリックします。
まず、OpenAMホストをSAMLにおけるIdentityの提供や認証を請け負うIdP(Identity Provider)として機能させる設定を行うため、"Create Hosted Identity Provider"をクリックします。
ここからIdPとしての設定に入ります。「メタデータ」中の「名前」は一旦このまま使い、「署名鍵」はOpenAMに用意されている自己署名を用いた"test"を選択します。「トラストサークル」はSAMLによるフェデレーションを用いる相互に信頼されたIdPとそれに依存してサービスを提供するSP(Service Provider)からなるグループで、今回、AWS以外のクラウドサービスへのログインも後々、やってみたいので、「新しいトラストサークル」は一般的な名前として、"public_cloud"としておきます。最後に「設定」をクリックして次に進みます。
うまく行くと、「アイデンティティープロバイダが設定されました」「次に何を実行しますか?」と表示されるので、「サービスプロバイダを登録する」をクリックし、SPとなるAWSの登録に進みます。
#OpenAMへのAWSのSPとしての登録
SAMLのIdPとして動くOpenAMに対して、SPとして動くAWSを登録するには、まず、AWSのSPとしてのメタデータが配置されているURLを与える必要があります。AWSマネジメントコンソールへのログインの場合、そのURLについては、こちらなどに説明がある通り、https://signin.aws.amazon.com/static/saml-metadata.xml ですので、これを「メタデータが配置されているURL」に入力します。その後、「設定」をクリックします。
うまく行くと、リモートサービスプロバイダとして登録されるので、「了解」をクリックします。
上部の"FEDERATION"をクリックします。
下記のような画面に変わり、IdP(ローカルのOpenAM)とSP(AWSマネージメントコンソール)が、public_cloudと言うトラストサークルに含まれてるように見えます。
これで一旦、OpenAM側の作業を止めて、AWSマネジメントコンソール側の作業に入ります。
#AWSへのOpenAMのIdPとしての認識
まず、個人のルートユーザでAWSにサインインします。
サービスのメニューの中から"IAM"を探してクリックします。
左のメニューから「IDプロバイダー」をクリックします。
「プロバイダの作成」をクリックします。
「プロバイダーのタイプを選択する」のプルダウンメニューから"SAML"を選びます。
次にIdP(OpenAM)のメタデータがファイルの形で必要となるため、macOSのコマンドラインからcurlコマンドを実行して、メタデータをファイル(ここでは"exportmetadata.jsp"に落とします。
macbookpro% curl http://samlidp.kawajun.local:8080/openam/saml2/jsp/exportmetadata.jsp > exportmetadata.jsp
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4617 100 4617 0 0 901k 0 --:--:-- --:--:-- --:--:-- 901k
プロバイダ名に名前(ここでは"OpenAM"としました)を記入し、上記で生成されたファイルを「メタデータドキュメント」の「ファイルの選択」から選び、「次のステップ」をクリックします。
うまく行ってるようなので「作成」をクリックします。
うまく行ったようなので、次に「ロール」をクリックし、AWS上でのロールの定義に進みます。
#AWSでのロールの定義
次のような画面に移るので、「ロールの作成」をクリックします。
SAML用のロールを準備するので、もちろん「SAML 2.0フェデレーション」をクリックします。
「SAMLプロバイダー」は上で決めた"OpenAM"をプルダウンメニューから選び、「プログラムによるアクセスとAWSマネジメントコンソールによるアクセスを許可する」にチェックを入れて、「次のステップ: アクセス権限」をクリックします。
「ポリシー名」の中から"AdministratorAccess"にチェックを入れて、「次のステップ: タブ」をクリックします。(Alexaとか出てくるんですね。笑)
何もいじらず、「次のステップ: 確認」をクリックします。
「ロール名」は任意ですが、ここでは、"openam-user-role"を入れて、「ロールの作成」をクリックします。
どうやらうまく行ったっぽいですね。
ここから再びOpenAMに戻って設定を続けます。
#OpenAMにおけるアサーション設定
アサーション(Assersion: 表明)と呼ばれるSAML上の設定を行います。「エンティティープロバイダ」の中の"urn:amazon:webservices"をクリックします。
以下の画面に移るので、「表明処理」タブをクリックします。
「属性マップ」の「新しい値」に以下の2つの値を入れて「追加」します。
- https://aws.amazon.com/SAML/Attributes/Role=employeeNumber
-
https://aws.amazon.com/SAML/Attributes/RoleSessionName=uid
うまく行くと次のようなメッセージが出るので、「戻る」をクリックします。
さらに「アクセス制御」タブをクリックして、元の画面に戻ります。
再び"Top Level Realm"をクリックして中に入ります。ここからはOpenAM上にフェデレーションの対象となるユーザIDの作成に進みます。
#OpenAMにおけるフェデレーション対象ユーザ作成
左のメニューから"Subjects"をクリックします。
新しくユーザを定義していくので、「新規」をクリックします。
新規に作るユーザID(ここでは"kawajun")の情報として、必須フィールドの"ID"、「姓」、「フルネーム」、「パスワード」、「パスワード (確認)」を入力し、「了解」をクリックします。
今、作成したユーザIDのフルネーム("Jun Kawa")をクリックします。
ここから先はユーザの属性情報を入力しますが、SPであるAWS側からロールに関する情報を入手する必要があるので、再びAWSマネジメントコンソールに行きます。
#AWSからロールに関する情報を入手
先ほど作成したロールの名前"openam-user-role"をクリックします。
「ローカルARN」の値の右にあるアイコンをクリックし、値をクリップボードにコピーし、メモ帳などに一旦、ペーストします。その後、「信頼関係」タブをクリックします。
以下の画面に移るので、「信頼されたエンティティ」の値をコピーし、これもメモ帳などにペーストします。
次からは、OpenAMに再び戻り、AWSから得られた2つの値を使って、ユーザ属性を追加します。
#OpenAM上にユーザ属性を追加
「社員番号」の欄に、AWSから得られた2つの値をカンマ","でつなげた値を入れます。私のケースだと、"arn:aws:iam::265806162838:role/openam-user-role,arn:aws:iam::265806162838:saml-provider/OpenAM"がその値となります。その後、「保存」をクリックします。
うまく更新されると以下のような画面に移ります。ここで、amAdminによる管理作業は終わるので、「ログアウト」、さらに"OK"をクリックします。
#SAMLフェデレーション利用によるログイン試行
上記で準備は整いましたので、SAMLフェデレーション利用によるログインを試してみます。このURL: http://samlidp.kawajun.local:8080/openam/saml2/jsp/idpSSOInit.jsp?metaAlias=/idp&spEntityID=urn:amazon:webservices にアクセスし、先ほど定義したユーザID(ここでは"kawajun")とそのパスワードを入力し、"LOG IN"ボタンをクリックします。
そうすると、AWSマネジメントコンソールに画面遷移し、OpenAM(IdP)上に定義したユーザID(kawajun)とそのパスワードで、AWSマネジメントコンソール(SP)にログインできます。アカウント情報のところに、OpenAMを用いて認証されたことが示す情報が見えています。
#OpenAMダッシュボードにAWSへのリンク追加
ここまででOpenAM上に作ったユーザIDでAWSマネジメントコンソールにログインできることは確認できましたが、長いURLをエンドユーザに打たせるのはよろしくないので、OpenAMのダッシュボードに一発リンクを追加します。が、その作業中、Tomcatがエラーを吐いて先に進めなくなるので、こちらを参考におまじないを入れます。具体的には、ポート8080の属性の設定のところに、"relaxedPathChars"を追加定義し、Tomcatをリスタートします。
[root@samlidp ~]# cd /opt/tomcat/conf
[root@samlidp ~]# cp server.xml server.xml.org
[root@samlidp ~]# vi server.xml
(中略)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`"/>
(中略)
[root@samlidp ~]# systemctl restart tomcat
ここから再びOpenAMにamAdminでログインし、"CONFIGURATION"タブに進みます。
「グローバル」タブをクリックします。
次に「グローバルプロパティー」の中から「ダッシュボード」を探してクリックします。
ダッシュボードに新たなインスタンスを作成するため、「新規...」をクリックします。
先に、AWSロゴのアイコンをネットから拾ってきて、所定のディレクトリに配置しておきます。
[root@samlidp vagrant_data]# cp awslogo.png /opt/tomcat/webapps/openam/XUI/images
以下のように「グローバル属性」の各フィールドの値を入力し、「追加」をクリックします。ここで上から3つ目の"Dashboard Login"に入れるURLは、上でAWSへのログインに用いたURL http://samlidp.kawajun.local:8080/openam/saml2/jsp/idpSSOInit.jsp?metaAlias=/idp&spEntityID=urn:amazon:webservices です。また、一番下はAWSロゴのイメージを入れたディレクトリですが、/opt/tomcat/webapps/openam/XUIからの相対パスで指定します。
下記画面に移るので、「保存」をクリックします。
以下のメッセージが現れ、これでダッシュボードへの項目追加は完了です。さらに、上で作成したユーザのダッシュボードに、今、追加したAWSマネジメントコンソールが現れるようにします、「サービス設定へ戻る」をクリックします。
「アクセス制御」をクリックします。
再び、"Top Level Realm"の画面に戻るので、クリックします。
左のメニューから"Subjects"をクリックします。
先に作成したユーザ名(ここでは"Kawa Jun")をクリックします。
「サービス」タブをクリックします。
「ダッシュボード」をクリックします。上のTomcatへのおまじないを入れない場合、ここでエラーを吐きます。
「新しい値」に「AWSマネジメントコンソール」を入れて、「追加」をクリックし、「保存」をクリックします。
以下のような表示が出れば設定は完了です。
ここでamAdminはログアウトし、作成したユーザID(ここでは"kawajun")でログインし直します。以下の画面にログインするので、"DASHBOARD"をクリックします。
AWSロゴとともに、「AWSマネジメントコンソール」へのリンクが表示されるので、そこをクリックします。
先ほどと同じく、AWSマネジメントコンソールにログインし、確かにOpenAMをIdPとするフェデレーションによるユーザでログインできていることが確認できます。