Усиление безопасности сервера 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

Чтобы проверить, что Redis работает, воспользуйтесь командной строкой Redis. Для доступа к командной строке используйте команду redis-cli.

redis-cli

Примечание: Если вы уже установили пароль для Redis, авторизуйтесь после установки соединения с помощью auth.

auth your_redis_password

Ответ:
OK

Проверьте соединение с сервером с помощью команды ping:

ping

Если Redis работает правильно, вы увидите ответ:

PONG

Для выхода используйте:

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

После установки пароля сохраните файл и перезапустите 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 — это отдельная тема.