それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PostgresのインストールとPAM設定で/etc/passwd のローカルユーザーで認証

debaian に postgresql をインストールした。

Postgresのユーザのパスワードをいちいち管理するのが面倒なので、/etc/shadow を同一にして、Linuxのログイン・パスワードを使えるようにした。 MySQLのPAMと同じね。

そのうちLDAPにしたいんだけど、まぁpsql -> PAM -> LDAP に変えればいいだけなので、これはそのうち。 PAMにさえ丸投げしてれば別に困らないし。

psql をインストール

sudo aptitude install postgresql

基本設定を作る

sudo -e /etc/postgresql/9.1/main/postgresql.conf

日本語が化けるので、設定を変更

 grep lc /etc/postgresql/9.1/main/postgresql.conf
lc_messages = 'C'                       # locale for system error message

外部からの接続を許可する

 grep listen /etc/postgresql/9.1/main/postgresql.conf
listen_addresses = '*'          # what IP address(es) to listen on;

ユーザーtakuyaを作る

ユーザーを作る。

root@atom:/home/takuya# su postgres
postgres@atom:/home/takuya$ createuser takuya
新しいロールをスーパーユーザにしますか? (y/n)n
新しいロールに対してデータベースを作成する権限を与えますか? (y/n)y
新しいロールに対して別のロールを作成する権限を与えますか? (y/n)n

takuyaユーザー専用DBの データベース名takuyaで作る

root@atom:/home/takuya# su postgres
postgres@atom:/home/takuya$ psql
psql (9.1.16)
"help" でヘルプを表示します.
postgres=# create database takuya;
CREATE DATABASE
postgres=#

PAM連携

パスワードの管理が面倒なので、PAMに認証を丸投げする。

通常は、IPv4 の部分に、md5を書けば、Postgresに登録したパスワードでmd5 のハッシュで認証してくれる。(チャレンジレスポンスかな?)

ここをPAMにすると、postgresは、認証をPAMに丸投げしてくれる

/etc/postgresql

ファイルは /etc/postgresql/9.6/main/pg_hba.conf に記述がある。

# IPv4 local connections:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             takuya          192.168.10.0/24    pam

ipv4 と ついでにlocal も追加

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             takuya          192.168.10.0/24          pam
host    all             all             ::1/128                 pam
host    all             all             127.0.0.1/32            pam
local   all             takuya                                  pam


# "local" is for Unix domain socket connections only

PAM側でpostgresを受け付けてあげる。

postgres はpam に自分の名前をpostgresで依頼するので、/etc/pam.d/postgresを作る

sudo -e /etc/pam.d/postgres
@include common-auth

私はDebianなので、@include common-auth を使った、centos なら password-auth あたりかな

で、postgresはPAM経由で/etc/shadow を使うので、/etc/shadow が読み取れなきゃ、認証できない。 なので、/etc/shadow が postgresにも読み取れるようにする。

postgresql に /etc/shadow の読取り許可を出には、shadowグループに追加する。

sudo usermod -aG shadow postgres
sudo chmod g+r /etc/shadow

結果を確認

takuya@:~$ id postgres
uid=131(postgres) gid=141(postgres) groups=141(postgres),42(shadow),109(ssl-cert)

setacl してもいいんだけど、面倒なので、shadowグループに追加した。 PAM経由をroot にするssh-agent 的なのないのかしら。

ここ迄できたら、再起動

$ sudo systemctl restart postgresql
$ sudo systemctl status  postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Fri 2018-02-23 05:40:21 JST; 9s ago
  Process: 1170 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 1170 (code=exited, status=0/SUCCESS)
      CPU: 609us

 2月 23 05:40:21 acid systemd[1]: Starting PostgreSQL RDBMS...
 2月 23 05:40:21 acid systemd[1]: Started PostgreSQL RDBMS.

再起動が終わったらログインしてみる。

別サーバーからのログインを確認する。

takuya@:~/Desktop$ psql -h 192.168.10.50 -U takuya
Password for user takuya:
psql (9.4.4, server 9.1.16)
SSL connection (protocol: TLSv1.2, cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256, compression: on)
Type "help" for help.

takuya=>

おkおk

これで、PostgreSQL側でPAM認証経由でユーザー認証ができて、パスワード管理する手間が減った。楽チン楽チン。

追記

そういえば、PAM設定してPAMに任せてるのに、/etc/shadow 権限ってなんで必要なんだったんろう。直接/etc/shadow読み取れるなら、PAMに任せず/etc/shadow読み取って認証できるじゃんね。

2018/02/23 Debian バージョンアップ

systemctl とか postgresql のバージョンアップに合わせて書き換えた