end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

IdP by OpenAM - SP by OpenAM による SAML連携

SAMLシングル・サインオン構成において、 IdP(Identity Provider)にのみ OpenAM を用い、 SP(Service Provider)にOpenAM以外(SalesforceやG-Suite、cybozu)を用いた例は、 インターネット上によく見かけます。

一方、SP に OpenAMを用いた例は、あまり見かけない為、 今回、主に SPや SP側WebAgentの設定について記載しています。

f:id:end0tknr:20200822094024p:plain

0.今回 構成のポイント

https://resources.us.safenetid.com/help/ForgeRock%20OpenAM/Index.htm

上記urでは、SP に OpenAM を用い、 Authentication Modules (SAML)や Authentication Chain を 設定し、 SP にあるログイン画面を表示しないようにしています。(下図)

f:id:end0tknr:20200822094045p:plain

当初、上記urlの設定に倣おうとしましたが、上手くSAML連携できなかった為、 今回は、Auth Moduleや Auth Chain を用いず、 主に SAMLトラストサークルと、ログイン画面URLの設定を行うことで IdPのログイン画面をdefault表示するようにしていますので、 SPのログイン画面もURLを直接指定することで表示できる状態にしています。

1. 事前準備

ここでは、SPやSP側WebAgentのサーバインスタンスの追加から、 ミドルウェアやOpenAMのインストールまでを簡単に記載します。

1.1. OpenAM SP - sp.end0tknr.com

1.1.1. サーバインスタンス

AWS EC2

t2.small、ディスク=50GB、OS=AmazonLinux1

hostname

$ sudo vi /etc/sysconfig/network
   HOSTNAME=sp1.end0tknr.com

(ロードバランサ下での冗長構成を想定し、上記としてます)

/etc/hosts

$ sudo vi /etc/hosts
  $PRIVATE_IP sp1.end0tknr.com

( $PRIVATE_IPはAWSにより決定される任意のものです)

ALB(ELB)

ホスト名=sp.end0tknr.com
TARGET= sp1.end0tknr の port:8080

1.1.2. Java

version 1.8.0を利用していますが、別のバージョンでも問題ないと思います。

$ sudo yum install java-1.8.0-openjdk-devel.x86_64
$ sudo alternatives --config java
$ /usr/bin/java -version
openjdk version "1.8.0_252"

1.1.3. tomcat

少々、古めのOpenAM 13を使用する為、tomcat7を使用しています

$ cd /opt
$ sudo wget https://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-7/v7.0.105/bin/apache-tomcat-7.0.105.tar.gz
$ sudo tar -xvf apache-tomcat-7.0.105.tar.gz
$ sudo ln -s apache-tomcat-7.0.105 tomcat

$ sudo useradd tomcat
$ sudo chown -R tomcat:tomcat /opt/tomcat
$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-7.0.105

$ sudo mkdir /opt/sso  ## openamの設定用dir
$ sudo chown tomcat:tomcat /opt/sso

$ sudo vi /etc/init.d/tomcat
  #!/bin/bash
  # description: Tomcat7 Start Stop Restart
  # processname: tomcat7
  # chkconfig: 234 20 80
  CATALINA_HOME=/opt/tomcat

  case $1 in
  start)
      sh $CATALINA_HOME/bin/startup.sh
  ;;
  stop)
      sh $CATALINA_HOME/bin/shutdown.sh
  ;;
  restart)
      sh $CATALINA_HOME/bin/shutdown.sh
      sh $CATALINA_HOME/bin/startup.sh
  ;;
  esac

1.1.4. OpenAM

OpenAM ver.12 を使用したかったのですが、 ForgeRock社のライセンス変更?により入手できない為、 OpenAM Community Edition ver.13 を使用しています。

$ sudo /etc/init.d/tomcat stop

$ sudo su -
# cd /opt/tomcat/webapps
# wget https://github.com/OpenIdentityPlatform/OpenAM/releases/download/13.0.0/OpenAM-13.0.0.war
# mv OpenAM-13.0.0.war sso.war
# chown tomcat:tomcat sso.war

$ sudo /etc/init.d/tomcat start

https://sp.end0tknr.com/sso へブラウザでアクセス

- 「設定オプション」画面にて「カスタム設定の新しい設定の作成」リンクをクリック

- 「カスタム設定オプション 手順1:一般」にて
  「amadmin」のpasswordを<ないしょ>に設定

- 「カスタム設定オプション 手順2:サーバ設定」にて
   サーバURL     : https://sp.end0tknr.com:443
   Cookieドメイン: .end0tknr.com
   ロケール      : en_US
   設定dir       : /opt/sso
   
