Аутентификация и шифрование
Запуск Stunnel в режиме демона
Запуск Stunnel в режиме демона не вызывает проблем при подключении как к локальным, так и к удаленным базам данных. Чтобы использовать Stunnel для подключения к локальной базе данных, следует запустить пакет в режиме клиента и сервера (два разных процесса одной программы, работающих на разных портах). Затем вы приказываете psql подключиться к номеру порта, на котором работает клиентская часть Stunnel.
После того как psql подключится к клиенту, все данные автоматически шифруются и передаются серверу Stunnel, работающему на другом порте, номер которого сообщается клиенту при запуске. Сервер расшифровывает данные и пересылает их серверу PostgreSQL. Клиент должен знать свой номер порта, а также номер порта, на котором работает сервер, чтобы передать ему зашифрованные данные.
Впрочем, Stunnel чаще применяется для передачи данных от локального клиента удаленному серверу. Для этого следует запустить локальный клиентский процесс Stunnel либо включением в стартовый сценарий (например, /etc/rc.d/rc.local), либо непосредственным запуском из каталога. Затем удаленный процесс Stunnel запускается на хосте, на котором работает PostgreSQL. Сервер, как и клиент, обычно запускается автоматически в процессе загрузки системы.
Примеры запуска клиентской и серверной частей Stunnel приведены в листинге 8.15. Если исполняемый файл stunnel не был скопирован в каталог /usr/sbin, Stunnel следует запускать из каталога установки.
Листинг 8.15. Использование Stunnel при удаленных подключениях.
[user@remote – ]$ # Запуск сервера на удаленном компьютере [user@remote – ]$ stunnel – P/tmp/ – p – /stunnel.pern – d 9000 – г local host:5432 [user@local – ]$ # Запуск клиента на локальном компьютере [user@local – ]$ stunnel – P/tmp/ – c – d 5432 – г 192.168.1.2:9000
Первая команда в листинге 8.15 приказывает серверу использовать в качестве сертификата для шифрования файл ~/stunnel.pem и запустить процесс Stunnel в режиме демона. Параметр – d 9000 означает, что демон должен прослушивать порт 9000. Параметр – г lосаl host: 5432 сообщает процессу-демону, что при получении зашифрованных данных на прослушиваемом порте (в данном примере – 9000) эти данные необходимо расшифровать и передать локальному хосту на порт 5432 (номер порта PostgreSQL). Таким образом, расшифрованные данные будут переданы серверу базы данных на локальном хосте.
Вторая команда запускает экземпляр Stunnel на клиентском компьютере в режиме клиента (на что указывает ключ – с) с прослушиванием порта 5432. Параметр – г 192.168.1.2:9000 сообщает процессу, что сервер работает по адресу 192.168.1.2:9000 и прослушивает зашифрованные пакеты на порте 9000.
В обоих режимах обязательный ключ – P/tmp/ сообщает путь к временному файлу PID, в котором хранится системный идентификатор процесса Stunnel. Указывать имя файла не обязательно, достаточно пути (по умолчанию используется имя вида stunnel.localhost.9000.pid), хотя при желании можно задать полное имя.
После того как оба процесса Stunnel заработают на своих хостах, клиент psql направляется на порт 5432 клиентского компьютера. Пакеты, отправляемые на этот порт, проходят прозрачное шифрование, перенаправляются на порт 9000 серверного компьютера, расшифровываются и передаются PostgreSQL на порт 5432. Происходящее напоминает туннели SSH, о которых говорилось в подразделе "SSH/ OpenSSH", но между ними существует одно важное различие: клиентский процесс Stunnel может создаваться без аутентификации на удаленном сервере. Таким образом, любой пользователь может создать защищенного "отправителя" на сервере базы данных, хотя при этом все равно потребуется создать защищенного "получателя", принимающего зашифрованные данные.
Шифрование полностью отделено от обычной процедуры аутентификации PostgreSQL; с точки зрения серверного процесса postmaster данные поступают в текстовом виде, поскольку они проходят предварительную расшифровку. Stunnel идеально работает в сочетании с парольной аутентификацией – пароли обеспечивают необходимое ограничение доступа и пересылаются по сети в зашифрованном виде.
Кроме того, как упоминалось выше, локальный запуск двух процессов Stunnel позволяет шифровать пакеты, передаваемые между двумя локальными портами TCP/IP. В листинге 8.16 приведен пример запуска клиентского и серверного процессов на одном компьютере.
Листинг 8.16. Локальный запуск Stunnel.
[user@local – ]$ stunnel – P/tmp/ – p – /stunnel-3.15/stunnel.pern – d 9000 – r 5432 [user@local – ]$ stunnel – P/tmp/ – c – d 5433 – r local host:9000
Первая команда запускает серверный процесс, использующий файл сертификата ~/stunnel-3.15/stunnel.pem. Демон прослушивает подключения на порте 9000 и передает расшифрованные данные с этого порта на порт 5432. В примере использован номер 5432, потому что сервер PostgreSQL работает на этом порте.
Вторая команда запуска Stunnel в листинге 8.16 открывает клиентский процесс Stunnel на порте 5433 (порт выбирается произвольно; в данном примере он напоминает номер порта PostgreSQL). Демон шифрует входящие данные и передает их серверному процессу на порт 9000 локального хоста.