Comment sécuriser votre installation Redis sur Ubuntu 14.04

introduction

Redis est un cache en mémoire, NoSQL, une mémoire clé-valeur et un magasin qui peuvent également être conservés sur le disque.

Ce tutoriel montre comment implémenter la sécurité de base pour un serveur Redis.

Cependant, gardez à l'esprit que Redis a été conçu pour être utilisé partrusted clients dans untrusted environment, sans fonctionnalités de sécurité robustes. Pour souligner ce point, voici une citation desofficial Redis website:

Redis est conçu pour être accessible aux clients sécurisés dans des environnements sécurisés. Cela signifie qu'habituellement, ce n'est pas une bonne idée d'exposer l'instance Redis directement à Internet ou, en général, à un environnement dans lequel les clients non approuvés peuvent accéder directement au port TCP ou au socket UNIX de Redis.

En général, Redis n’est pas optimisé pour une sécurité maximale, mais pour des performances optimales et une grande simplicité.

Performances et simplicité sans sécurité sont la recette du désastre. Même les quelques fonctionnalités de sécurité dont dispose Redis ne sont vraiment pas fantastiques. Ceux-ci comprennent: un mot de passe non chiffré de base, ainsi que le renommage et la désactivation de la commande. Il manque un véritable système de contrôle d'accès.

Cependant, la configuration des fonctionnalités de sécurité existantes représente un grand pas en avant pour laisser votre base de données non sécurisée.

Dans ce didacticiel, vous apprendrez à configurer les quelques fonctionnalités de sécurité de Redis, ainsi que quelques autres fonctionnalités de sécurité du système qui amélioreront la sécurité d’une installation Redis autonome sur Ubuntu 14.04.

Notez que ce guide ne traite pas des situations dans lesquelles le serveur Redis et les applications clientes se trouvent sur des hôtes ou des centres de données différents. Les installations où le trafic Redis doit traverser un réseau non sécurisé ou non approuvé nécessitent un ensemble de configurations entièrement différent, comme la configuration d'un proxy SSL ou d'unVPN entre les machines Redis, en plus de celles données ici.

Conditions préalables

Pour ce tutoriel, vous aurez besoin de:

  • Un serveur Ubuntu 14.04 avec un utilisateur sudo ajouté, à partir desinitial server setup

  • iptables configurés à l'aide dethis iptables guide, jusqu'à l'étape(Optional) Update Nameservers (si vous ne faites pas la partie de configuration du serveur de noms, APT ne fonctionnera pas). Après avoir configuré les serveurs de noms, vous avez terminé

  • Redis est installé et fonctionne à l'aide des instructions de l'installation maître uniquement dethis Redis guide, jusqu'à l'étapeStep 2 — Configure Redis Master

[[step-1 -—- verifying-that-redis-is-running]] == Étape 1 - Vérifier que Redis est en cours d'exécution

Commencez par vous connecter à votre serveur à l'aide de SSH:

ssh username@server-ip-address

Pour vérifier que Redis fonctionne, utilisez la ligne de commande Redis. La commanderedis-cli est utilisée pour accéder à la ligne de commande Redis.

redis-cli

[.Remarque]##

Si vous avez déjà défini un mot de passe pour Redis, vous devezauth après la connexion.

auth your_redis_password

Sortie

OK

Testez le serveur de base de données:

ping

Réponse:

Sortie

PONG

Sortie:

quit

[[step-2 -—- secururing-the-server-with-iptables]] == Étape 2 - Sécurisation du serveur avec iptables

Si vous avez suivi les conditions préalables pour iptables, n'hésitez pas à sauter cette étape. Ou vous pouvez le faire maintenant.

Redis est simplement une application qui s'exécute sur votre serveur et, comme elle ne possède pas de réelle fonctionnalité de sécurité, la première étape pour la sécuriser consiste à sécuriser d'abord le serveur sur lequel elle s'exécute.

Dans le cas d'un serveur public comme votre serveur Ubuntu 14.04, la configuration d'un pare-feu comme indiqué dansthis iptables guide est cette première étape. Follow that link and set up your firewall now.

