Skip to content

Commit 7fa60aa

Browse files
committed
See #8605. Add authentcation support to prometheus.
1 parent 683dba9 commit 7fa60aa

File tree

16 files changed

+568
-270
lines changed

16 files changed

+568
-270
lines changed

deps/rabbitmq_management/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ rabbitmq_suite(
189189
deps = [
190190
"//deps/rabbitmq_ct_helpers:erlang_app",
191191
"//deps/rabbitmq_management_agent:erlang_app",
192+
"//deps/rabbitmq_web_dispatch:erlang_app",
192193
"@proper//:erlang_app",
193194
],
194195
)
@@ -197,6 +198,7 @@ rabbitmq_integration_suite(
197198
name = "rabbit_mgmt_test_db_SUITE",
198199
deps = [
199200
"//deps/rabbitmq_management_agent:erlang_app",
201+
"//deps/rabbitmq_web_dispatch:erlang_app",
200202
],
201203
)
202204

@@ -210,6 +212,7 @@ rabbitmq_suite(
210212
size = "small",
211213
deps = [
212214
"//deps/rabbitmq_management_agent:erlang_app",
215+
"//deps/rabbitmq_web_dispatch:erlang_app",
213216
"@proper//:erlang_app",
214217
],
215218
)

deps/rabbitmq_management/app.bzl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,10 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
568568
outs = ["test/rabbit_mgmt_stats_SUITE.beam"],
569569
app_name = "rabbitmq_management",
570570
erlc_opts = "//:test_erlc_opts",
571-
deps = ["//deps/rabbitmq_management_agent:erlang_app", "@proper//:erlang_app"],
571+
deps = [
572+
"//deps/rabbitmq_management_agent:erlang_app",
573+
"@proper//:erlang_app",
574+
],
572575
)
573576
erlang_bytecode(
574577
name = "rabbit_mgmt_test_db_SUITE_beam_files",
@@ -578,7 +581,11 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
578581
hdrs = ["include/rabbit_mgmt.hrl"],
579582
app_name = "rabbitmq_management",
580583
erlc_opts = "//:test_erlc_opts",
581-
deps = ["//deps/rabbit_common:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app", "//deps/rabbitmq_management_agent:erlang_app"],
584+
deps = [
585+
"//deps/rabbit_common:erlang_app",
586+
"//deps/rabbitmq_ct_helpers:erlang_app",
587+
"//deps/rabbitmq_management_agent:erlang_app",
588+
],
582589
)
583590
erlang_bytecode(
584591
name = "rabbit_mgmt_test_unit_SUITE_beam_files",

deps/rabbitmq_management/src/rabbit_mgmt_util.erl

Lines changed: 78 additions & 251 deletions
Large diffs are not rendered by default.

deps/rabbitmq_management_agent/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ rabbitmq_app(
7272
deps = [
7373
"//deps/rabbit:erlang_app",
7474
"//deps/rabbit_common:erlang_app",
75+
"//deps/rabbitmq_web_dispatch:erlang_app",
7576
"@ranch//:erlang_app",
7677
],
7778
)

deps/rabbitmq_management_agent/app.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def all_beam_files(name = "all_beam_files"):
3434
"//deps/rabbit:erlang_app",
3535
"//deps/rabbit_common:erlang_app",
3636
"//deps/rabbitmq_cli:erlang_app",
37+
"//deps/rabbitmq_web_dispatch:erlang_app",
3738
],
3839
)
3940

@@ -72,6 +73,7 @@ def all_test_beam_files(name = "all_test_beam_files"):
7273
"//deps/rabbit:erlang_app",
7374
"//deps/rabbit_common:erlang_app",
7475
"//deps/rabbitmq_cli:erlang_app",
76+
"//deps/rabbitmq_web_dispatch:erlang_app",
7577
],
7678
)
7779

deps/rabbitmq_management_agent/include/rabbit_mgmt_records.hrl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,8 @@
55
%% Copyright (c) 2007-2023 VMware, Inc. or its affiliates. All rights reserved.
66
%%
77

8-
-record(context, {user,
9-
password = none,
10-
impl}). % storage for a context of the resource handler
8+
-include_lib("rabbitmq_web_dispatch/include/rabbitmq_web_dispatch_records.hrl").
119

