One place for hosting & domains

      Como Gerenciar Réplicas e Clientes no Redis


      Introdução

      O Redis é um armazenamento de dados open-source de chave-valor na memória. Um dos seus recursos mais procurados é o suporte à replicação: qualquer servidor Redis pode replicar seus dados para qualquer número de réplicas, permitindo alta escalabilidade de leitura e forte redundância de dados. Além disso, o Redis foi projetado para permitir que muitos clientes (até 10000, por padrão) se conectem e interajam com os dados, tornando-o uma boa opção para casos em que muitos usuários precisam acessar o mesmo dataset ou conjunto de dados.

      Este tutorial aborda os comandos usados para gerenciar clientes e réplicas Redis.

      Como Usar Este Guia

      Este guia foi escrito como uma consulta rápida com exemplos independentes. Recomendamos que você pule para qualquer seção que seja relevante para a tarefa que você está tentando concluir.

      Os comandos mostrados neste guia foram testados em um servidor Ubuntu 18.04 executando a versão do Redis 4.0.9. Para configurar um ambiente semelhante, você pode seguir o Passo 1 do nosso guia Como Instalar e Proteger o Redis no Ubuntu 18.04. Vamos demonstrar como esses comandos se comportam executando-os com redis-cli, a interface de linha de comando do Redis. Observe que se você estiver usando uma interface Redis diferente — Redli, por exemplo — a saída exata de certos comandos pode ser diferente.

      Alternativamente, você pode provisionar uma instância de banco de dados Redis gerenciada para testar esses comandos, mas observe que, dependendo do nível de controle permitido pelo seu provedor de banco de dados, alguns comandos neste guia podem não funcionar como descrito. Para provisionar um banco de dados gerenciado na DigitalOcean, siga nossa documentação do produto Managed Databases. Em seguida, você deve instalar o Redli ou configurar um túnel TLS para conectar-se ao banco de dados gerenciado via TLS.

      Nota: O projeto Redis usa os termos “master” e “slave” em sua documentação e em vários comandos para identificar diferentes funções na replicação, embora os colaboradores do projeto estejam tomando medidas para alterar essa linguagem nos casos onde isso não cause problemas de compatibilidade. A DigitalOcean geralmente prefere usar os termos alternativos “primary” e “replica”.

      Este guia assumirá o padrão “primary” e “replica” sempre que possível, mas observe que existem algumas circunstâncias em que os termos “master” e “slave” inevitavelmente aparecem.

      Gerenciando Réplicas

      Um dos recursos que mais se destaca no Redis é sua replicação embutida. Ao usar a replicação, o Redis cria cópias exatas da instância primária. Essas instâncias secundárias se reconectam à primária sempre que suas conexões quebram e sempre procurarão permanecer como uma cópia exata da primária.

      Se você não tiver certeza se a instância do Redis à qual você está conectado atualmente é uma instância primária ou uma réplica, verifique com o comando role:

      Este comando retornará master ou slave ou, potencialmente, sentinel se você estiver usando Redis Sentinel.

      Para designar uma instância do Redis como uma réplica de outra instância em tempo real, execute o comando replicaof. Este comando usa o nome do host ou o endereço IP do servidor primário pretendido e a porta como argumentos:

      • replicaof hostname_ou_IP porta

      Se o servidor já era uma réplica de outro primário, ele interromperá a replicação do servidor antigo e começará a sincronizar imediatamente com o novo. Ele também descartará o dataset antigo.

      Para promover uma réplica de volta para ser primária, execute o seguinte comando replicaof:

      Isso impedirá a instância de replicar o servidor primário, mas não descartará o dataset que já foi replicado. Essa sintaxe é útil nos casos em que o primário original falha. Depois de executar replicaof no one em uma réplica do primário com falha, a réplica anterior pode ser usada como o novo primário e ter suas próprias réplicas como um mecanismo de proteção a falhas.

      Nota: Antes da versão 5.0.0, o Redis incluía uma versão deste comando chamada slaveof.

      Gerenciando Clientes

      Um cliente é qualquer máquina ou software que se conecta a um servidor para acessar um serviço. O Redis vem com vários comandos que ajudam a rastrear e gerenciar conexões de clientes.

      O comando client list retorna um conjunto de informações legíveis sobre as conexões atuais de cliente:

      Output

      "id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client "

      Aqui está o que cada um desses campos significa:

      • id: um ID de cliente exclusivo de 64 bits
      • name: o nome da conexão do cliente, conforme definido por um comando anterior client setname
      • addr: o endereço e a porta a partir da qual o cliente está se conectando
      • fd: o descritor de arquivo que corresponde ao soquete no qual o cliente está se conectando
      • age: a duração total da conexão do cliente, em segundos
      • flags: um conjunto de uma ou mais flags de caractere simples que fornecem detalhes mais granulares sobre os clientes; veja a documentação do comando client list para mais detalhes
      • db: o número atual do ID do banco de dados ao qual o cliente está conectado (pode ser de 0 a 15)
      • sub😮 número de canais aos quais o cliente está inscrito
      • psub: o número de subscrições correspondentes ao padrão do cliente
      • mutli: o número de comandos que o cliente enfileirou em uma transação (mostrará -1 se o cliente não iniciou uma transação ou 0 se apenas iniciou uma transação e não colocou nenhum comando na fila)
      • qbuf😮 tamanho do buffer de consulta do cliente, com “0” significando que não há consultas pendentes
      • qbuf-free: a quantidade de espaço livre no buffer de consulta do cliente, com “0” significando que o buffer de consulta está cheio
      • obl: o comprimento do buffer de saída do cliente
      • oll: o comprimento da lista de saída do cliente, onde as respostas são colocadas na fila quando o buffer está cheio
      • omem: a memória usada pelo buffer de saída do cliente
      • events: eventos do descritor de arquivo do cliente, eles podem ser r para “legível”, w para “gravável” ou ambos
      • cmd: o último comando executado pelo cliente

      Definir nomes de clientes é útil para debugar vazamentos de conexão em qualquer aplicativo que esteja usando o Redis. Toda nova conexão é iniciada sem um nome atribuído, mas client setname pode ser usado para criar um para a conexão atual do cliente. Não há limite para o tamanho dos nomes dos clientes, embora o Redis normalmente limite os comprimentos de string de caracteres para 512 MB. Observe, porém, que os nomes dos clientes não podem incluir espaços:

      Para obter o nome de uma conexão de cliente, use o comando client getname:

      Output

      "elaine"

      Para buscar o ID de conexão de um cliente, use o comando client id:

      Output

      (integer) "19492"

      Os IDs de clientes Redis nunca são repetidos e são monotonicamente incrementais. Isso significa que, se um cliente tiver um ID maior que outro, então ele foi estabelecido posteriormente.

      Bloqueando Clientes e Fechando Conexões de Cliente

      Os sistemas de replicação são normalmente descritos como sendo síncronos ou assíncronos. Na replicação síncrona, sempre que um cliente adiciona ou altera dados, ele deve receber algum tipo de reconhecimento de um certo número de réplicas para que a alteração seja registrada como confirmada. Isso ajuda a impedir que os nodes tenham conflitos de dados, mas tem um custo de latência, já que o cliente deve esperar para executar outra operação até receber uma resposta de um certo número de réplicas.

      Na replicação assíncrona, por outro lado, o cliente vê uma confirmação de que a operação é concluída assim que os dados são gravados no armazenamento local. No entanto, pode haver um atraso entre isso e quando as réplicas realmente gravam os dados. Se uma das réplicas falhar antes de poder gravar a alteração, essa gravação será perdida para sempre. Portanto, embora a replicação assíncrona permita que os clientes continuem executando operações sem a latência causada pela espera das réplicas, isso pode levar a conflitos de dados entre nodes e pode exigir trabalho extra por parte do administrador do banco de dados para resolver esses conflitos.

      Devido ao seu foco no desempenho e na baixa latência, o Redis implementa a replicação assíncrona por padrão. No entanto, você pode simular a replicação síncrona com o comando wait. O wait bloqueia a conexão do cliente atual por um período de tempo especificado (em milissegundos) até que todos os comandos de gravação anteriores sejam transferidos e aceitos com sucesso por um número especificado de réplicas. Este comando usa a seguinte sintaxe:

      • wait número_de_réplicas número_de_milisegundos

      Por exemplo, se você deseja bloquear a sua conexão de cliente até que todas as gravações anteriores sejam registradas por pelo menos três réplicas dentro de um tempo limite de 30 milissegundos, sua sintaxe wait se parecerá com esta:

      O comando wait retorna um número inteiro que representa o número de réplicas que reconheceram os comandos de gravação, mesmo que nem todas as réplicas o façam:

      Output

      2

      Para desbloquear uma conexão de cliente que foi bloqueada anteriormente, seja de um comando wait, brpop ou xread, você pode executar um comando client unblock com a seguinte sintaxe:

      Para suspender temporariamente todos os clientes atualmente conectados ao servidor Redis, você pode usar o comando client pause. Isso é útil nos casos em que você precisa fazer alterações na configuração do Redis de maneira controlada. Por exemplo, se você estiver promovendo uma de suas réplicas como a instância primária, poderá pausar todos os clientes com antecedência para promover a réplica e fazer com que os clientes se conectem a ela como o novo primário sem perder nenhuma operação de gravação no processo.

      O comando client pause exige que você especifique a quantidade de tempo (em milissegundos) que deseja suspender os clientes. O exemplo a seguir suspenderá todos os clientes por um segundo:

      A sintaxe do client kill permite que você feche uma única conexão ou um conjunto de conexões específicas com base em vários filtros diferentes. A sintaxe é assim:

      • client kill filtro_1 valor_1 ... filtro_n valor_n

      Nas versões do Redis 2.8.12 e posteriores, os seguintes filtros estão disponíveis:

      • addr: permite fechar uma conexão de cliente a partir de um endereço IP e porta especificados
      • client-id: permite fechar uma conexão de cliente com base em seu campo de ID exclusivo
      • type: fecha todo cliente de um determinado tipo, que pode ser normal, master, slave ou pubsub
      • skipme: as opções de valor para este filtro são yes e no:
        • se no for especificado, o cliente que chama o comando client kill não será ignorado e será eliminado se os outros filtros se aplicarem a ele
        • se yes for especificado, o cliente executando o comando será ignorado e o comando kill não terá efeito no cliente. skipme é sempreyes por padrão

      Conclusão

      Este guia detalha vários comandos usados para gerenciar clientes e réplicas Redis. Se houver outros comandos, argumentos ou procedimentos relacionados que você gostaria de ver descritos neste guia, peça ou faça sugestões nos comentários abaixo.

      Para obter mais informações sobre comandos Redis, consulte nossa série de tutoriais sobre Como gerenciar um banco de dados Redis.



      Source link

      Установка и обеспечение безопасности Redis в Ubuntu 18.04


      Предыдущая версия данного обучающего руководства была написана Джастином Эллингвудом

      Введение

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

      Предварительные требования

      Для выполнения данного руководства вам потребуется сервер Ubuntu 18.04 с пользователем без прав root с привилегиями sudo и брандмауэром с базовой конфигурацией. Вы можете выполнить настройку с помощью нашего руководства по первоначальной настройке сервера.

      ​​Когда все будет готово, выполните вход на сервер Ubuntu 18.04 с помощью пользователя с правами sudo и продолжите выполнять дальнейшие инструкции.

      Шаг 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 рекомендуется сначала проверить корректность работы системы.

      Шаг 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 запущена и уже активирована, т.е. для нее настроен запуск при загрузке сервера.

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

      • sudo systemctl disable redis

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

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

      Output

      PONG

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

      Output

      OK

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

      Если все работает корректно, вы получите сохраненное значение:

      Output

      "It's working!"

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

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

      • sudo systemctl restart redis

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

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

      Output

      "It's working!"

      Выйдите в командную строку после завершения:

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

      Шаг 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

      Output

      tcp 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).

      Шаг 4 — Настройка пароля Redis

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

      • sudo nano /etc/redis/redis.conf

      Прокрутите содержимое файла до раздела SECURITY и найдите следующую закомментированную директиву:

      /etc/redis/redis.conf

      # requirepass foobared
      

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

      Примечание: над директивой 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

      Вывод должен выглядеть следующим образом:

      Output

      RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      Скопируйте и вставьте вывод этой команды в качестве нового значения для requirepass. Оно должно выглядеть следующим образом:

      /etc/redis/redis.conf

      requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

      • sudo systemctl restart redis.service

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

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

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

      Output

      (error) NOAUTH Authentication required.

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

      Redis принимает пароль:

      Output

      OK

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

      Output

      OK

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

      Output

      "10"

      Подтвердив, что вы можете выполнять команды в клиенте Redis после аутентификации, вы можете закрыть redis-cli:

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

      Шаг 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

      Предупреждение. Седующие шаги с демонстрацией отключения или переименования команд являются примерами. Вы должны отключить или переименовать команды, имеющие смысл для вас. Вы можете просмотреть полный список команд самостоятельно и узнать, как они могут использоваться злоумышленниками, по адресу 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:

      Затем выполните аутентификацию:

      Output

      OK

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

      Output

      (error) ERR unknown command 'config'

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

      • asc12_config get requirepass

      Output

      1) "requirepass" 2) "your_redis_password"

      После этого вы можете закрыть redis-cli:

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

      Output

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

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



      Source link

      Como Instalar e Proteger o Redis no Ubuntu 18.04


      Uma versão anterior deste tutorial foi escrita por Justin Ellingwood.

      Introdução

      O Redis é uma reserva de valores-chave na memória conhecido pela sua flexibilidade, desempenho e amplo suporte de linguagens. Este tutorial demonstra como instalar, configurar e proteger o Redis em um servidor do Ubuntu 18.04.

      Pré-requisitos

      Para completar este guia, você precisará ter acesso a um servidor do Ubuntu 18.04 que tenha um usuário não-root com privilégios sudo e um firewall básico configurado. Você pode configurar isso seguindo nosso guia de Configuração Inicial de Servidor.

      Quando você estiver pronto para começar, logue-se ao seu servidor Ubuntu 18.04 com seu usuário sudo e continue abaixo.

      Passo 1 — Instalando e Configurando o Redis

      Para obter a última versão do Redis, usaremos o apt para instalá-la dos repositórios oficiais do Ubuntu.

      Atualize seu cache de pacote local apt e instale o Redis digitando:

      • sudo apt update
      • sudo apt install redis-server

      Isso irá baixar e instalar o Redis e suas dependências. Em seguida, há uma alteração importante na configuração a ser feita no arquivo de configuração do Redis, que foi gerada automaticamente durante a instalação.

      Abra este arquivo com seu editor de texto preferido:

      • sudo nano /etc/redis/redis.conf

      No arquivo, encontre a diretiva supervised. Esta diretiva permite que você declare um sistema init para gerenciar o Redis como um serviço, fornecendo a você mais controle sobre a sua operação. A diretiva supervised é configurada como no por padrão. Uma vez que você está executando o Ubuntu, que usa o sistema systemd init, altere isso para 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
      
      . . .
      

      Essa é a única alteração que você precisa fazer no arquivo de configuração do Redis neste ponto, então salve e feche-o quando você terminar. Então, reinicie o serviço Redis para refletir as alterações feitas no arquivo de configuração:

      • sudo systemctl restart redis.service

      Com isso, você instalou e configurou o Redis e ele está funcionando na sua máquina. No entanto, antes de você começar a usá-lo, é prudente verificar primeiro se o Redis está funcionando corretamente.

      Passo 2 — Testando o Redis

      Como com qualquer software recém-instalado, é uma boa ideia garantir que o Redis esteja funcionando como esperado antes de fazer outras alterações na sua configuração. Vamos analisar várias maneiras de verificar se o Redis está funcionando corretamente neste passo.

      Comece por verificar se o serviço Redis está funcionando:

      • sudo systemctl status redis

      Se ele estiver funcionando sem erros, este comando irá produzir resultados semelhantes aos seguintes:

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

      Aqui, você pode ver que o Redis está funcionando e já está ativo, o que significa que ele está definido para iniciar sempre que o servidor inicializar.

      Nota: Esta configuração é desejável para muitos casos de uso comum do Redis. No entanto, se você preferir iniciar o Redis manualmente sempre que seu servidor inicializar, você pode configurar isso com o comando a seguir:

      • sudo systemctl disable redis

      Para testar se o Redis está funcionando corretamente, conecte-se ao servidor usando o cliente da linha de comando:

      No prompt que segue, teste a conectividade com o comando ping:

      Output

      PONG

      Este resultado confirma que a conexão com o servidor ainda está viva. A seguir, verifique se você é capaz de definir chaves executando:

      Output

      OK

      Recupere o valor digitando:

      Supondo que tudo esteja funcionando, você será capaz de recuperar o valor que você armazenou:

      Output

      "It's working!"

      Após confirmar que você pode obter o valor, saia do prompt do Redis para voltar ao shell:

      Como um teste final, verificaremos se o Redis é capaz de manter dados mesmo após ter sido interrompido ou reiniciado. Para fazer isso, primeiro reinicie a instância do Redis:

      • sudo systemctl restart redis

      Então, conecte-se com o cliente da linha de comando novamente e confirme se seu valor de teste ainda está disponível:

      O valor da sua chave ainda deve estar acessível:

      Output

      "It's working!"

      Saia novamente para o shell quando terminar:

      Com isso, sua instalação do Redis está totalmente operacional e pronta para que você a use. No entanto, algumas de suas definições de configurações padrão são inseguras e proporcionam a indivíduos maliciosos oportunidades de atacar e obter acesso ao seu servidor e seus dados. Os passos restantes neste tutorial cobrem métodos para mitigar essas vulnerabilidades, como prescrito no site oficial do Redis. Embora esses passos sejam opcionais e o Redis ainda funcionará se você escolher não segui-los, é fortemente recomendado que você os complete para fortalecer a segurança do seu sistema.

      Passo 3 — Vinculando ao localhost

      Por padrão, o Redis apenas é acessível do localhost. No entanto, se você instalou e configurou o Redis seguindo um tutorial diferente deste, você pode ter atualizado o arquivo de configuração para permitir conexões de qualquer lugar. Isso não é tão seguro quanto o vínculo ao localhost.

      Para corrigir isso, abra o arquivo de configuração do Redis para edição:

      • sudo nano /etc/redis/redis.conf

      Localize esta linha e certifique-se de que ela esteja descomentada (remova o # se ele existir):

      /etc/redis/redis.conf

      bind 127.0.0.1 ::1
      

      Salve e feche o arquivo quando terminar (pressione CTRL + X, Y, então ENTER).

      Então, reinicie o serviço para garantir que o systemd leia suas alterações:

      • sudo systemctl restart redis

      Para verificar se essa alteração entrou em vigor, execute o comando netstat a seguir:

      • sudo netstat -lnp | grep redis

      Output

      tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

      Este resultado mostra que o programa redis-server se encontra ligado ao localhost (127.0.0.1), refletindo a alteração que você acabou de fazer no arquivo de configuração. Se você ver outro endereço IP na coluna (0.0.0.0, por exemplo), então você deve verificar de novo se você descomentou a linha correta e reiniciar o serviço do Redis novamente.

      Agora que sua instalação do Redis apenas está escutando o localhost, será mais difícil para indivíduos maliciosos fazerem pedidos ou obter acesso ao seu servidor. No entanto, o Redis atualmente não está definido para exigir que os usuários se autentiquem antes de fazer alterações na sua configuração ou nos dados que ele possui. Para remediar isso, o Redis permite que você exija que os usuários autentiquem-se com uma senha antes de realizarem alterações pelo cliente do Redis (redis-cli).

      Passo 4 — Configurando uma Senha para o Redis

      Configurar uma senha para o Redis habilita uma de suas duas características intrínsecas de segurança — o comando auth, que exige que os clientes autentiquem-se para acessar o banco de dados. A senha é configurada diretamente no arquivo de configuração do Redis, /etc/redis/redis.conf, assim abra esse arquivo novamente com seu editor preferido:

      • sudo nano /etc/redis/redis.conf

      Role até a seção SECURITY e procure uma diretiva comentada que mostre:

      /etc/redis/redis.conf

      # requirepass foobared
      

      Descomente-a removendo o #, e modificando o foobared para uma senha segura.

      Nota: Acima da diretiva requirepass no arquivo redis.conf, há um aviso comentado:

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

      Assim, é importante que você especifique um valor muito forte e longo como sua senha. Ao invés de criar uma senha você mesmo, você pode usar o comando openssl para gerar uma aleatória, como no exemplo a seguir. Canalizando o resultado do primeiro comando para o segundo comando openssl, como mostrado aqui, ele removerá quaisquer quebras de linha produzidas pelo primeiro comando:

      • openssl rand 60 | openssl base64 -A

      Seu resultado deve se parecer com esse:

      Output

      RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      Após copiar e colar o resultado desse comando como o novo valor para requirepass, ele deve mostrar:

      /etc/redis/redis.conf

      requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      Após configurar a senha, salve e feche o arquivo, então reinicie o Redis:

      • sudo systemctl restart redis.service

      Para testar que a senha funciona, acesse a linha de comando do Redis:

      A seguir encontra-se uma sequência de comandos usada para testar se a senha do Redis funciona. O primeiro comando tenta definir uma chave para um valor antes da autenticação:

      Isso não funcionará porque você não se autenticou, então o Redis retorna um erro:

      Output

      (error) NOAUTH Authentication required.

      O próximo comando autentica-se com a senha especificada no arquivo de configuração do Redis:

      O Redis reconhece:

      Output

      OK

      Após isso, executando o comando anterior novamente terá sucesso:

      Output

      OK

      get key1 consulta o Redis para o valor da nova chave.

      Output

      "10"

      Após confirmar que você é capaz de executar comandos no cliente Redis após a autenticação, você pode sair do redis-cli:

      A seguir, vamos ver como renomear comandos do Redis que, se inseridos por engano ou por um indivíduo malicioso, podem causar danos graves na sua máquina.

      Passo 5 — Renomeando Comandos Perigosos

      A outra característica de segurança construída no Redis envolve renomear ou desativar completamente determinados comandos que são considerados perigosos.

      Quando executados por usuários não autorizados, esses comandos podem ser usados para reconfigurar, destruir ou até limpar seus dados. Assim como a senha de autenticação, renomear ou desativar comandos é configurado na mesma seção SECURITY do arquivo /etc/redis/redis.conf.

      Alguns comandos que são considerados perigosos incluem: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, e DEBUG. Esta não é uma lista completa, mas renomear ou desativar todos os comandos nessa lista é um bom ponto de partida para melhorar a segurança do seu servidor do Redis.

      Se você deve desativar ou renomear um comando depende de suas necessidades específicas ou daquelas do seu site. Se você sabe que nunca usará um comando que possa ser abusado, então você pode desativá-lo. Caso contrário, pode ser do seu melhor interesse renomeá-lo.

      Para habilitar ou desativar comandos do Redis, abra novamente o arquivo de configuração:

      • sudo nano /etc/redis/redis.conf

      Aviso: Os passos a seguir mostrando como desativar e renomear comandos são exemplos. Você deve apenas escolher desativar ou renomear os comandos que fizerem sentido para você. Você pode rever a lista completa de comandos por conta própria e determinar como eles poderiam ser usados de forma errada com o redis.io/commands.

      Para desativar um comando, simplesmente renomeie-o para uma string vazia (representado por um par de aspas sem caracteres entre elas), como mostrado abaixo:

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

      Para renomear um comando, dê a ele outro nome como mostrado nos exemplos abaixo. Os comandos renomeados devem ser difíceis para que outros possam adivinhar, mas fácil para você lembrar:

      /etc/redis/redis.conf

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

      Salve suas alterações e feche o arquivo.

      Após renomear um comando, aplique a alteração reiniciando o Redis:

      • sudo systemctl restart redis.service

      Para testar o novo comando, acesse a linha de comando do Redis:

      Então, autentique-se:

      Output

      OK

      Vamos supor que você renomeou o comando CONFIG para ASC12_CONFIG, como no exemplo anterior. Primeiro, tente usar o comando original CONFIG. Ele deve falhar, porque você renomeou ele:

      Output

      (error) ERR unknown command 'config'

      Chamar o comando renomeado, no entanto, será bem-sucedido. Não é sensível a maiúsculas e minúsculas:

      • asc12_config get requirepass

      Output

      1) "requirepass" 2) "your_redis_password"

      Finalmente, você pode sair do redis-cli:

      Observe que se você já estiver usando a linha de comando do Redis e então reiniciar o Redis, você precisará autenticar-se novamente. Caso contrário, você receberá este erro se digitar um comando:

      Output

      NOAUTH Authentication required.

      A respeito da prática de renomear comandos, há uma declaração preventiva ao final da seção SECURITY no /etc/redis/redis.conf que mostra:

      Por favor, note que alterar o nome de comandos que estejam logados no arquivo AOF ou transmitidos a escravos pode causar problemas.

      Nota: O projeto Redis escolhe usar os termos “mestre” e “escravo”, enquanto o DigitalOcean geralmente prefere as alternativas “primário” e “secundário”. Para evitar confusão, escolhemos usar os termos usados na documentação do Redis aqui.

      Isso significa que se o comando renomeado não estiver no arquivo AOF, ou se ele estiver, mas o arquivo AOF não for transmitido a escravos, então não deve haver problemas.

      Então, lembre-se disso quando você estiver tentando renomear comandos. A melhor hora para renomear um comando é quando você não estiver usando a persistência do AOF, ou logo após a instalação, ou seja, antes do seu aplicativo que utiliza o Redis for implantado.

      Quando você estiver usando o AOF e lidando com uma instalação mestre-escravo, considere essa resposta na página do GitHub do projeto. A seguir está uma resposta à pergunta do autor:

      Os comandos são logados no AOF e reproduzidos para o escravo da mesma forma que eles são enviados, então, se você tentar replicar o AOF em uma instância que não tenha a mesma renomeação, você pode enfrentar inconsistências já que o comando não pode ser executado (igualmente para escravos).

      Assim, a melhor maneira de lidar com renomeações em casos como esse é garantir que os comandos renomeados sejam aplicados a todas as instâncias em instalações mestre-escravo.

      Conclusão

      Neste tutorial, você instalou e configurou o Redis, garantiu que sua instalação do Redis está funcionando corretamente, e usou suas características intrínsecas de segurança para torná-lo menos vulnerável a ataques de indivíduos maliciosos.

      Lembre-se de que uma vez que alguém estiver logado no seu servidor, é muito fácil contornar as características específicas de segurança do Redis que colocamos. Portanto, a característica mais importante de segurança no seu servidor Redis é seu firewall (que você configurou se seguiu o tutorial pré-requisito Configuração Inicial do Servidor, uma vez que isso torna extremamente difícil para indivíduos maliciosos pular esta cerca.



      Source link