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なども標準で対応しています。


それらの接続設定の紹介もいつかおこなえたらと思います。

それではまた