SimpleSAMLphpを使ってAD認証するSAML IDPを作ろう
schedule 2018/10/16 refresh 2023/11/08
やりたいこと
- SimpleSAMLphpを使ってSAML IDプロバイダ(SAML IDP)を構築しActive Directoryのユーザでログインする。
- SeciossLinkで認証時にSAML IDPで認証するようにする。
前提
- CentOS 7.5のインストールと初期設定が完了していること
- SELinuxが無効(disable)となっていること
- Active Directoryが構築済みであること(外部からLDAP接続できる状態であること)
- SeciossLink検証環境の申し込みが完了していること(もちろん本契約しているSeciossLinkテナントでも大丈夫です)
※ 本契約しているテナントの場合は、適宜 ホスト名を“slinkdev.secioss.net”から”slink.secioss.com”に読み替えてください。
※ 本稿で使用しているSeciossLinkのテナントIDをexample.comです。こちらも適宜読み替えてください。
手順
1. 環境設定
まず、SimpleSAMLphpに必要なパッケージをインストールします。
# yum install mod_ssl
# yum install php
# yum install php-mbstring
# yum install php-xml
# yum install php-ldap
2. SimpleSAMLphpのインストール
SimpleSAMLphpのホームページからパッケージをダウンロードしてインストールします。
本稿執筆時点(2018/10/12)では simplesamlphp-1.16.2.tar.gz が最新でした。
※別のバージョンを使う場合は適宜読み替えてください。
# wget --content-disposition https://simplesamlphp.org/download?latest
# tar xvzf simplesamlphp-1.16.2.tar.gz
# mv simplesamlphp-1.16.2 /var/www/simplesamlphp
3. SimpleSAMLphpの初期設定
3.1. SimpleSAMLphpのIDP機能を有効化
# vi /var/www/simplesamlphp/config/config.php
:
'enable.saml20-idp' => true,
:
3.2. IDP証明書を生成
# openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem
Generating a 2048 bit RSA private key
............................................+++
.............+++
writing new private key to 'server.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Toshima-ku
Organization Name (eg, company) [Default Company Ltd]:SECIOSS,INC.
Organizational Unit Name (eg, section) []:Research development
Common Name (eg, your name or your server's hostname) []:simplesamlphp.secioss.local
Email Address []:info@secioss.co.jp
3.3. SAMLメタデータの設定
メタデータに作成した証明書ファイルと、認証にLDAP(AD)を使用するよう設定します。
# vi /var/www/simplesamlphp/metadata/saml20-idp-hosted.php : 'privatekey' => 'server.pem', 'certificate' => 'server.crt', : 'auth' => 'example-ldap', :
3.4. 接続先LDAP(AD)の設定
example-ldapはデフォルトではコメントアウトされているので、コメントインしてください。
※ 接続先情報は適宜読み替えてください。
# vi /var/www/simplesamlphp/config/authsources.php
:
'example-ldap' => array(
'ldap:LDAP',
'hostname' => 'ldaps://ad.secioss.local',
'enable_tls' => TRUE,
'port' => 636,
'search.enable' => TRUE,
'search.base' => 'CN=Users,DC=ad,DC=secioss,DC=local',
'search.attributes' => array('sAMAccountName'),
'search.filter' => '(objectclass=person)',
'search.username' => 'CN=Administrator,CN=Users,DC=ad,DC=secioss,DC=local
'search.password' => 'Password',
),
:
自己発行証明書のLDAP(AD)にLDAPS接続する場合は証明書の検証をしないよう設定しておきます。
# echo TLS_REQCERT never >> /etc/openldap/ldap.conf
3.5. SAML SPのメタデータ設定
SAML SPの情報を設定します。
今回はSeciossLinkがSAML SPとして動作しますので、以下のように設定します。
※テナント名や接続先ホスト名は環境に合わせて変更してください。
# vi /var/www/simplesamlphp/metadata/saml20-sp-remote.php : $metadata['https://slinkdev.secioss.net/example.com'] = array( 'AssertionConsumerService' => 'https://slinkdev.secioss.net/saml/saml2/sp/AssertionConsumerService.php?tenant=example.com', 'SingleLogoutService' => 'https://slinkdev.secioss.net/saml/saml2/sp/SingleLogoutService.php', 'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', 'simplesaml.nameidattribute' => 'uid', 'simplesaml.attributes' => FALSE, 'signature.algorithm' => 'http://www.w3.org/2000/09/xmldsig#rsa-sha1', ); :
3.6. httpdの設定
httpdにSimpleSAMLphp用の設定ファイルを追加します。
# vi/etc/httpd/conf.d/simplesamlphp.conf
Alias /simplesaml /var/www/simplesamlphp/www
<Directory /var/www/simplesamlphp/www>
Require all granted
</Directory>
httpdを起動します。
# systemctl start httpd
必要でしたらファイアーウォールで通信を許可してください。
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload
4. SeciossLinkの設定
4.1. SAML IDプロバイダの登録
SeciossLinkの管理画面にログインし、SAML IDPの新規登録を行います。
項目名 |
設定値 |
エンティティID | https://simplesamlphp.secioss.local/simplesaml/saml2/idp/metadata.php |
名前 | simplesamlphp.secioss.local |
ログインURL | https://simplesamlphp.secioss.local/simplesaml/saml2/idp/SSOService.php |
ログアウトURL | https://simplesamlphp.secioss.local/simplesaml/module.php/core/authenticate.php?as=example-ldap&logout |
IDの属性 | ユーザID |
SAML 公開鍵 | 3.2. IDP証明書を生成で生成した server.crt を指定してください。 |
※ ホスト名(simplesamlphp.secioss.local)は環境に合わせて変更してください。
4.2. 認証ルールの登録
登録したSAML IDPを認証時に使用するよう認証ルールを設定します。
4.3. ユーザの登録
認証はADで行いますが同じユーザIDのユーザをSeciossLinkにも作っておく必要があります。
※ ID同期も自動で行う場合はSeciossLinkオプションサービスの「AD/LDAP同期(SaaS)」が便利です。こちらの紹介記事もいつか書きたいですね。
5. 動作確認
5.1. SeciossLinkへのアクセス
https://slinkdev.secioss.net/user/ にアクセスすると 今回作成したSAML IDPにリダイレクトされます。
※ 初回の場合はテナント入力画面が表示されます。
この画面でID/パスワードを入力するとADに認証問い合わせに行き、ログインできます。
6. さいごに
今回ユーザデータの認証源泉としてADを使用しましたが、SimpleSAMLphpはそれ以外にSQLサーバー、Facebook、Twitterなども標準で対応しています。
それらの接続設定の紹介もいつかおこなえたらと思います。
それではまた