Усиление безопасности сервера Redis
Redis — NoSQL хранилище типа “ключ/значение”, размещаемое в памяти, имеющее возможность сохранения на диск. Чаще всего Redis используется для кэширования данных, хранения сессий и для реализации различных механизмов масштабирования.
Redis был спроектирован для использования доверенными клиентами в надежной среде, и в нем не предусмотрено собственных надежных функций безопасности. Для подтверждения этого приведем цитату с официального сайта Redis:
«Redis предназначен для доступа доверенных клиентов в доверенных средах. Это означает, что, как правило, не рекомендуется размещать экземпляр Redis непосредственно в Интернете или, вообще, в среде, где непроверенные клиенты могут напрямую обратиться к TCP-порту Redis или сокету UNIX… В общем, дизайн Redis спроектирован для обеспечения максимальной производительности и простоты управления, но не для максимальной безопасности.»
Но производительность и простота управления без обеспечения безопасности — ошибочный путь. Redis имеет несколько базовых встроенных функций безопасности, такие как создание базового незашифрованного пароля, переименование и отключение команд. Однако, полноценной системы контроля доступа не предусмотрено.
Конфигурирование существующей функциональности для повышения безопасности установки Redis является важным шагом, позволяющим обеспечить разумную защиту данных.
Из данной статьи вы узнаете как настроить встроенные функции безопасности Redis и другие возможности повышения уровня безопасности с помощью изолированной установки Redis в Ubuntu.
Отметим, что в данном руководстве не рассматриваются ситуации, когда сервер Redis и клиентские приложения размещены на разных хостах или в разных data-центрах. Инфраструктуры, в которых трафик Redis должен пересекать небезопасную или ненадежную сеть, кроме приведенных здесь настроек требуют дополнительного набора конфигураций, таких как настройка прокси SSL или VPN между машинами Redis.
Предварительные требования
Для работы по описанным инструкциям вам понадобится:
- сервер Ubuntu с пользователем с правами sudo;
- iptables;
- Redis установлен и работает.
Проверка доступности Redis
Первым делом, подключитесь к серверу, используя SSH:
ssh username@server-ip-address
А так, как мы создавали контейнер. То подключимся так
sudo docker exec -it [имя контейнера или id] bash
Чтобы проверить, что Redis работает, воспользуйтесь командной строкой Redis. Для доступа к командной строке используйте команду redis-cli.
redis-cli
Примечание: Если вы уже установили пароль для Redis, авторизуйтесь после установки соединения с помощью auth.auth your_redis_password
Ответ:
OK
Проверьте соединение с сервером с помощью команды ping:
ping
Если Redis работает правильно, вы увидите ответ:
Для выхода используйте:
quit
Теперь вы уверены, что установка Redis полностью работоспособна и готова к использованию. Можно перейти к настройке безопасности сервера.
Обеспечение безопасности сервера с помощью iptables
Redis — это просто приложение, запущенное на сервере, и так как оно не обладает реальными возможностями для обеспечения безопасности, первым шагом к его защите является обеспечение безопасности сервера, на котором он работает.
В случае использования сервера с доступом к сети, таким первым шагом будет настройка брандмауэра:
# доступ к Redis c IP A.B.C.D
# если требуется
sudo iptables -A INPUT -s A.B.C.D/32 -i eth0 -p tcp -m tcp --dport 6379 -j ACCEPT
# Всем остальным запрещаем внешние подключения к
# Redis
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 6379 -j DROP
Если Redis должен быть доступен для клиентов с внешних IP, необходимо запустить Redis так, чтобы он слушал требуемые IP, например, 0.0.0.0 (можно указать конкретные ip-адреса через пробел) :
grep '^bind' /etc/redis/redis.conf
# If you want you can bind a single interface, if the bind option is not
bind 0.0.0.0
Настройка пароля для аутентификации Redis
После установки Redis необходимо задать для него пароль. Вы можете задать надежный пароль, следуя инструкциям в этом разделе.
Настройка пароля Redis активиирует одну из двух встроенных функций безопасности — команду auth
, которая требует от клиентов аутентификации для доступа к базе данных. Пароль настраивается непосредственно в файле конфигурации Redis, /etc/redis/redis.conf
.
Перейдите к разделу SECURITY
и найдите закомментированную директиву:
# requirepass foobared
Раскомментируйте эту строку, удалив #
, и вместо foobared
укажите надежный и длинный пароль.
Вместо того, чтобы создавать пароль самостоятельно, можно использовать утилиту apg
или pwgen
. Если вы не хотите устанавливать приложение для генерации пароля, вы можете использовать скрипт ниже. Измените слово в кавычках на свой пароль.
echo "произвольный текст" | sha256sum
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
Скопируйте и вставьте ответ в качестве значения для requirepass
в /etc/redis/redis.conf
, теперь ваши приложения должны использовать этот хэш в качестве пароля при аутентификации:
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
Или можно воспользоваться командной строкой
config set requirepass P@ssword
Проверяем:
Авторизуемся и проверяем еще раз.
После установки пароля сохраните файл и перезапустите Redis:
sudo service redis-server restart
Чтобы проверить, что пароль работает, подключитесь к серверу Redis с помощью клиента командной строки:
redis-cli
Ниже приведем последовательность команд для проверки работы пароля Redis. Первая команда пытается установить ключ к значению до аутентификации.
set key1 10
Это не сработает, поэтому Redis вернет ошибку:
NOAUTH Authentication required.
Вторая команда позволяет аутентифицироваться с паролем, указанным в файле конфигурации Redis.
auth your_redis_password
После того, как Redis принял пароль, предыдущая команда возвращает успешный ответ:
set key1 10
Ответ:
OK
get key1
запрашивает Redis о значении нового ключа.
get key1
10
Теперь можем выйти из командной строки:
quit
Далее рассмотрим метод, основанный на переименовании опасных команд Redis для дальнейшего повышения безопасности.
Переименование опасных команд
Еще одна встроенная возможность безопасности Redis позволяет переименовывать или полностью отключать определенные команды, которые считаются опасными.
При запуске пользователями, такие команды могут использоваться для изменения конфигурации, уничтожения или повреждения данных. Как и пароль аутентификации, команды переименовываются или отключаются в файле /etc/redis/redis.conf
.
Вот некоторые команды, которые считаются опасными: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME
и DEBUG
. Список неполный, но для начала достаточно переименовать или отключить команды из этого списка.
Отключение или переименование команды определяется ее использованием клиентами Redis. Если вы знаете, что никогда не будете использовать небезопасную команду, ее лучше отключить. В противном случае хотя бы переименуйте ее.
Чтобы переименовать или отключить команды Redis, откройте файл конфигурации для редактирования еще раз:
sudo nano /etc/redis/redis.conf
Отключите или переименуйте команды, которые значимы для вас. На redis.io/commands можно самостоятельно проверить команды и посмотреть, как они могут быть использованы некорректно.
Чтобы отключить команду, просто переименуйте ее на пустую строку, как показано ниже:
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
Чтобы переименовать команду, укажите другое имя для нее, как показано ниже. Переименованные команды злоумышленникам должно быть трудно угадать, а вам – легко запомнить.
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
Сохраните изменения и примените их, перезапустив Redis.
sudo service redis-server restart
Чтобы проверить новую команду, перейдите в командную строку Redis:
redis-cli
Теперь предположим, что вы переименовали команду CONFIG
в ASC12_CONFIG
. Тогда следующий вывод покажет как проверить, что применилась новая команда.
После аутентификации:
auth your_redis_password
OK
Первая попытка использовать команду config
вернет ошибку, т.к. она была переименована.
config get requirepass
Ответ:
(error) ERR unknown command 'config'
Вызов переименованной команды пройдет успешно (вызов команд не чувствителен к регистру):
asc12_config get requirepass
Ответ:
1) "requirepass"
2) "your_redis_password"
Теперь можно выйти из redis-cli
:
quit
Примечание: Если вы перезапускаете Redis, не закрыв перед этим командную строку, вам нужно будет пройти повторную аутентификацию. В противном случае вы получите ошибку при запуске команды:
NOAUTH Authentication required.
Важно:
Что касается переименования команд, в конце секции SECURITY
в /etc/redis/redis.conf
есть предупреждение:
«Помните, что переименование команд, находящихся в файле журнала AOF или переданных серверам slave, может вызвать проблемы.»
Это означает, что если по какой-либо причине, вы измените команду после того, как она уже сохранена в журнал инкрементного постоянного хранилища или на серверах slave команда имеет другое имя, то вы столкнетесь с проблемами работы серверов Redis.
Таким образом, если вы используете AOF или реплицированную среду, после переименования команд, одни и те же имена должны быть на всех серверах, а хранилище AOF очищено, если есть шанс, что там есть команды со старыми именами.
Настройка прав доступа к каталогу данных и доступа к файлам
На этом этапе рассмотрим изменения прав доступа, которые можно сделать для повышения безопасности установки Redis. Они включают в себя проверку, что права на чтение данных есть только у пользователя, которому нужен доступ к Redis. Это по умолчанию пользователь redis.
Проверить это можно, выполнив поиск по каталогу данных Redis :
ls -l /var/lib | grep redis
Ответ:
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
Вы можете видеть, что каталог данных Redis принадлежит пользователю redis и группе redis.
Сложнее с правами доступа к папке, это 755. Чтобы гарантировать, что только пользователь Redis имеет доступ к папке и ее содержимому, измените права доступа на 700:
sudo chmod 700 /var/lib/redis
Еще одно право доступа, которое следует изменить, это права доступа конфигурационного файла Redis. По умолчанию, права доступа файла 644 и принадлежит пользователю root, c предоставлением вторичного доступа группе redis.
ls -l /etc/redis/redis.conf
Ответ:
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis/redis.conf
Это разрешение (644) доступно для чтения всему миру, что не очень хорошо, поскольку оно содержит незашифрованный пароль, настроенный ранее.
Нужно сменить права владения и доступа. В идеале, он должен принадлежать пользователю redis, c предоставлением вторичного доступа пользователю root. Для этого выполните следующую команду:
sudo chown redis:root /etc/redis/redis.conf
Затем измените права доступа так, чтобы только владелец файла мог читать и/или писать в него:
sudo chmod 600 /etc/redis/redis.conf
Проверьте новые права доступа, используя:
ls -l /etc/redis/redis.conf
Ответ:
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf
Наконец, перезапустите Redis:
sudo service redis-server restart
Заключение
Помните, что при наличии доступа к вашему серверу обойти специфические для Redis функции безопасности, которые мы внедрили, очень легко. Таким образом, самая важная функция безопасности — это настройка брандмауэра, так как он максимально блокирует неизвестных пользователей.
Чтобы поднять безопасность вашего сервера на новый уровень, вы можете настроить систему обнаружения вторжений, такую как OSSEC.
Для защиты Redis в небезопасной сети, вам придется использовать SSL-прокси, как рекомендовано разработчиками Redis в официальном руководстве по безопасности Redis. Настройка SSL-прокси для защиты соединений Redis — это отдельная тема.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.