1210
-record(range, {first :: integer(),
1311
last :: integer(),
1412
incr :: integer()}).
15-
16-

deps/rabbitmq_prometheus/app.bzl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def all_beam_files(name = "all_beam_files"):
2424
deps = [
2525
"//deps/amqp_client:erlang_app",
2626
"//deps/rabbit_common:erlang_app",
27+
"//deps/rabbitmq_web_dispatch:erlang_app",
2728
"@prometheus//:erlang_app",
2829
],
2930
)
@@ -53,6 +54,7 @@ def all_test_beam_files(name = "all_test_beam_files"):
5354
deps = [
5455
"//deps/amqp_client:erlang_app",
5556
"//deps/rabbit_common:erlang_app",
57+
"//deps/rabbitmq_web_dispatch:erlang_app",
5658
"@prometheus//:erlang_app",
5759
],
5860
)
@@ -114,5 +116,8 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
114116
outs = ["test/rabbit_prometheus_http_SUITE.beam"],
115117
app_name = "rabbitmq_prometheus",
116118
erlc_opts = "//:test_erlc_opts",
117-
deps = ["//deps/amqp_client:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app"],
119+
deps = [
120+
"//deps/amqp_client:erlang_app",
121+
"//deps/rabbitmq_ct_helpers:erlang_app",
122+
],
118123
)

deps/rabbitmq_prometheus/priv/schema/rabbitmq_prometheus.schema

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,8 @@ end}.
141141
{mapping, "prometheus.ssl.max_keepalive", "rabbitmq_prometheus.ssl_config.cowboy_opts.max_keepalive",
142142
[{datatype, integer}, {validators, ["non_negative_integer"]}]}.
143143

144-
{mapping, "prometheus.filter_aggregated_queue_metrics_pattern", "rabbitmq_prometheus.filter_aggregated_queue_metrics_pattern", [{datatype, string}]}.
144+
{mapping, "prometheus.filter_aggregated_queue_metrics_pattern", "rabbitmq_prometheus.filter_aggregated_queue_metrics_pattern", [{datatype, string}]}.
145+
146+
%% Authentication options ========================================================
147+
{mapping, "prometheus.authentication.enabled", "rabbitmq_prometheus.authentication.enabled",
148+
[{datatype, {enum, [true, false]}}]}.

deps/rabbitmq_prometheus/src/rabbit_prometheus_handler.erl

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,38 @@
1111
-export([setup/0]).
1212

1313
-include_lib("amqp_client/include/amqp_client.hrl").
14+
-include_lib("rabbitmq_web_dispatch/include/rabbitmq_web_dispatch_records.hrl").
1415

1516
-define(SCRAPE_DURATION, telemetry_scrape_duration_seconds).
1617
-define(SCRAPE_SIZE, telemetry_scrape_size_bytes).
1718
-define(SCRAPE_ENCODED_SIZE, telemetry_scrape_encoded_size_bytes).
1819

20+
-define(AUTH_REALM, "Basic realm=\"RabbitMQ Prometheus\"").
21+
1922
%% ===================================================================
2023
%% Cowboy Handler Callbacks
2124
%% ===================================================================
2225

2326
init(Req, _State) ->
24-
{cowboy_rest, Req, #{}}.
27+
{cowboy_rest, Req, #context{}}.
28+
2529

2630
content_types_provided(ReqData, Context) ->
2731
%% Since Prometheus 2.0 Protobuf is no longer supported
2832
{[{{<<"text">>, <<"plain">>, '*'}, generate_response}], ReqData, Context}.
2933

3034
is_authorized(ReqData, Context) ->
31-
{true, ReqData, Context}.
35+
AuthSettings = rabbit_misc:get_env(rabbitmq_prometheus, authentication, []),
36+
case proplists:get_value(enabled, AuthSettings) of
37+
true ->
38+
rabbit_web_dispatch_access_control:is_authorized_monitor(ReqData,
39+
Context,
40+
#auth_settings{basic_auth_enabled = true,
41+
auth_realm = ?AUTH_REALM});
42+
_ ->
43+
{true, ReqData, Context}
44+
end.
45+
3246

3347
setup() ->
3448
setup_metrics(telemetry_registry()),

deps/rabbitmq_prometheus/test/config_schema_SUITE_data/rabbitmq_prometheus.snippets

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,5 +296,14 @@
296296
{ssl_config, [{cowboy_opts, [{max_keepalive, 120}]}]}
297297
]}
298298
], [rabbitmq_prometheus]
299+
},
300+
301+
{authentication,
302+
"prometheus.authentication.enabled = true",
303+
[
304+
{rabbitmq_prometheus, [
305+
{authentication, [{enabled, true}]}
306+
]}
307+
], [rabbitmq_prometheus]
299308
}
300309
].

