🐘

SadServers解説#7 "Bucharest": Connecting to Postgres

2024/01/27に公開

問題概要

シナリオ

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に接続できないという問題のトラブルシューティングを行います。
トラブルシューティングの際は、エラーメッセージがあればそれを読んで原因を調査し、行き詰ってしまったら他のログを見る、という流れがいいでしょう。

解決の手順を表示する
  1. PostgreSQLが動作しているか確認する
  2. PostgreSQLに接続を試みる
  3. エラーメッセージが出力された場合は、その内容に従って原因を調査する

 

ヒント

一部、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の問題に取り掛かってみてはいかがでしょうか。
https://zenn.dev/comf_nakamura/articles/linux_command
 

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion