Local環境のアプリケーションに対してAzure ADでOpenID Connectの認証をしてみる (その1)
Motivation
Azure ADをIDaaSとして、社内サービスと連携したい。 弊社の社内サービスはPHP、Java、Rubyと多種多様な言語で書かれており、 またインフラもGCP,AWSと利用されているので、 それらすべてで動くようにnginxレイヤーでIDaaS連携をするようにする必要がある。 ということで、今回はnginxでIDaaS連携ができるライブラリを調査することにする。
※ AWS のみならば、ALBレイヤーでAzure ADと連携することが可能である。 社内サービスがAWSのみであれば、これを利用するのが最も楽だと思う。
Application Load Balancer 組み込み認証によりログインを簡略化 | Amazon Web Services ブログ
OpenID ConnectとSAML
Azure ADにおいてフェデレーションアクセスをする際のプロトコルとして、OpenID ConnectとSAMLが存在する。 SAMLはIdP側だけでなくSP側もメタデータの登録などが必要であり、設定コストが非常に高い。 そのためOpenID Connectで、求める水準のID管理が出来るのであれば、それにこしたことはない。 なので、一旦OpenID Connectでどこまでできるのか検証を進めていく。
用語の確認
OpenID Connect
- RP (Relying Party) : SSO対象のアプリケーション
- OP (OpenID Provider ) : IDの認証を行う機能を有するサーバー
その他、OpenID Connectに関する基礎的な知識は、下記URLを参照。
OpenID Connectまとめ - selmertsxの素振り日記
SAML (Security Assertion Markup Language)
- SP (Service Provider) : SSO対象のアプリケーション. OpenID Connectで言うRP
- IdP (Identity Provider) : IDの認証を行うサーバー. OpenID Connetで言うOP
nginx library
OpenID ConnectのRPに使うための nginx lua library. OpenID Connect DiscoveryとAuthorization code flowを使って、OPとユーザー認証を行う。 セッションはブラウザのcookieか、redis, memcacheで持つ。
使い方
local opts = { redirect_uri_path ="", discovery = "" -- ... その他args } local res, err = require("resty.openidc").authenticate(opts) if err then ngx.status = 500 ngx.say(err) ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end
こんな感じ。opsに必要なパラメータを入れた後、require("resty.openidc").authenticate(opts)
で認証を実行する。
どんなパラメータが必要なのかはAzure ADと連携するときにでも諸々確認していく
現状の懸念点
- OpenID Connectで認証した場合、IDaaSでは認証はできるが認可はできないのではないだろうか
www.slideshare.net