Как установить и защитить Redis в Ubuntu 18.04

Предыдущая версия этого руководства была написанаJustin Ellingwood

Вступление

Redis - это хранилище ключей и значений в памяти, известное своей гибкостью, производительностью и широкой языковой поддержкой. В этом руководстве показано, как установить, настроить и защитить Redis на сервере Ubuntu 18.04.

Предпосылки

Для выполнения этого руководства вам потребуется доступ к серверу Ubuntu 18.04 с пользователем без полномочий root с привилегиямиsudo и настроенным базовым брандмауэром. Вы можете настроить это, следуя нашимInitial Server Setup guide.

Когда вы будете готовы начать, войдите на свой сервер Ubuntu 18.04 как пользовательsudo и продолжайте ниже.

[[step-1 -—- install-and-configuring-redis]] == Шаг 1. Установка и настройка Redis

Чтобы получить последнюю версию Redis, мы будем использоватьapt для его установки из официальных репозиториев Ubuntu.

Обновите локальный кеш пакетовapt и установите Redis, набрав:

sudo apt update
sudo apt install redis-server

Это загрузит и установит Redis и его зависимости. После этого в файле конфигурации Redis необходимо внести одно важное изменение конфигурации, которое было сгенерировано автоматически во время установки.

Откройте этот файл в предпочитаемом вами текстовом редакторе:

sudo nano /etc/redis/redis.conf

Внутри файла найдите директивуsupervised. Эта директива позволяет вам объявить систему инициализации для управления Redis как сервис, предоставляя вам больший контроль над его работой. Директиваsupervised по умолчанию установлена ​​наno. Поскольку вы используете Ubuntu, в которой используется система инициализации systemd, измените это значение наsystemd:

/etc/redis/redis.conf

. . .

# 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 на данный момент, поэтому сохраните и закройте его, когда закончите. Затем перезапустите службу Redis, чтобы отразить изменения, внесенные в файл конфигурации:

sudo systemctl restart redis.service

После этого вы установили и настроили Redis, и он работает на вашем компьютере. Однако прежде чем вы начнете его использовать, целесообразно сначала проверить, правильно ли работает Redis.

[[step-2 -—- testing-redis]] == Шаг 2. Тестирование Redis

Как и в случае с любым новым программным обеспечением, рекомендуется убедиться, что Redis работает должным образом, прежде чем вносить какие-либо дополнительные изменения в его конфигурацию. На этом шаге мы рассмотрим несколько способов проверить, что Redis работает правильно.

Начните с проверки, что служба Redis работает:

sudo systemctl status redis

Если он работает без каких-либо ошибок, эта команда выдаст вывод, подобный следующему:

Output● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-06-27 18:48:52 UTC; 12s ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
  Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 2445 (redis-server)
    Tasks: 4 (limit: 4704)
   CGroup: /system.slice/redis-server.service
           └─2445 /usr/bin/redis-server 127.0.0.1:6379
. . .

Здесь вы можете видеть, что Redis работает и уже включен, то есть он настроен на запуск при каждой загрузке сервера.

[.Примечание]##

Note: Этот параметр желателен для многих распространенных случаев использования Redis. Однако, если вы предпочитаете запускать Redis вручную при каждой загрузке сервера, вы можете настроить это с помощью следующей команды:

sudo systemctl disable redis

Чтобы проверить, что Redis работает правильно, подключитесь к серверу с помощью клиента командной строки:

redis-cli

В следующем приглашении проверьте подключение с помощью командыping:

ping
OutputPONG

Этот вывод подтверждает, что соединение с сервером все еще живо. Затем проверьте, что вы можете установить ключи, запустив:

set test "It's working!"
OutputOK

Получите значение, набрав:

get test

Предполагая, что все работает, вы сможете получить сохраненное вами значение:

Output"It's working!"

Убедившись, что вы можете получить значение, выйдите из приглашения Redis, чтобы вернуться в оболочку:

exit

В качестве заключительного теста мы проверим, может ли Redis сохранять данные даже после их остановки или перезапуска. Для этого сначала перезапустите экземпляр Redis:

sudo systemctl restart redis

Затем снова подключитесь к клиенту командной строки и подтвердите, что тестовое значение все еще доступно:

redis-cli
get test

Значение вашего ключа все еще должно быть доступно:

Output"It's working!"

Выйдите в оболочку снова, когда вы закончите:

exit

