web-dev-qa-db-ja.com

Rails SSLを使用してPostgreSQLに接続するにはどうすればよいですか?

Rails 3.2プロジェクトでリモートPostgreSQLデータベースに接続しようとすると、次のエラーが発生します。

FATAL:  no pg_hba.conf entry for Host "10.0.0.3", user "projectx", database "projectx", SSL off

Railsの設定は次のようになります:

staging:
  adapter: postgresql
  database: projectx
  username: projectx
  password: 123456
  Host: 10.0.0.3
  encoding: utf8
  template: template0
  min_messages: warning

postgreSQLでは次のようになります。

hostssl    all             all             0.0.0.0/0            md5
hostssl    all             all             ::/0                 md5

両方のマシンはUbuntu12.04で実行されています。

自動的に機能するはずだという投稿を見つけましたが、明らかに発生しません。 libpqでSSLが有効になっておらず、有効にすると問題が解決したという意見もありましたが、有効にする方法についての説明はありませんでした。 libpqの依存関係を見ると、いくつかのSSLパッケージに依存していることがわかります。したがって、SSLサポートがコンパイルされていると思います。

いくつかの投稿はこれを追加することを推奨しました:

sslmode: require

またはこれ:

sslmode: enabled

sslモードを有効にしますが、効果はありませんでした。私はそれが黙って無視されていることを読みました。

また、データベース文字列アプローチを試しましたが、最終的には次のようになりました。

staging:
  adapter: postgresql
  database: "Host=10.0.0.3 dbname=projectx user=projectx password=123456 sslmode=require"

そして、私はエラーが発生しました:

could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

これは、Railsが10.0.0.3ではなくローカルホストまたはローカルPostgreSQL(存在しない)に接続しようとしていたことを示しているようです。

何か案は?

18
pupeno

あなたが書いたように、通常、Ubuntu 12.xパッケージは、SSLがアクティブ化され、箱から出してすぐに機能するように設定されています。さらに、最初のメソッドRails、またはlibpqにこのような処理を許可するクライアント、つまりほぼすべてのクライアントによって試行されました。

この自動有効化は、他のPostgreSQLパッケージや自己コンパイルされたサーバーでは必ずしも当てはまらないため、これらの他のコンテキストに適用される回答やアドバイスは役に立ちません。

セットアップは直接機能するはずなので、この回答は何がうまくいかないかを見つけるためにチェックすることのリストです。できれば、psqlではなくRailsを最初に使用して接続設定をテストし、一般的なpostgresqlの問題を最初に除外できるようにします。

クライアント側

クライアント側 sslmode パラメーターは、接続試行のシーケンスを制御します。

SSLを自発的に回避するには、クライアントは接続文字列のどこかにsslmode=disableを置くか、環境のPGSSLMODE=disableを置くか、他のいずれかを台無しにする必要があります PGSSL* 変数。万が一、あなたのRailsプロセスがその環境でこれを持っていた場合、pg_hba.confが非SSL接続を許可しないことを考えると、それはあなたが得ているエラーを説明するでしょう。

SSLを試さないもう1つの理由は、明らかにlibpqがSSLサポート付きでコンパイルされていない場合ですが、Ubuntuパッケージの場合はそうではありません。

sslmodeのデフォルトはpreferで、次のように記述されます。

優先(デフォルト)

first try an SSL connection; if that fails, try a non-SSL connection

エラーメッセージの最後にあるSSL=offは、失敗した最後の接続試行に関連しています。 SSLが試行されて失敗したか、まったく試行されなかった可能性があります。このメッセージだけではわかりません。 SSL=offでの接続試行は、通常、pg_hba.conf(最初の列のhostssl)で設定されたポリシーに従ってサーバーによって拒否されます。

問題がサーバー側にあることはもっともらしいです。なぜなら、うまくいかない可能性があるよりも多くのことがあるからです。

サーバ側

サーバー側で確認するさまざまな事項は次のとおりです。

  • ssl=onにはpostgresql.confがあるはずです(デフォルトの場所:/etc/postgresql/9.1/main/

  • psqlを使用してローカルホストに接続すると、次のようなメッセージが表示されます。

psql(9.1.13)
SSL接続(暗号:DHE-RSA-AES256-SHA、ビット:256)
ヘルプを表示するには「help」と入力してください。

  • ca-certificatesパッケージがインストールされ、最新である必要があります。

  • ssl-certパッケージがインストールされ、最新である必要があります。

  • Postgresデータディレクトリ(デフォルトでは/var/lib/postgresql/9.1/main)内に、ソフトリンクがあるはずです。
    server.crt -> /etc/ssl/certs/ssl-cert-snakeoil.pemまたは別の有効な証明書、および
    server.key -> /etc/ssl/private/ssl-cert-snakeoil.keyまたは別の有効なキー。

  • /etc/ssl/certsおよび親ディレクトリは、postgresによって読み取り可能でCD可能である必要があります。

  • postgresunixユーザーはssl-cert unixグループに属している必要があります(id -a postgresで確認してください)。そうでない場合、秘密鍵を読み取ることができません。

  • postgresql.confを変更する場合は、他のテストを行う前に、postgresqlが再起動されることを確認してください。

  • 起動時または接続試行の失敗時に、/var/log/postgresql/postgresql-9.1-main.logにSSLに関する疑わしいメッセージが表示されないようにする必要があります。

17
Daniel Vérité

RailsはpostgresにPGgemを使用して接続します。実装については、こちらをご覧ください。

https://github.com/Rails/rails/blob/02a3c0e771b3e09173412f93d8699d4825a366d6/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L881

PG gemは、libpg(cライブラリ)とここにある「PG :: Connection.new」に関するドキュメントを使用します: http://deveiate.org/code/pg/PGconn.html

次のオプションを提案します。

Host
server hostname

hostaddr
server address (avoids hostname lookup, overrides Host)

port
server port number

dbname
connecting database name

user
login user name

password
login password

connect_timeout
maximum time to wait for connection to succeed

options
backend options

tty
(ignored in newer versions of PostgreSQL)

sslmode
(disable|allow|prefer|require)

krbsrvname
kerberos service name

gsslib
GSS library to use for GSSAPI authentication

service
service name to use for additional parameters

したがって、これは接続文字列が機能しないことを示します(アダプターによって認識されないため、これはmysqlアダプターオプションである可能性があります)

また、これはsslmode=requiredオプションは、libpgの基本機能であるため、機能するはずです。

そう:

database.yml

staging:
  ...
  sslmode: "require"
  ...

間違いなくトリックを行う必要があります、ステージングモードを使用してもよろしいですか? //念のため、他の環境にもsslmodeを追加します。

また、libpgは最初の試行としてデフォルトでSSLを使用します。SSLモードが最初に失敗したためにSSLオフでエラーが表示され、次にlibpqがsslなしで再試行し、最終的にエラーが発生しました。

9
ahmeij