deps/rabbitmq_prometheus/test/rabbit_prometheus_http_SUITE.erl

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ all() ->
2323
{group, per_object_metrics},
2424
{group, per_object_endpoint_metrics},
2525
{group, commercial},
26-
{group, detailed_metrics}
26+
{group, detailed_metrics},
27+
{group, authentication}
2728
].
2829

2930
groups() ->
@@ -32,7 +33,7 @@ groups() ->
3233
{config_path, [], generic_tests()},
3334
{global_labels, [], generic_tests()},
3435
{aggregated_metrics, [], [
35-
aggregated_metrics_test,
36+
aggregated_metrics_test,
3637
specific_erlang_metrics_present_test,
3738
global_metrics_present_test,
3839
global_metrics_single_metric_family_test
@@ -60,12 +61,13 @@ groups() ->
6061
vhost_status_metric,
6162
exchange_bindings_metric,
6263
exchange_names_metric
63-
]}
64+
]},
65+
{authentication, [], [basic_auth]}
6466
].
6567

6668
generic_tests() ->
6769
[
68-
get_test,
70+
get_test,
6971
content_type_test,
7072
encoding_test,
7173
gzip_encoding_test,
@@ -202,7 +204,14 @@ init_per_group(aggregated_metrics, Config0) ->
202204
init_per_group(commercial, Config0) ->
203205
ProductConfig = {rabbit, [{product_name, "WolfMQ"}, {product_version, "2020"}]},
204206
Config1 = rabbit_ct_helpers:merge_app_env(Config0, ProductConfig),
205-
init_per_group(commercial, Config1, []).
207+
init_per_group(commercial, Config1, []);
208+
209+
init_per_group(authentication, Config) ->
210+
Config1 = rabbit_ct_helpers:merge_app_env(
211+
Config, {rabbitmq_prometheus, [{authentication, [{enabled, true}]}]}),
212+
init_per_group(authentication, Config1, []).
213+
214+
206215

207216
init_per_group(Group, Config0, Extra) ->
208217
rabbit_ct_helpers:log_environment(),
@@ -242,7 +251,10 @@ end_per_group(detailed_metrics, Config) ->
242251

243252
%% Delete queues?
244253
end_per_group_(Config);
245-
254+
end_per_group(authentication, Config) ->
255+
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, unset_env,
256+
[rabbitmq_prometheus, authentication]),
257+
end_per_group_(Config);
246258
end_per_group(_, Config) ->
247259
end_per_group_(Config).
248260

@@ -549,6 +561,25 @@ exchange_names_metric(Config) ->
549561
ok.
550562

551563

564+
basic_auth(Config) ->
565+
http_get(Config, [{"accept-encoding", "deflate"}], 401),
566+
AuthHeader = rabbit_mgmt_test_util:auth_header("guest", "guest"),
567+
http_get(Config, [{"accept-encoding", "deflate"}, AuthHeader], 200),
568+
569+
rabbit_ct_broker_helpers:add_user(Config, <<"monitor">>),
570+
rabbit_ct_broker_helpers:set_user_tags(Config, 0, <<"monitor">>, [monitoring]),
571+
MonAuthHeader = rabbit_mgmt_test_util:auth_header("monitor", "monitor"),
572+
http_get(Config, [{"accept-encoding", "deflate"}, MonAuthHeader], 200),
573+
574+
rabbit_ct_broker_helpers:add_user(Config, <<"management">>),
575+
rabbit_ct_broker_helpers:set_user_tags(Config, 0, <<"management">>, [management]),
576+
MgmtAuthHeader = rabbit_mgmt_test_util:auth_header("management", "management"),
577+
http_get(Config, [{"accept-encoding", "deflate"}, MgmtAuthHeader], 401),
578+
579+
rabbit_ct_broker_helpers:delete_user(Config, <<"monitor">>),
580+
rabbit_ct_broker_helpers:delete_user(Config, <<"management">>).
581+
582+
552583
http_get(Config, ReqHeaders, CodeExp) ->
553584
Path = proplists:get_value(prometheus_path, Config, "/metrics"),
554585
http_get(Config, Path, ReqHeaders, CodeExp).

