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を実行したときに、気付きました。
そういやレシピ実行中にパスワードなんて入れることできないねーって。
[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)
直接コマンドを実行してみた。
[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. パスワードファイル』に遭遇。
ユーザのホームディレクトリの.pgpassまたはPGPASSFILEで設定されるファイルは、接続にパスワードが必要な場合(かつ、他に指定されたパスワードが無かった場合)に使用するパスワードを格納するファイルです。
だそうだ。
なので早速作成してみる。
作成したファイルは、セキュリティ面を考慮し、postgresユーザーのみアクセスできるようにする。
[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.パスワードなしなのか本当に確認してみる。
[root@test01 data]# su - postgres -c "psql -c \"\du ;\"" | grep zz01adm1
zz01adm1 | Create role, Create DB | {}
[root@test01 data]#
chefで実行しても、パスワードに関するエラーがでませんよ!
[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
今回は、わりとあっさり対応できてよかったけれども、このやり方使わなければ、結構業務上は大変な気がしますね。