Wie lasse ich RabbitMQ nur localhost hören?

40

Ich habe RabbitMQ auf einer Debian Linux Squeeze-Maschine installiert und möchte, dass es nur die localhost-Schnittstelle hört. Ich habe hinzugefügt

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

zu meiner /etc/rabbitmq/rabbitmq.confDatei, und das macht es beim Abhören auf dem amqpPort (5672) nur an die localhost-Schnittstelle binden . Es wird jedoch weiterhin an alle Schnittstellen gebunden, wenn die Ports epmd (4369) und 43380 abgehört werden:

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

Wie verhindere ich das? Muss ich iptables einrichten oder gibt es zusätzliche RabbitMQ-Konfigurationsoptionen, mit denen es tun kann, was ich will?

Vebjorn Ljosa
quelle
epmd ist nicht Teil von RabbitMQ. Es ist der Erlang-Namensdämon. Der beste Weg, nur an localhost zu binden, besteht darin, Kaninchen den Knotennamen 'rabbit @ localhost' zu geben. Dies ist der Knotenname, mit dem mehrere RabbitMQ-Server geclustert werden. Erlang verwendet ihn, um den Knoten im Netzwerk zu finden. Der Teil nach dem @ ist der Hostname, auf dem Rabbit ausgeführt wird, und localhost ist eindeutig kein Name, auf den von außen zugegriffen werden kann.
Michael Dillon

Antworten:

48

Wenn Sie Folgendes /etc/rabbitmq/rabbitmq-env.confeingeben, hören RabbitMQ und epmd nur localhost:

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

Es ist etwas aufwändiger, Erlang so zu konfigurieren, dass nur localhost für den höher nummerierten Port verwendet wird (der, soweit ich das beurteilen kann, für das Clustering von Knoten verwendet wird). Wenn Sie sich nicht für Clustering interessieren und Rabbit nur vollständig lokal ausführen möchten, können Sie Erlang eine Kerneloption übergeben, damit es nur die Loopback-Schnittstelle verwendet.

Erstellen Sie dazu eine neue Datei in /etc/rabbitmq/- ich werde es nennen rabbit.config. In diese Datei wird die Erlang-Option eingefügt, die zur Laufzeit geladen werden muss.

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

Wenn Sie das Verwaltungs-Plugin verwenden und dies auch auf localhost beschränken möchten, müssen Sie die Ports separat konfigurieren, sodass die Datei rabbit.config Folgendes enthält:

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

(Hinweis: RabbitMQ lässt epmd beim Herunterfahren laufen. Wenn Sie also den Erlang-Clustering-Port blockieren möchten, müssen Sie epmd separat von Rabbit neu starten.)

Als nächstes muss RabbitMQ dies beim Start laden. Öffne /etc/rabbitmq/rabbitmq.conferneut und setze das Folgende oben drauf:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Dadurch wird diese Konfigurationsdatei beim Start des Rabbit-Servers geladen und die Optionen an Erlang übergeben.

Sie sollten jetzt alle Erlang / RabbitMQ-Prozesse nur auf localhost abhören lassen! Dies kann mit überprüft werdennetstat -ntlap

EDIT: In älteren Versionen von RabbitMQ, die Konfigurationsdatei ist: /etc/rabbitmq/rabbitmq.conf. Diese Datei wurde jedoch durch die rabbit-env.confDatei ersetzt.

David Wilemski
quelle
1
Bravo! Vielen Dank. Hinweis: Ich benötigte 'rabbitmq-env.conf' auf RabbitMQ für CentOS / RHEL über EPEL. Und während mir der 'rabbit'-Export für' rabbit.config 'seltsam vorkam, funktionierte er ohne Suffix.
Astrostl
" /etc/rabbitmq/rabbitmq.confWieder aufmachen". Warum nochmal"? Meinst du rabbitmq-env.conf?
Phinz
Die Umgebungsvariable ERL_EPMD_ADDRESSsteuert nur die Empfangs-IP von epmd. Wenn Sie die Empfangs-IP von RabbitMQ für den Cluster-Port (25672) ändern möchten, müssen Sie die inet_dist_use_interfaceOption verwenden. 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
13

