SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-07-13(Sat) SSOのOSSでSOS

  mod_auth_mellonを使いたい、っていう客が現れた。なんだそのフルーティな認証モジュールは!? と、思ったらApacheでSSO(シングルサインオン)を実現するものらしい。

  認証にはあまり興味がないのだが、DKIMだの、Sinatraへ追加だの、S/MIMEだの、OAuth2.0だの、意外とアレコレと取り組んでいる。まぁSSOはユーザの負担を軽減するための妥当な仕組みであるし、悪いのものではないよな……と、調べ始めるといろいろ出てくる新事実。

  • mod_auth_mellonはApacheをSAMLに対応させるためのクライアントモジュール
  • SAMLはSecurity Assertion Markup LanguageというSSOのオープンな規格
  • SAMLはクライアント/サーバの形であり、サーバ側が認証を司る
  • サーバ側で一度認証すれば、すべてのクライアントでアクセス許可される
  • 代表的なサーバは、商用サイト「OneLogin」や、OSSの「Keycloak」

  そういやKeycloakってどこかで聞いたような名前だな。mod_auth_mellonを試すにはサーバが必要だが、Keycloakが使えるならそっちの味見もできて一石二鳥である。とりあえずKeycloakをコンテナで上げてみる……

  画像の説明

  ……と、それがドハマリな日々の始まりであった。

  まぁ、概念がわからない。ウェブ上に文書はあるが、読んでもわからん。Sinatraに実装して動かすのが目的なのだから、どうにか少しでも動かして、それを元に理解を進めたいのだが、にっちもさっちもよっちもごっちもろっちもしっちもはっちもくっちもじっちも動かない。

  画像の説明

  急がば回れと、OneLoginのお試しアカウントを作ってサーバを替えてみたり、mod_auth_mellonのハウツーを柄にもなく実直に辿ってみたりもした。結果mod_auth_mellonは動きはしたがそれだけだ。やっぱりわからん。

  ここまでガッツリとハマったのは人生で初めてかもしれん。なにしろ、Keycloakのログイン画面に遷移しないのだ。Keycloakはエラーログを出すのだが、内容が具体的でないので、試行錯誤するほかない。ググると似たような感じでハマっている書き込みは見つかるものの、解決してそうに見えない。結局、秘密鍵や証明書の指定をアレコレしまくって、ようやくログイン画面にこぎ着けたが、今度はSAMLのライブラリがエラーを吐く。終いにはruby-samlのコードにデバッグ行を入れまくり、どうにかSinatra側に戻すところまで持ってきたが、なんだか設定が微妙すぎて、もう何が正しいのかわからない。

  ログインができたらログアウトもできなければならない。そしてまたKeycloakのエラーログだ。意味不明……さすがにちょっとログの出し方がアホなんじゃないかと思い始める。またもや証明書の指定をアレコレしまくって、どうにか抜けたかと思ったら、またもやSAMLのライブラリがエラーを吐く。再びruby-samlのコードにデバッグ行を入れまくるが、限りなくバグくさいコードをアチラコチラに見つけてしまう……さすがにちょっとライブラリの品質もクソなんじゃないかと思い始める。

  どうにかログアウトもできたが、そこで気づく。基本的にhttpにはセッションの概念がないのに、どうやって各ページで認証を行うんだ? IdPから受け取ったアサーション(認証情報)をSPに提示し、SPが認証するのはわかるが、どうやってアクセスの都度アサーションを渡すのか。POSTしなければならないサイズだよな。それってAタグによるページ遷移はできなくなるってことなんじゃ?

  うーん、なんだか急激に興味が薄れてきたな。そんな実装以外にやりようはなかったんかいな。まぁ、散々コネくりまわしたのでソコソコ概念は理解できたが、手に入ったのは山盛りのバッドノウハウという気しかしない。Sinatraへの実装は断念するか……もう疲れたんだよパトラッシュ……しかしなぁ、そこは無理をしてでもブラウザのBasic認証やCookieの機構の上に載せるべきだったんじゃないのかねぇ……知らねえけれど、さよ〜ならまたいつか〜♪