Si vous avez implémenté les règles de pare-feu à l’aide de ce guide, il n’est pas nécessaire d’ajouter une règle supplémentaire pour Redis car, par défaut, tout le trafic entrant est supprimé, sauf autorisation expresse. Etant donné qu'une installation autonome par défaut du serveur Redis n'écoute que sur l'interface de bouclage (127.0.0.1 ou localhost), le trafic entrant sur son port par défaut ne devrait pas poser de problèmes.

Si vous devez autoriser spécifiquement une adresse IP pour Redis, vous pouvez vérifier sur quelle adresse IP Redis écoute et à quel port il est lié pargrep-ing la sortie de la commandenetstat. La quatrième colonne -127.0.0.1:6379 ici - indique l'adresse IP et la combinaison de ports associée à Redis:

sudo netstat -plunt | grep -i redis

Sortie

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

Assurez-vous que cette adresse IP est autorisée dans votre stratégie de pare-feu. Pour plus d'informations sur l'ajout de règles, veuillez consulter ceiptables basics article.

[[step-3 -—- binding-to-localhost]] == Étape 3 - Liaison à localhost

Par défaut, le serveur Redis est uniquement accessible à partir de localhost. Toutefois, si vous avez suivi le didacticiel pour configurer un serveur maître Redis, vous avez mis à jour le fichier de configuration pour autoriser les connexions depuis n'importe où. Ce n'est pas aussi sûr que contraignant pour localhost.

Ouvrez le fichier de configuration Redis pour le modifier:

sudo nano /etc/redis/redis.conf

