Что это такое?
Redis является хранилищем данных в памяти, обычно используется в качестве базы данных, кэша и брокера сообщений. Поддерживаются различные структуры данных, такие как строки, хэши, списки, наборы.
Преимущества:
- высокая скорость;
- GitHub, Weibo, Pinterest, Snapchat, Craigslist, Digg, StackOverflow, Flickr выбрали это хранилище;
- поддерживается практически всеми языками программирования, в том числе JavaScript, Java, Go, C, C , C#, Python, Objective-C, PHP;
- имеет открытый исходный код.
Введение
Redis — это быстрое хранилище данных типа «ключ‑значение», известное своей гибкостью, производительностью и широким выбором поддерживаемых языков. В этом руководстве описывается установка, настройка и обеспечение безопасности Redis на сервере Ubuntu 18.04.
Introduction
Redis is an in-memory, NoSQL, key-value cache and store that can also be persisted to disk.
This tutorial shows how to implement basic security for a Redis server.
However, keep in mind that Redis was designed for use by trusted clients in a trusted environment, with no robust security features of its own. To underscore that point, here’s a quote from the official Redis website:
Redis is designed to be accessed by trusted clients inside trusted environments. This means that usually it is not a good idea to expose the Redis instance directly to the internet or, in general, to an environment where untrusted clients can directly access the Redis TCP port or UNIX socket.
. . .
In general, Redis is not optimized for maximum security but for maximum performance and simplicity.
Performance and simplicity without security is a recipe for disaster. Even the few security features Redis has are really nothing to rave about. Those include: a basic unencrypted password, and command renaming and disabling. It lacks a true access control system.
However, configuring the existing security features is still a big step up from leaving your database unsecured.
In this tutorial, you’ll read how to configure the few security features Redis has, and a few other system security features that will boost the security posture of a standalone Redis installation on Ubuntu 14.04.
Note that this guide does not address situations where the Redis server and the client applications are on different hosts or in different data centers. Installations where Redis traffic has to traverse an insecure or untrusted network require an entirely different set of configurations, such as setting up an SSL proxy or a VPN between the Redis machines, in addition to the ones given here.
1: тестирование redis
Создайте SSH-подключение как пользователь с правами sudo.
Сначала установку Redis нужно проверить. Откройте командную строку:
redis-cli
Примечание: Если вы уже настроили парольную аутентификацию, сначала вам нужно авторизоваться:
auth your_redis_passwordOK
Подробнее о настройке аутентификации – в разделе 4.
В командную строку введите такую команду, чтобы проверить соединение:
ping
Если Redis работает правильно, вы увидите ответ:
PONG
Закройте командную строку:
exit
Теперь вы знаете, что установка Redis полностью работоспособна и готова к использованию. Пора заняться безопасностью сервера.
2: настройка ufw
Redis – это просто приложение, работающее на вашем сервере. Поскольку у него есть только несколько основных функций безопасности, первым шагом к его защите является защита сервера, на котором он работает. В случае сервера с доступом к сети, такого как ваш сервер Ubuntu 18.
Если вы не уверены, включен ли брандмауэр, вы можете проверить это:
sudo ufw status
Если вы выполнили мануал по начальной настройке сервера, вы получите такой вывод:
Status: activeTo Action From– —— —-OpenSSH ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)
Если вы настроили правила брандмауэра с помощью этого руководства, вам не нужно добавлять дополнительное правило для Redis, потому что по умолчанию UFW сбрасывает весь входящий трафик, если он явно не разрешен. Поскольку автономная установка сервера Redis по умолчанию работает только на интерфейсе loopback (127.0.0.1 или localhost), по поводу входящего трафика на его порт по умолчанию можно не беспокоиться.
Prerequisites
For this tutorial, you’ll need:
Step 1 — verifying that redis is running
First log in to your server using SSH:
Step 2 — securing the server with iptables
If you followed the prerequisites for iptables, feel free to skip this step. Or, you can do it now.
Redis is just an application that’s running on your server, and because it has no real security features of its own, the first step to truly securing it is to first secure the server it is running on.
In the case of a public-facing server like your Ubuntu 14.04 server, configuring a firewall as given in this iptables guide is that first step. Follow that link and set up your firewall now.
If you’ve implemented the firewall rules using that guide, then you do not need to add an extra rule for Redis, because by default, all incoming traffic is dropped unless explicitly allowed. Since a default standalone installation of Redis server is listening only on the loopback interface (127.0.0.1 or localhost), there should be no concern for incoming traffic on its default port.
If you need to specifically allow an IP address for Redis, you can check what IP address Redis is listening on, and what port it is bound to by grep-ing the output of the netstat command. The fourth column — 127.0.0.1:
- sudonetstat -plunt |grep -i redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8562/redis-server 1
Make sure this IP address is allowed in your Firewall policy. For more information on how to add rules, please see this iptables basics article.
Step 3 — binding to localhost
By default, Redis server is only accessible from localhost. However, if you followed the tutorial to set up a Redis master server, you updated the configuration file to allow connections from anywhere. This is not as secure as binding to localhost.
Open the Redis configuration file for editing:
- sudonano /etc/redis/redis.conf
Locate this line and make sure it is uncommented (remove the # if it exists):
bind 127.0.0.1
We’ll keep using this file, so keep it open for now.
Step 4 — configuring a redis password
If you installed Redis using the How To Configure a Redis Cluster on Ubuntu 14.04 article, you should have configured a password for it. At your discretion, you can make a more secure password now by following this section. If not, instructions in this section show how to set the database server password.
Configuring a Redis password enables one of its two built-in security feature – the auth command, which requires clients to authenticate to access the database. The password is configured directly in Redis’s configuration file, /etc/redis/redis.conf, which you should still have open from the previous step.
Scroll to the SECURITY section and look for a commented directive that reads:
# requirepass foobared
Uncomment it by removing the #, and change foobared to a very strong and very long value.
Rather than make up a password yourself, you may use a tool like apg or pwgen to generate one. If you don’t want to install an application just to generate a password, you may use the one-liner below. To generate a password different from the one that this would generate, change the word in quotes.
Step 5 — renaming dangerous commands
The other security feature built into Redis allows you to rename or completely disable certain commands that are considered dangerous.
Предварительные требования
Для выполнения данного руководства вам потребуется сервер Ubuntu 18.04 с пользователем без прав root с привилегиями sudo и брандмауэром с базовой конфигурацией. Вы можете выполнить настройку с помощью нашего руководства по первоначальной настройке сервера.
Когда все будет готово, выполните вход на сервер Ubuntu 18.04 с помощью пользователя с правами sudo и продолжите выполнять дальнейшие инструкции.
Проверка redis
Для того, чтобы убедиться, что сервер работает, выполните следующую команду:
sudo systemctl status redis
Результат:
Чтобы проверить корректность работы Redis, подключитесь к серверу с помощью клиента командной строки:
Проверьте соединение с помощью команды ping:
Результат PONG подтверждает, что соединение с сервером установлено. Затем убедитесь, что установка ключей Redis доступна:
Теперь получите заданное значение, также после перезапуска сервера значение должно сохраниться:
Для выхода из клиента используйте сочетание клавиш Ctrl С или команду:
Удаленное подключение
Иногда бывает удобно выполнять удаленное подключение к Redis, для этого откройте файл конфигурации:
Найдите следующую строку:
Раскомментируйте и замените адрес, 0.0.0.0 – подключнию с любого IP, если указать конкретный IP, то сможете подключаться именно с него:
Перезагрузите СУБД:
Не забудьте открыть порт, на котором запущен сервер, с помощью iptables, например:
Для удаленного подключения используйте следующую команду:
redis-cli -h <ip-адрес> -p <порт>
Например:
redis-cli -h 5.200.56.169 -p 6379
Установка и конфигурация redis
Первоначальные требования: действия выполняются от имени пользователя с правами sudo.
Для успешной установки Redis выполните обновление локальной базы пакетов:
Для загрузки и установки Redis выполните следующую команду:
С помощью текстового редактора, например vi, откройте конфигурационный файл, который генерируется автоматически:
С помощью поиска найдите параметр supervised. Значение параметра указывает на систему инициализации, по умолчанию имеет значение no, необходимо заменить это значение на systemd:
Перезагрузите СУБД:
Установка пароля
Для увеличения безопасности хранилища рекомендуем установить пароль, для этого откройте файл конфигурации:
Найдите следующую строку:
# requirepass foobared
Раскомментируйте строку, удалив #, и измените значение параметра requirepass на безопасный пароль:
requirepass <пароль>
Перезагрузите СУБД:
Для подключения по паролю используйте ключ a:
redis-cli -a <пароль>
Шаг 1 — установка и настройка redis
Мы будем использовать диспетчер пакетов APT для установки redis из официальных репозиториев Ubuntu. На момент написания этой статьи в репозиториях по умолчанию доступна версия 5.0.7.
Начните с обновления кэша локальных пакетов apt:
- sudoapt update
Затем установите Redis. Для этого введите следующее:
- sudoaptinstall redis-server
После этого будет выполнена загрузка и установка Redis и ее зависимостей. После этого в файл конфигурации Redis, созданный автоматически при установке, необходимо внести одно важное изменение.
Откройте этот файл в предпочитаемом текстовом редакторе:
- sudonano /etc/redis/redis.conf
Внутри файла найдите директиву supervised. Эта директива позволяет объявить систему инициализации для управления Redis как службой, предоставляя вам более широкий контроль за ее работой. Для директивы supervised по умолчанию установлено значение no.
. . .
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
. . .
Это единственное изменение, которое вам нужно внести в файл конфигурации Redis на данный момент,поэтому сохраните и закройте его после завершения редактирования. Если вы использовали nano для редактирования файла, нажмите CTRL X, Y, а затем ENTER.
Перезапустите службу Redis, чтобы изменения в файле конфигурации вступили в силу:
- sudo systemctl restart redis.service
После этого установка и настройка Redis будет закончена, и вы можете запускать его на вашем компьютере. Перед началом использования Redis рекомендуется сначала проверить корректность работы системы.
Шаг 5 — переименование опасных команд
Другой элемент безопасности, встроенные в Redis, подразумевает переименование или полное удаление определенных команд, которые считаются опасными.
При использовании неавторизованными пользователями, такие команды могут использоваться для изменения конфигурации, уничтожения или выведения из строя ваших данных. Как и в случае пароля для аутентификации, переименование или отключение команд выполняется в том же разделе SECURITY в файле /etc/redis/redis.conf.
Список команд, которые считаются опасными, включает: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME и DEBUG.
Решение о том, нужно ли отключить или переименовать команду, зависит от ваших потребностей или потребностей вашего сайта. Если вы знаете, что вы не будете использовать команду, которая может быть использована злоумышленниками, тогда вы можете отключить ее. В другом случае мы рекомендуем вам переименовать ее.
Чтобы активировать или отключить команды Redis, откройте файл конфигурации еще раз:
- sudonano /etc/redis/redis.conf
Предупреждение. Седующие шаги с демонстрацией отключения или переименования команд являются примерами. Вы должны отключить или переименовать команды, имеющие смысл для вас. Вы можете просмотреть полный список команд самостоятельно и узнать, как они могут использоваться злоумышленниками, по адресу vhod-v-lichnyj-kabinet.ru/commands.
Чтобы отключить команду, просто укажите пустую строку в качестве имени (обозначается парой кавычек без символов между ними), как показано ниже:
. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""rename-command FLUSHALL ""rename-command DEBUG ""
. . .
Чтобы переименовать команду, дайте ей другое имя, как показано в приведенных ниже примерах. Переименованные команды должно быть трудно подобрать, но легко запомнить:
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOTrename-command CONFIG ASC12_CONFIG
. . .
Сохраните изменения и закройте файл.
После переименования команды примените изменения, перезапустив Redis:
- sudo systemctl restart redis.service
Чтобы протестировать новую команду, откройте командную строку Redis:
- redis-cli
Затем выполните аутентификацию:
- auth your_redis_password
OK
Предположим, вы переименовали команду CONFIG в ASC12_CONFIG, как показано в предыдущем примере. Сначала попробуйте воспользоваться первоначальной команду CONFIG. Команда не будет выполнена, потому что вы переименовали ее:
- config get requirepass
(error) ERR unknown command 'config'
Вызов переименованной команды будет успешным. Регистр не имеет значения:
- asc12_config get requirepass
1) "requirepass"
2) "your_redis_password"
После этого вы можете закрыть redis-cli:
- exit
Обратите внимание, что если вы уже используете командную строку Redis, а затем перезапустите Redis, вам нужно будет повторно выполнить аутентификацию. Иначе вы получите следующую ошибку при вводе команды:
NOAUTH Authentication required.
В отношении практики переименования команд в конце раздела SECURITY
файла /etc/redis/redis.conf
есть следующее предостережение:
Обратите внимание, что изменение имени команд, зарегистрированных в файле AOF или передающихся “slave” компонентам системы, может вызывать проблемы.
Примечание:проект Redis предпочитает использовать термины «master» и «slave», в то время как DigitalOcean предпочитает использовать варианты «primary» и «secondary». Чтобы не допустить путаницы, мы решили использовать здесь термины, используемые в документации Redis.
Это значит, что, если переименованная команда не содержится в файле AOF, либо содержится, но AOF файл не передается «slave» компонентам, не будет никаких проблем.
Учитывайте этот момент, когда будете переименовать команды. Лучшее всего переименовать команду, пока вы не используете AOF сохранение или сразу после установки, т.е. до развертывания использующего Redis приложения.
Если вы используете AOF и работаете с конфигурацией master-slave, изучите этот ответ на странице проблем проекта на GitHub. Ниже приводится ответ на вопрос автора:
Команды сохраняются в AOF и воспроизводятся в «slave» компоненте в таком же виде, как были отправлены, поэтому если вы попытаетесь использовать AOF для экземпляра, где не было выполнено переименование, могут возникнуть противоречия, так как команда не может быть выполнена (то же самое характерно для «slave» компонентов).
Таким образом, при переименовании необходимо убедиться, что переименованные команды применяются во всех экземплярах на установках типа «master-slave».
Заключение
Имейте в виду, если злоумышленник получит доступ к серверу, специальные функции безопасности Redis, которые вы установили, будет довольно легко обойти. Вот почему самая важная функция безопасности – это брандмауэр, поскольку он блокирует неизвестных пользователей.
Чтобы защитить Redis в небезопасной сети, вам придется использовать прокси SSL, как рекомендовано разработчиками Redis в официальном руководстве по безопасности Redis.
Tags:
Conclusion
Keep in mind that once someone is logged in to your server, it’s very easy to circumvent the Redis-specific security features we’ve put in place. So, the most important security feature is one that makes it extremely difficult to jump that fence.
That should be your firewall.
To take your server security to the next level, you could configure an intrusion detection system like OSSEC. To configure OSSEC on Ubuntu 14.04, see this OSSEC guide.
If you’re attempting to secure Redis communication across an untrusted network you’ll have to employ an SSL proxy, as recommeded by Redis developers in the official Redis security guide. Setting up an SSL proxy to secure Redis commmunication is a separate topic.
We didn’t include a full list of Redis commands in the renaming section. However, you can check this for yourself and determine how they might be misused at vhod-v-lichnyj-kabinet.ru/commands.