【SAML認証】SimpleSAMLphpを試す(Google Workspace編)
SimpleSAMLphpをSP、Google WorkspaceをIDPとしてSAML認証したい!
概要
今回の記事では、SimpleSAMLphpをSP、Google WorkspaceをIDPとしてSAML認証する手順を掲載する。
無料のGmailアカウントではSAML認証をできないので注意。
SimpleSAMLphpのインストールする手順は下記の記事に載せてる。
仕様書
環境
- Ubuntu 20.04.4 LTS
- Apache 2.4.41
- PHP 8.0.30
- SimpleSAMLphp 2.1.1
手順書
- SimpleSAMLphpのインストールする手順は下記の記事のような感じで済ませておく。
- Google Workspaceの管理者アカウントにログインしてる状態で
[https://admin.google.com/](https://admin.google.com/)にアクセスする。 - 左のメニューの「アプリ」->「ウェブアプリとモバイルアプリ」を開いて、「アプリの追加」をクリックする。

- 「カスタムSAMLアプリを追加」をクリックする。

- 「アプリ名」を入力して、「続行」をクリックする。

- 「メタデータをダウンロード」をクリックして、
google-workspace.xmlをダウンロードする。このxmlファイルは後ほどSimpleSAMLphpで使う。「続行」をクリックする。後ほど、また戻ってこちらでも設定をするのでページは閉じないでおく。

- SimpleSAMLphpの管理画面にアクセスする。「連携」を開き、「ツール」の中にある「XMLをSimpleSAMLphpメタデータに変換」をクリックする。

- 「~ or select a file」をクリックして、先ほどダウンロードした
google-workspace.xmlを選択する。「パース」をクリックする。

- 下に「変換されたメタデータ」が表示されるので、内容を全てコピーする。右上のアイコンをクリックしてもコピーできる。

/var/www/simplesamlphp/metadata/saml20-idp-remote.phpに先ほどコピーした内容を丸ごとペーストする。<?php // 以下にコピペする(一部抜粋 $metadata['https://accounts.google.com/o/saml2?idpid=XXXXXXXXX'] = [ 'entityid' => 'https://accounts.google.com/o/saml2?idpid=XXXXXXXXX', 'contacts' => [], 'metadata-set' => 'saml20-idp-remote', 'SingleSignOnService' => [ [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://accounts.google.com/o/saml2/idp?idpid=XXXXXXXXX', ], [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', 'Location' => 'https://accounts.google.com/o/saml2/idp?idpid=XXXXXXXXX', ], ], ... ];entityidのhttps://accounts.google.com/o/saml2?idpid=XXXXXXXXXという感じの値は次の手順で使うのでコピーしておく。/var/www/simplesamlphp/config/authsources.phpを開き、Google Workspace用の設定を追加する。'google-workspace' => [ 'saml:SP', 'entityID' => 'https://example.com/simplesamlphp/', 'idp' => 'https://accounts.google.com/o/saml2?idpid=XXXXXXXXX', 'discoURL' => null, 'name' => [ 'en' => 'A service', 'no' => 'En tjeneste', ], 'attributes' => [ 'email' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', ], 'attributes.required' => [ 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', ], ],entityIDの値は、Google Workspace側の設定でも使う共通のユニークIDになるので覚えておく。記事中ではURL形式にしてるが、URL形式でなくても良い。
'idp'の値は、先程コピーしたsaml20-idp-remote.phpのentityidの値を入力する。- 再びSimpleSAMLphpの管理画面の「連携」を開くと「Hosted entities」の中に先ほど入力した
entityidの値の項目が増えてるので折りたたみを開く。

この中にmd:AssertionConsumerServiceというタグがあるので、その中にある属性Locationの値をGoogle Workspaceで使うのでこちらも覚えておく。 - Google Workspaceの設定画面に戻る。

「ACRのURL」にmd:AssertionConsumerServiceのLocationの値を入力する。https://example.com/simplesamlphp/public/module.php/saml/sp/saml2-acs.php/google-workspaceのような感じ。
エンティティIDには/var/www/simplesamlphp/config/authsources.phpのentityIDの値を入力する。この記事の例ではhttps://example.com/simplesamlphp/となる。
「名前IDの形式」は「UNSPECIFID」を選択する。
「名前ID」は「Basic Information > Primary email」を選択する。
「続行」をクリックする。 - 次のページが表示される。今回の場合は特に設定は不要なので「完了」をクリックする。

- デフォルトでは誰もSAML認証できない設定になってるので、認証できるよう設定する。

「ユーザーアクセス」の中にある「詳細を表示」をクリックする。 - 「サービスのステータス」の中にある「オン(すべてのユーザー)」にチェックを入れて「保存」をクリックする。この画面から「グループ」や「組織部門」毎にアクセスの設定をできる。今回は契約に含まれるアカウント(全グループ、全組織部門)がアクセスできる設定にした。

- 「SAMLログインをテスト」をクリックしてSimpleSAMLphpをインストールしてるサーバー(何も設定をしなければ
example.comのトップページ)が表示されればSAML認証に成功してる。

- SimpleSAMLphpからもテストする。管理画面にログインして「Test」を開き、「Test Authentication Sources」の中にある「google-workspace(/var/www/simplesamlphp/config/authsources.php`に入力した名前が表示される)」をクリックする。

- 下図のように「email」と「NameId」にGoogle Workspaceのメールアドレスが表示されてれば、正常にSAML認証できてる。

お疲れさまでした。
まとめ(感想文)
手順が長い!
テストが上手くいかない場合は、下記をチェックしてみる。(自分が手探りで設定してた時にここらへんを間違えてた)
- Google Workspace側の設定で「ACRのURL」が正しいか?(simpleSAMLphpの「連携」の「Hosted entities」の
md:AssertionConsumerServiceのLocationの値) - Google Workspace側の「エンティティID」とsimpleSAMLphpの
/var/www/simplesamlphp/config/authsources.phpのentityIDに同じ値が入力されてるか?
次は「Microsoft Entra」でSAML認証してみるよ!
