Перейти к основному содержимому

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

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

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

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

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

Чтобы предотвратить подделку с использованием SSL, сервер должен быть настроен на прием только hostssl соединений (Раздел Файл pg_hba.conf) и иметь файлы ключа и сертификата SSL (Раздел «Безопасные соединения TCP/IP с помощью SSL»). Клиент TCP должен подключаться с использованием sslmode=verify-ca или verify-full и установить соответствующий корневой сертификат файл (Раздел Проверка клиентом сертификатов сервера).

Как вариант, можно применять системный пул ЦС, предоставляемый реализацией SSL. В этом случае для безопасности принудительно применяется режим sslmode=verify-full, так как получение сертификатов, подписываемых публичным ЦС, является обычной практикой.

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

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