2016-06-07 16:55:07 +08:00
# RabbitMQ Access Control Cache Plugin
2019-03-20 16:11:34 +08:00
This plugin provides a caching layer for [access control operations ](https://rabbitmq.com/access-control.html )
2016-06-07 16:55:07 +08:00
performed by RabbitMQ nodes.
2016-05-18 00:48:45 +08:00
2016-06-07 16:54:05 +08:00
## Project Maturity
2016-05-18 00:48:45 +08:00
2017-12-19 19:06:33 +08:00
As of 3.7.0, this plugin is distributed with RabbitMQ.
2016-05-18 00:36:29 +08:00
2016-06-07 16:54:05 +08:00
## Overview
2016-05-18 00:36:29 +08:00
2019-03-20 16:11:34 +08:00
This plugin provides a way to cache [authentication and authorization backend ](https://rabbitmq.com/access-control.html )
2016-06-07 16:54:05 +08:00
results for a configurable amount of time.
It's not an independent auth backend but a caching layer for existing backends
2020-05-05 22:07:30 +08:00
such as the built-in, [LDAP ](https://github.com/rabbitmq/rabbitmq-auth-backend-ldap ), or [HTTP ](https://github.com/rabbitmq/rabbitmq-auth-backend-http )
2016-06-07 16:54:05 +08:00
ones.
2016-05-18 00:36:29 +08:00
2017-02-09 20:40:33 +08:00
Cache expiration is currently time-based. It is not very useful with the built-in
2019-03-20 16:11:34 +08:00
(internal) [authn/authz backends ](https://rabbitmq.com/access-control.html ) but can be very useful for LDAP, HTTP or other backends that
2016-06-07 16:54:05 +08:00
use network requests.
2016-05-18 00:36:29 +08:00
2016-06-07 16:54:05 +08:00
## RabbitMQ Version Requirements
2020-06-24 05:31:56 +08:00
As of 3.7.0, this plugin is distributed with RabbitMQ. Like any other plugin, it must
be [enabled ](https://www.rabbitmq.com/plugins.html#ways-to-enable-plugins ) before it can be used.
2016-05-18 00:36:29 +08:00
2017-12-19 19:06:33 +08:00
2020-06-24 05:31:56 +08:00
## Installation
2017-04-12 00:37:47 +08:00
2020-06-24 05:31:56 +08:00
This plugin ships with reasonably recent RabbitMQ versions
(e.g. `3.7.0` or later). Enable it with
2016-12-05 19:05:17 +08:00
2020-06-24 05:31:56 +08:00
``` shell
rabbitmq-plugins enable rabbitmq_auth_backend_cache
```
2016-12-05 19:05:17 +08:00
2016-07-21 19:53:56 +08:00
## Binary Builds
Binary builds can be obtained [from project releases ](https://github.com/rabbitmq/rabbitmq-auth-backend-cache/releases/ ) on GitHub.
2016-05-18 00:36:29 +08:00
## Building
You can build and install it like any other plugin (see
2019-03-20 16:11:34 +08:00
[the plugin development guide ](https://www.rabbitmq.com/plugin-development.html )).
2016-05-18 00:36:29 +08:00
2016-06-07 16:54:05 +08:00
## Authentication and Authorization Backend Configuration
2016-05-18 00:36:29 +08:00
To enable the plugin, set the value of the `auth_backends` configuration item
for the `rabbit` application to include `rabbit_auth_backend_cache` .
`auth_backends` is a list of authentication providers to try in order.
2018-07-30 08:33:05 +08:00
So a configuration fragment that enables this plugin *only* (this example is **intentionally incomplete** ) would look like:
2016-05-18 00:36:29 +08:00
2020-06-24 05:31:56 +08:00
``` ini
auth_backends.1 = cache
```
2017-02-09 20:40:33 +08:00
2019-03-20 16:11:34 +08:00
In the [classic config format ](https://www.rabbitmq.com/configure.html#config-file-formats ):
2016-05-18 00:36:29 +08:00
2018-07-30 08:33:05 +08:00
``` erlang
[
{rabbit, [
{auth_backends, [rabbit_auth_backend_cache]}
]
}
].
```
2016-05-18 00:36:29 +08:00
2018-07-30 08:33:05 +08:00
This plugin wraps another auth backend (an "upstream" one) to reduce load on it.
2016-05-18 00:36:29 +08:00
2018-07-30 08:33:05 +08:00
To configure upstream auth backend, use the `auth_cache.cached_backend` configuration key
(`rabbitmq_auth_backend_cache.cached_backend` in the classic config format).
2017-02-09 20:40:33 +08:00
2018-07-30 08:33:05 +08:00
The following configuration uses the [LDAP backend ]((https://rabbitmq.com/ldap.html )) for both authentication and authorization
and wraps it with caching:
2016-05-18 00:36:29 +08:00
2018-07-30 08:33:05 +08:00
auth_backends.1 = cache
2016-05-18 00:36:29 +08:00
2018-07-30 08:33:05 +08:00
auth_cache.cached_backend = ldap
2016-05-18 00:36:29 +08:00
2018-07-30 08:33:05 +08:00
In the classic config format:
2017-02-09 20:40:33 +08:00
2018-07-30 08:33:05 +08:00
``` erlang
[
{rabbit, [
%% ...
]},
{rabbitmq_auth_backend_cache, [
{cached_backend, rabbit_auth_backend_ldap}
]},
{rabbit_auth_backend_ldap, [
%% ...
]},
].
```
2017-02-09 20:40:33 +08:00
2022-09-29 23:22:43 +08:00
The following example combines this backend with the [HTTP backend ](https://github.com/rabbitmq/rabbitmq-server/tree/main/deps/rabbitmq_auth_backend_http ) and its [example Spring Boot application ](https://github.com/rabbitmq/rabbitmq-server/tree/main/deps/rabbitmq_auth_backend_http/examples ):
2016-05-18 00:36:29 +08:00
2018-03-14 11:40:58 +08:00
auth_backends.1 = cache
auth_cache.cached_backend = http
auth_http.http_method = post
auth_http.user_path = http://localhost:8080/auth/user
auth_http.vhost_path = http://localhost:8080/auth/vhost
auth_http.resource_path = http://localhost:8080/auth/resource
2019-06-03 23:05:55 +08:00
auth_http.topic_path = http://localhost:8080/auth/topic
2018-03-14 11:40:58 +08:00
2018-07-30 08:33:05 +08:00
In the classic config format:
``` erlang
[
{rabbit, [
{auth_backends, [rabbit_auth_backend_cache]}
]
},
{rabbitmq_auth_backend_cache, [
{cached_backend, rabbit_auth_backend_http}
]
},
{rabbitmq_auth_backend_http, [{http_method, post},
2019-06-03 23:05:55 +08:00
{user_path, "http://127.0.0.1:8080/auth/user"},
{vhost_path, "http://127.0.0.1:8080/auth/vhost"},
{resource_path, "http://127.0.0.1:8080/auth/resource"},
2022-01-04 19:30:04 +08:00
{topic_path, "http://127.0.0.1:8080/auth/topic"}
2018-07-30 08:33:05 +08:00
]
}
].
```
It is still possible to [use different backends for authorization and authentication ](https://www.rabbitmq.com/access-control.html ).
The following example configures plugin to use LDAP backend for authentication
but internal backend for authorisation:
auth_backends.1 = cache
auth_cache.cached_backend.authn = ldap
auth_cache.cached_backend.authz = internal
In the classic config format:
``` erlang
[
{rabbit, [
%% ...
]},
{rabbitmq_auth_backend_cache, [{cached_backend, {rabbit_auth_backend_ldap,
rabbit_auth_backend_internal}}]}].
```
2018-03-14 11:40:58 +08:00
2016-06-07 16:54:05 +08:00
## Cache Configuration
2016-05-18 00:36:29 +08:00
You can configure TTL for cache items, by using `cache_ttl` configuration item, specified in **milliseconds**
2017-02-09 20:40:33 +08:00
auth_cache.cached_backend = ldap
auth_cache.cache_ttl = 5000
2017-02-09 23:31:55 +08:00
Or using the classic config for both parameters:
2017-02-09 20:40:33 +08:00
2018-07-30 08:37:27 +08:00
``` erlang
[
{rabbit, [
%% ...
]},
2018-12-18 03:10:20 +08:00
{rabbitmq_auth_backend_cache, [{cached_backend, rabbit_auth_backend_ldap},
2018-07-30 08:37:27 +08:00
{cache_ttl, 5000}]}].
```
2016-05-18 00:36:29 +08:00
You can also use a custom cache module to store cached requests. This module
2016-05-19 17:18:02 +08:00
should be an erlang module implementing `rabbit_auth_cache` behaviour and (optionally)
define `start_link` function to start cache process.
2016-05-18 00:36:29 +08:00
2016-06-07 16:54:05 +08:00
This repository provides several implementations:
2016-05-18 00:36:29 +08:00
2016-06-07 16:54:05 +08:00
* `rabbit_auth_cache_dict` stores cache entries in the internal process dictionary. **This module is for demonstration only and should not be used in production** .
2019-03-20 16:11:34 +08:00
* `rabbit_auth_cache_ets` stores cache entries in an [ETS ](https://learnyousomeerlang.com/ets ) table and uses timers for cache invalidation. **This is the default implementation** .
2016-06-07 16:54:05 +08:00
* `rabbit_auth_cache_ets_segmented` stores cache entries in multiple ETS tables and does not delete individual cache items but rather
uses a separate process for garbage collection.
* `rabbit_auth_cache_ets_segmented_stateless` same as previous, but with minimal use of `gen_server` state, using ets tables to store information about segments.
2016-05-18 00:36:29 +08:00
2017-02-09 20:40:33 +08:00
To specify module for caching you should use `cache_module` configuration item and
2016-05-18 00:36:29 +08:00
specify start args with `cache_module_args` .
2016-05-19 17:18:02 +08:00
Start args should be list of arguments passed to module `start_link` function
2016-05-18 00:36:29 +08:00
2017-02-09 20:40:33 +08:00
Cache module can be set via sysctl config format:
auth_cache.cache_module = rabbit_auth_backend_ets_segmented
2019-03-20 16:11:34 +08:00
Additional cache module arguments can only be defined via the [advanced config ](https://www.rabbitmq.com/configure.html#advanced-config-file ) or classic config format:
2017-02-09 20:40:33 +08:00
2018-07-30 08:37:27 +08:00
``` erlang
[
{rabbit, [
%% ...
]},
2017-02-09 20:40:33 +08:00
2018-07-30 08:37:27 +08:00
{rabbitmq_auth_backend_cache, [{cache_module_args, [10000]}]}
].
```
The above two snippets combined in the classic config format:
2017-02-09 20:40:33 +08:00
2018-07-30 08:37:27 +08:00
``` erlang
[
{rabbit, [
%% ...
]},
{rabbitmq_auth_backend_cache, [{cache_module, rabbit_auth_backend_ets_segmented},
{cache_module_args, [10000]}]}
].
2018-07-30 08:38:17 +08:00
```
2016-05-18 00:36:29 +08:00
2017-02-09 23:31:55 +08:00
The default values are `rabbit_auth_cache_ets` and `[]` , respectively.
2016-05-18 00:36:29 +08:00
2016-06-07 16:54:05 +08:00
## License and Copyright
2016-05-18 00:36:29 +08:00
2024-02-06 01:26:25 +08:00
(c) 2007-2024 Broadcom. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
2016-05-18 00:36:29 +08:00
2020-07-11 02:57:18 +08:00
Released under the Mozilla Public License 2.0, same as RabbitMQ.