Um RabbitMQ zu veranlassen, localhost abzuhören / nur localhost zu binden:

3 verschiedene Arten (alle gleichwertig):

  • Fügen Sie NODE_IP_ADDRESS = 127.0.0.1 in die Umgebungsvariablendatei ein (siehe http://www.rabbitmq.com/configure.html#define-environment-variables ).

  • Fügen Sie die Eigenschaften tcp_listeners und ssl_listeners in die Konfigurationsdatei ein: Die Konfigurationseinträge tcp_listeners und ssl_listeners steuern die Schnittstellen, auf denen RabbitMQ lauscht. Ein Eintrag zum Abhören von localhost wäre zB {tcp_listeners, [{'127.0.0.1', 5672}]} (Syntax ist möglicherweise nicht korrekt, überprüfen Sie sie) http://www.rabbitmq.com/configure.html# Konfigurationsdatei

  • Exportieren Sie die Umgebung. Variable im Startskript (/etc/init.d/rabbitmq-server) export RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Letzteres hat bei mir funktioniert.

EPMD:

Das Epmd-Programm sorgt dafür, dass verteilte Teile der Erlang-Laufzeit funktionieren. Wenn Sie einen Cluster mit mehreren Computern erstellen, müssen Sie diese für andere Knoten und auf jeden Fall für localhost zugänglich machen. Aber es hat einen eingebauten Schutz durch eine Cookie-Datei.

Es erfordert kaum Aufmerksamkeit. Denken Sie daran, dass Erlang-Programme (einschließlich rabbitmqctl zum Beispiel) auf diesen Port zugreifen müssen, um andere Erlang-Programme zu kontaktieren.

Wenn Sie jedoch mit Finanzdaten oder Krankenakten zu tun haben, ist es möglicherweise eine gute Idee, epmd zu schützen. Der voreingestellte Port, den epmd verwendet, ist 4369. Andere Programme stellen über TCP eine Verbindung her.

Siehe auch: http://www.erlang.org/doc/man/epmd.html#environment_variables

Wenn Sie RabbitMQ weiter sichern müssen,

  1. Deaktivieren Sie das integrierte Gastkonto http://www.rabbitmq.com/admin-guide.html#default-state

  2. Erwägen Sie die Verwendung von SSL und die Authentifizierung mithilfe der Zertifikatkette

Ich habe diese Antworten vom IRC-Kanal der RabbitMQ-Community erhalten.

Möchte mich bei ihnen bedanken.

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

Hoffe, das oben Genannte spart Ihnen etwas Zeit (ich habe 6 Stunden gebraucht, um eine Antwort zu finden).

Boris
quelle
Der obige epmd-Link enthält einen Eintrag für ERL_EPMD_ADDRESS, vermutlich, um die Adressen festzulegen, an die epmd gebunden wird, außer ich sehe nicht, wo diese Umgebungsvariable für den rabbitmq-Benutzer festgelegt werden soll.
François Beausoleil
5

Wenn Sie Umgebungsvariablen in der Datei rabbitmq.conf angeben, müssen Sie das Präfix RABBITMQ_ löschen. Versuchen Sie Folgendes:

NODE_IP_ADDRESS = 127.0.0.1

cbz
quelle
Auf meiner Installation funktioniert entweder RABBITMQ_NODE_IP_ADDRESSoder NODE_IP_ADDRESS, aber wie erwähnt, nur für den amqp-Port.
Vebjorn Ljosa
1
Der epmd-Port ist eine Funktion des erlang-Port-Mappers, und es ist leider nicht möglich, seine Bindungsadresse einzuschränken.
cbz
Außerdem ist der EPMD-Port mit Cookies geschützt, sodass niemand eine Verbindung herstellen kann, wenn er nicht Ihr RabbitMQ-Server-Cookie kennt. Sie würden diesen Cookie nur anderen Mitgliedern eines RabbitMQ-Clusters geben. Gleiches Prinzip wie ein API-Schlüssel.
Michael Dillon