Во время работы сервера злоумышленник не может занять место штатного сервера баз данных. Однако при остановленном сервере локальный пользователь может подменить штатный сервер, запустив собственный экземпляр сервера. Ложный сервер может считывать
пароли и запросы, отправляемые клиентами, но не может возвращать данные,
так как PGDATA директория останется защищенной благодаря установленным правам доступа к директории. Подмена возможна, так как любой пользователь может
запустить сервер баз данных; клиент не может идентифицировать нелегитимный сервер, если он не настроен специальным образом.
Одним из способов предотвращения подмены локальных
соединений является использование директории сокетов домена Unix (unix_socket_directories) имеющей права на запись только для доверенного локального пользователя. Это предотвращает создание собственного файла сокета вредоносным пользователем в данной директории. Если существует вероятность того, что некоторые приложения все еще ссылаются на /tmp для обращения к файлу сокета и, следовательно, могут быть подвержены подмене, при запуске операционной системы следует создать символическую ссылку /tmp/.s.PGSQL.5432 указывающую на перемещенный файл сокета. Также может потребоваться изменить
/tmp скрипт очистки, чтобы предотвратить удаление этой символической ссылки.
Другим вариантом для локальных соединений является использование клиентами параметра
requirepeer
для указания владельца процесса сервера, подключающегося к сокету.
Для предотвращения подмены в TCP-соединениях следует либо использовать SSL-сертификаты и обеспечить проверку сертификата сервера на стороне клиентов, либо использовать шифрование GSSAPI (или оба метода, если они используются для раздельных соединений).
Для предотвращения подмены сервера при использовании SSL сервер должен быть настроен на прием только hostssl соединений (Раздел 3.5.1) и иметь файлы SSL-ключа и сертификата
(Раздел 3.3.9). TCP-клиент должен подключаться с использованием параметров
sslmode=verify-ca или
verify-full и иметь установленный файл соответствующего корневого сертификата (Раздел 4.1.19.1). Также можно использовать системное хранилище доверенных сертификатов (CA pool) с помощью sslrootcert=system; в
этом случае sslmode=verify-full применяется принудительно в целях безопасности, так как получение сертификатов, подписанных публичным удостоверяющим центром (CA), обычно не представляет сложности.
Для предотвращения подмены сервера при использовании механизма
scram-sha-256 для аутентификации по паролю
в сети следует подключаться к серверу с использованием SSL
и одного из методов защиты от подмены, описанных в предыдущем
абзаце. Кроме того, реализация SCRAM в
libpq не может обеспечить защиту всего процесса
аутентификации, однако использование channel_binding=require параметр соединения обеспечивает защиту от подмены сервера. Злоумышленник, использующий поддельный сервер для перехвата обмена данными SCRAM, может применить офлайн-анализ для потенциального определения хешированного пароля клиента.
Для предотвращения спуфинга (подмены) при использовании GSSAPI сервер должен быть настроен на прием только hostgssenc соединений
(Раздел 3.5.1) и использование gss
аутентификации для них. TCP-клиент должен подключаться
с использованием gssencmode=require.