- 「カスタム設定オプション 手順3:設定データストア設定」にて
   設定データストア  : OpenAM
   ポート            : 50389
   管理者ポート      : 4444
   JMXポート         : 1689
   暗号化鍵          : root4HEMS
   ルートサフィックス: dc=openam,dc=forgerock,dc=org

- 「カスタム設定オプション 手順4:ユーザーデータストア設定」にて
  「OpenAMのユーザデータストア」を選択

- 「カスタム設定オプション 手順5:サイト設定」に
   ロードバランサの背後に配備され「ない」として次へ
   ※「ロードバランサの背後に配備される」でも問題ないと思います。

- 「カスタム設定オプション 手順6:デフォルトのポリシーエージェントユーザー」にて
   パスワード : <ないしょ>

「設定の作成」をクリックし、しばらく経過すると「設定が完了しました」と
表示される為、「ログインに進む」をクリックでログインできれば、完了。

1.1.5.テスト用ユーザの作成

ブラウザでOpenAMにログインし、IdPにて、Top Level Realm -> Data Stores -> 「対象」順に画面遷移後、ユーザを追加して下さい。

1.2. OpenAM SP側WebAgent - sp-agt.end0tknr.com

1.2.1. サーバインスタンス

AWS EC2

t2.small、ディスク=50GB、OS=AmazonLinux1

hostname

$ sudo vi /etc/sysconfig/network
   HOSTNAME=sp-agt1.end0tknr.com

(ロードバランサ下での冗長構成を想定し、上記としてます)

/etc/hosts

$ sudo vi /etc/hosts
  $PRIVATE_IP sp-agt1.end0tknr.com

( $PRIVATE_IPはAWSにより決定される任意のものです)

ALB(ELB)

ホスト名=sp-agt.end0tknr.com
TARGET= sp-agt1.end0tknr の port:8080

1.2.2. apache httpd

$ sudo yum install httpd24
$ /usr/sbin/httpd -v
Server version: Apache/2.4.43 (Amazon)

$ sudo chkconfig --add httpd
$ sudo chkconfig httpd on
$ sudo chkconfig --list httpd
httpd    0:off  1:off   2:on    3:on    4:on    5:on    6:off

$ sudo /etc/init.d/httpd start

1.2.3. WebAgent (Servie Provider側)

先程、installした Service Provider (OpenAM)へブラウザでログインし、 以下の設定を行って下さい。

エージェントプロファイルを作成。
Top Level Realm -> Agents -> Web で遷移した画面で、
エージェントの「新規」をクリックし、「新しいWeb」の画面にて以下を入力

  名前            : idp_to_sp_by_saml
  パスワード      : ないしょ
  設定            : 集中
  サーバー URL    : https://sp.end0tknr.com:443/sso
  エージェント URL: https://sp-agt.end0tknr.com:443/

同じ IdPにて、OpenAM上でAuthorization Policyを作成。
Top Level Realm -> Authorization -> Policy Setsへ移動。
iPlanetAMWebAgentServiceの右側のEdit(鉛筆)アイコンをクリック。
Add a New policyで新しいポリシーを作成する。
「New Policy」の画面にて以下を入力。

  Name        : idp_to_sp_by_saml
  Description : null
  Resources   : *://*:*/*

更に「Subjects」タブへ移動し、TypeをAuthenticated Usersに変更。

1.2.4. WebAgent

※yum install httpd で adduser された apache を su - 可能にする(以下)
# su - apache
This account is currently not available.
# vi /etc/passwd
apache:x:48:48:Apache:/var/www:/bin/bash  # CHANGE from /sbin/nologin

$ sudo su -
$ mkdir /etc/httpd/openam
$ chown apache:apache /etc/httpd/openam

## 以下は、web agent の installerが httpd.conf を書き換える為に実施
$ chown -R apache:apache /etc/httpd/conf

$ su - apache
$ cd /etc/httpd/openam
$ wget https://github.com/OpenIdentityPlatform/OpenAM-Web-Agents/releases/download/4.1.1/Apache_v24_Linux_64bit_4.1.1.zip
$ unzip Apache_v24_Linux_64bit_4.1.1.zip

$ echo "ないしょ" > web_agents_passwd

$ cd /etc/httpd/openam/web_agents/apache24_agent/bin
$ ./agentadmin --help
$ ./agentadmin --i   ## 「i」は、インストールを意味します

  Configuration file [/opt/apache/conf/httpd.conf]: /etc/httpd/conf/httpd.conf
  Existing OpenSSOAgentBootstrap.properties file: NULL
  OpenAM server URL: https://sp.end0tknr.com/sso
  Agent URL: https://sp-agt.end0tknr.com
  Agent Profile name: idp_to_sp_by_saml
  Agent realm/organization name: [/]: NULL
  The path and name of the password file: /etc/httpd/openam/web_agents_passwd


