mod_auth_mellonで値を引き渡せない

構成

  • SP:mod_auth_mellon (with Apache HTTP Server)
  • IdP:AzureAD
  • アプリ:Tomcat

実現したいこと

  • SAML認証を行い、Tomcatへのアクセス制御を行う。
  • AzureADのキー(仮にemailとする)値を、Tomcatに渡したい。
  • Tomcatには、リクエストヘッダーにUSERNAMEというキー名で値を引き渡したい。

失敗例

mod_auth_mellonのマニュアルを参照した。
mod_auth_mellon User Guide
そこには、SAMLから受け取った値は、デフォルトでは "MELLON_" + "定義した名前"で取得できるとのこと。
なお、記述っぷりを参考にしたい場合は、GitHub側を見れば"MELLON_"部分の変え方も含め、readmeに綺麗に記載してくれている。
github.com
よって、以下の様に書いていたが、値を受け取れなかった。

(中略)
    RequestHeader set USERNAME %{MELLON_email}e

対応方法

(もしかしたら最適解でないのかもしれないが、)以下で対応できた。

(中略)
    RequestHeader set USERNAME %{MELLON_http://schemas.microsoft.com/identity/claims/email}e
補足解説
  • :や//はエスケープした記述をしなくて良い
  • %{キー名}eは、mod_auth_mellonではなく、mod_headersの文法である

発見方法

mellon_diagnoticsやMellonSamlResponseDump、mod_dumpioなど色々試したが、
そもそもログを出力させれなかったり、欲しい情報を得ることができなかった。
すると、元々FireFoxプラグインで今はChromeにも提供されているsaml-tracerという拡張機能を見つけれた。
chrome.google.com
拡張機能を用いることでSAML通信の中身を見ることに成功した。
結果、以下の様な値が返却されていることが確認できた。

(中略)
<AttributeStatement>
  <AttributeStatement>
    <Attribute Name="http://schemas.microsoft.com/identity/claims/email">
      <AttributeValue>hoge1@hoge.com</AttributeValue>
(以下略)

省略して記載する方法があるかもしれないが、このまま記載することで無事値取得に成功した。

稼働中のプロセスの環境変数確認方法

/proc/PID/environ で確認可能

cat /proc/12345/environ | tr '\0' '\n'

MySQLのビューの定義がselect 1となっていた

事象

mysqldumpでビューやトリガーを含むダンプを取得した。
その後、別インスタンスにロードした。
すると、ビューが動かなくなった。
ビューの定義を確認すると以下の様な定義に置き換わっていた。

CREATE ALGORITHM=UNDEFINED DEFINER=`userhoge`@`%` SQL SECURITY DEFINER VIEW `dbhoge`.`view_hoge` AS select 1

なお、ダンプ、ロードに使用したユーザーは移行元、移行先のどちらにも存在している。

原因

移行先にユーザーは存在しなかったため。
正確には、微妙に違うかった。

誤) `userhoge`@`%`
正) `userhoge`@`localhost`

結果、違うユーザーと認識されてしまったようである。

対応方法

取得したダンプを直接編集して、`userhoge`@`localhost` に変更する。
なお、移行元はユーザーが上記2つそれぞれ存在し、移行先はユーザーが1つのみというのも敗因である。
但し、セキュリティと利便性の関係上これは致し方無なので、都度変更する整理とした。
(%のユーザーを作成していると、localhostで接続しても%側が勝つという仕様を読んだ様な…[自信無いし未調査])

補記事項

定義内容とdefinerの確認方法
  • VIEW
select * from information_schema.VIEWS where TABLE_SCHEMA = 'dbhoge';
  • procedure
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'dbhoge';

定義後の書換え方法

  • VIEW

alter文で書き換えするしかない

show create view ビュー名

取得した情報をalterに変更し、実行する。
(1個、2個位ならMySQL workbench上でやると楽)

  • procedure

同様にalter文で書き換えするしかない

show create procedure プロシージャ名

取得した情報をalterに変更し、実行する。
(こちらも1個、2個位ならMySQL workbench上でやると楽)

P50 GraphQLクライアントの実態

フラグメントコロケーション

クエリの一部をコンポーネントと紐付ける。クエリの一部に名前を付けて取り出せる。
フラグメントはインラインフラグメントに名前を付けたもので、再利用可能なセレクションである。
フラグメントは次の構文で定義する。

fragment  フラグメント名 on 型名 セレクションセット

フラグメントを使うときは、

...

と書く。

クライアントライブラリ

Relay
  • Facebook
  • Reactに特化
  • フラグメントコロケーションのためのAPI
Apollo Client
  • Appollo Platformが提供
  • GraphQL APIに特別な追加の仕様を要求しない

Amazon Athenaの処理結果がおかしくなった

## 事象
Amazon Athenaで出力を得ていた情報がある日を境におかしくなった。
但し、全てがおかしくなっていると思ったら、抽出条件がそうであっただけで、
抽出条件を指定せずに実行してみると後半からは想定しているデータが得られていた。

## 原因
Amazon AthenaのデータソースにしているAWS Glueの参照しているS3のパスに異物データが配置されてしまっていた。。
併せて、連動されていたデータ事態にも不備があったので、併せて状況気づくのに時間を要した。

## 対応方法

  • S3のバケットの書き込みを厳密化(書き込みできるユーザー制御)
  • 事前チェックを行い、問題あればエラーにして後続連携を止める

終了したバージョンにひも付けされたチケットの再オープンはできません

事象

Redmineで終了したチケットを再オープンさせるステータスに変更しようとしたら、
「終了したバージョンにひも付けされたチケットの再オープンはできません。」
と怒られてエラーになる。

原因

対象バージョンのステータスを終了にしているため

対応方法

対応プラン1

バージョンを管理しているプロジェクトの設定を変更する。
設定画面からバージョンタブに遷移し、対象バージョンのステータスをロック中か進行中にする。

対応プラン2

対象バージョンを別のバージョンに変更する。

補記事項

気づけば文言通りだけど、”バージョン”が”対象バージョン”と分からなかったので記載

アンダーフェッチングとオーバーフェッチング

用語解説

アンダーフェッチング:必要なデータが取得できていないこと
オーバーフェッチング:必要以上のデータを取得していること
(特集2 GraphQL完全ガイド 第一章GraphQLの基本仕様より)

GraphQLの利点

GraphQLでは必要なデータを指定できるので、オーバーフェッチング問題を解決できる。
記事中のREST APIとGraphQLのリクエストとレスポンスの比較がとても分かりやすかった。
(今までGraphQL懐疑的であったが、ようやく利点が納得できた)