Аудит безопасности
Этот документ поможет провести аудит безопасности кластера Tarantool. Здесь описаны различные аспекты безопасности, их обоснование и способы проверки. Подробнее о настройке Tarantool Enterprise Edition и ее инфраструктуры для каждого аспекта см. в инструкциях по повышению безопасности.
Tarantool использует бинарный протокол iproto для репликации данных между экземплярами, а также в библиотеках коннекторов.
Начиная с версии 2.10.0 в Enterprise Edition встроена поддержка SSL для шифрования клиент-серверного взаимодействия по бинарным соединениям. Подробнее о включении SSL-шифрования см. в разделе Защита подключений с помощью SSL этого документа.
Если встроенное шифрование не включено, для защиты обмена данными между дата-центрами рекомендуется использовать VPN.
Если в кластере Tarantool не используется iproto для внешних запросов, подключение к портам iproto должно разрешаться только между экземплярами Tarantool.
Подробнее о настройке портов для iproto см. в разделе advertise_uri в документации Cartridge.
Экземпляр Tarantool может принимать HTTP-соединения от внешних служб или предоставлять доступ к веб-интерфейсу администратора. Все такие соединения должны проходить через веб-сервер с HTTPS, работающий на том же хосте, например, nginx. Это требование действует как для виртуальных, так и для физических хостов. Прохождение HTTP-трафика через несколько отдельных хостов с завершением HTTPS недостаточно безопасно.
Tarantool принимает HTTP-подключения на определенном порту. Этот порт должен быть доступен только на том же хосте, чтобы к нему мог подключаться nginx.
Убедитесь, что настроенный HTTP-порт закрыт, а HTTPS-порт (по умолчанию 443) открыт.
С помощью модуля console можно подключиться к рабочему экземпляру и запускать пользовательский код Lua. Это полезная возможность для разработчиков и администраторов. В следующих примерах показано, как открыть соединение по TCP-порту и на UNIX-сокете.
console.listen(<port number>)console.listen('/var/lib/tarantool/socket_name.sock')
Открывать административную консоль через TCP-порт всегда небезопасно. Убедитесь, что в коде нет вызовов функции
console.listen(<port_number>).
При подключении через сокет требуется право write для директории /var/lib/tarantool. Убедитесь, что оно выдано только
пользователю tarantool.
Подключение к экземпляру с помощью команд tt connect или tarantoolctl connect без учетных данных пользователя (под
пользователем guest) должно быть отключено.
Есть два способа проверить эту уязвимость:
-
Проверьте, что в исходном коде пользователю
guestне предоставляется доступ. Соответствующий код может выглядеть так:box.schema.user.grant('guest','read,write','universe',nil, { if_not_exists = true })Помимо соответствующего фрагмента кода, ищите все вхождения значения
'universe'. -
Попробуйте подключиться с помощью команды
tt connectк каждому узлу Tarantool. Подробнее см. в документации по LINK_NOT_DEFINED(../../../admin/access_control).
При использовании веб-интерфейса требуется вход по имени пользователя и паролю.
Все экземпляры Tarantool должны работать под пользователем tarantool.
Пользователь tarantool должен быть непривилегированным пользователем без права sudo. Кроме того, у него не должно быть
пароля, чтобы не допустить входа через SSH или su.
Для надежности резервного копирования в экземпляре Tarantool должны храниться минимум два последних снимка данных. Проверьте каждый экземпляр.
Значение параметра snapshot_count определяет количество хранимых снимков данных. Значения конфигурации задаются в первую очередь в конфигурационных файлах, но могут быть переопределены через переменные окружения и аргументы командной строки. Поэтому рекомендуется проверить как значения в конфигурационных файлах, так и фактические значения с помощью консоли:
tarantool> box.cfg.checkpoint_count---- 2
Tarantool фиксирует все входящие данные в журнале упреждающей записи (WAL). WAL должен быть включен, чтобы в случае перезапуска экземпляра эти данные можно было восстановить.
Безопасные значения параметра конфигурации
wal.mode — write и
fsync:
wal:dir: 'var/lib/{{ instance_name }}/wals'mode: 'write'
Исключение — когда экземпляр обрабатывает данные, которые можно свободно отбросить – например, при использовании Tarantool для кэширования. В этом случае WAL можно отключить для снижения нагрузки на ввод-вывод.
Уровень ведения журнала должен быть 5 (INFO), 6 (VERBOSE) или 7 (DEBUG). В этом случае журналы приложения будут содержать
достаточно информации для расследования инцидента.
tarantool> box.cfg.log_level---- 5
Полный список существующих уровней см. в справке по параметру log_level.
В Tarantool для ведения журнала следует использовать journald.