Project

rabbitcage

0.01
No commit activity in last 3 years
No release in over 3 years
RabbitMQ's access control capabilities are rather limited. RabbitCage enables fine-grained permission setups, you define which user can perform which AMQP method on which class.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 0

Runtime

>= 0.6.5
>= 0.12.10
 Project Readme

RabbitCage

WARNING: This project is at a very early stage of development. The command line options and the config file format will most likely change in future versions.

RabbitCage is a AMQP application firewall build on EventMachine. The code has been heavily inspired by mojombo's awesome ProxyMachine.

RabbitCage was written because RabbitMQ's access control capabilities are rather limited.

RabbitCage works as a transparent, content aware proxy between the connecting client and a AMQP broker (currently only tested with RabbitMQ). Based on configured ACL-like rules RabbitCage will either forward or reject the message. Messages sent from the broker are forwarded directly to the client using EventMachine's proxy incoming to, though it will just affect the client -> server performance.

Installation

sudo gem install rabbitcage

Running

Usage:
rabbitcage -c <config file> [-h <host>] [-p <port>]

Options:
    -c, --config CONFIG              Configuration file
    -h, --host HOST                  Hostname to bind. Default 0.0.0.0
    -p, --port PORT                  Port to listen on. Default 5672
    -r, --remote-host HOST           Hostname of the RabbitMQ server to connect to. Default 'localhost'
    -x, --remote-port PORT           Port of the RabbitMQ server to connect to. Default 5673
    -v                               Verbose output (denied requests).
    -V                               Very verbose output (denied requests/allowed requests).
    -D                               Debug output (denied requests/allowed requests/debug info).

Example config file

# Basic syntax:
# allow|deny 'username'|:all, AMQP method|:all, AMQP class|:all, Hash of AMQP method properties
#
# This example will allow the admin user to perform any action on the broker.
# A guest is allowed to consume every exchange which name does not start with 'private_' and
# register every queue which name does not start with 'reserved_'
include RabbitCageACL
config do
  allow 'admin', :all, :all
  allow 'guest', :all, :queue, :name => /^(?!reserved_)/
  allow 'guest', :all, :exchange, :name => /^(?!private_)/
  allow 'guest', [:consume, :get], :basic
  allow 'guest', :all, :connection
  allow 'guest', :all, :channel
  allow 'guest', :all, :access
  default :deny
end

Performance

Here are some basic performance measurements which compares a raw connection to RabbitMQ with a filtered one. Check the spec/performance/test.rb script to get information about how the tests were run. If you have a more benchmark results or suggestions about how to change the benchmark, please let me know.

Average message delay:
RabbitMQ    : 0.00293165922164917
RabbitCache : 0.00457870006561279

For a 1kb message do 1000 times:
RabbitMQ    push to queue : 0.443398952484131
RabbitMQ    pop from queue: 0.711700439453125
RabbitMQ    async get     : 0.847184419631958
RabbitCache push to queue : 0.764634847640991
RabbitCache pop from queue: 1.02018523216248
RabbitCache async get     : 0.852582693099976

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright

Copyright (c) 2009 Dominik Sander. See LICENSE for details.