deps/rabbitmq_web_dispatch/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ rabbitmq_app(
5353
license_files = [":license_files"],
5454
priv = [":priv"],
5555
deps = [
56+
"//deps/amqp_client:erlang_app",
5657
"//deps/rabbit:erlang_app",
5758
"//deps/rabbit_common:erlang_app",
5859
"@cowboy//:erlang_app",

deps/rabbitmq_web_dispatch/app.bzl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def all_beam_files(name = "all_beam_files"):
1313
"src/rabbit_cowboy_redirect.erl",
1414
"src/rabbit_cowboy_stream_h.erl",
1515
"src/rabbit_web_dispatch.erl",
16+
"src/rabbit_web_dispatch_access_control.erl",
1617
"src/rabbit_web_dispatch_app.erl",
1718
"src/rabbit_web_dispatch_listing_handler.erl",
1819
"src/rabbit_web_dispatch_registry.erl",
@@ -25,7 +26,10 @@ def all_beam_files(name = "all_beam_files"):
2526
app_name = "rabbitmq_web_dispatch",
2627
dest = "ebin",
2728
erlc_opts = "//:erlc_opts",
28-
deps = ["@cowboy//:erlang_app"],
29+
deps = [
30+
"//deps/amqp_client:erlang_app",
31+
"@cowboy//:erlang_app",
32+
],
2933
)
3034

3135
def all_test_beam_files(name = "all_test_beam_files"):
@@ -42,6 +46,7 @@ def all_test_beam_files(name = "all_test_beam_files"):
4246
"src/rabbit_cowboy_redirect.erl",
4347
"src/rabbit_cowboy_stream_h.erl",
4448
"src/rabbit_web_dispatch.erl",
49+
"src/rabbit_web_dispatch_access_control.erl",
4550
"src/rabbit_web_dispatch_app.erl",
4651
"src/rabbit_web_dispatch_listing_handler.erl",
4752
"src/rabbit_web_dispatch_registry.erl",
@@ -54,7 +59,10 @@ def all_test_beam_files(name = "all_test_beam_files"):
5459
app_name = "rabbitmq_web_dispatch",
5560
dest = "test",
5661
erlc_opts = "//:test_erlc_opts",
57-
deps = ["@cowboy//:erlang_app"],
62+
deps = [
63+
"//deps/amqp_client:erlang_app",
64+
"@cowboy//:erlang_app",
65+
],
5866
)
5967

6068
def all_srcs(name = "all_srcs"):
@@ -77,6 +85,7 @@ def all_srcs(name = "all_srcs"):
7785
"src/rabbit_cowboy_redirect.erl",
7886
"src/rabbit_cowboy_stream_h.erl",
7987
"src/rabbit_web_dispatch.erl",
88+
"src/rabbit_web_dispatch_access_control.erl",
8089
"src/rabbit_web_dispatch_app.erl",
8190
"src/rabbit_web_dispatch_listing_handler.erl",
8291
"src/rabbit_web_dispatch_registry.erl",
@@ -92,6 +101,7 @@ def all_srcs(name = "all_srcs"):
92101
)
93102
filegroup(
94103
name = "public_hdrs",
104+
srcs = ["include/rabbitmq_web_dispatch_records.hrl"],
95105
)
96106
filegroup(
97107
name = "license_files",
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
%% This Source Code Form is subject to the terms of the Mozilla Public
2+
%% License, v. 2.0. If a copy of the MPL was not distributed with this
3+
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
4+
%%
5+
%% Copyright (c) 2007-2023 VMware, Inc. or its affiliates. All rights reserved.
6+
%%
7+
8+
-record(context, {user,
9+
password = none,
10+
impl}). % storage for a context of the resource handler
11+
12+
-record(auth_settings, {auth_realm = "Basic realm=\"RabbitMQ undefined\"",
13+
basic_auth_enabled = false,
14+
oauth2_enabled = false,
15+
oauth_client_id = <<"">>}).

0 commit comments

Comments
 (0)