SadServers解説#7 "Bucharest": Connecting to Postgres
問題概要
シナリオ
Postgresに接続しましょう。
問題詳細
このサーバーには、PostgreSQL13のデータベースを使用しているWEBアプリケーションがありますが、データベースへ接続することができないようです。この接続の失敗を引き起こしている問題を特定し、解決してください。アプリケーションは、ユーザー名に"app1user"、パスワードに"app1user"を使用して、"app1"という名前のデータベースに接続します。
提供:PykPyky
解決判定
Check My Solution
ボタンをクリックしてください。
解答が正解かどうか、コマンドプロンプト上で確認することも可能です。次のコマンドを実行して、以下のコマンドを実行し、エラーが返されることなく成功すればOKです。
~$ PGPASSWORD=app1user psql -h 127.0.0.1 -d app1 -U app1user -c '\q'
問題解決の方針
【表示する】
この問題では、PostgreSQLに接続できないという問題のトラブルシューティングを行います。
トラブルシューティングの際は、エラーメッセージがあればそれを読んで原因を調査し、行き詰ってしまったら他のログを見る、という流れがいいでしょう。
解決の手順を表示する
- PostgreSQLが動作しているか確認する
- PostgreSQLに接続を試みる
- エラーメッセージが出力された場合は、その内容に従って原因を調査する
ヒント
一部、SadServers公式のヒントを改変しています。
ヒント1
まずは、そもそもPostgreSQLが動作しているのか確かめましょう。
実行コマンド
~$ systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset:>
Active: active (exited) since Sat 2024-01-27 12:37:42 UTC; 27s ago
Process: 671 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 671 (code=exited, status=0/SUCCESS)
CPU: 2ms
Jan 27 12:37:42 i-0f15d898f5685ecb3 systemd[1]: Starting PostgreSQL RDBMS...
Jan 27 12:37:42 i-0f15d898f5685ecb3 systemd[1]: Finished PostgreSQL RDBMS.
lines 1-9/9 (END)
どうやら、サービスは動作しているようです。
ヒント2
PostgreSQLが動いていることが確認できたため、実際にPostgreSQLへの接続を試みてみます。
~$ PGPASSWORD=app1user psql -h 127.0.0.1 -d app1 -U app1user -c '\q'
psql: error: FATAL: pg_hba.conf rejects connection for host "127.0.0.1", user "app1user", database "app1", SSL on
FATAL: pg_hba.conf rejects connection for host "127.0.0.1", user "app1user", database "app1", SSL off
どうやら、pg_hba.conf
という設定が、ユーザーapp1userがデータベースapp1に接続することを拒否しているようです。
pg_hda.conf
という設定ファイルを探しましょう。ファイルの検索にはfind
コマンドを使用します。
実行コマンド
設定ファイルなので、/etc
配下にないか探してみます。
~$ sudo find /etc -name pg_hba.conf
/etc/postgresql/13/main/pg_hba.conf
見つかりました。
設定ファイルの場所が分かったら、中身を確認して怪しい記述を探しましょう。
ヒント3
pg_hba.confに以下の記述がありました。
# Database administrative login by Unix domain socket
...
local all postgres peer
host all all all reject
host all all all reject
...
このエントリは、すべてのデータベース、すべてのユーザー、すべてのIPアドレスからの接続を拒否するものです。
この記述を無効化すれば、接続が拒否されることがなくなるかもしれません。
適切な手順で、設定ファイルを編集しましょう。
実行コマンド
設定ファイルを編集するときは、作業前の状態を復元できるようにバックアップを取り、設定を無効化する際は行ごと消すのではなくコメントアウトを活用しましょう。
~$ sudo cp /etc/postgresql/13/main/pg_hba.conf /tmp/pg_hba.conf.bak
~$ sudo vi /etc/postgresql/13/main/pg_hba.conf
# Database administrative login by Unix domain socket
...
local all postgres peer
#host all all all reject
#host all all all reject
...
ヒント4
変更した設定ファイルを反映させるために、postgresql
を再起動しましょう。
実行コマンド
~$ sudo systemctl restart postgresql
~$ PGPASSWORD=app1user psql -h 127.0.0.1 -d app1 -U app1user -c '\q'
~$
どうやら、エラーが出力されずに実行できたようです。
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
問題一覧はこちら
Discussion