Localisez cette ligne et assurez-vous qu'elle n'est pas commentée (supprimez les# s'il existe):

/etc/redis/redis.conf

bind 127.0.0.1

Nous allons continuer à utiliser ce fichier, alors gardez-le ouvert pour le moment.

[[step-4 -—- configuring-a-redis-password]] == Étape 4 - Configuration d'un mot de passe Redis

Si vous avez installé Redis à l'aide de l'articleHow To Configure a Redis Cluster on Ubuntu 14.04, vous devez avoir configuré un mot de passe pour celui-ci. À votre discrétion, vous pouvez créer un mot de passe plus sécurisé maintenant en suivant cette section. Sinon, les instructions de cette section indiquent comment définir le mot de passe du serveur de base de données.

La configuration d'un mot de passe Redis active l'une de ses deux fonctions de sécurité intégrées - la commandeauth, qui oblige les clients à s'authentifier pour accéder à la base de données. Le mot de passe est configuré directement dans le fichier de configuration de Redis,/etc/redis/redis.conf, que vous devriez toujours avoir ouvert à l’étape précédente.

Faites défiler jusqu'à la sectionSECURITY et recherchez une directive commentée qui lit:

/etc/redis/redis.conf

# requirepass foobared

Décommentez-le en supprimant les# et changezfoobared en une valeur très forte et très longue.

Plutôt que de créer un mot de passe vous-même, vous pouvez utiliser un outil commeapg oupwgen pour en générer un. Si vous ne souhaitez pas installer une application uniquement pour générer un mot de passe, vous pouvez utiliser le one-liner ci-dessous. Pour générer un mot de passe différent de celui que cela générerait, modifiez le mot entre guillemets.

echo "digital-ocean" | sha256sum

Votre sortie devrait ressembler à quelque chose comme:

Sortie

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

Bien que le mot de passe généré ne soit pas prononçable, il vous en donnera un très fort et très long, qui correspond exactement au type de mot de passe requis pour Redis. Après avoir copié et collé la sortie de cette commande en tant que nouvelle valeur pourrequirepass, elle devrait lire:

/etc/redis/redis.conf

requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

Si vous préférez un mot de passe plus court, utilisez plutôt le résultat de la commande ci-dessous. Encore une fois, changez le mot entre guillemets pour qu'il ne génère pas le même mot de passe que celui-ci:

echo "digital-ocean" | sha1sum

La sortie sera un peu plus courte cette fois-ci:

Sortie

10d9a99851a411cdae8c3fa09d7290df192441a9

Après avoir défini le mot de passe, enregistrez le fichier et redémarrez Redis:

sudo service redis-server restart

Pour vérifier que le mot de passe fonctionne, accédez à la ligne de commande Redis:

redis-cli

La sortie suivante montre une séquence de commandes permettant de tester le fonctionnement du mot de passe Redis. La première commande tente de définir une clé sur une valeur avant l'authentification.

set key1 10

Cela ne fonctionnera pas, donc Redis renvoie une erreur.

Sortie

(error) NOAUTH Authentication required.

La deuxième commande s'authentifie avec le mot de passe spécifié dans le fichier de configuration Redis.

auth your_redis_password

Redis reconnaît.

Sortie

OK

Après cela, relancez la commande précédente.

set key1 10

Sortie

OK

get key1 demande à Redis la valeur de la nouvelle clé.

get key1

Sortie

"10"

La dernière commande quitteredis-cli. Vous pouvez également utiliserexit:

quit

Nous verrons ensuite comment renommer les commandes Redis.

[[step-5 -—- renaming-dangerous-commands]] == Étape 5 - Renommer les commandes dangereuses

L’autre fonctionnalité de sécurité intégrée à Redis vous permet de renommer ou de désactiver complètement certaines commandes considérées comme dangereuses.

Lorsqu'elles sont exécutées par des utilisateurs non autorisés, ces commandes peuvent être utilisées pour reconfigurer, détruire ou effacer vos données. Comme le mot de passe d'authentification, le changement de nom ou la désactivation des commandes est configuré dans la même sectionSECURITY du fichier/etc/redis/redis.conf.

Certaines des commandes connues pour être dangereuses incluent:FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF,BGSAVE,SAVE,SPOP,SREM,RENAME etDEBUG. Ce n'est pas une liste complète, mais renommer ou désactiver toutes les commandes de cette liste est un bon point de départ.

Que vous désactiviez ou renommiez une commande est spécifique au site. Si vous savez que vous n'utiliserez jamais une commande pouvant être utilisée de manière abusive, vous pouvez la désactiver. Sinon, renommez-le.

Pour activer ou désactiver les commandes Redis, ouvrez le fichier de configuration pour le modifier une fois de plus:

sudo nano  /etc/redis/redis.conf

These are examples. You should choose to disable or rename the commands that make sense for you. Vous pouvez vérifier les commandes par vous-même et déterminer comment elles pourraient être mal utilisées àredis.io/commands.

Pour désactiver ou supprimer une commande, renommez-la simplement en une chaîne vide, comme indiqué ci-dessous:

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

Et pour renommer une commande, donnez-lui un autre nom, comme dans les exemples ci-dessous. Les commandes renommées devraient être difficiles à deviner, mais faciles à retenir. Ne vous compliquez pas la vie.

/etc/redis/redis.conf

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

Enregistrez vos modifications.

Après avoir renommé une commande, appliquez la modification en redémarrant Redis:

sudo service redis-server restart

Pour tester la nouvelle commande, entrez la ligne de commande Redis:

redis-cli

Ensuite, en supposant que vous avez renommé la commandeCONFIG enASC12_CONFIG, la sortie suivante montre comment tester que la nouvelle commande a été appliquée.

Après authentification:

auth your_redis_password

Sortie

OK

La première tentative d'utilisation de la commandeconfig doit échouer, car elle a été renommée.

config get requirepass

Sortie

(error) ERR unknown command 'config'

L’appel de la commande renommée doit aboutir (sans distinction de casse):

asc12_config get requirepass

Sortie

1) "requirepass"
2) "your_redis_password"

Enfin, vous pouvez quitterredis-cli:

exit

Remarque: Si vous utilisez déjà la ligne de commande Redis puis redémarrez Redis, vous devrez vous authentifier à nouveau. Sinon, vous obtiendrez cette erreur si vous tapez une commande:

Sortie

NOAUTH Authentication required.

[.Attention]##

En ce qui concerne les commandes de changement de nom, il y a une mise en garde à la fin de la sectionSECURITY dans/etc/redis/redis.conf qui se lit comme suit:

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

Cela signifie que si la commande renommée n'est pas dans le fichier AOF, ou si elle l'est mais que le fichier AOF n'a pas été transmis aux esclaves, il ne devrait pas y avoir de problème.