$ sudo /etc/init.d/httpd stop
$ sudo /etc/init.d/httpd start

2. SAML設定

ここからが、本題の SAML設定です

2.1. SAMLトラストサークル作成

OpenAM Service Provider へブラウザで amadminでログインし 「FEDERATION」→「連携タブ」→「新規」ボタンをクリックして下さい。 「トラストサークルの作成」画面にて「名前」【のみ】入力し、 「了解」をクリックすることで 【空】のトラストサークルを作成します。

f:id:end0tknr:20200822100955p:plain

f:id:end0tknr:20200822101008p:plain

f:id:end0tknr:20200822101017p:plain

2.2. SAMLトラストサークルへのエンティティ追加 (ServiceProvider)

「Top Level Realm」→「Create SAMLv2 Providers」→ 「Create Hosted Service Provider」で遷移後、 「このサーバー上に SAMLv2 サービスプロバイダを作成します」画面で、 以下に記載のように設定することで、 先程作成したトラストサークルへServiceProviderが追加されます。

f:id:end0tknr:20200822101924p:plain

f:id:end0tknr:20200822101935p:plain

項目 内容
このプロバイダのメタデータはありますか? いいえ
メタデータURL https://sp.end0tknr.com:443/sso
トラストサークル 既存のトラストサークルに追加します
既存のトラストサークル ★先程作成したトラストサークル名を選択下さい
IdPのデフォルト属性マッピングを使用しますか はい

2.3.SAMLトラストサークルへのエンティティ追加 (Identity Provider)

「Top Level Realm」→「Create SAMLv2 Providers」→ 「Register Remote Identity Provider」で遷移後、 「SAMLv2 リモートアイデンティティープロバイダを作成します」画面で、 以下に記載のように設定することで、 先程作成したトラストサークルへIdentity Providerが追加されます。

f:id:end0tknr:20200822103147p:plain

f:id:end0tknr:20200822103201p:plain

項目 内容
メタデータ ファイルはどこに存在しますか? URL
メタデータが配置されているURL https://idp.end0tknr.com/sso/saml2/jsp/exportmetadata.jsp?realm=/
トラストサークル 既存のトラストサークルに追加します
既存のトラストサークル ★先程作成したトラストサークル名を選択下さい

2.4. SAMLトラストサークル作成と、エンティティ追加(IdP側)

先程までに行ったSP側と、ほぼ同様の手順で、IdP側(idp.end0tknr.com)へも SAMLトラストサークル作成と、エンティティ追加を行って下さい。 IdP側のトラストサークルに追加するServiceProviderエンティティのメタデータURLは、 例えば、次のものです。

https://sp.end0tknr.com/sso/saml2/jsp/exportmetadata.jsp?realm=/

2.5. SAMLエンティティ(ServiceProvider)の修正 表明処理における自動連携設定

ここでは、IdPとSP間での、ユーザID(uid)の連携を設定します。

まず、SAMLトラストサークル設定画面にあるエンティティプロバイダ(SP)のリンクから、 設定画面へ遷移して下さい。

f:id:end0tknr:20200822104246p:plain

次に「SP」の「表明処理」画面で以下のように設定し、完了です。

項目 内容
自動連携 有効 はい
自動連携 属性 uid

f:id:end0tknr:20200822104832p:plain

2.6. WebAgent設定

SP側 WebAgentへのアクセスで、IdP側ログイン画面へリダイレクトする設定を行います。 まず、「Top Level Realm」→「Agents」で画面遷移して下さい。

f:id:end0tknr:20200822110230p:plain

f:id:end0tknr:20200822110241p:plain

「グローバル」タブにて以下の赤線のように設定を行って下さい。

項目 内容
エージェント通知 URL https://idp.end0tknr.com:443/UpdateAgentCacheServlet?shortcircuit=false
エージェント通知 URI プレフィックス https://idp.end0tknr.com:443/amagent
CDSSO のエージェントルート URL https://idp.end0tknr.com:443/
完全修飾ドメイン名 FQDN デフォルト end0tknr.com

f:id:end0tknr:20200822111432p:plain

f:id:end0tknr:20200822112127p:plain

「OpenAMサービス」タブタブにて以下の赤線のような設定を【戦闘に】追加して下さい。

項目 内容
OpenAM ログイン URL https://sp.end0tknr.com/sso/saml2/jsp/spSSOInit.jsp?metaAlias=/sp&idpEntityID=https://idp.end0tknr.com:443/sso
OpenAM ログアウト URL https://sp.end0tknr.com/sso/UI/Logout?realm=/

f:id:end0tknr:20200822113353p:plain

以上で、設定完了で、SP側WebAgentへブラウザでアクセスすると、IdPのログイン画面が表示され、 認証成功すると、SP側WebAgent の画面が表示されるかと思います。