С этим ваша установка Redis полностью работоспособна и готова к использованию. Однако некоторые из его настроек конфигурации по умолчанию небезопасны и предоставляют злоумышленникам возможность атаковать и получать доступ к вашему серверу и его данным. Остальные шаги в этом руководстве относятся к методам устранения этих уязвимостей, как предписаноofficial Redis website. Хотя эти шаги являются необязательными и Redis будет работать, если вы решите не следовать им,strongly рекомендуется выполнить их, чтобы повысить безопасность вашей системы.

[[step-3 -—- binding-to-localhost]] == Шаг 3. Привязка к localhost

По умолчанию Redis доступен только изlocalhost. Однако если вы установили и настроили Redis, следуя другому руководству, чем это, вы, возможно, обновили файл конфигурации, чтобы разрешить подключения из любого места. Это не так безопасно, как привязка кlocalhost.

Чтобы исправить это, откройте файл конфигурации Redis для редактирования:

sudo nano /etc/redis/redis.conf

Найдите эту строку и убедитесь, что она не закомментирована (удалите#, если он существует):

/etc/redis/redis.conf

bind 127.0.0.1 ::1

Сохраните и закройте файл, когда закончите (нажмитеCTRL + X,Y, затемENTER).

Затем перезапустите сервис, чтобы systemd считал ваши изменения:

sudo systemctl restart redis

Чтобы убедиться, что это изменение вступило в силу, выполните следующую командуnetstat:

sudo netstat -lnp | grep redis
Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14222/redis-server
tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server

Этот вывод показывает, что программаredis-server привязана кlocalhost (127.0.0.1), что отражает изменение, которое вы только что внесли в файл конфигурации. Если вы видите другой IP-адрес в этом столбце (например,0.0.0.0), вам следует дважды проверить, раскомментировали ли вы правильную строку, и снова перезапустить службу Redis.

Теперь, когда ваша установка Redis прослушивает толькоlocalhost, злоумышленникам будет сложнее делать запросы или получать доступ к вашему серверу. Тем не менее, Redis в настоящее время не требует от пользователей аутентификации перед внесением изменений в конфигурацию или данные, которые он хранит. Чтобы исправить это, Redis позволяет вам требовать от пользователей аутентификации с паролем перед внесением изменений через клиент Redis (redis-cli).

[[step-4 -—- configuring-a-redis-password]] == Шаг 4. Настройка пароля Redis

Настройка пароля Redis включает одну из двух встроенных функций безопасности - командуauth, которая требует от клиентов аутентификации для доступа к базе данных. Пароль настраивается непосредственно в файле конфигурации Redis,/etc/redis/redis.conf, поэтому снова откройте этот файл с помощью предпочитаемого вами редактора:

sudo nano /etc/redis/redis.conf

Прокрутите до разделаSECURITY и найдите прокомментированную директиву, которая гласит:

/etc/redis/redis.conf

# requirepass foobared

Раскомментируйте его, удалив#, и заменитеfoobared на безопасный пароль.

[.Примечание]##

Note: Над директивойrequirepass в файлеredis.conf есть комментированное предупреждение:

# 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.
#

Таким образом, важно, чтобы вы указали в качестве пароля очень сильное и очень длинное значение. Вместо того, чтобы придумывать пароль самостоятельно, вы можете использовать командуopenssl для генерации случайного пароля, как в следующем примере. Передавая вывод первой команды по конвейеру второй командеopenssl, как показано здесь, он удалит любые разрывы строк, вызванные этой первой командой:

openssl rand 60 | openssl base64 -A

Ваш вывод должен выглядеть примерно так:

OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

После копирования и вставки вывода этой команды в качестве нового значения дляrequirepass он должен читать:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

После установки пароля сохраните и закройте файл, затем перезапустите Redis:

sudo systemctl restart redis.service

Чтобы проверить, работает ли пароль, откройте командную строку Redis:

redis-cli

Ниже показана последовательность команд, используемая для проверки работоспособности пароля Redis. Первая команда пытается установить ключ к значению до аутентификации:

set key1 10

Это не сработает, потому что вы не прошли аутентификацию, поэтому Redis возвращает ошибку:

Output(error) NOAUTH Authentication required.

Следующая команда аутентифицируется с паролем, указанным в файле конфигурации Redis:

auth your_redis_password

Redis признает:

OutputOK

После этого повторное выполнение предыдущей команды завершится успешно:

set key1 10
OutputOK

get key1 запрашивает Redis значение нового ключа.

get key1
Output"10"

Убедившись, что вы можете запускать команды в клиенте Redis после аутентификации, вы можете выйти изredis-cli:

quit

Далее мы рассмотрим переименование команд Redis, которые, если они были введены по ошибке или злонамеренным пользователем, могут нанести серьезный ущерб вашей машине.

[[step-5 -—- renaming-dangerous-commands]] == Шаг 5. Переименование опасных команд

Другая функция безопасности, встроенная в Redis, включает переименование или полное отключение определенных команд, которые считаются опасными.

При запуске неавторизованными пользователями такие команды могут использоваться для изменения конфигурации, уничтожения или иного удаления данных. Как и пароль аутентификации, переименование или отключение команд настраивается в том же разделеSECURITY файла/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

[.warning] #Warning: Следующие шаги, показывающие, как отключать и переименовывать команды, являются примерами. Вам следует отключить или переименовать только те команды, которые имеют для вас смысл. Вы можете самостоятельно просмотреть полный список команд и определить, как они могут быть использованы неправильно наredis.io/commands.
#

Чтобы отключить команду, просто переименуйте ее в пустую строку (обозначенную парой кавычек без символов между ними), как показано ниже:

/etc/redis/redis.conf

. . .
# 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 ""
. . .

Чтобы переименовать команду, дайте ей другое имя, как показано в примерах ниже. Переименованные команды должны быть сложными для других, но их легко запомнить:

/etc/redis/redis.conf

. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

Сохраните ваши изменения и закройте файл.

После переименования команды примените изменения, перезапустив Redis:

sudo systemctl restart redis.service

Чтобы проверить новую команду, введите командную строку Redis:

redis-cli

Затем подтвердите:

auth your_redis_password
OutputOK

Предположим, вы переименовали командуCONFIG вASC12_CONFIG, как в предыдущем примере. Сначала попробуйте использовать исходную командуCONFIG. Он должен потерпеть неудачу, потому что вы переименовали его:

config get requirepass
Output(error) ERR unknown command 'config'

Однако вызов переименованной команды будет успешным. Он не чувствителен к регистру:

asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"

Наконец, вы можете выйти изredis-cli:

exit

Обратите внимание, что если вы уже используете командную строку Redis и затем перезапускаете Redis, вам нужно будет пройти повторную аутентификацию. В противном случае вы получите эту ошибку, если наберете команду:

OutputNOAUTH Authentication required.

[.предупреждение]##

Что касается практики переименования команд, в конце разделаSECURITY в/etc/redis/redis.conf есть предостережение, которое гласит:

Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.

Замечания: Проект Redis предпочитает использовать термины «главный» и «подчиненный», тогда как DigitalOcean обычно предпочитает альтернативы «первичный» и «вторичный». Чтобы избежать путаницы, мы решили использовать здесь термины, используемые в документации Redis.

Это означает, что если переименованная команда отсутствует в файле AOF или если она есть, но файл AOF не был передан ведомым, то проблем быть не должно.

Так что имейте это в виду, когда вы пытаетесь переименовать команды. Лучшее время для переименования команды - это когда вы не используете постоянство AOF или сразу после установки, то есть до того, как ваше приложение, использующее Redis, было развернуто.

Когда вы используете AOF и имеете дело с установкой ведущий-ведомый, учитывайтеthis answer from the project’s GitHub issue page. Ниже приводится ответ на вопрос автора:

Команды регистрируются в AOF и реплицируются на ведомое устройство так же, как они отправляются, поэтому, если вы попытаетесь воспроизвести AOF на экземпляре, который не имеет того же переименования, вы можете столкнуться с несоответствиями, так как команда не может быть выполнена ( то же самое для рабов).

Таким образом, лучший способ справиться с переименованием в подобных случаях - убедиться, что переименованные команды применяются ко всем экземплярам в установках «главный-подчиненный».

Заключение

В этом руководстве вы установили и настроили Redis, проверили, что ваша установка Redis работает правильно, и использовали встроенные функции безопасности, чтобы сделать ее менее уязвимой для атак злоумышленников.

Имейте в виду, что, как только кто-то вошел в систему на вашем сервере, очень легко обойти функции безопасности, связанные с Redis, которые мы ввели. Следовательно, наиболее важной функцией безопасности на вашем сервере Redis является ваш брандмауэр (который вы настроили, если следовали предварительному требованию руководстваInitial Server Setup), так как это чрезвычайно затрудняет злоумышленникам возможность преодолеть этот забор.

Related