fix(s3): wrap S3 secrets during config load
This commit is contained in:
parent
3d428a2e0e
commit
48858dee33
|
@ -21,6 +21,10 @@
|
||||||
%% API:
|
%% API:
|
||||||
-export([wrap/1, unwrap/1]).
|
-export([wrap/1, unwrap/1]).
|
||||||
|
|
||||||
|
-export_type([t/1]).
|
||||||
|
|
||||||
|
-opaque t(T) :: T | fun(() -> t(T)).
|
||||||
|
|
||||||
%%================================================================================
|
%%================================================================================
|
||||||
%% API funcions
|
%% API funcions
|
||||||
%%================================================================================
|
%%================================================================================
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
-type profile_config() :: #{
|
-type profile_config() :: #{
|
||||||
bucket := string(),
|
bucket := string(),
|
||||||
access_key_id => string(),
|
access_key_id => string(),
|
||||||
secret_access_key => string(),
|
secret_access_key => emqx_secret:t(string()),
|
||||||
host := string(),
|
host := string(),
|
||||||
port := pos_integer(),
|
port := pos_integer(),
|
||||||
url_expire_time := pos_integer(),
|
url_expire_time := pos_integer(),
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
acl := emqx_s3:acl() | undefined,
|
acl := emqx_s3:acl() | undefined,
|
||||||
url_expire_time := pos_integer(),
|
url_expire_time := pos_integer(),
|
||||||
access_key_id := string() | undefined,
|
access_key_id := string() | undefined,
|
||||||
secret_access_key := string() | undefined,
|
secret_access_key := emqx_secret:t(string()) | undefined,
|
||||||
http_pool := http_pool(),
|
http_pool := http_pool(),
|
||||||
pool_type := pool_type(),
|
pool_type := pool_type(),
|
||||||
request_timeout := timeout() | undefined,
|
request_timeout := timeout() | undefined,
|
||||||
|
@ -230,7 +230,7 @@ aws_config(#{
|
||||||
s3_bucket_after_host = true,
|
s3_bucket_after_host = true,
|
||||||
|
|
||||||
access_key_id = AccessKeyId,
|
access_key_id = AccessKeyId,
|
||||||
secret_access_key = SecretAccessKey,
|
secret_access_key = emqx_secret:unwrap(SecretAccessKey),
|
||||||
|
|
||||||
http_client = request_fun(
|
http_client = request_fun(
|
||||||
HttpPool, PoolType, with_default(MaxRetries, ?DEFAULT_MAX_RETRIES)
|
HttpPool, PoolType, with_default(MaxRetries, ?DEFAULT_MAX_RETRIES)
|
||||||
|
|
|
@ -34,11 +34,12 @@ fields(s3) ->
|
||||||
)},
|
)},
|
||||||
{secret_access_key,
|
{secret_access_key,
|
||||||
mk(
|
mk(
|
||||||
string(),
|
hoconsc:union([string(), function()]),
|
||||||
#{
|
#{
|
||||||
desc => ?DESC("secret_access_key"),
|
desc => ?DESC("secret_access_key"),
|
||||||
required => false,
|
required => false,
|
||||||
sensitive => true
|
sensitive => true,
|
||||||
|
converter => fun secret/2
|
||||||
}
|
}
|
||||||
)},
|
)},
|
||||||
{bucket,
|
{bucket,
|
||||||
|
@ -142,6 +143,14 @@ desc(s3) ->
|
||||||
desc(transport_options) ->
|
desc(transport_options) ->
|
||||||
"Options for the HTTP transport layer used by the S3 client".
|
"Options for the HTTP transport layer used by the S3 client".
|
||||||
|
|
||||||
|
secret(undefined, #{}) ->
|
||||||
|
undefined;
|
||||||
|
secret(Secret, #{make_serializable := true}) ->
|
||||||
|
unicode:characters_to_binary(emqx_secret:unwrap(Secret));
|
||||||
|
secret(Secret, #{}) ->
|
||||||
|
_ = is_binary(Secret) orelse throw({expected_type, string}),
|
||||||
|
emqx_secret:wrap(unicode:characters_to_list(Secret)).
|
||||||
|
|
||||||
translate(Conf) ->
|
translate(Conf) ->
|
||||||
translate(Conf, #{}).
|
translate(Conf, #{}).
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ t_full_config(_Config) ->
|
||||||
host := "s3.us-east-1.endpoint.com",
|
host := "s3.us-east-1.endpoint.com",
|
||||||
min_part_size := 10485760,
|
min_part_size := 10485760,
|
||||||
port := 443,
|
port := 443,
|
||||||
secret_access_key := "secret_access_key",
|
secret_access_key := Secret,
|
||||||
transport_options :=
|
transport_options :=
|
||||||
#{
|
#{
|
||||||
connect_timeout := 30000,
|
connect_timeout := 30000,
|
||||||
|
@ -74,7 +74,7 @@ t_full_config(_Config) ->
|
||||||
versions := ['tlsv1.2']
|
versions := ['tlsv1.2']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
} when is_function(Secret),
|
||||||
emqx_s3_schema:translate(#{
|
emqx_s3_schema:translate(#{
|
||||||
<<"access_key_id">> => <<"access_key_id">>,
|
<<"access_key_id">> => <<"access_key_id">>,
|
||||||
<<"secret_access_key">> => <<"secret_access_key">>,
|
<<"secret_access_key">> => <<"secret_access_key">>,
|
||||||
|
@ -126,6 +126,26 @@ t_sensitive_config_hidden(_Config) ->
|
||||||
)
|
)
|
||||||
).
|
).
|
||||||
|
|
||||||
|
t_sensitive_config_no_leak(_Config) ->
|
||||||
|
?assertThrow(
|
||||||
|
{emqx_s3_schema, [
|
||||||
|
Error = #{
|
||||||
|
kind := validation_error,
|
||||||
|
path := "s3.secret_access_key",
|
||||||
|
reason := {expected_type, string}
|
||||||
|
}
|
||||||
|
]} when map_size(Error) == 3,
|
||||||
|
emqx_s3_schema:translate(
|
||||||
|
#{
|
||||||
|
<<"bucket">> => <<"bucket">>,
|
||||||
|
<<"host">> => <<"s3.us-east-1.endpoint.com">>,
|
||||||
|
<<"port">> => 443,
|
||||||
|
<<"access_key_id">> => <<"access_key_id">>,
|
||||||
|
<<"secret_access_key">> => #{<<"1">> => <<"secret_access_key">>}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).
|
||||||
|
|
||||||
t_invalid_limits(_Config) ->
|
t_invalid_limits(_Config) ->
|
||||||
?assertException(
|
?assertException(
|
||||||
throw,
|
throw,
|
||||||
|
|
Loading…
Reference in New Issue