【SAML認証】SimpleSAMLphpを試す(Google Workspace編)

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【SAML認証】SimpleSAMLphpを試す(Google Workspace編)

2023-12-12 | , ,

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

手順書

  1. SimpleSAMLphpのインストールする手順は下記の記事のような感じで済ませておく。
  2. Google Workspaceの管理者アカウントにログインしてる状態で[https://admin.google.com/](https://admin.google.com/)にアクセスする。
  3. 左のメニューの「アプリ」->「ウェブアプリとモバイルアプリ」を開いて、「アプリの追加」をクリックする。
  4. 「カスタムSAMLアプリを追加」をクリックする。
  5. 「アプリ名」を入力して、「続行」をクリックする。
  6. 「メタデータをダウンロード」をクリックして、google-workspace.xmlをダウンロードする。このxmlファイルは後ほどSimpleSAMLphpで使う。「続行」をクリックする。後ほど、また戻ってこちらでも設定をするのでページは閉じないでおく。
  7. SimpleSAMLphpの管理画面にアクセスする。「連携」を開き、「ツール」の中にある「XMLをSimpleSAMLphpメタデータに変換」をクリックする。
  8. 「~ or select a file」をクリックして、先ほどダウンロードしたgoogle-workspace.xmlを選択する。「パース」をクリックする。
  9. 下に「変換されたメタデータ」が表示されるので、内容を全てコピーする。右上のアイコンをクリックしてもコピーできる。
  10. /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',
        ],
    ],
    ...
    ];

    entityidhttps://accounts.google.com/o/saml2?idpid=XXXXXXXXXという感じの値は次の手順で使うのでコピーしておく。

  11. /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.phpentityidの値を入力する。

  12. 再びSimpleSAMLphpの管理画面の「連携」を開くと「Hosted entities」の中に先ほど入力したentityidの値の項目が増えてるので折りたたみを開く。

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

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

    「ユーザーアクセス」の中にある「詳細を表示」をクリックする。
  16. 「サービスのステータス」の中にある「オン(すべてのユーザー)」にチェックを入れて「保存」をクリックする。この画面から「グループ」や「組織部門」毎にアクセスの設定をできる。今回は契約に含まれるアカウント(全グループ、全組織部門)がアクセスできる設定にした。
  17. 「SAMLログインをテスト」をクリックしてSimpleSAMLphpをインストールしてるサーバー(何も設定をしなければexample.comのトップページ)が表示されればSAML認証に成功してる。
  18. SimpleSAMLphpからもテストする。管理画面にログインして「Test」を開き、「Test Authentication Sources」の中にある「google-workspace(/var/www/simplesamlphp/config/authsources.php`に入力した名前が表示される)」をクリックする。
  19. 下図のように「email」と「NameId」にGoogle Workspaceのメールアドレスが表示されてれば、正常にSAML認証できてる。

お疲れさまでした。

まとめ(感想文)

手順が長い!

テストが上手くいかない場合は、下記をチェックしてみる。(自分が手探りで設定してた時にここらへんを間違えてた)

  • Google Workspace側の設定で「ACRのURL」が正しいか?(simpleSAMLphpの「連携」の「Hosted entities」のmd:AssertionConsumerServiceLocationの値)
  • Google Workspace側の「エンティティID」とsimpleSAMLphpの/var/www/simplesamlphp/config/authsources.phpentityIDに同じ値が入力されてるか?

次は「Microsoft Entra」でSAML認証してみるよ!