17.7. Предотвращение подделки сервера#

17.7. Предотвращение подделки сервера

17.7. Предотвращение подделки сервера #

В то время как сервер работает, злоумышленнику невозможно занять место обычного сервера базы данных. Однако, когда сервер выключен, локальный пользователь может подделать обычный сервер, запустив свой собственный сервер. Поддельный сервер может читать пароли и запросы, отправленные клиентами, но не может возвращать какие-либо данные, поскольку каталог PGDATA остается защищенным из-за прав доступа к каталогу. Подделка возможна, потому что любой пользователь может запустить сервер базы данных; клиент не может идентифицировать недопустимый сервер, если он не настроен специально.

Один из способов предотвратить подделку local-соединений - использовать каталог Unix-сокетов (unix_socket_directories), доступный только для записи доверенным локальным пользователем. Это предотвращает возможность злонамеренного пользователя создать свой собственный файл сокета в этом каталоге. Если вы беспокоитесь о том, что некоторые приложения все еще могут ссылаться на /tmp для файла сокета и, следовательно, быть уязвимыми для подделки, во время запуска операционной системы создайте символическую ссылку /tmp/.s.PGSQL.5432, указывающую на перемещенный файл сокета. Вам также может потребоваться изменить скрипт очистки /tmp, чтобы предотвратить удаление символической ссылки.

Другой вариант для локальных соединений local - это использование клиентами параметра requirepeer в libpq, чтобы указать требуемого владельца процесса сервера, подключенного к сокету.

Для предотвращения подделки на TCP-соединениях используйте либо SSL-сертификаты и убедитесь, что клиенты проверяют сертификат сервера, либо используйте шифрование GSSAPI (или оба варианта, если они находятся на отдельных соединениях).

Чтобы предотвратить подделку с помощью SSL, сервер должен быть настроен на прием только hostssl соединений (Раздел 19.1) и иметь файлы ключей и сертификатов SSL (Раздел 17.9). TCP-клиент должен подключаться с использованием sslmode=verify-ca или verify-full и иметь установленный соответствующий корневой сертификат (Раздел 31.19.1). В качестве альтернативы можно использовать системный пул CA с помощью sslrootcert=system; в этом случае sslmode=verify-full принудительно используется для безопасности, так как обычно не составляет труда получить сертификаты, подписанные публичным CA.

Чтобы предотвратить подделку сервера при использовании scram-sha-256 аутентификации по паролю через сеть, вы должны убедиться, что подключаетесь к серверу с использованием SSL и одного из методов защиты от подделки, описанных в предыдущем абзаце. Кроме того, реализация SCRAM в libpq не может защитить весь процесс аутентификации, но использование параметра подключения channel_binding=require обеспечивает смягчение риска подделки сервера. Злоумышленник, использующий поддельный сервер для перехвата SCRAM-обмена, может использовать оффлайн-анализ для потенциального определения хэшированного пароля клиента.

Для предотвращения подделки с использованием GSSAPI сервер должен быть настроен на принятие только соединений hostgssenc (Раздел 19.1) и использовать аутентификацию gss с ними. TCP-клиент должен подключаться с использованием gssencmode=require.