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に登録
- NameIdFormat:
- 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