LoginSignup
1
1

More than 3 years have passed since last update.

VirtaulBox上のOpenAMによるSAMLでのAWSへのログイン

Last updated at Posted at 2020-09-29

第一弾として、こちらの記事で、macOS上のVirtualBoxでOpenAMをインストールして動くところまでを記載しました。この記事では、このOpenAMをSAMLのIdPとして用い、AWSマネジメントコンソールにログインできるようにするところまでを記述します。
federation-openam-aws.png

この構成にした背景を少々。

  • 多くの企業では、ハイブリッドクラウド環境が採用されており、オンプレミスにも従来から利用している多くのアプリケーションが残っている。
  • この状況では、それらのアプリケーションへのログイン認証のための統合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の初期設定を行います。
「新しい設定の作成」をクリック。
openam-domain2.png
license agreementにチェックを入れて、「次へ」をクリック。
openam-configtool.png
デフォルトの管理ユーザとなるamAdminのパスワードを入力して設定し、「次へ」をクリック。
openam-customconfig.png
「Cookieドメイン」を「samlidp.kawajun.local」(OpenAMホストのFQDN名)とし、「次へ」をクリック。
openam-serverconfig.png
「ポート」、「管理者ポート」、「JNXポート」が以下のようになっていなければそのように入力し、「次へ」をクリック。
スクリーンショット 2021-01-07 8.41.26.png
「OpenAMのユーザーデータストア」にチェックを入れて、「次へ」をクリック。
openam-userdatastore.png
何もいじらず、「次へ」をクリック。
openam-siteconfig.png
デフォルトのポリシーエージェントユーザのパスワードを入力、設定して、「次へ」をクリック。
openam-defaultpolicyagentuser.png
何もいじらず、「設定の作成」をクリック。
openam-configtooloverviewanddetail.png
「お待ちください... 設定しています...」がしばらく表示され、設定が進む。
openam-waiting.png
成功すると、「設定が完了しました」と表示されるので、「ログインに進む」をクリック。もし、ここで失敗した場合、/home/tomcat配下のopenamをリネーム、必要に応じて、サーバのリスタートを試みてからやり直す。
openam-configcompleted.png

OpenAMによるSAML IdPの構成

ここからいよいよOpenAM上にSAMLの設定を行なっていきます。上でセットアップしたデフォルトアドミン(amAdmin)とそのパスワードにより、OpenAMにログインします。TLS/SSLによる暗号化通信をしていないため、「この接続は安全ではありません」の警告が出ますが、検証目的のため、ここでは無視します。
openam-login.png
ログインに成功すると、以下のような画面になるので、SAMLのRealm(レルム)の設定として、"Top Level Realm"をクリックします。
openam-realms.png
今回、フェデレーション・プロトコルとしてSAMLを使うので、"Create SAMLv2 Provider"をクリックします。
openam--realmoverview.png
まず、OpenAMホストをSAMLにおけるIdentityの提供や認証を請け負うIdP(Identity Provider)として機能させる設定を行うため、"Create Hosted Identity Provider"をクリックします。
openam-realmoverview2.png
ここからIdPとしての設定に入ります。「メタデータ」中の「名前」は一旦このまま使い、「署名鍵」はOpenAMに用意されている自己署名を用いた"test"を選択します。「トラストサークル」はSAMLによるフェデレーションを用いる相互に信頼されたIdPとそれに依存してサービスを提供するSP(Service Provider)からなるグループで、今回、AWS以外のクラウドサービスへのログインも後々、やってみたいので、「新しいトラストサークル」は一般的な名前として、"public_cloud"としておきます。最後に「設定」をクリックして次に進みます。
openam-samlidp.png
うまく行くと、「アイデンティティープロバイダが設定されました」「次に何を実行しますか?」と表示されるので、「サービスプロバイダを登録する」をクリックし、SPとなるAWSの登録に進みます。

OpenAMへのAWSのSPとしての登録

