core: add user and group to NFTSet=
The benefit of using this setting is that user and group IDs, especially dynamic and random
IDs used by DynamicUser=, can be used in firewall configuration easily.
Example:
```
[Service]
NFTSet=user:inet:filter:serviceuser
```
Corresponding NFT rules:
```
table inet filter {
set serviceuser {
typeof meta skuid
}
chain service_output {
meta skuid @serviceuser accept
drop
}
}
```
```
$ cat /etc/systemd/system/dunft.service
[Service]
DynamicUser=yes
NFTSet=user:inet:filter:serviceuser
ExecStart=/bin/sleep 1000
[Install]
WantedBy=multi-user.target
$ sudo nft list set inet filter serviceuser
table inet filter {
set serviceuser {
typeof meta skuid
elements = { 64864 }
}
}
$ ps -n --format user,group,pid,command -p `systemctl show dunft.service -P MainPID`
USER GROUP PID COMMAND
64864 64864 55158 /bin/sleep 1000
```
This commit is contained in:
committed by
Topi Miettinen
parent
dc7d69b3c1
commit
3bb48b19bd
@@ -509,7 +509,7 @@ static int bus_append_nft_set(sd_bus_message *m, const char *field, const char *
|
||||
assert(set);
|
||||
|
||||
source = nft_set_source_from_string(source_str);
|
||||
if (source != NFT_SET_SOURCE_CGROUP)
|
||||
if (!IN_SET(source, NFT_SET_SOURCE_CGROUP, NFT_SET_SOURCE_USER, NFT_SET_SOURCE_GROUP))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s", field);
|
||||
|
||||
nfproto = nfproto_from_string(nfproto_str);
|
||||
|
||||
@@ -1203,6 +1203,8 @@ static const char *const nft_set_source_table[] = {
|
||||
[NFT_SET_SOURCE_PREFIX] = "prefix",
|
||||
[NFT_SET_SOURCE_IFINDEX] = "ifindex",
|
||||
[NFT_SET_SOURCE_CGROUP] = "cgroup",
|
||||
[NFT_SET_SOURCE_USER] = "user",
|
||||
[NFT_SET_SOURCE_GROUP] = "group",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(nft_set_source, int);
|
||||
@@ -1223,7 +1225,7 @@ int nft_set_add(NFTSetContext *s, NFTSetSource source, int nfproto, const char *
|
||||
_cleanup_free_ char *table_dup = NULL, *set_dup = NULL;
|
||||
|
||||
assert(s);
|
||||
assert(IN_SET(source, NFT_SET_SOURCE_ADDRESS, NFT_SET_SOURCE_PREFIX, NFT_SET_SOURCE_IFINDEX, NFT_SET_SOURCE_CGROUP));
|
||||
assert(IN_SET(source, NFT_SET_SOURCE_ADDRESS, NFT_SET_SOURCE_PREFIX, NFT_SET_SOURCE_IFINDEX, NFT_SET_SOURCE_CGROUP, NFT_SET_SOURCE_USER, NFT_SET_SOURCE_GROUP));
|
||||
assert(nfproto_is_valid(nfproto));
|
||||
assert(table);
|
||||
assert(set);
|
||||
@@ -1332,7 +1334,7 @@ int config_parse_nft_set(
|
||||
source = nft_set_source_from_string(source_str);
|
||||
if (source < 0 ||
|
||||
(ltype == NFT_SET_PARSE_NETWORK && !IN_SET(source, NFT_SET_SOURCE_ADDRESS, NFT_SET_SOURCE_PREFIX, NFT_SET_SOURCE_IFINDEX)) ||
|
||||
(ltype == NFT_SET_PARSE_CGROUP && source != NFT_SET_SOURCE_CGROUP)) {
|
||||
(ltype == NFT_SET_PARSE_CGROUP && !IN_SET(source, NFT_SET_SOURCE_CGROUP, NFT_SET_SOURCE_USER, NFT_SET_SOURCE_GROUP))) {
|
||||
_cleanup_free_ char *esc = NULL;
|
||||
|
||||
esc = cescape(source_str);
|
||||
|
||||
@@ -37,6 +37,8 @@ typedef enum NFTSetSource {
|
||||
NFT_SET_SOURCE_PREFIX,
|
||||
NFT_SET_SOURCE_IFINDEX,
|
||||
NFT_SET_SOURCE_CGROUP,
|
||||
NFT_SET_SOURCE_USER,
|
||||
NFT_SET_SOURCE_GROUP,
|
||||
_NFT_SET_SOURCE_MAX,
|
||||
_NFT_SET_SOURCE_INVALID = -EINVAL,
|
||||
} NFTSetSource;
|
||||
|
||||
Reference in New Issue
Block a user