mirror of
https://github.com/mailscope/kumomta.git
synced 2026-08-21 11:58:17 +00:00
206 lines
6.5 KiB
Markdown
206 lines
6.5 KiB
Markdown
---
|
|
tags:
|
|
- aaa
|
|
---
|
|
|
|
# kumo.aaa.load_acl_map
|
|
|
|
{{since('2026.03.04-bb93ecb1')}}
|
|
|
|
```lua
|
|
local map = kumo.aaa.load_acl_map(KEYSOURCE)
|
|
```
|
|
|
|
This function loads an ACL map definition file (whose syntax is described
|
|
below) and parses it into an ACL Map object which can be queried to provide an
|
|
implementation for the [get_acl_definition](../events/get_acl_definition.md)
|
|
event callback.
|
|
|
|
The parameter is a [keysource](../keysource.md) object which enables the ACL
|
|
definition to be loaded from a file, from an inline string, a hashicorp vault
|
|
or through a data loading event callback.
|
|
|
|
You can load from a file like so:
|
|
|
|
```lua
|
|
local map = kumo.aaa.load_acl_map '/opt/kumomta/etc/custom_acl.toml'
|
|
```
|
|
|
|
Or from an inline string:
|
|
|
|
```lua
|
|
local map = kumo.aaa.load_acl_map {
|
|
key_data = [=[
|
|
[[acl."http_listener/*/api/admin/baz"]]
|
|
allow = true
|
|
privileges = ["GET"]
|
|
identity.Group = "kumomta:http-listener-trusted-ip"
|
|
]=],
|
|
}
|
|
```
|
|
|
|
or any of the other forms allowed by a [keysource](../keysource.md).
|
|
|
|
## ACL Map File Syntax
|
|
|
|
The purpose of an ACL Map File is to map a given *resource* name to an *access
|
|
control list* that defines an ordered sequence of rules that might apply to that resource.
|
|
The first rule that matches defines the access level that is allowed for the session.
|
|
|
|
The following excerpt adds a new ACL rule to the resource named `http_listener/*/api/check-liveness`.
|
|
That rule allows any access, either Authenticated or Unauthenticated sessions, to perform `GET`
|
|
requests to URLs with a path of `/api/check-liveness`. Note the use of `[[` and `]]` around the
|
|
rule definition--that is TOML syntax for appending a new array entry to the definition, which has
|
|
the effect of adding a new rule to the ACL:
|
|
|
|
```toml
|
|
# Explicitly allow blanket unauthenticated access to the health status endpoint
|
|
[[acl."http_listener/*/api/check-liveness"]]
|
|
allow = true
|
|
privileges = ["GET"]
|
|
identity.Any = {}
|
|
```
|
|
|
|
This example shows how two rules are added to the same entry; the first one
|
|
grants `POST` access to members of the `kumomta:http-listener-trusted-ip` group
|
|
(which matches peer addresses that match the
|
|
[trusted_hosts](../kumo/start_http_listener/trusted_hosts.md) config option),
|
|
while the second grants `POST` access to any authenticated HTTP client:
|
|
|
|
```toml
|
|
# Trusted ips can use the injection API
|
|
[[acl."http_listener/*/api/inject"]]
|
|
allow = true
|
|
privileges = ["POST"]
|
|
identity.Group = "kumomta:http-listener-trusted-ip"
|
|
|
|
# Allow injection by other authenticated users
|
|
[[acl."http_listener/*/api/inject"]]
|
|
allow = true
|
|
privileges = ["POST"]
|
|
identity.Authenticated = {}
|
|
```
|
|
|
|
Each ACL rule comprises of the following fields:
|
|
|
|
* `allow` - a boolean indicating whether this rule allows (`true`) or denies
|
|
(`false`) access when the other criteria in the rule match.
|
|
|
|
* `privileges` - an array listing the set of privilege names which are covered
|
|
by this rule. For example `["POST", "GET"]` means that an auth check for
|
|
a privilege of either `POST` OR `GET` will potentially match this rule,
|
|
assuming that the other criteria are a match.
|
|
|
|
* `identity` - defines the identity matching criteria, for example, a required
|
|
group or authentication identity. This field is mutually exclusive with
|
|
`criteria`, described in the next bullet.
|
|
|
|
* `criteria` - an extended set of matching criteria that allows using logical
|
|
operators to group or invert other identity criteria. This is useful to
|
|
define a rule that allows certain identities access but only if they
|
|
are connected from an approved IP address. This field is mutually exclusive
|
|
with the `identity` field described in the bullet above this one.
|
|
|
|
`identity` and `criteria` examples are found below:
|
|
|
|
## Individual Identity
|
|
|
|
```toml
|
|
identity.Individual = "john.smith"
|
|
```
|
|
|
|
This condition is satisfied (evaluates as `true`) when the auth into lists
|
|
the specified user name in its list of authenticated identities.
|
|
|
|
## Group Membership
|
|
|
|
```toml
|
|
identity.Group = 'kumomta:http-listener-trusted-ip'
|
|
```
|
|
|
|
This condition is satisfied (evaluates as `true`) when the auth info lists the
|
|
specified group name in its list of groups.
|
|
|
|
In the example above the `kumomta:http-listener-trusted-ip` group is
|
|
automatically added to the group membership when the peer-ip associated with
|
|
the incoming IP address is among the set of
|
|
[trusted_hosts](../kumo/start_http_listener/trusted_hosts.md) defined in the
|
|
HTTP listener.
|
|
|
|
Other groups may be populated into the auth info through authentication related
|
|
event callbacks, depending on the context.
|
|
|
|
## Any Authenticated Identity
|
|
|
|
```toml
|
|
identity.Authenticated = {}
|
|
```
|
|
|
|
This condition is satisfied (evaluates as `true`) when the auth info lists at
|
|
least one user identity in its list of identities, which is the case when
|
|
authentication has been performed successfully.
|
|
|
|
## Unauthenticated Identity
|
|
|
|
```toml
|
|
identity.Unauthenticated = {}
|
|
```
|
|
|
|
This condition is satisfied (evaluates as `true`) when the auth info has no
|
|
authenticated identities associated with it, which is true when no
|
|
authentication has been performed, or has not been performed successfully.
|
|
|
|
## Matching any authentication state
|
|
|
|
```toml
|
|
identity.Any = {}
|
|
```
|
|
|
|
## Grouping: AllOf
|
|
|
|
The `AllOf` condition is satisifed (evaluates as `true`) when all of the
|
|
conditions defined within it also evaluate to true. This is a logical `AND`
|
|
operation.
|
|
|
|
In the example below, the critiera will only evaluate as true if the session
|
|
belongs to a hypothetical `admins` group AND if the peer address is `10.0.0.1`:
|
|
|
|
```toml
|
|
criteria.AllOf = [ {Identity = { Group = 'admins' }}, {Identity={Machine = "10.0.0.1"}} ]
|
|
```
|
|
|
|
## Grouping: AnyOf
|
|
|
|
The `AnyOf` condition is satisifed (evaluates as `true`) when any of the
|
|
conditions defined within it also evaluate to true. This is a logical `OR`
|
|
operation.
|
|
|
|
In the example below, the critiera will evaluate as true if either the session
|
|
belongs to a hypothetical `admins` group OR if the peer address is `10.0.0.1`:
|
|
|
|
```toml
|
|
criteria.AnyOf = [ {Identity = { Group = 'admins' }}, {Identity={Machine = "10.0.0.1"}} ]
|
|
```
|
|
|
|
## Inverting Criteria
|
|
|
|
The `Not` condition is satisifed (evaluates as `true`) when the term within it
|
|
evaluates to `false`. This is a logical `NOT` operation.
|
|
|
|
In the example below, the critiera will evaluate as true if the session is NOT
|
|
a member of a hypothetical `admins` group.
|
|
|
|
```toml
|
|
criteria.Not = {Identity = { Group = 'admins' }}
|
|
```
|
|
|
|
## The Default ACL map
|
|
|
|
The default ACL map from the `main` branch at the time that this documentation
|
|
was built is included below, which may be different from the ACL in your
|
|
currently deployed version of KumoMTA.
|
|
|
|
```toml
|
|
--8<-- "acls/default.toml"
|
|
```
|