openam-idpcomplete.png
SAMLのIdPとして動くOpenAMに対して、SPとして動くAWSを登録するには、まず、AWSのSPとしてのメタデータが配置されているURLを与える必要があります。AWSマネジメントコンソールへのログインの場合、そのURLについては、こちらなどに説明がある通り、https://signin.aws.amazon.com/static/saml-metadata.xml ですので、これを「メタデータが配置されているURL」に入力します。その後、「設定」をクリックします。
openam-removesp.png
うまく行くと、リモートサービスプロバイダとして登録されるので、「了解」をクリックします。
openam-remotespcomplete.png
上部の"FEDERATION"をクリックします。
openam-federation.png
下記のような画面に変わり、IdP(ローカルのOpenAM)とSP(AWSマネージメントコンソール)が、public_cloudと言うトラストサークルに含まれてるように見えます。
openam-trustcircle.png
これで一旦、OpenAM側の作業を止めて、AWSマネジメントコンソール側の作業に入ります。

AWSへのOpenAMのIdPとしての認識

まず、個人のルートユーザでAWSにサインインします。
aws-signin.png
aws-password.png
サービスのメニューの中から"IAM"を探してクリックします。
aws-iam.png
左のメニューから「IDプロバイダー」をクリックします。
aws-idp.png
「プロバイダの作成」をクリックします。
aws-createidp.png
「プロバイダーのタイプを選択する」のプルダウンメニューから"SAML"を選びます。
aws-saml.png
次に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-metadata.png
うまく行ってるようなので「作成」をクリックします。
aws-createidpcomplete.png
うまく行ったようなので、次に「ロール」をクリックし、AWS上でのロールの定義に進みます。

AWSでのロールの定義

aws-role.png
次のような画面に移るので、「ロールの作成」をクリックします。
aws-createrole.png
SAML用のロールを準備するので、もちろん「SAML 2.0フェデレーション」をクリックします。
aws-createrole2.png
「SAMLプロバイダー」は上で決めた"OpenAM"をプルダウンメニューから選び、「プログラムによるアクセスとAWSマネジメントコンソールによるアクセスを許可する」にチェックを入れて、「次のステップ: アクセス権限」をクリックします。
aws-samlprovider.png
「ポリシー名」の中から"AdministratorAccess"にチェックを入れて、「次のステップ: タブ」をクリックします。(Alexaとか出てくるんですね。笑)
aws-policy.png
何もいじらず、「次のステップ: 確認」をクリックします。
aws-tag.png
「ロール名」は任意ですが、ここでは、"openam-user-role"を入れて、「ロールの作成」をクリックします。
aws-createrole3.png
どうやらうまく行ったっぽいですね。
aws-createrolecomplete.png
ここから再びOpenAMに戻って設定を続けます。

OpenAMにおけるアサーション設定

アサーション(Assersion: 表明)と呼ばれるSAML上の設定を行います。「エンティティープロバイダ」の中の"urn:amazon:webservices"をクリックします。
openam-trustcircle2.png
以下の画面に移るので、「表明処理」タブをクリックします。
openam-assersion.png
「属性マップ」の「新しい値」に以下の2つの値を入れて「追加」します。
- https://aws.amazon.com/SAML/Attributes/Role=employeeNumber
- https://aws.amazon.com/SAML/Attributes/RoleSessionName=uid
openam-attributemap.png
うまく行くと次のようなメッセージが出るので、「戻る」をクリックします。
openam-attributemapcomplete.png
さらに「アクセス制御」タブをクリックして、元の画面に戻ります。
openam-accesscontrol.png
再び"Top Level Realm"をクリックして中に入ります。ここからはOpenAM上にフェデレーションの対象となるユーザIDの作成に進みます。

OpenAMにおけるフェデレーション対象ユーザ作成

openam-realms2.png
左のメニューから"Subjects"をクリックします。
openam-subjects.png
新しくユーザを定義していくので、「新規」をクリックします。
openam-user.png
新規に作るユーザID(ここでは"kawajun")の情報として、必須フィールドの"ID"、「姓」、「フルネーム」、「パスワード」、「パスワード (確認)」を入力し、「了解」をクリックします。
openam-newuser.png
今、作成したユーザIDのフルネーム("Jun Kawa")をクリックします。
openam-user2.png
ここから先はユーザの属性情報を入力しますが、SPであるAWS側からロールに関する情報を入手する必要があるので、再びAWSマネジメントコンソールに行きます。

