вторник, 8 января 2013 г.

17.10. Безопасные TCP/IP соединения при помощи SSHTunnels


Возможно использовать SSH для шифрования сетевых соединений между клиентом и сервером PostgreSQL. Если это сделано правильно, что мы поучаем адекватный уровень сетевой безопасности даже для клиентов, не поддерживающих SSL.
Для начала убедитесь, что SSH сервер работает на той же машине, что и сервер PostgreSQL и что Вы можете залогиниться на сервер при помощи ssh. После этого установите безопасный тунель с клиентской машины:
ssh -L 63333:localhost:5432 joe@foo.com
Первое число аргумента L - 63333 - номер порта на вашем конце туннеля; это может быть любой свободный порт (IANA резервирует порты с 49152 по 65535 для частного использования). Второе число, 5432 - это номер порта на удалённом конце тунеля, номер порта, который использует ваш сервер. Имя или IP адрес между номерами портов - это машина, на которой запущен сервер БД, как её адрес выглядит с машины, с которой Вы хотите подключиться, в нашем примере - с foo.com. Для того, чтобы подключиться к серверу БД при помощи туннеля, Вы должны использовать порт 63333 на локальной машине:
psql -h localhost -p 63333 postgres
Для сервера БД это будет выглядеть как будто Вы пользователь joe c хоста foo.com и подключаетесь к localhost и, соответственно, сервер будет использовать подходящие процедуры аутентификации для этого пользователя и этого хоста. Обратите внимание, что сервер не будет рассматривать соединение как SSL-шифрованное, так как оно не шифруется между SSH сервером и PostgreSQL. Это не должно понижать уровень безопасности, так как оба они находятся на одной машине.
Для того, чтобы туннель был создан, Вы должны разрешить подключения через ssh для joe@foo.com как если бы Вы использовали ssh для создания удалённой сессии.
Кроме того, Можно использовать перенаправление портов:
ssh -L 63333:foo.com:5432 joe@foo.com
но в таком случае сервер БД будет рассматривать соединение как приходящее с интерфейса foo.com, которое не открыто при настройках по умолчанию: listen_addresses = 'localhost'. Скорее всего это не то, что Вы бы хотели.
Если Вы должны "прыгнуть" на сервер БД через какой-то хост для логина, можно попробовать сделать так:
ssh -L 63333:db.foo.com:5432 joe@shell.foo.com
Обратите внимание, что в этом случае соединение с shell.foo.com на db.foo.com не будет зашифровано туннелем. SSH предоставляет и другие возможности настройки при сетевых ограничениях. Подробнее это описано в документации по SSH.
Совет: некоторые другие приложения могут предоставлять схожую функциональность

Комментариев нет:

Отправить комментарий