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 による接続が設定でき、
- ホスト
- ユーザー名
- 鍵情報
に対して、そのユーザーでアクセスできるように postgresql がいるサーバーを設定しておけば、それでことがたりる。
個人的には、 postgres ユーザーの authorized key に、そのサーバーにアクセスで利用している公開鍵を登録することで、セキュリティ的に鍵は ssh のそれだけで、セキュアなオンプレ postgresql サーバーが構築できるデフォルト認証構成が、良いのではないか、と考えている。
Tags: postgresql
関連記事
PostgreSQL の Incremental Sorting について
2021/12/22
ARIES と fuzzy check pointing
2021/6/1