PostgreSQL サーバーで ident を利用してパスワードレスに

Published: 2020/1/23


個人的に、 PostgreSQL を自前で立てるにあたっては、以下が一番良いだろうと思うのでその備忘録。

ここでの PostgreSQL は、たとえば rails などのウェブアプリのサーバーに、同居する形でひとまず最小コストを目指す場合の話。

本文

local   all         all                               peer
host    all         all         127.0.0.1/32          ident
host    all         all         ::1/128               ident
# レプリケーションのなにかしらが続いている

上記は、 amazon linux 2 の上で、パッケージマネージャなどから PostgreSQL を素直にインストールした際の、 pg_hba.conf の内容。

ここで注目なのは、これは、基本的にホストへのユーザーアクセスによって、 PostgreSQL へのアクセス制御も行う設定になっていること。

具体的には、 peer の設定は、 unix socket からのアクセスのみに限定し、かつ、それは unix ユーザー名と同一 PostgreSQL ユーザーとしてしかログインできないようにしている。特に、同一筐体でウェブアプリを動かすのならば、そのアプリユーザーを一つ作っておくのがいろいろと吉であると考えれば、この設定だけでいろいろ十分ではある。

ident の設定は、これは特に ssh tunneling でもってアクセスを行う時に重宝する。というのも、 PostgreSQL は機能として ssl 通信機能を持つが、その設定は自分で行わなければならない。つまり、よくあるパスワード認証型に変更して、いろんなところからアクセスできるようにするということは、とりもなおさず ssl での防御が必要になり、しかしそれをいちいち行うのは割と面倒臭い。

ident は、 unix が伝統的に利用してきた ident サーバーを用いて認証を行うものであり、これは何かというと、「あなたのところから来ているこの接続の、ユーザー名は何ですか?」という問いに対して回答を行うようなサーバーである。 この ident, なので、ちゃんと認証基盤として運用するのならば、 postgresql が問い合わせを行う対象の ident サーバーは、信頼できるサーバーである必要がある。(その実、 ident をセキュリティ基盤として使うのは誤りである、と書いてある。)

PostgreSQL での ident 認証は、この ident を利用して、接続された TCP コネクションの接続元 unix ユーザー名と、同一 PostgreSQL ユーザー名に対しての認証を許可する方式。

とすると、 ssh tunneling で port forward しながら接続することを考えれば、 ssh の接続権限管理が、そっくりそのまま postgresql ユーザーとしての認証に利用できることになる。 そしてこの場合、 ssh の通信は(それなりに) secure であるので、 tsl の設定を別途行わなくても良くなる。

その実、 pgAdmin では、 ssh tunneling による接続が設定でき、

  1. ホスト
  2. ユーザー名
  3. 鍵情報

に対して、そのユーザーでアクセスできるように postgresql がいるサーバーを設定しておけば、それでことがたりる。

個人的には、 postgres ユーザーの authorized key に、そのサーバーにアクセスで利用している公開鍵を登録することで、セキュリティ的に鍵は ssh のそれだけで、セキュアなオンプレ postgresql サーバーが構築できるデフォルト認証構成が、良いのではないか、と考えている。


Tags: postgresql

関連記事