Nextcloud に Google アカウントで SSO できるようにする (SAML 認証)

AWS EC2 上に構築した Nextcloud に Google アカウントでシングル・サインオン (SSO)できるように設定しました。

Google Workspace (旧 G Suite) は Google アカウントを使った SSO ができるよう SAML 認証の IdP (Identity Provider) の仕組みを提供しています。 Google Workspace の機能であるため個人アカウントでは利用できません。

これを使って Nextcloud を自社の Google アカウントで使えるようにしました。が、当初は評価環境で試していたこともあり、結構ハマりましたので、ちゃんとまとめておきたいと思います。

基本的には上記のヘルプに従えばよいのですが、おそらくこれだけでは設定が難しく、ネット上にもあまり有益な情報がないのが難点です。

前提条件

  • OS: Amazon Linux 2 (Linux 4.14.198-152.320.amzn2.x86_64 x86_64)
  • PHP 7.4.11
  • DB: Mysql 5.5.64
  • Nextcloud 20.0.0

Nextcloud の構築については下記の記事を参照してください。

Google 側の設定

Nextcloud 側からやりたくなってしまいますが、先に Google 側の設定を済ませたほうがスムースです。

まずは Google 側で設定します。

SAML アプリの追加

Google に管理者アカウントでログインし、管理コンソールを開きます。アプリ→ウェブアプリとモバイルアプリを開き、「アプリを追加」から「カスタム SAML アプリの追加」を選択します。

アプリ名を設定します。既存のものと重複しなければなんでも OK ですが、わかりやすく Nextcloud か nextcloud などにしておくとよいでしょう。

入力したら「続行」をクリックします。

Google IdP 情報の取得

Google 側の IdP 情報が表示されます。のちほど赤枠で囲った部分を Nextcloud の SAML 認証設定に入力しますが、とりあえずこの 3 つの値をテキストエディターなどにコピーしておきます。

ちなみにこれらの値は後からも参照できるのでコピーし忘れても問題ありません。

ここでは入力するものはないので「続行」をクリックします。

Nextcloud (SP) 情報の入力

「サービスプロバイダの詳細」画面で Nextcloud (SP) 側の設定を入力します。

ACS (Assertion Consumer Service) の URLエンティティ ID はのちほど Nextcloud 側で再確認しますが、基本的には下記のような URL になるはずですのでこれを入力します。

項目
ACS の URL https://<Nextcloud のアドレス>/index.php/apps/user_saml/saml/acs
エンティティ ID https://<Nextcloud のアドレス>/index.php/apps/user_saml/saml/metadata

ちなみに ACS の URL は https しか入力できませんので、 http 運用の場合は連携できません。

「名前 ID」のところは下記のように設定します。

項目
名前 ID の形式 EMAIL
名前 ID Basic Information > Primary email

入力したら「続行」をクリックします。

属性マッピングの定義

属性のマッピングを定義します。

Google ディレクトリの属性 アプリの属性
Basic Information > Primary email username
Basic Information > Primary email emailAddress
Last name displayName

username は Nextcloud のユーザー名にマッピングするために定義します。ただこの username という属性名は後ほど Nextcloud 側で設定するときに一致させればよいので、 mailuid などでもかまいません。

emailAddressdisplayName などは必須ではありません。それぞれ Nextcloud の登録メールアドレスと表示名にマッピングさせるために必要であれば定義します。こちらも属性名は任意のものでかまいません。

「完了」をクリックすると Google 側の設定は完了です。

ユーザーアクセスの有効化

設定が完了すると追加したアプリの詳細画面になります。ここでデフォルトでは「ユーザー アクセス」が「オフ(すべてのユーザー)」になっていると思いますので、ここをクリックしてユーザーアクセスの設定画面を開きます。

サービスのステータスで「オン(すべてのユーザー)」を選択して、「保存」をクリックします。特定のグループや部門にアクセス権を設定する場合は、左メニューから選択して設定します。

「ユーザー アクセス」が「オン(すべてのユーザー)」になっていれば OK です。

これで Google 側の設定は終了です。

Nextcloud の設定

続いていよいよ Nextcloud 側を設定していきます。

SAML 認証アプリのインストールと有効化

アカウントメニューから「アプリ」を選びます。

検索欄に saml とでも入力すると 「SSO & SAML authentication」 が表示されるので、「ダウンロードして有効にする」を選択します。

SAML 認証の設定

インストールが終わると「設定」の「管理」に「SSOとSAML認証」が表示されているはずなので、これを開きます。

組み込みのSAML認証を使用する」ボタンをクリックします。

まず、上のほうに警告がでているとおり、何も考えずに SAML 認証だけ有効にしてしまうと Nextcloud の認証ができなくなり、管理者でログインできなくなる恐れがあります。

事前に下記のいずれかの対応をしておきましょう。

  • ユーザー設定から、ログイン ID を今から連携する Google アカウントのメールアドレスにしたアカウントに管理者権限を与えておく
  • 下図のように「複数のユーザーのバックエンド(LDAPなど)の使用を許可する (Allow the use of multiple user back-ends (e.g. LDAP))」にチェックをいれておきます。(このチェックにより、 Nextcloud の元々の認証も利用できるようになります)

次に IdP (Identity Provider = Google) の設定を入力します。

各項目がとてもわかりづらいですが、下記のように設定します。日本語だと項目名が若干変なので英語版も併記しておきます。

項目 値/値の例
UID をマップする属性
Attribute to map the UID to.
Google で Primary email をマップした属性名
例. username
ID プロバイダのオプション表示名
Optional display name of the identity provider (default: “SSO & SAML log in”)
この認証方法の名前 (任意)
例. Google ログイン
IdP エンティティの識別子
Identifier of the IdP entity (must be a URI)
Google の “エンティティ ID”
例. https://accounts.google.com/o/saml2?idpid=<ID>
SPが認証要求メッセージを送信するIdPのURLターゲット
URL Target of the IdP where the SP will send the Authentication Request Message
Google の “SSO の URL”
例. https://accounts.google.com/o/saml2/idp?idpid=<ID>
URL SP がSLO要求を送信するIdPの場所
URL Location of the IdP where the SP will send the SLO Request
空 ※後述
IdPの公開X.509証明書
Public X.509 certificate of the IdP
Google の SAML 証明書
表示名をにマップする属性
Attribute to map the displayname to.
Google の属性マッピングで Last name をマッピングした属性名 (任意)
例. displayName
電子メールアドレスをマップする属性
Attribute to map the email address to.
Google の属性マッピングで Primary email をマッピングした属性名 (任意)
例. emailAddress

「IdPの公開X.509証明書」の設定欄などが表示されていないときは Show optional Identity Provider settings… をクリックします。

設定できたら、ページ下部の「メタデータXMLをダウンロード」をクリックして、 metadata.xml を保存します。

metadata.xml の中身は下記のようになっています。

<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
                     validUntil="2020-11-15T08:39:42Z"
                     cacheDuration="PT604800S"
                     entityID="https://<Nextcloud のアドレス>/index.php/apps/user_saml/saml/metadata">
    <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
        <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
        <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                                     Location="https://<Nextcloud のアドレス>/index.php/apps/user_saml/saml/acs"
                                     index="1" />

    </md:SPSSODescriptor>
</md:EntityDescriptor>

ここで md:EntityDescriptor@entityIDmd:AssertionConsumerService@Location を確認します。これが最初に Google 側で設定した「エンティティ ID」と「ACS の URL」と一緒であれば OK です。もし違っている場合は一致させる必要があるので Google 側で設定変更が必要です。

SSO 動作確認

ここまできたら、 Nextcloud からログアウトするか、別のブラウザーを開き、 Nextcloud のログイン画面を開きます。

上記のようにダイレクトログイン (Nextcloud のユーザー認証) と先ほど追加した SAML 認証 (ここでは「Google ログイン」) が表示されているはずです。

ここでは「Google ログイン」をクリックして SSO をテストします。

うまく設定できていて、 Google アカウントにすでにログイン済みの場合は、そのまま Nextcloud にログインできるはずです。 Google アカウントにログインしていない場合は Google のログイン画面が表示されます。

Google アカウントから無事サインインできれば成功です。お疲れ様でした!

トラブルシューティング

SAML 認証エラーのデバッグ

SAML 認証に失敗すると下記のような Google のエラーが表示されることがあります。

エラーメッセージについては下記のページを参考にします。

また、このとき Request Details を展開して表示される SAMLRequest は下記のページでデコードできます。

403 app_not_configured_for_user (未解決)

Google Chrome や Internet Explorer, Firefox では動作確認できたのですが、なぜか Edge (Chromium 版) では 403 (app_not_configured_for_user) がでてログインできません

残念ながら現状ではこの問題は解決できていません。環境依存かもしれませんので、またなにかわかれば更新します。

ログアウトについて

SSO でログインすると ログアウト ボタンが表示されなくなり、ログアウトできなくなります。通常の利用者には大きな問題がないと思いますが、ログアウトしたいときだってあるかもしれません。

SAML 認証構成で ログアウトできるようにするには Nextcloud の SAML IdP 設定に SLO (シングル・ログアウト) の URL を設定する必要があります。

が、残念ながら Google は SLO の URL を提供していません。。。

というわけで今のところ弊社では SLO の URL に Nextcloud の URL (https://<Nextcloud のアドレス/) を指定しています。

本来の使い方とは違う気もしますが、これでログアウトボタンも出現し、特に問題なく動作しているようです。

その他参考サイト

SNSでもご購読できます。

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください