diff --git a/docs/ubuntu/redis.md b/docs/ubuntu/redis.md new file mode 100644 index 0000000..d0dccc3 --- /dev/null +++ b/docs/ubuntu/redis.md @@ -0,0 +1,163 @@ +[Redis](https://redis.io/) — это быстрое хранилище данных типа «ключ‑значение», известное своей гибкостью, производительностью и широким выбором поддерживаемых языков. В этом руководстве описывается установка, настройка и обеспечение безопасности Redis на сервере Ubuntu 22. + +Будем устанавливать Redis на Ubuntu Server 22. Нам нужен пользователь без root прав, но с привилегиями `sudo`. + + +## Установка Redis + +1. Обновите списки репозиториев: + + ``` + sudo apt-get update + ``` + +2. Для установки актуальной версии Redis, добавьте репозиторий с новой версией: + + ``` + sudo apt install lsb-release curl gpg + curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg + + echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list + ``` + +3. Далее установите Redis новой версии: + + ``` + sudo apt-get update + sudo apt-get install redis-server + ``` + +4. После установки убедитесь, что сервер запущен: + + ``` + ps ax | grep redis + 335 ? Ssl 0:00 /usr/bin/redis-server 127.0.0.1:6379 + ``` + +5. Проверьте подключение к базе. По умолчанию для доступа к базе пароль не требуется: + + ``` + redis-cli + 127.0.0.1:6379> PING + PONG + 127.0.0.1:6379> + ``` + +6. Добавьте сервис в список приложений, запускаемых автоматически: + + ``` + sudo systemctl enable redis-server + ``` + +Установка завершена. + +## Настройка безопасности + +### Установка пароля + +По умолчанию для доступа к Redis не требуется пароль. Для настройки прав доступа отредактируйте конфигурационный файл `/etc/redis/redis.conf`. Из-за того, что Redis - высокопроизводительная база данных, позволяющая злоумышленнику проверять до 150 000 паролей в секунд, рекомендуется использовать надежный пароль. + +Сгенерируем пароль из 60 символов + +``` +openssl rand 60 | openssl base64 -A +KBXBWCd1Kynbkdbo6IxEwx5fMBhutjj3YTT1J29rKoUjCnRcvo4uxYcptydQpqAjintegDhkYyCJHvx2 +``` + +Укажите этот пароль в файле `/etc/redis/redis.conf` в разделе `SECURITY` в команде `requirepass`: + +``` +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +requirepass KBXBWCd1Kynbkdbo6IxEwx5fMBhutjj3YTT1J29rKoUjCnRcvo4uxYcptydQpqAjintegDhkYyCJHvx2 +``` + +### Переименование команд + +Для повышения уровня безопасности можно использовать переименование команд либо запрет выполнения команд для работы с базой данных. + +Чтобы переименовать команду, дайте ей другое имя, как показано в приведенных ниже примерах. Переименованные команды должно быть трудно подобрать, но легко запомнить: + +``` +. . . +# rename-command CONFIG "" +rename-command SHUTDOWN SHUTDOWN_MENOT +rename-command CONFIG ASC12_CONFIG +. . . +``` +Чтобы отключить команду, просто укажите пустую строку в качестве имени (обозначается парой кавычек без символов между ними), как показано ниже: +``` +. . . +# 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 "" +. . . +``` +После изменения файла конфигурации, выполните проверку доступности базы данных: + +``` +sudo systemctl restart redis-server +``` + +## Сетевой доступ + +По умолчанию Redis слушает только 127.0.0.1. Изменим настройки, чтобы можно было подключаться с других хостов. + +Отредактируем файл `/etc/redis/redis.conf`. Найдем в нем строчку `bind 127.0.0.1 ::1` и закомментируем её: + +``` +# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES +# JUST COMMENT THE FOLLOWING LINE. +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#bind 127.0.0.1 ::1 +``` + +Перезапустим Redis для применения настроек: + +``` +sudo systemctl restart redis-server +``` +Проверим, что Redis слушает сеть: +``` +sudo netstat -tulpn | grep redis +tcp 0 0 0.0.0.0:6379 0.0.0.0:\* LISTEN 1562/redis-server \* +tcp6 0 0 :::6379 :::\* LISTEN 1562/redis-server \* +``` + +## Установка лимита на память RAM + +Теперь установим лимит на использование оперативной памяти и изменим механизм вытеснения ключей при заполнении этого объема памяти. + +Это делается в секции **MEMORY MANAGEMENT** файла `/etc/redis/redis.conf`: + +``` +# maxmemory +# maxmemory-policy noeviction +``` + +- **maxmemory** - указывает на максимальный объем памяти, что можно задействовать. Указывается в байтах, но можно указывать и краткие форматы (kb, mb, gb). Например `maxmemory 4gb` +- **maxmemory-policy** - определяет политику вытеснения ключей, при заполнении памяти.Могут быть разные значения: + - noeviction — не вытеснять данные, то есть если память закончилась, при попытке записи в базу данных выдавать ошибку (по умолчанию); + - volatile-lru — удалить наименее используемые в последнее время ключи с настройкой expire; + - allkeys-lru — удалить наименее используемые в последнее время ключи вне зависимости от настройки expire; + - volatile-lfu — удалить наименее часто используемые ключи с настройкой expire; + - allkeys-lfu — удалить наименее часто используемые ключи вне зависимости от настройки expire; + - volatile-random — удалить случайные ключи с настройкой expire; + - allkeys-random — удалить случайные ключи вне зависимости от настройки expire; + - volatile-ttl — удалить ключи, срок действия которых истекает быстрее остальных (то есть время жизни которых приближается к expire). \ No newline at end of file