mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-13 21:50:33 +03:00
Merge: nixos/postgresql: allow customisations of SystemCallFilter (#386345)
This commit is contained in:
commit
25310642c6
1 changed files with 120 additions and 10 deletions
|
@ -14,8 +14,11 @@ let
|
||||||
const
|
const
|
||||||
elem
|
elem
|
||||||
escapeShellArgs
|
escapeShellArgs
|
||||||
|
filter
|
||||||
filterAttrs
|
filterAttrs
|
||||||
|
getAttr
|
||||||
getName
|
getName
|
||||||
|
hasPrefix
|
||||||
isString
|
isString
|
||||||
literalExpression
|
literalExpression
|
||||||
mapAttrs
|
mapAttrs
|
||||||
|
@ -31,6 +34,8 @@ let
|
||||||
mkRemovedOptionModule
|
mkRemovedOptionModule
|
||||||
mkRenamedOptionModule
|
mkRenamedOptionModule
|
||||||
optionalString
|
optionalString
|
||||||
|
pipe
|
||||||
|
sortProperties
|
||||||
types
|
types
|
||||||
versionAtLeast
|
versionAtLeast
|
||||||
warn
|
warn
|
||||||
|
@ -124,6 +129,100 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemCallFilter = mkOption {
|
||||||
|
type = types.attrsOf (
|
||||||
|
types.coercedTo types.bool (enable: { inherit enable; }) (
|
||||||
|
types.submodule (
|
||||||
|
{ name, ... }:
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
enable = mkEnableOption "${name} in postgresql's syscall filter";
|
||||||
|
priority = mkOption {
|
||||||
|
default =
|
||||||
|
if hasPrefix "@" name then
|
||||||
|
500
|
||||||
|
else if hasPrefix "~@" name then
|
||||||
|
1000
|
||||||
|
else
|
||||||
|
1500;
|
||||||
|
defaultText = literalExpression ''
|
||||||
|
if hasPrefix "@" name then 500 else if hasPrefix "~@" name then 1000 else 1500
|
||||||
|
'';
|
||||||
|
type = types.int;
|
||||||
|
description = ''
|
||||||
|
Set the priority of the system call filter setting. Later declarations
|
||||||
|
override earlier ones, e.g.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Service]
|
||||||
|
SystemCallFilter=~read write
|
||||||
|
SystemCallFilter=write
|
||||||
|
```
|
||||||
|
|
||||||
|
results in a service where _only_ `read` is not allowed.
|
||||||
|
|
||||||
|
The ordering in the unit file is controlled by this option: the higher
|
||||||
|
the number, the later it will be added to the filterset.
|
||||||
|
|
||||||
|
By default, depending on the prefix a priority is assigned: usually, call-groups
|
||||||
|
(starting with `@`) are used to allow/deny a larger set of syscalls and later
|
||||||
|
on single syscalls are configured for exceptions. Hence, syscall groups
|
||||||
|
and negative groups are placed before individual syscalls by default.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
defaultText = literalExpression ''
|
||||||
|
{
|
||||||
|
"@system-service" = true;
|
||||||
|
"~@privileged" = true;
|
||||||
|
"~@resources" = true;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
description = ''
|
||||||
|
Configures the syscall filter for `postgresql.service`. The keys are
|
||||||
|
declarations for `SystemCallFilter` as described in {manpage}`systemd.exec(5)`.
|
||||||
|
|
||||||
|
The value is a boolean: `true` adds the attribute name to the syscall filter-set,
|
||||||
|
`false` doesn't. This is done to allow downstream configurations to turn off
|
||||||
|
restrictions made here. E.g. with
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
services.postgresql.systemCallFilter."~@resources" = false;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
it's possible to remove the restriction on `@resources` (keep in mind that
|
||||||
|
`@system-service` implies `@resources`).
|
||||||
|
|
||||||
|
As described in the section for [](#opt-services.postgresql.systemCallFilter._name_.priority),
|
||||||
|
the ordering matters. Hence, it's also possible to specify customizations with
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
services.postgresql.systemCallFilter = {
|
||||||
|
"foobar" = { enable = true; priority = 23; };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[](#opt-services.postgresql.systemCallFilter._name_.enable) is the flag whether
|
||||||
|
or not it will be added to the `SystemCallFilter` of `postgresql.service`.
|
||||||
|
|
||||||
|
Settings with a higher priority are added after filter settings with a lower
|
||||||
|
priority. Hence, syscall groups with a higher priority can discard declarations
|
||||||
|
with a lower priority.
|
||||||
|
|
||||||
|
By default, syscall groups (i.e. attribute names starting with `@`) are added
|
||||||
|
_before_ negated groups (i.e. `~@` as prefix) _before_ syscall names
|
||||||
|
and negations.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
checkConfig = mkOption {
|
checkConfig = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = true;
|
default = true;
|
||||||
|
@ -583,6 +682,21 @@ in
|
||||||
'')
|
'')
|
||||||
];
|
];
|
||||||
|
|
||||||
|
services.postgresql.systemCallFilter = mkMerge [
|
||||||
|
(mapAttrs (const mkDefault) {
|
||||||
|
"@system-service" = true;
|
||||||
|
"~@privileged" = true;
|
||||||
|
"~@resources" = true;
|
||||||
|
})
|
||||||
|
(mkIf (any extensionInstalled [ "plv8" ]) {
|
||||||
|
"@pkey" = true;
|
||||||
|
})
|
||||||
|
(mkIf (any extensionInstalled [ "citus" ]) {
|
||||||
|
"getpriority" = true;
|
||||||
|
"setpriority" = true;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
users.users.postgres = {
|
users.users.postgres = {
|
||||||
name = "postgres";
|
name = "postgres";
|
||||||
uid = config.ids.uids.postgres;
|
uid = config.ids.uids.postgres;
|
||||||
|
@ -727,16 +841,12 @@ in
|
||||||
RestrictRealtime = true;
|
RestrictRealtime = true;
|
||||||
RestrictSUIDSGID = true;
|
RestrictSUIDSGID = true;
|
||||||
SystemCallArchitectures = "native";
|
SystemCallArchitectures = "native";
|
||||||
SystemCallFilter =
|
SystemCallFilter = pipe cfg.systemCallFilter [
|
||||||
[
|
(mapAttrsToList (name: v: v // { inherit name; }))
|
||||||
"@system-service"
|
(filter (getAttr "enable"))
|
||||||
"~@privileged @resources"
|
sortProperties
|
||||||
]
|
(map (getAttr "name"))
|
||||||
++ lib.optionals (any extensionInstalled [ "plv8" ]) [ "@pkey" ]
|
];
|
||||||
++ lib.optionals (any extensionInstalled [ "citus" ]) [
|
|
||||||
"getpriority"
|
|
||||||
"setpriority"
|
|
||||||
];
|
|
||||||
UMask = if groupAccessAvailable then "0027" else "0077";
|
UMask = if groupAccessAvailable then "0027" else "0077";
|
||||||
}
|
}
|
||||||
(mkIf (cfg.dataDir != "/var/lib/postgresql/${cfg.package.psqlSchema}") {
|
(mkIf (cfg.dataDir != "/var/lib/postgresql/${cfg.package.psqlSchema}") {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue