PingFederateと連携して社内向けのコンテンツにSSOログイン機能をつけたい。

そもそもSAMLとは何なのか。

SAMLは、Security Assertion Markup Languageの略で、認証、属性、権限の認可をXMLのフォーマットにて定義し、これらの情報を送信する規約のことです。
今回やりたいことのシングルサインオンや、ID連携等によく使用されます。

わかりやすい説明がここに書いてありました。
https://www.slideshare.net/shinichitomita/saml-34672223

シングルサインオンで利用する場合

シングルサインオンは、ユーザーが一度認証を受けることで、連携された他の様々なウェブサービスをその認証を使用して、利用出来る様になります。

Slack,Box,Tableau,Cybozu等の有名サービスでもこれを利用することが可能なようです。

Slack: https://get.slack.help/hc/en-us/articles/203772216-SAML-single-sign-on
Box: https://www.dropbox.com/ja/guide/admin/security/configure-single-sign-on
Tableau: https://onlinehelp.tableau.com/current/online/ja-jp/saml_config_pingone.htm
Cybozu: https://jp.cybozu.help/general/ja/admin/list_externalservices/list_saml/saml_settings.html

いざ実装するとなると出てくる登場人物

  • SP(サービスプロバイダー)
  • Idp(IDプロバイダー)
  • ACS(アサーションコンシューマサービス)
  • ユーザー

図にするとこんな感じ

Idp、SPに対して相互に必要となる設定が見えてくると思います。
ACSが行う主な処理は、下記となります。

  • Idpからデータを受け取る(XML)
  • XMLをparse
  • 署名の検証
  • Assertionの有効性の確認
  • 属性の取り出し

自作はセキュリティホールに繋がるのでおすすめしないとの事。
https://jvn.jp/vu/JVNVU98536678/
https://www.kb.cert.org/vuls/id/475445

Saml認証のためのライブラリ

go: crewjam/saml
Python: onelogin/python-saml
Ruby: onelogin/ruby-saml
PHP: onelogin/php-saml

今回使ったもの

laravel-saml2は、saml認証を行うためのlaravelパッケージです。
設定箇所がまとまっててわかりやすかったので採用しました。
セットアップに関しては、READMEや、下記の記事を参考にしました。
日本語で書いてあります。
Laravel5でSAMLシングルサインオンする

設定

saml2_settings.phpの設定では以下の項目を設定します。

  • sp
    • NameIdFormat: urn:oasis:names:tc:SAML:2.0:nameid-format:persistent <- 固定
    • x509cert: 証明書文字列 idp側から出力してもらうmetadata参照
    • entityId: 任意の文字列 <-適当でおkだけど後でidp側に登録する
    • assertionConsumerService: localhost:8000/saml2/acs <- 認証後のリダイレクト先のURL(laravel-saml2の場合はこのパスで作ってくれる)。これも後でidpに登録
  • idp
    • entityId: idp側から出力してもらうmetadata参照
    • singleSignOnService: idp側から出力してもらうmetadata参照

テスト

テストして終わりです。

まとめ

Idpは、ActiveDirectoryと連携して動いてたりするので、社畜プログラマーが気軽に触れない感あります。そのあたりは情シスが握ってたりするのですが、担当者がわかってなかったりするケースもあるので、開発者側も、仕組み等を把握しておくとスムーズに色々やれる気がします。

参考

wiki: https://ja.wikipedia.org/wiki/Security_Assertion_Markup_Language
Ping KnowledgeBase: https://ping.force.com/Support/PingIdentityKnowledgeHome

元記事はこちら

PingFederateを使ってSAML認証対応してみた