Comment faire en sorte que RabbitMQ n'écoute que localhost?

41

J'ai installé RabbitMQ sur une machine Linux Debian Linux Squeeze et je voudrais qu'il écoute uniquement l'interface localhost. J'ai ajouté

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

dans mon /etc/rabbitmq/rabbitmq.conffichier, ce qui le lie uniquement à l'interface localhost lors de l'écoute sur le amqpport (5672). Cependant, il reste lié à toutes les interfaces lors de l'écoute sur les ports epmd (4369) et 43380:

# lsof -n -a -i -urabbitmq
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
epmd     7353 rabbitmq    3u  IPv4 1177662      0t0  TCP *:epmd (LISTEN)
epmd     7353 rabbitmq    5u  IPv4 1177714      0t0  TCP 127.0.0.1:epmd->127.0.0.1:50877 (ESTABLISHED)
beam.smp 7365 rabbitmq   10u  IPv4 1177711      0t0  TCP *:43380 (LISTEN)
beam.smp 7365 rabbitmq   11u  IPv4 1177713      0t0  TCP 127.0.0.1:50877->127.0.0.1:epmd (ESTABLISHED)
beam.smp 7365 rabbitmq   19u  IPv4 1177728      0t0  TCP 127.0.0.1:amqp (LISTEN)

Comment puis-je empêcher cela? Dois-je configurer iptables ou existe-t-il d'autres options de configuration de RabbitMQ qui lui permettront de faire ce que je veux?

Vebjorn Ljosa
la source
epmd ne fait pas partie de RabbitMQ. C'est le démon de nommage Erlang. Le meilleur moyen de se lier uniquement à localhost est de donner à lapin le nom de noeud 'rabbit @ localhost'. Il s'agit du nom de noeud utilisé pour mettre en cluster plusieurs serveurs RabbitMQ. Erlang l'utilise pour rechercher le noeud sur le réseau. La partie après le @ est le nom d'hôte qui exécute Rabbit et, de toute évidence, localhost n'est pas un nom accessible de l'extérieur.
Michael Dillon

Réponses:

49

Mettre les éléments suivants dans /etc/rabbitmq/rabbitmq-env.conffera RabbitMQ et EPMD écouter uniquement localhost:

export RABBITMQ_NODENAME=rabbit@localhost
export RABBITMQ_NODE_IP_ADDRESS=127.0.0.1
export ERL_EPMD_ADDRESS=127.0.0.1

Il faut un peu plus de travail pour configurer Erlang afin qu'il n'utilise que localhost pour le port dont le numéro est le plus élevé (utilisé pour la mise en cluster des nœuds, pour autant que je sache). Si vous ne vous souciez pas de la mise en cluster et que vous voulez simplement que Rabbit soit entièrement exécuté localement, vous pouvez alors donner à Erlang une option du noyau lui permettant d’utiliser uniquement l’interface de bouclage.

Pour ce faire, créez un nouveau fichier dans /etc/rabbitmq/- je l'appellerai rabbit.config. Dans ce fichier, nous mettrons l'option Erlang que nous devons charger à l'exécution.

[{kernel,[{inet_dist_use_interface,{127,0,0,1}}]}].

Si vous utilisez le plugin de gestion et souhaitez également le limiter à localhost, vous devez configurer ses ports séparément, afin que rabbit.config inclue ceci:

[ {rabbitmq_management, [ {listener, [{port, 15672}, {ip, "127.0.0.1"}]} ]}, {kernel, [ {inet_dist_use_interface,{127,0,0,1}} ]} ].

(Remarque: RabbitMQ laisse epmd en marche lorsqu'il s'arrête. Par conséquent, si vous souhaitez bloquer le port de cluster d'Erlang, vous devrez redémarrer epmd séparément de Rabbit.)

Ensuite, RabbitMQ doit le charger au démarrage. Ouvrez à /etc/rabbitmq/rabbitmq.confnouveau et mettez ce qui suit en haut:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Cela charge ce fichier de configuration au démarrage du serveur lapin et transmet les options à Erlang.

Vous devriez maintenant avoir tous les processus Erlang / RabbitMQ en écoute uniquement sur localhost! Ceci peut être vérifié avecnetstat -ntlap

EDIT: Dans les anciennes versions de RabbitMQ, le fichier de configuration est: /etc/rabbitmq/rabbitmq.conf. Cependant, ce fichier a été remplacé par le rabbit-env.conffichier.

David Wilemski
la source
1
Bravo! Merci. Remarque: j'avais besoin de 'rabbitmq-env.conf' sur RabbitMQ pour CentOS / RHEL via EPEL. Et bien que l'exportation «rabbit» pour «rabbit.config» me paraisse étrange, cela fonctionne sans suffixe.
astrostl
"Ouvrez à /etc/rabbitmq/rabbitmq.confnouveau". Pourquoi "encore"? Tu veux dire rabbitmq-env.conf?
Phinz
La variable d'environnement ERL_EPMD_ADDRESSne contrôle que l'adresse IP d'écoute de epmd. Si vous souhaitez modifier l'adresse IP d'écoute du port de cluster (25672) de RabbitMQ, vous devez utiliser l' inet_dist_use_interfaceoption. NODE_IP_ADDRESS=127.0.0.1 ERL_EPMD_ADDRESS=127.0.0.1 SERVER_START_ARGS="-kernel inet_dist_use_interface {127,0,0,1}"
Terry le
13

Pour que RabbitMQ écoute sur localhost / lie uniquement à localhost:

3 façons différentes (toutes équivalentes):

  • Placez NODE_IP_ADDRESS = 127.0.0.1 dans le fichier de variables d’environnement (voir http://www.rabbitmq.com/configure.html#define-environment-variables )

  • Placez les propriétés tcp_listeners et ssl_listeners dans le fichier de configuration: Les entrées de configuration tcp_listeners et ssl_listeners régissent les interfaces sur lesquelles RabbitMQ écoute. Par exemple, {tcp_listeners, [{'127.0.0.1', 5672}]} (la syntaxe pourrait ne pas être correcte, cochez-la) http://www.rabbitmq.com/configure.html# fichier de configuration

  • exporter l'env. variable dans le script de démarrage (/etc/init.d/rabbitmq-server) export RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Ce dernier a fonctionné pour moi.

EPMD:

Le programme Epmd réalise des parties distribuées du moteur d’exécution d’Erlang. Si vous construisez un cluster multi-machines, vous devez les laisser accessibles aux autres nœuds et certainement à localhost. Mais il a une protection intégrée via un fichier cookie.

Cela ne demande presque jamais aucune attention. N'oubliez pas que les programmes erlang (notamment rabbitmqctl) doivent accéder à ce port pour contacter d'autres programmes erlang.

Toutefois, si vous traitez avec des données financières ou des dossiers médicaux, protéger epmd peut être une bonne idée. Le port par défaut utilisé par epmd est 4369, d'autres programmes s'y connectent via TCP.

Voir aussi: http://www.erlang.org/doc/man/epmd.html#environment_variables

Si vous avez besoin de sécuriser davantage RabbitMQ,

  1. Désactiver le compte invité intégré http://www.rabbitmq.com/admin-guide.html#default-state

  2. Pensez à utiliser SSL et à vous authentifier à l'aide de la chaîne de certificats

J'ai reçu ces réponses du canal IRC de la communauté RabbitMQ.

Voudrais les remercier.

http://dev.rabbitmq.com/irclog/index.php?date=2011-06-14

J'espère que ce qui précède vous fait gagner du temps (cela m'a pris 6 heures pour trouver une réponse).

Boris
la source
Le lien epmd ci-dessus contient une entrée pour ERL_EPMD_ADDRESS, probablement pour définir les adresses vers lesquelles epmd se liera, sauf que je ne vois pas où définir cette variable d'environnement pour l'utilisateur rabbitmq.
François Beausoleil
5

Si vous spécifiez des variables d'environnement dans le fichier rabbitmq.conf, vous devez supprimer le préfixe RABBITMQ_. Essayez donc:

NODE_IP_ADDRESS = 127.0.0.1

cbz
la source
Sur mon installation, soit RABBITMQ_NODE_IP_ADDRESSou NODE_IP_ADDRESSfonctionne, mais comme mentionné uniquement pour le port amqp.
Vebjorn Ljosa
1
Le port epmd est une fonction du mappeur de ports erlang et il est impossible de restreindre son adresse de liaison.
cbz
De plus, le port EPMD est protégé par des cookies afin que personne ne puisse se connecter à moins de connaître le cookie de votre serveur RabbitMQ. Vous ne donneriez ce cookie qu'aux autres membres d'un cluster RabbitMQ. Même principe qu'une clé API.
Michael Dillon