Tutorial

Como Instalar e Proteger o Redis no Ubuntu 18.04

UbuntuNoSQLRedisUbuntu 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:

  • redis-cli

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

  • 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:

  • set test "It's working!"
Output
OK

Recupere o valor digitando:

  • get test

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:

  • exit

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:

  • redis-cli
  • get test

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

Output
"It's working!"

Saia novamente para o shell quando terminar:

  • exit

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:

  • redis-cli

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:

  • set key1 10

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:

  • auth your_redis_password

O Redis reconhece:

Output
OK

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

  • set key1 10
Output
OK

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

  • get key1
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:

  • quit

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:

  • redis-cli

Então, autentique-se:

  • auth your_redis_password
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:

  • config get requirepass
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:

  • exit

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.

0 Comments

Creative Commons License