AWSからロールに関する情報を入手

先ほど作成したロールの名前"openam-user-role"をクリックします。
aws-openamuserrole.png
「ローカルARN」の値の右にあるアイコンをクリックし、値をクリップボードにコピーし、メモ帳などに一旦、ペーストします。その後、「信頼関係」タブをクリックします。
openam-localarn.png
以下の画面に移るので、「信頼されたエンティティ」の値をコピーし、これもメモ帳などにペーストします。
aws-trustedentity.png
次からは、OpenAMに再び戻り、AWSから得られた2つの値を使って、ユーザ属性を追加します。

OpenAM上にユーザ属性を追加

「社員番号」の欄に、AWSから得られた2つの値をカンマ","でつなげた値を入れます。私のケースだと、"arn:aws:iam::265806162838:role/openam-user-role,arn:aws:iam::265806162838:saml-provider/OpenAM"がその値となります。その後、「保存」をクリックします。
openam-empnumber.png
うまく更新されると以下のような画面に移ります。ここで、amAdminによる管理作業は終わるので、「ログアウト」、さらに"OK"をクリックします。
openam-usercomplete.png
openam-logout.png

SAMLフェデレーション利用によるログイン試行

上記で準備は整いましたので、SAMLフェデレーション利用によるログインを試してみます。このURL: http://samlidp.kawajun.local:8080/openam/saml2/jsp/idpSSOInit.jsp?metaAlias=/idp&spEntityID=urn:amazon:webservices にアクセスし、先ほど定義したユーザID(ここでは"kawajun")とそのパスワードを入力し、"LOG IN"ボタンをクリックします。
openam-federatedlogin.png
そうすると、AWSマネジメントコンソールに画面遷移し、OpenAM(IdP)上に定義したユーザID(kawajun)とそのパスワードで、AWSマネジメントコンソール(SP)にログインできます。アカウント情報のところに、OpenAMを用いて認証されたことが示す情報が見えています。
aws-federatedlogin.png

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"タブに進みます。
openam-configuration.png
「グローバル」タブをクリックします。
openam-global.png
次に「グローバルプロパティー」の中から「ダッシュボード」を探してクリックします。
openam-dashboard.png
ダッシュボードに新たなインスタンスを作成するため、「新規...」をクリックします。
openam-instance.png
先に、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からの相対パスで指定します。
openam-globalattribute.png
下記画面に移るので、「保存」をクリックします。
openam-dashboardcomplete.png
以下のメッセージが現れ、これでダッシュボードへの項目追加は完了です。さらに、上で作成したユーザのダッシュボードに、今、追加したAWSマネジメントコンソールが現れるようにします、「サービス設定へ戻る」をクリックします。
openam-dashboardcomplete2.png
「アクセス制御」をクリックします。
openam-accesscontrol2.png
再び、"Top Level Realm"の画面に戻るので、クリックします。
openam-toplevelrealm.png
左のメニューから"Subjects"をクリックします。
openam-subjects2.png
先に作成したユーザ名(ここでは"Kawa Jun")をクリックします。
openam-username.png
「サービス」タブをクリックします。
openam-userservice.png
「ダッシュボード」をクリックします。上のTomcatへのおまじないを入れない場合、ここでエラーを吐きます。
openam-edituser.png
「新しい値」に「AWSマネジメントコンソール」を入れて、「追加」をクリックし、「保存」をクリックします。
openam-userattribute.png
以下のような表示が出れば設定は完了です。
openam-dashboardusercomplete.png
ここでamAdminはログアウトし、作成したユーザID(ここでは"kawajun")でログインし直します。以下の画面にログインするので、"DASHBOARD"をクリックします。
ppenam-userlogin.png
AWSロゴとともに、「AWSマネジメントコンソール」へのリンクが表示されるので、そこをクリックします。
openam-awsdashboard.png
先ほどと同じく、AWSマネジメントコンソールにログインし、確かにOpenAMをIdPとするフェデレーションによるユーザでログインできていることが確認できます。
aws-federatedlogin2.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1