18.7. Защита от подмены сервера #
Когда сервер работает, злонамеренный пользователь не может подставить свой сервер вместо него. Однако если сервер отключён, локальный пользователь может подменить нормальный сервер, запустив свой собственный. Поддельный сервер сможет читать пароли и запросы клиентов, хотя не сможет вернуть никакие данные, так как каталог PGDATA
будет защищён от чтения посторонними пользователями. Такая подмена возможна потому, что любой пользователь может запустить сервер баз данных; клиент, со своей стороны, не может обнаружить подмену, если его не настроить дополнительно.
Один из способов предотвратить подмену для локальных
подключений — использовать каталог Unix-сокетов (unix_socket_directories), в который сможет писать только проверенный локальный пользователь. Это не позволит злонамеренному пользователю создать в этом каталоге свой файл сокета. Если вас беспокоит, что некоторые приложения при этом могут обращаться к файлу сокета в /tmp
и, таким образом, всё же будут уязвимыми, создайте при загрузке операционной системы символическую ссылку /tmp/.s.PGSQL.5432
, указывающую на перемещённый файл сокета. Возможно, вам также придётся изменить скрипт очистки /tmp
, чтобы он не удалял эту ссылку.
Также клиенты могут защитить локальные
подключения, установив в параметре requirepeer
имя пользователя, который должен владеть серверным процессом, подключённым к сокету.
Для защиты от подмены TCP-соединений можно либо использовать сертификаты SSL и проверять сертификат сервера со стороны клиентов, либо применять шифрование GSSAPI (или и то, и другое при использовании независимых подключений).
To prevent spoofing with SSL, the server must be configured to accept only hostssl
connections (Раздел 20.1) and have SSL key and certificate files (Раздел 18.9). The TCP client must connect using sslmode=verify-ca
or verify-full
and have the appropriate root certificate file installed (Подраздел 37.19.1). Alternatively the system CA pool can be used using sslrootcert=system
; in this case, sslmode=verify-full
is forced for safety, since it is generally trivial to obtain certificates which are signed by a public CA.
Для защиты от подмены соединения с сервером во время использования сетевой аутентификации по паролю с методом scram-sha-256 следует удостовериться, что подключение к серверу происходит по SSL-протоколу и с одним из методов, защищающих от подмены соединения, которые описаны в предыдущем абзаце. Кроме того, реализация SCRAM в libpq не защищает на протяжении всего процесса обмена информацией при аутентификации, однако использование параметра соединения channel_binding=require
позволяет минимизировать вероятность подмены соединения. Злоумышленник, использующий подставной сервер для перехвата данных при обмене по SCRAM, может прибегнуть к офлайн-анализу, чтобы попытаться определить хешированный пароль клиента.
Для защиты от подмены соединения с GSSAPI сервер надо настроить так, чтобы он принимал только подключения hostgssenc
(см. Раздел 20.1) и для них использовалась аутентификация gss
. TCP-клиент в этом случае должен подключаться с параметром gssencmode=require
.