Donc, gardez cela à l'esprit lorsque vous essayez de renommer des commandes. Le meilleur moment pour renommer une commande est lorsque vous n'utilisez pas la persistance AOF, ou juste après l'installation, c'est-à-dire avant le déploiement de votre application utilisant Redis.

Lorsque vous utilisez AOF et que vous traitez une installation maître-esclave, tenez compte de cette réponse à partir de la page de problème GitHub du projet. Voici une réponse à la question de l’auteur:

Les commandes sont journalisées sur l'AOF et répliquées sur l'esclave de la même manière qu'elles sont envoyées, donc si vous essayez de rejouer l'AOF sur une instance qui n'a pas le même renommage, vous pouvez rencontrer des incohérences car la commande ne peut pas être exécutée ( idem pour les esclaves).

Ainsi, la meilleure façon de gérer le changement de nom dans de tels cas est de s'assurer que les commandes renommées sont appliquées à toutes les instances des installations maître-esclave.

[[step-6 -—- setting-data-directory-owner-and-file-permissions]] == Étape 6 - Définition de la propriété du répertoire de données et des autorisations de fichier

Dans cette étape, nous examinerons quelques modifications de propriété et d’autorisations que vous pouvez apporter pour améliorer le profil de sécurité de votre installation Redis. Cela implique de s'assurer que seul l'utilisateur qui a besoin d'accéder à Redis est autorisé à lire ses données. Cet utilisateur est, par défaut, l'utilisateur deredis.

Vous pouvez le vérifier engrep-ing pour le répertoire de données Redis dans une longue liste de son répertoire parent. La commande et sa sortie sont données ci-dessous.

ls -l /var/lib | grep redis

Sortie

drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

Vous pouvez voir que le répertoire de données Redis appartient à l'utilisateurredis, avec un accès secondaire accordé au grouperedis. Cette partie est bonne.

La partie qui ne correspond pas aux autorisations du dossier, soit 755. Pour vous assurer que seul l'utilisateur Redis a accès au dossier et à son contenu, définissez l'autorisation sur 700:

sudo chmod 700 /var/lib/redis

L'autre autorisation à modifier est celle du fichier de configuration Redis. Par défaut, il a une autorisation de fichier de 644 et appartient àroot, avec une propriété secondaire par le grouperoot:

ls -l /etc/redis/redis.conf

Sortie

-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis/redis.conf

Cette autorisation (644) est lisible par tout le monde, ce qui n’est pas une bonne idée, car elle contient le mot de passe non chiffré configuré à l’étape 4.

Nous devons changer la propriété et les autorisations. Idéalement, il devrait appartenir à l'utilisateurredis, avec la propriété secondaire par l'utilisateurroot. Pour ce faire, exécutez la commande suivante:

sudo chown redis:root /etc/redis/redis.conf

Puis changez la propriété pour que seul le propriétaire du fichier puisse lire et / ou écrire dessus:

sudo chmod 600 /etc/redis/redis.conf

Vous pouvez vérifier la nouvelle propriété et autorisation en utilisant:

ls -l /etc/redis/redis.conf

Sortie

total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf

Enfin, redémarrez Redis:

sudo service redis-server restart

Conclusion

N'oubliez pas qu'une fois que quelqu'un est connecté à votre serveur, il est très facile de contourner les fonctionnalités de sécurité spécifiques à Redis que nous avons mises en place. La caractéristique de sécurité la plus importante est donc extrêmement difficile à franchir.

Cela devrait être votre pare-feu.

Pour amener la sécurité de votre serveur au niveau supérieur, vous pouvez configurer un système de détection d’intrusion tel que OSSEC. Pour configurer OSSEC sur Ubuntu 14.04, consultezthis OSSEC guide.

Si vous essayez de sécuriser la communication Redis sur un réseau non approuvé, vous devrez utiliser un proxy SSL, comme recommandé par les développeurs Redis dans lesofficial Redis security guide. La configuration d’un proxy SSL pour sécuriser la communication Redis constitue un sujet distinct.

Nous n’avons pas inclus la liste complète des commandes Redis dans la section Renommage. Cependant, vous pouvez le vérifier par vous-même et déterminer comment ils pourraient être mal utilisés àredis.io/commands.