Программа курса

Модуль 06 / Урок 26 из 27

Безопасность и операционные настройки

Теория и практика

Redis исторически доверял сети: «поставь в закрытый контур — и хватит». Практика показывает, что слоёв защиты нужно больше. Здесь — сетевой периметр, ACL, TLS и настройки ОС, без которых Redis ведёт себя плохо.

Сеть

# redis.conf
bind 10.0.0.5 127.0.0.1     # ТОЛЬКО нужные интерфейсы, никогда 0.0.0.0 наружу
protected-mode yes           # отклоняет внешние подключения без пароля/ACL
port 6379
  • Redis не должен быть доступен из интернета — это правило №1 (миллионы взломанных инстансов в истории: через незащищённый Redis заливали SSH-ключи и майнеры);
  • Security groups/фаервол: доступ только от подов приложения и мониторинга;
  • Ошибочный RDB-файл — тоже вектор: dir должен быть закрыт от посторонних.

ACL: пользователи с правами (Redis 6+)

# Синтаксис: on/off, пароль, паттерны ключей, команды
ACL SETUSER appuser on >Str0ngPass ~app:* +@read +@write -@dangerous
ACL SETUSER monitor on >MonPass ~* +INFO +PING +SLOWLOG
ACL LIST ; ACL WHOAMI ; ACL GETUSER appuser
# Подключение: redis-cli --user appuser --askpass
  • Категории команд: @read, @write, @dangerous (KEYS, FLUSHALL, CONFIG, SHUTDOWN), @admin;
  • Паттерн ключей ~app:* ограничивает пользователя своим пространством;
  • Дефолтный default пользователь стоит отключить или запаролить;
  • Разные приложения на общем Redis — отдельные ACL-пользователи с разными префиксами.

TLS

tls-port 6379          # порт становится TLS-only
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-replication yes    # шифровать и репликацию

TLS обязателен, если трафик идёт через недоверенные сегменты сети или этого требует комплаенс; локально в закрытом контуре — решение по риск-модели.

Опасные команды

# Отключить полностью ("" = команда исчезнет)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
# Или переименовать в непредсказуемое (для админских операций)
rename-command CONFIG "a9f3-config"
⚠️ rename-command ломает некоторые инструменты (мониторинг, бэкаперы) и рассинхронизирует документацию. Современная альтернатива — ACL: отключить команды конкретным пользователям, оставив админам.

Настройки ОС, о которых забывают

  • Transparent Huge Pages — выключить: echo never > /sys/kernel/mm/transparent_hugepage/enabled — иначе fork и copy-on-write резко дороже;
  • vm.overcommit_memory = 1: иначе BGSAVE-форк под нагрузкой может получить OOM-kill от ядра;
  • vm.swappiness = 1..10: Redis не должен свопиться;
  • ulimit -n: ≥ maxclients + запас;
  • NUMA: на многосокетных серверах — привязка к одному узлу (numactl), иначе латентность скачет;
  • THP/swap — проверить дважды после каждого крупного обновления хоста: обновления ОС любят возвращать дефолты.

Мини-манифест эксплуатации

  • Обновляйтесь на новые стабильные версии (7.x): константные улучшения латентности и памяти;
  • Не делите один инстанс между несвязанными командами без ACL;
  • Держите «инженерный» доступ отдельным пользователем и через bastion;
  • Все изменения конфига — через версионированный redis.conf (CONFIG SET только на время отладки с записью в гит).

Практика

  1. Настройте ACL: appuser (только app:* и read/write), monitor (INFO/PING), отключите default-доступ без пароля.
  2. Проверьте защиту: попробуйте KEYS под appuser (должен получить NOPERM), FLUSHALL — тоже.
  3. Проверьте хост: THP, overcommit, swappiness, ulimit — приведите к норме и запишите в runbook.
  4. Разверните Redis с TLS и подключитесь клиентом с ca-cert.
Мини-квиз

1. Зачем protected-mode, если есть bind? — Страховка от ошибок конфигурации: без пароля/ACL внешние подключения отклоняются.

2. Чем ACL лучше rename-command? — Гибко по пользователям, без ломки инструментов и документации.

3. Почему THP вреден для Redis? — Гигантские страницы делают copy-on-write при fork дорогим: рост памяти и паузы.