Подключитесь к Postgres через SSL, используя R

У меня есть тот же вопрос, который был задан здесь Подключиться к Redshift через SSL с помощью R

Однако данный ответ требует подтверждения сертификата. Мне интересно, есть ли способ сделать это без проверки сертификата? Когда я подключаюсь через клиент sql, я просто добавляю это

?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

Как я могу добавить эти параметры в R?

Заранее благодарю за любую помощь!

2 ответа

Решение

Вместо прохождения verify-full в sslmode, пытаться require или же allow:

dbConnect(dbDriver('PostgreSQL'),
    dbname   = 'dbname=foobar sslmode=require',
    host     = 'foobar.redshift.amazonaws.com',
    port     = 5439,
    user     = 'foobar',
    password = 'foobar')

https://github.com/r-dbi/RPostgres представляется наиболее современным и поддерживаемым пакетом на данный момент. Это то, что сработало для меня...

install.packages("RPostgres")
require(RPostgres)

db = dbConnect(
  Postgres(), 
  user = 'user',
  password = 'password',
  dbname = 'dbname',
  host = 'host',
  port = port,
  sslmode = 'require'
)

dbListTables(db)

Это сработало для меня:

connection <- DBI::dbConnect(RPostgres::Postgres(),
                             dbname = "dbname",
                             host = "host",
                             port = "port",
                             password = "password",
                             user = "user_name",
                             base::list(sslmode="require", connect_timeout="10"),
                             service = NULL)

Таким образом, ключевые слова параметра можно передавать в виде списка. Это также работало для RPostgres 1.1.1 и 1.2.0.

Я полагаюсь на пакеты R DBI и odbc. Вот настройка, которую я использовал с помощью @ Floris

  • Сначала создайте сертификат и ключ SSL клиента, подпишите сертификат клиента с помощью корневого сертификата сервера postgres, а также сохраните корневой сертификат сервера postgres на стороне клиента в ~/.postgresql/. Ключ ssl клиента принадлежит только владельцу и доступен только для чтения. Вот руководство от jealastic.com, которому я следовал, чтобы создать сертификаты SSL сервера и клиента.

ls -alh ~/.postgresql/

drwx------  2 foo staff      122 Jul 23 10:45 ./
drwx------ 54 foo staff 2.1K Jul 23 10:45 ../
-rw-r--r--  1 foo staff      875 Jul 21 17:42 postgresql.crt
-rw-r--r--  1 foo staff      631 Jul 21 17:41 postgresql.csr
-r--------  1 foo staff      891 Jul 21 17:41 postgresql.key
-rw-r--r--  1 foo staff     1.1K Jul 21 17:40 root.crt
  • nano ~/.odbcinst.ini и добавьте следующее:
[PostgreSQL Driver]
Driver              = /home/foo/anaconda3/envs/sql/lib/psqlodbcw.so

где драйвер odbc был установлен в среде conda с использованием conda create --name sql -c conda-forge psqlodbc.

  • nano ~/.odbc.ini и добавьте одну или несколько записей для базы данных, к которой вы хотите подключиться, с действующими учетными данными:
[foodb]
Driver              = PostgreSQL Driver
Database            = foodb
Servername          = db.example.com
UserName            = foo
Password            = mypassword
Port                = 5432
sslmode             = require

Обратите внимание, что драйвер PostgreSQL соответствует соответствующей записи в ~/.odbcinst.ini Для типа sslmode и безопасности и накладных расходов рекомендуется прочитать: https://www.postgresql.org/docs/9.4/libpq-ssl.html

  • Исправить разрешения
chmod 600 ~/.odbc.ini ~/.odbcinst.ini
  • В графическом интерфейсе RStudio либо создайте новое соединение, и оно должно показать запись foodb из ~/.odbc.ini, либо введите это в консоль R.
library(odbc)
foodb <- dbConnect(odbc::odbc(), "foodb", timeout = 10)

Готово!

Другие вопросы по тегам