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 のバージョンアップに合わせて書き換えた