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 только на время отладки с записью в гит).
Практика
- Настройте ACL: appuser (только app:* и read/write), monitor (INFO/PING), отключите default-доступ без пароля.
- Проверьте защиту: попробуйте KEYS под appuser (должен получить NOPERM), FLUSHALL — тоже.
- Проверьте хост: THP, overcommit, swappiness, ulimit — приведите к норме и запишите в runbook.
- Разверните Redis с TLS и подключитесь клиентом с ca-cert.
Мини-квиз
1. Зачем protected-mode, если есть bind? — Страховка от ошибок конфигурации: без пароля/ACL внешние подключения отклоняются.
2. Чем ACL лучше rename-command? — Гибко по пользователям, без ломки инструментов и документации.
3. Почему THP вреден для Redis? — Гигантские страницы делают copy-on-write при fork дорогим: рост памяти и паузы.