Подтвердить что ты не робот

Как заставить Rails использовать SSL для подключения к PostgreSQL?

Когда я пытаюсь подключиться к удаленной базе данных PostgreSQL с проектом Rails 3.2, я получаю эту ошибку:

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

Обе машины работают на Ubuntu 12.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 пыталась подключиться к локальному хосту или, скорее, локальному PostgreSQL (там нет) вместо 10.0.0.3.

Любые идеи?

4b9b3361

Ответ 1

Как вы писали, как правило, пакеты Ubuntu 12.x настроены так, что SSL активирован, работает из коробки, а кроме того, это первый метод, проверенный rails, или любой клиент, который позволяет libpq иметь дело с этим материалом, что означает почти все клиенты.

Это автоматическое включение не обязательно выполняется с другими пакетами PostgreSQL или с самокомпилированным сервером, поэтому ответы или рекомендации, применяемые к этим другим контекстам, не помогают с вашими.

Поскольку ваша настройка должна работать напрямую, этот ответ представляет собой список вещей, которые нужно проверить, чтобы узнать, что пошло не так. Предпочтительно сначала использовать psql для проверки настройки соединения, а не rails, так что сначала можно исключить общие проблемы postgresql.

Клиентский

Параметр sslmode управляет последовательностью попыток подключения.

Чтобы добровольно избегать SSL, клиенту нужно было бы поставить sslmode=disable где-нибудь в строке подключения или PGSSLMODE=disable в среде или испортить одну из других PGSSL*. В маловероятном случае, когда ваш процесс rails имел это в своей среде, это объясняло бы ошибку, которую вы получаете, учитывая, что pg_hba.conf не разрешает подключения без SSL.

Еще одна причина не попробовать SSL, очевидно, когда 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 в первом столбце).

Более правдоподобно, что проблема связана с сервером, потому что есть больше вещей, чем может пойти не так.

на стороне сервера

Вот несколько вопросов для проверки на стороне сервера:

  • В postgresql.conf должно быть ssl=on (местоположение по умолчанию: /etc/postgresql/9.1/main/)

  • при подключении к localhost с помощью 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, а родительские каталоги должны быть читаемыми и cd'able postgres.

  • Пользователь postgres unix должен находиться в группе unix ssl-cert (проверьте с помощью id -a postgres), иначе он не сможет прочитать закрытый ключ.

  • Если вы изменяете postgresql.conf, убедитесь, что postgresql перезапускается перед выполнением любого другого теста.

  • Не должно быть подозрительного сообщения о SSL в /var/log/postgresql/postgresql-9.1-main.log во время запуска или во время неудачной попытки подключения.

Ответ 2

Rails использует жемчужину PG для postgres для подключения, см. здесь для реализации:

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

Драйвер PG использует библиотеку 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 и, в конце концов, вызвал ошибку.