備忘録 PostgreSQLでpsqlコマンド実行時にパスワードを省略したい。

pg_hba.confファイルを編集し、データベース接続ユーザーを管理したり、パスワード認証の設定を行ったりすることで、セキュリティ強化を図りました。


```ruby:pg_hba.conf
# "local" is for Unix domain socket connections only
#local   all             all                                     trust
local   postgres   postgres                                 md5
local   dvdrental  zz01adm01                                md5
local   zipcode  zz01adm01,zz01upd1,zz01ref1,zz01app1      md5
#local  all             postgres                                trust
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust
host postgres postgres 0.0.0.0/0 md5
host dvdrental zz01adm01 0.0.0.0/0 md5
host zipcode zz01adm01,zz01upd1,zz01ref1,zz01app1 0.0.0.0/0 md5
```

今回、データベースzipcodeにアクセスするロールを作成するために（zz01upd01など）、chefで実行したところエラーとなったところが、今回の調査のきっかけ。

いろいろ調べていたら、.pgpassファイルを利用することで、psqlコマンド実行時にパスワード入力が不要になるようです。

##1.最初に遭遇したエラー
chefを実行したときに、気付きました。
そういやレシピ実行中にパスワードなんて入れることできないねーって。

```ruby:
[chef@test01 recipes]$ sudo chef-solo -c /home/chef/chef-repo/solo.rb -o "recipe[psql::crt_role]"
[sudo] password for chef:
Starting Chef Client, version 12.18.31
[2017-05-22T10:35:12+09:00] WARN: Run List override has been provided.
[2017-05-22T10:35:12+09:00] WARN: Original Run List: []
[2017-05-22T10:35:12+09:00] WARN: Overridden Run List: [recipe[psql::crt_role]]
resolving cookbooks for run list: ["psql::crt_role"]
Synchronizing Cookbooks:
  - psql (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 12 resources
Recipe: psql::crt_role
  * bash[ create role aj04adm1 ] action run

    ================================================================================
    Error executing action `run` on resource 'bash[ create role zz01adm1 ]'
    ================================================================================

    Mixlib::ShellOut::ShellCommandFailed
    ------------------------------------
    Expected process to exit with [0], but received '2'
    ---- Begin output of "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" ----
    STDOUT: 210 Number of sources = 1
    STDERR: Password:   ←　パスワードの入力が必要となるが、レシピ実行中には対話式で入力できないためエラーとなる。
    psql: fe_sendauth: no password supplied
    ---- End output of "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" ----
    Ran "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" returned 2
～省略～
STDERR: Password:
psql: fe_sendauth: no password supplied
---- End output of "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" ----
Ran "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" returned 2
[2017-05-22T10:35:13+09:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
```

直接コマンドを実行してみた。

```ruby:
[root@test01 data]# su - postgres -c "psql -c \"\du ;\"" | grep zz01adm1
Password:                                         ←　パスワード入力が必要
 zz01adm1  | Create role, Create DB                                     | {}
[root@test01 data]#
```

##2. .pgpassファイルを作成
マニュアルをながめていると、『[PostgreSQL 9.6.2文書 32.15. パスワードファイル](https://www.postgresql.jp/document/9.6/html/libpq-pgpass.htmla)』に遭遇。


**`ユーザのホームディレクトリの.pgpassまたはPGPASSFILEで設定されるファイルは、接続にパスワードが必要な場合(かつ、他に指定されたパスワードが無かった場合)に使用するパスワードを格納するファイルです。`**

だそうだ。

なので早速作成してみる。
作成したファイルは、セキュリティ面を考慮し、postgresユーザーのみアクセスできるようにする。

```ruby:
[postgres@test01 ~]$ vi .pgpass
localhost:5432:postgres:postgres:zaq12wsx
[postgres@test01 ~]$ chmod 600 .pgpass
[postgres@test01 ~]$ ls -la .pgpass
-rw------- 1 postgres postgres 42 May 22 10:11 .pgpass
```


##3.パスワードなしなのか本当に確認してみる。

```ruby:
[root@test01 data]# su - postgres -c "psql -c \"\du ;\"" | grep zz01adm1
 zz01adm1  | Create role, Create DB                                     | {}
[root@test01 data]#
```

chefで実行しても、パスワードに関するエラーがでませんよ！

```ruby:
[chef@test01 recipes]$ sudo chef-solo -c /home/chef/chef-repo/solo.rb -o "recipe[psql::crt_role]"
[sudo] password for chef:
Starting Chef Client, version 12.18.31
[2017-05-22T10:50:22+09:00] WARN: Run List override has been provided.
[2017-05-22T10:50:22+09:00] WARN: Original Run List: []
[2017-05-22T10:50:22+09:00] WARN: Overridden Run List: [recipe[psql::crt_role]]
resolving cookbooks for run list: ["psql::crt_role"]
Synchronizing Cookbooks:
  - psql (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 12 resources
Recipe: psql::crt_role
   * bash[ create role zz01adm1 ] action run (skipped due to not_if)
  * bash[ create role zz01upd1 ] action run (skipped due to not_if)
  * bash[ create role zz01ref1 ] action run (skipped due to not_if)
  * bash[ create role zz01app1 ] action run (skipped due to not_if)
[2017-05-22T10:50:23+09:00] WARN: Skipping final node save because override_runlist was given

Running handlers:
Running handlers complete
Chef Client finished, 0/12 resources updated in 03 seconds
```

今回は、わりとあっさり対応できてよかったけれども、このやり方使わなければ、結構業務上は大変な気がしますね。

##参考
『[PostgreSQL 9.6.2文書 32.15. パスワードファイル](https://www.postgresql.jp/document/9.6/html/libpq-pgpass.htmla)』