VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
このガイドはプレビュー機能を使用します。サーバーを
--vsql_allow_preview_extensions=ON で起動してください。そうしないと INSTALL EXTENSION は拒否されます。vsql_oauth2 拡張機能を使うと、アカウントは代わりに JSON Web Token でサインインできます。プロバイダーがトークンを発行し、サーバーが署名と有効期限を検証し、トークン内のクレームがアカウントを指定します。
署名鍵の設定
この拡張機能は、JWKS エンドポイントから取得した鍵(実際のプロバイダーで使う方法)か、貼り付けた 1 つの公開鍵のどちらかで署名を検証します。静的な鍵は、経路全体が動くことを確認する最も手早い方法なので、このガイドはそこから始めます。username_claim は、アカウント名を運ぶクレームを指定します。デフォルトは sub で、以下の例のトークンもこれを使います。
実際のプロバイダーでは、代わりに jwks_url を設定します。拡張機能は鍵を取得し、jwks_refresh_interval の間隔で再取得し、キャッシュにない鍵 ID をトークンが指定したときには直ちに再取得します。issuer と audience も設定してください。そうすれば、別のシステム向けに発行されたトークンはここでは受け入れられません。
アカウントの作成
アカウントは通常の MySQL アカウントで、作成時にこの拡張機能で認証するものとして指定します。アカウントは自身の権限を持ちます。username_claim のクレーム(デフォルトでは sub)から取られます。そのクレームが analyst と言っている限り、上のステートメントで十分です。プロバイダーがそこに別のもの、たとえばメールアドレスを入れる場合は、そのアカウントも作成し、接続するアカウントをそこへプロキシさせます。
alice@example.com として直接サインインしないため、このアカウントに独自のパスワードは不要です。validate_password を実行しているサーバーは、パスワードのないアカウントの作成を ERROR 1819 (HY000): Your password does not satisfy the current policy requirements で拒否します。それが当てはまる場合は、誰も保持しないパスワードを与えるか、ログインをまったく許可しない認証プラグインを与えてください。
プロキシの付与がないと、ログインは ERROR 6126 (HY000): Access denied for user 'oidc_user'@'localhost', missing proxy privilege. で拒否されます。
ログイン
トークンは、通常パスワードが通る場所を通ります。組み込みのmysql_clear_password プラグイン経由で、クライアントはこれを明示的に有効にする必要があります。
--password= で渡すとプロセス一覧に載るため、トークンは代わりに環境変数に入れます。
セッション内では、CURRENT_USER() がデータベースのアカウントで、@@external_user はトークンが運んだ ID を保持します。これは監査証跡で求められるものです。
トークンからのロールのマッピング
アカウントは、トークンから権限を受け取ることもできます。ロールを運ぶクレームを拡張機能に指定し、付与を有効にします。"roles": ["shop_reader"] を運ぶトークンは、そのロールが有効な状態でログインします。
roles_filter は考慮されるロール名を絞り込み、roles_transform_pattern と roles_transform_replacement は、グループ名がロール名のように見えないプロバイダーのために、プロバイダー側の名前をデータベースのロール名に書き換えます。
auto_grant がオフの場合、同じトークンでログインはできますが、ロールは付与されずにスキップされ、CURRENT_ROLE() は NONE になります。スキップされた各ロールはエラーログに書き込まれます: VEF auth: role 'shop_reader'@'%' requested for account 'dana'@'%' is not granted; skipping。auto_create はアカウントについて同じように動作し、サーバーが見たことのないサブジェクトの初回ログイン時にアカウントを作成します。どちらもデフォルトではオフで、どちらもこのサーバーに対する権限をプロバイダーに委ねます。
拒否されたトークンはパスワード間違いのように見える
すべての失敗は 1 つのエラーを生み、それは通常のエラーです。using password: NO も含めてです。トークンは送られているので、これは誤解を招きます。サーバーのエラーログにも、log_error_verbosity=3 であっても、区別できるものは何も出ません。
そのため、エラーではなくトークンからデバッグしてください。トークンをデコードし、次の 4 点をこの順に確認します。
expが未来である。プロバイダーとサーバーの間のクロックのずれがここで影響します。- 署名鍵が一致する。 トークンの
kidが、JWKS ドキュメントがまだ公開しているものであることを確認します。ドキュメントがもう持っていない鍵は、偽造トークンとまったく同じに見えます。 issとaudが、設定した場合はその設定値と一致する。username_claimのクレームが存在するアカウントを指定している。アカウントの綴りどおりに。
トラブルシューティング
関連項目
- vsql_oauth2 — 拡張機能のリファレンスページ。追加されるすべての設定を掲載
- MySQL のユーザー管理 — トークンで認証するアカウントにも必要な権限
- MySQL のセキュリティ強化 — TLS と接続面のその他の要素
- MySQL での HMAC 署名 — ログイン時ではなく SQL 内で署名を検証する