他のバージョンの文書 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

52.3. SASL認証

SASLは接続指向のプロトコルでの認証のためのフレームワークです。 現時点ではPostgreSQLはSASLの認証機構を1つだけ、SCRAM-SHA-256を実装しているだけですが、将来には他の機構が追加されるかもしれません。 以下の手順は、SASLの認証が一般的にどのように行われるかを示したものですが、次の副節ではSCRAM-SHA-256におけるより詳細について説明します。

SASL認証のメッセージフロー

  1. SASL認証の交換を開始するため、サーバはAuthenticationSASLメッセージを送信します。 これにはサーバが受け付けることができるSASLの認証機構を、サーバにとって望ましいものから順に並べたリストが含まれます。

  2. クライアントはリストからサポートされる機構を1つ選択し、サーバにSASLInitialResponseメッセージを送信します。 このメッセージには選択された機構の名前が含まれ、また選択した機構がInitial Client Response(最初のクライアントの応答)を使用するなら、オプションでそれも含まれます。

  3. サーバのチャレンジメッセージおよびクライアントのレスポンスメッセージが1つ以上続きます。 サーバのチャレンジはそれぞれがAuthenticationSASLContinueメッセージで送信され、それにクライアントからのレスポンスがSASLResponseメッセージで続きます。 メッセージの詳細は機構に固有のものです。

  4. 最後に、認証の交換が成功裏に終了すると、サーバはAuthenticationSASLFinalメッセージを送信し、その直後にAuthenticationOkメッセージを送信します。 AuthenticationSASLFinalにはサーバからクライアントへの追加のデータが含まれ、その内容は選択した認証機構毎に異なります。 完了時に送信する追加データを認証機構が使用していない場合、AuthenticationSASLFinalメッセージは送信されません。

エラーが発生したときは、サーバは認証を任意の段階で終了してErrorMessageを送信することができます。

52.3.1. SCRAM-SHA-256 認証

SCRAM-SHA-256(以下では単にSCRAMと呼びます)は現時点で実装されている唯一のSASL機構です。 詳細はRFC 7677およびRFC 5802で説明されています。

PostgreSQLでSCRAM-SHA-256を使用する場合、クライアントがclient-first-messageで送信するユーザ名をサーバは無視します。 その代わりに、開始メッセージで送信済みのユーザ名が使用されます。 SCRAMはユーザ名としてUTF-8の使用を指示していますが、PostgreSQLは複数の文字符号化方式をサポートするため、PostgreSQLのユーザ名をUTF-8で表現できないかもしれません。

SCRAMの使用ではパスワードもUTF-8であり、SASLprepアルゴリズムで処理されることが規定されています。 しかしPostgreSQLではパスワードにUTF-8が使用されることを必須としていません。 ユーザのパスワードが設定されたとき、実際に使用された符号化方式に関わらず、それがUTF-8であるかのようにSASLprepで処理されます。 しかし、それが正当なUTF-8バイト列でない場合、あるいはSASLprepが禁止するUTF-8バイト列を含む場合、エラーを発生させるのではなく、SASLprep処理のない生のパスワードが使用されます。 これにより、パスワードがUTF-8であればそれを正規化できる一方で、UTF-8以外のパスワードを使用することもでき、またシステムもパスワードがどの符号化であるかを知る必要もありません。

チャネル結合はまだ実装されていません。

  1. サーバがAuthenticationSASLメッセージを送信します。 それにはサーバが受け付けることができるSASL認証機構のリストが含まれます。

  2. クライアントがSASLInitialResponseメッセージを送信することで応答します。 これは選択した機構SCRAM-SHA-256を示します。 Initial Clientの応答フィールドでは、メッセージにSCRAMのclient-first-messageが含まれます。

  3. サーバがAuthenticationSASLContinueメッセージを送信します。 その内容はSCRAMのserver-first messageです。

  4. クライアントがSASLResponseメッセージを送信します。 その内容はSCRAMのclient-final-messageです。

  5. サーバがSCRAMのserver-final-messageを含むAuthenticationSASLFinalメッセージを送信し、その直後にAuthenticationOkメッセージを送信します。