selmertsxの素振り日記

ひたすら日々の素振り内容を書き続けるだけの日記

Local環境のアプリケーションに対してAzure ADでOpenID Connectの認証をしてみる (その1)

Motivation

Azure ADをIDaaSとして、社内サービスと連携したい。 弊社の社内サービスはPHPJavaRubyと多種多様な言語で書かれており、 またインフラも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

github.com

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