web-dev-qa-db-ja.com

PostgreSQLのプロキシ認証

次はかなり一般的な状況のようですが、解決策は見ていません。

一部のデータベース固有のACLロジックに応じてデータを制限するために、$userに固有のビューを含むPostgreSQLデータベースがあります。データベースは通常、JDBCを介してアクセスされ、特にWebインターフェースのJSPではアクセスされます。ユーザーはLDAPを使用したパスワード認証でWebサイトにログインします。

私が望むのは、データベースへのJDBC接続内からビューを利用することです。ただし、通常、この中間層接続は、Webサイトにログインしているユーザーに固有のものではなく、一般的なユーザーを使用して作成されます。 Oracleでは「正しい」アプローチは プロキシ認証 であると思いますが、AFAIAAにはPostgreSQLに相当するものはありません。代わりに何をすべきか?

いくつかのアイデアが思い浮かびます:

  • すべてのユーザーのデータベースアカウントに同じパスワードを指定し、この一般的なパスワードを使用してユーザー固有のJDBC接続を作成します(これは非常に間違っているように感じます...)
  • ユーザーのログインパスワードをウェブサイトのどこかに保存し、データベース接続の作成時に再利用します(これも非常に間違っているように感じます)

他の(うまくいけば)提案はありますか?

4
beldaz

通常の解決策は、Webアプリ内でユーザーを認証し、SET ROLEまたはSET SESSION AUTHORIZATIONを発行して、固定ユーザー名を使用してデータベースですでに認証されているJDBCセッションでユーザーになることです。

どちらの場合も、接続をプールに戻すときに接続プールによって実行されるDISCARD ALLコマンドは、認証を自動的にリセットします。 返された接続で接続プールがDISCARD ALLを実行していることを確認してください

これらは、リンクされたOracleドキュメントに記載されている3つの「プロキシ認証」の最初のケースとよく似ています。

PostgreSQLは、クライアント認証がDBに渡される他の2つの形式をサポートしていません。サポートは比較的簡単ですが、それを実装したり、他の誰かが実装するために必要な作業に資金を供給したりすることを望んでいる人はいません。

SET ROLE

SET ROLEを使用するには、すべてのユーザーロールのメンバーシップを持つユーザーとしてDBに接続する必要がありますが、それ以外の場合はユーザーに権限がない可能性があります。 DBユーザーは、NOINHERITオプションをALTER ROLEで、またはCREATE ROLEに設定する必要があります。そのため、通常は、webappユーザーが所属するdbロールとしてwebappユーザーを作成します。

CREATE ROLE newusername 
  NOLOGIN
  ROLE mywebappuser;

ROLE mywebappは、後続のGRANT newusername TO mywebappuser;を実行するのと同じです)。

SET SESSION AUTHORIZATION

SET SESSION AUTHORIZATIONを使用するには、スーパーユーザーとして接続する必要があります。これは、webappユーザーに完全な制御を与えるため、通常は望ましくありません。

SET ROLEとは異なり、グループメンバーシップの要件はありません。

5
Craig Ringer