認証エンドポイントを秘匿する HTTP Unprompted Authentication の仕様

2024/03/03 追記
現在は「The Signature HTTP Authentication Scheme」という仕様名になっています。

==
HTTP Unprompted Authentication』という提案仕様がGoogleのDavid Schinazi氏らによって提出されている。

この仕様は、WebサーバにおいてHTTP認証を行っている事を秘匿するための仕様です。これによりWebサーバ上に管理者向けエンドポイントや、VPNサービスなどが動いてることを隠すことができます。

そのために必要なこととして、もちろん通信の暗号化も必要ですが、さらに正規ユーザでない第三者が認証用エンドポイントにリクエストしても「401 Authorization Required」で応答しないという要件があります。「401 Authorization Required」を返さないため、認証に使うNonceを別途共有する必要が出てきます。

HTTP Unprompted Authentication』はそのための仕組みを提供します。

Nonceの生成

この仕様では通信はTLSもしくはQUICを利用している事を前提としています。
Nonceの生成には、『RFC 5705 Keying Material Exporters for TLS』を利用しセッションに固有な秘密値を得ます。これをNonceとして利用します。

なお、ラベルには認証方式にあわせて次のどちらかを使用します

  • EXPORTER-HTTP-Unprompted-Authentication-Signature
  • EXPORTER-HTTP-Unprompted-Authentication-HMAC

認証用ヘッダ

認証用ヘッダとして新しくUnprompted-Authenticationヘッダを定義します。

Signatureで認証する場合の例

Unprompted-Authentication: Signature k=:YmFzZW1lbnQ=:;s=7;
  p=:SW5zZXJ0IHNpZ25hdHVyZSBvZiBub25jZSBoZXJlIHdo
  aWNoIHRha2VzIDUxMiBiaXRzIGZvciBFZDI1NTE5IQ==:

HMACで認証する場合の例

Unprompted-Authentication: HMAC k="YmFzZW1lbnQ=";h=6;
  p="SW5zZXJ0IEhNQUMgb2Ygbm9uY2UgaGVyZSB3aGljaCB0YWtl
  cyA1MTIgYml0cyBmb3IgU0hBLTUxMiEhISEhIQ=="

それぞれヘッダのパラメータの意味は次のとおりです

  • k: クライアントが認証に用いた鍵の識別子
  • p: 鍵情報の所持を証明するためのデータ
  • s: pを導出するのにつかった署名アルゴリズムの番号(TLSのIANAで定義される)
  • h: pを導出するのにつかったハッシュアルゴリズムの番号(TLSのIANAで定義される)

動作

クライアントは、そこに認証用エンドポイントがあるという知識を持って認証用エンドポイントにアクセスします。そのときにUnprompted-Authenticationを送信することで認証を試みます。

サーバは、送られてきたUnprompted-Authenticationヘッダを持ってユーザを認証します。認証が通れば200を返すことになります。それ以外の場合は、認証エンドポイントを秘匿するために404で応答します。