summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>2021-01-27 18:28:31 +0000
committerGitHub <noreply@github.com>2021-01-27 18:28:31 +0000
commitbef2fbcd27e27342ce0227e715f63b135a6d2258 (patch)
tree84131bad52abead9018d16f4349fb1855df29d33
parent2137c13b409525616ce92598e3440c088096044a (diff)
parent0b5fd3b7847445f3683ff60c8b896a7f2adc3b0e (diff)
Merge master into staging-next
-rw-r--r--nixos/doc/manual/configuration/profiles/qemu-guest.xml5
-rw-r--r--nixos/doc/manual/release-notes/rl-2103.xml9
-rw-r--r--nixos/modules/misc/ids.nix4
-rw-r--r--nixos/modules/module-list.nix3
-rw-r--r--nixos/modules/profiles/qemu-guest.nix4
-rw-r--r--nixos/modules/security/acme.nix129
-rw-r--r--nixos/modules/security/acme.xml12
-rw-r--r--nixos/modules/security/wrappers/default.nix12
-rw-r--r--nixos/modules/security/wrappers/wrapper.c330
-rw-r--r--nixos/modules/security/wrappers/wrapper.nix21
-rw-r--r--nixos/modules/services/misc/disnix.nix98
-rw-r--r--nixos/modules/services/misc/dysnomia.nix257
-rw-r--r--nixos/modules/services/networking/pleroma.nix140
-rw-r--r--nixos/modules/services/networking/pleroma.xml132
-rw-r--r--nixos/tests/acme.nix32
-rw-r--r--nixos/tests/all-tests.nix1
-rw-r--r--nixos/tests/pleroma.nix265
-rw-r--r--pkgs/applications/graphics/mandelbulber/default.nix4
-rw-r--r--pkgs/applications/networking/Sylk/default.nix4
-rw-r--r--pkgs/applications/networking/irc/wraith/default.nix9
-rw-r--r--pkgs/applications/science/logic/coq/default.nix2
-rw-r--r--pkgs/applications/science/logic/saw-tools/default.nix2
-rw-r--r--pkgs/applications/version-management/cvs-fast-export/default.nix2
-rw-r--r--pkgs/applications/version-management/reposurgeon/default.nix2
-rw-r--r--pkgs/build-support/coq/default.nix2
-rw-r--r--pkgs/build-support/coq/meta-fetch/default.nix5
-rw-r--r--pkgs/data/fonts/jetbrains-mono/default.nix4
-rw-r--r--pkgs/development/compilers/dmd/binary.nix7
-rw-r--r--pkgs/development/compilers/ldc/binary.nix9
-rw-r--r--pkgs/development/compilers/nextpnr/default.nix4
-rw-r--r--pkgs/development/compilers/zz/default.nix16
-rw-r--r--pkgs/development/haskell-modules/make-package-set.nix35
-rw-r--r--pkgs/development/libraries/libftdi/default.nix6
-rw-r--r--pkgs/development/libraries/mapnik/default.nix4
-rw-r--r--pkgs/development/libraries/spdlog/default.nix7
-rw-r--r--pkgs/development/node-packages/node-packages.json1
-rw-r--r--pkgs/development/node-packages/node-packages.nix8017
-rw-r--r--pkgs/development/ocaml-modules/elpi/default.nix2
-rw-r--r--pkgs/development/tools/analysis/tfsec/default.nix4
-rw-r--r--pkgs/development/tools/misc/clojure-lsp/default.nix4
-rw-r--r--pkgs/misc/emulators/mame/default.nix4
-rw-r--r--pkgs/misc/vscode-extensions/default.nix17
-rw-r--r--pkgs/os-specific/linux/oci-seccomp-bpf-hook/default.nix9
-rw-r--r--pkgs/servers/mail/postfix/default.nix4
-rw-r--r--pkgs/servers/nosql/redis/default.nix4
-rw-r--r--pkgs/servers/pleroma-otp/default.nix70
-rw-r--r--pkgs/servers/xmpp/ejabberd/default.nix8
-rw-r--r--pkgs/tools/audio/abcmidi/default.nix4
-rw-r--r--pkgs/tools/filesystems/ceph/default.nix9
-rw-r--r--pkgs/tools/filesystems/irods/common.nix6
-rw-r--r--pkgs/tools/filesystems/irods/default.nix8
-rw-r--r--pkgs/tools/package-management/disnix/DisnixWebService/default.nix28
-rw-r--r--pkgs/tools/package-management/disnix/default.nix20
-rw-r--r--pkgs/tools/package-management/disnix/disnixos/default.nix20
-rw-r--r--pkgs/tools/package-management/disnix/dydisnix/default.nix27
-rw-r--r--pkgs/tools/package-management/disnix/dysnomia/default.nix71
-rw-r--r--pkgs/tools/system/gotop/default.nix9
-rw-r--r--pkgs/tools/typesetting/tex/texlive/bin.nix6
-rw-r--r--pkgs/tools/typesetting/tex/texlive/combine.nix2
-rw-r--r--pkgs/tools/typesetting/tex/texlive/default.nix4
-rw-r--r--pkgs/top-level/aliases.nix5
-rw-r--r--pkgs/top-level/all-packages.nix14
62 files changed, 4970 insertions, 4985 deletions
diff --git a/nixos/doc/manual/configuration/profiles/qemu-guest.xml b/nixos/doc/manual/configuration/profiles/qemu-guest.xml
index 5d055c45d2d8..3ed97b94b510 100644
--- a/nixos/doc/manual/configuration/profiles/qemu-guest.xml
+++ b/nixos/doc/manual/configuration/profiles/qemu-guest.xml
@@ -11,8 +11,7 @@
</para>
<para>
- It makes virtio modules available on the initrd, sets the system time from
- the hardware clock to work around a bug in qemu-kvm, and
- <link linkend="opt-security.rngd.enable">enables rngd</link>.
+ It makes virtio modules available on the initrd and sets the system time from
+ the hardware clock to work around a bug in qemu-kvm.
</para>
</section>
diff --git a/nixos/doc/manual/release-notes/rl-2103.xml b/nixos/doc/manual/release-notes/rl-2103.xml
index 0458b3564a9f..24a0281310c6 100644
--- a/nixos/doc/manual/release-notes/rl-2103.xml
+++ b/nixos/doc/manual/release-notes/rl-2103.xml
@@ -612,6 +612,15 @@ self: super:
</listitem>
<listitem>
<para>
+ In the ACME module, the data used to build the hash for the account
+ directory has changed to accomodate new features to reduce account
+ rate limit issues. This will trigger new account creation on the first
+ rebuild following this update. No issues are expected to arise from this,
+ thanks to the new account creation handling.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
<xref linkend="opt-users.users._name_.createHome" /> now always ensures home directory permissions to be <literal>0700</literal>.
Permissions had previously been ignored for already existing home directories, possibly leaving them readable by others.
The option's description was incorrect regarding ownership management and has been simplified greatly.
diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index feb9c68301d5..a0f5ce72f339 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -71,7 +71,7 @@ in
#utmp = 29; # unused
# ddclient = 30; # converted to DynamicUser = true
davfs2 = 31;
- #disnix = 33; # unused
+ #disnix = 33; # module removed
osgi = 34;
tor = 35;
cups = 36;
@@ -387,7 +387,7 @@ in
utmp = 29;
# ddclient = 30; # converted to DynamicUser = true
davfs2 = 31;
- disnix = 33;
+ #disnix = 33; # module removed
osgi = 34;
tor = 35;
#cups = 36; # unused
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 911f0434e1b8..c7a8f6b2f7c3 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -450,8 +450,6 @@
./services/misc/devmon.nix
./services/misc/dictd.nix
./services/misc/dwm-status.nix
- ./services/misc/dysnomia.nix
- ./services/misc/disnix.nix
./services/misc/docker-registry.nix
./services/misc/domoticz.nix
./services/misc/errbot.nix
@@ -727,6 +725,7 @@
./services/networking/owamp.nix
./services/networking/pdnsd.nix
./services/networking/pixiecore.nix
+ ./services/networking/pleroma.nix
./services/networking/polipo.nix
./services/networking/powerdns.nix
./services/networking/pdns-recursor.nix
diff --git a/nixos/modules/profiles/qemu-guest.nix b/nixos/modules/profiles/qemu-guest.nix
index 0ea70107f717..d4335edfcf2d 100644
--- a/nixos/modules/profiles/qemu-guest.nix
+++ b/nixos/modules/profiles/qemu-guest.nix
@@ -1,7 +1,7 @@
# Common configuration for virtual machines running under QEMU (using
# virtio).
-{ lib, ... }:
+{ ... }:
{
boot.initrd.availableKernelModules = [ "virtio_net" "virtio_pci" "virtio_mmio" "virtio_blk" "virtio_scsi" "9p" "9pnet_virtio" ];
@@ -14,6 +14,4 @@
# to the *boot time* of the host).
hwclock -s
'';
-
- security.rngd.enable = lib.mkDefault false;
}
diff --git a/nixos/modules/security/acme.nix b/nixos/modules/security/acme.nix
index 8e646ae1567e..6b62e5043caf 100644
--- a/nixos/modules/security/acme.nix
+++ b/nixos/modules/security/acme.nix
@@ -7,6 +7,11 @@ let
numCerts = length (builtins.attrNames cfg.certs);
_24hSecs = 60 * 60 * 24;
+ # Used to make unique paths for each cert/account config set
+ mkHash = with builtins; val: substring 0 20 (hashString "sha256" val);
+ mkAccountHash = acmeServer: data: mkHash "${toString acmeServer} ${data.keyType} ${data.email}";
+ accountDirRoot = "/var/lib/acme/.lego/accounts/";
+
# There are many services required to make cert renewals work.
# They all follow a common structure:
# - They inherit this commonServiceConfig
@@ -19,7 +24,7 @@ let
Type = "oneshot";
User = "acme";
Group = mkDefault "acme";
- UMask = 0027;
+ UMask = 0023;
StateDirectoryMode = 750;
ProtectSystem = "full";
PrivateTmp = true;
@@ -54,23 +59,35 @@ let
'';
};
- # Previously, all certs were owned by whatever user was configured in
- # config.security.acme.certs.<cert>.user. Now everything is owned by and
- # run by the acme user.
- userMigrationService = {
- description = "Fix owner and group of all ACME certificates";
-
- script = with builtins; concatStringsSep "\n" (mapAttrsToList (cert: data: ''
- for fixpath in /var/lib/acme/${escapeShellArg cert} /var/lib/acme/.lego/${escapeShellArg cert}; do
+ # Ensures that directories which are shared across all certs
+ # exist and have the correct user and group, since group
+ # is configurable on a per-cert basis.
+ userMigrationService = let
+ script = with builtins; ''
+ chown -R acme .lego/accounts
+ '' + (concatStringsSep "\n" (mapAttrsToList (cert: data: ''
+ for fixpath in ${escapeShellArg cert} .lego/${escapeShellArg cert}; do
if [ -d "$fixpath" ]; then
chmod -R u=rwX,g=rX,o= "$fixpath"
chown -R acme:${data.group} "$fixpath"
fi
done
- '') certConfigs);
+ '') certConfigs));
+ in {
+ description = "Fix owner and group of all ACME certificates";
- # We don't want this to run every time a renewal happens
- serviceConfig.RemainAfterExit = true;
+ serviceConfig = commonServiceConfig // {
+ # We don't want this to run every time a renewal happens
+ RemainAfterExit = true;
+
+ # These StateDirectory entries negate the need for tmpfiles
+ StateDirectory = [ "acme" "acme/.lego" "acme/.lego/accounts" ];
+ StateDirectoryMode = 755;
+ WorkingDirectory = "/var/lib/acme";
+
+ # Run the start script as root
+ ExecStart = "+" + (pkgs.writeShellScript "acme-fixperms" script);
+ };
};
certToConfig = cert: data: let
@@ -101,11 +118,10 @@ let
${toString acmeServer} ${toString data.dnsProvider}
${toString data.ocspMustStaple} ${data.keyType}
'';
- mkHash = with builtins; val: substring 0 20 (hashString "sha256" val);
certDir = mkHash hashData;
domainHash = mkHash "${concatStringsSep " " extraDomains} ${data.domain}";
- othersHash = mkHash "${toString acmeServer} ${data.keyType} ${data.email}";
- accountDir = "/var/lib/acme/.lego/accounts/" + othersHash;
+ accountHash = (mkAccountHash acmeServer data);
+ accountDir = accountDirRoot + accountHash;
protocolOpts = if useDns then (
[ "--dns" data.dnsProvider ]
@@ -142,9 +158,8 @@ let
);
in {
- inherit accountDir selfsignedDeps;
+ inherit accountHash cert selfsignedDeps;
- webroot = data.webroot;
group = data.group;
renewTimer = {
@@ -184,7 +199,10 @@ let
StateDirectory = "acme/${cert}";
- BindPaths = "/var/lib/acme/.minica:/tmp/ca /var/lib/acme/${cert}:/tmp/${keyName}";
+ BindPaths = [
+ "/var/lib/acme/.minica:/tmp/ca"
+ "/var/lib/acme/${cert}:/tmp/${keyName}"
+ ];
};
# Working directory will be /tmp
@@ -222,16 +240,22 @@ let
serviceConfig = commonServiceConfig // {
Group = data.group;
- # AccountDir dir will be created by tmpfiles to ensure correct permissions
- # And to avoid deletion during systemctl clean
- # acme/.lego/${cert} is listed so that it is deleted during systemctl clean
- StateDirectory = "acme/${cert} acme/.lego/${cert} acme/.lego/${cert}/${certDir}";
+ # Keep in mind that these directories will be deleted if the user runs
+ # systemctl clean --what=state
+ # acme/.lego/${cert} is listed for this reason.
+ StateDirectory = [
+ "acme/${cert}"
+ "acme/.lego/${cert}"
+ "acme/.lego/${cert}/${certDir}"
+ "acme/.lego/accounts/${accountHash}"
+ ];
# Needs to be space separated, but can't use a multiline string because that'll include newlines
- BindPaths =
- "${accountDir}:/tmp/accounts " +
- "/var/lib/acme/${cert}:/tmp/out " +
- "/var/lib/acme/.lego/${cert}/${certDir}:/tmp/certificates ";
+ BindPaths = [
+ "${accountDir}:/tmp/accounts"
+ "/var/lib/acme/${cert}:/tmp/out"
+ "/var/lib/acme/.lego/${cert}/${certDir}:/tmp/certificates"
+ ];
# Only try loading the credentialsFile if the dns challenge is enabled
EnvironmentFile = mkIf useDns data.credentialsFile;
@@ -248,13 +272,18 @@ let
# Working directory will be /tmp
script = ''
- set -euo pipefail
+ set -euxo pipefail
+
+ ${optionalString (data.webroot != null) ''
+ # Ensure the webroot exists
+ mkdir -p '${data.webroot}/.well-known/acme-challenge'
+ chown 'acme:${data.group}' ${data.webroot}/{.well-known,.well-known/acme-challenge}
+ ''}
echo '${domainHash}' > domainhash.txt
# Check if we can renew
- # Certificates and account credentials must exist
- if [ -e 'certificates/${keyName}.key' -a -e 'certificates/${keyName}.crt' -a "$(ls -1 accounts)" ]; then
+ if [ -e 'certificates/${keyName}.key' -a -e 'certificates/${keyName}.crt' -a -n "$(ls -1 accounts)" ]; then
# When domains are updated, there's no need to do a full
# Lego run, but it's likely renew won't work if days is too low.
@@ -664,21 +693,33 @@ in {
systemd.timers = mapAttrs' (cert: conf: nameValuePair "acme-${cert}" conf.renewTimer) certConfigs;
- # .lego and .lego/accounts specified to fix any incorrect permissions
- systemd.tmpfiles.rules = [
- "d /var/lib/acme/.lego - acme acme"
- "d /var/lib/acme/.lego/accounts - acme acme"
- ] ++ (unique (concatMap (conf: [
- "d ${conf.accountDir} - acme acme"
- ] ++ (optional (conf.webroot != null) "d ${conf.webroot}/.well-known/acme-challenge - acme ${conf.group}")
- ) (attrValues certConfigs)));
-
- # Create some targets which can be depended on to be "active" after cert renewals
- systemd.targets = mapAttrs' (cert: conf: nameValuePair "acme-finished-${cert}" {
- wantedBy = [ "default.target" ];
- requires = [ "acme-${cert}.service" ] ++ conf.selfsignedDeps;
- after = [ "acme-${cert}.service" ] ++ conf.selfsignedDeps;
- }) certConfigs;
+ systemd.targets = let
+ # Create some targets which can be depended on to be "active" after cert renewals
+ finishedTargets = mapAttrs' (cert: conf: nameValuePair "acme-finished-${cert}" {
+ wantedBy = [ "default.target" ];
+ requires = [ "acme-${cert}.service" ] ++ conf.selfsignedDeps;
+ after = [ "acme-${cert}.service" ] ++ conf.selfsignedDeps;
+ }) certConfigs;
+
+ # Create targets to limit the number of simultaneous account creations
+ # How it works:
+ # - Pick a "leader" cert service, which will be in charge of creating the account,
+ # and run first (requires + after)
+ # - Make all other cert services sharing the same account wait for the leader to
+ # finish before starting (requiredBy + before).
+ # Using a target here is fine - account creation is a one time event. Even if
+ # systemd clean --what=state is used to delete the account, so long as the user
+ # then runs one of the cert services, there won't be any issues.
+ accountTargets = mapAttrs' (hash: confs: let
+ leader = "acme-${(builtins.head confs).cert}.service";
+ dependantServices = map (conf: "acme-${conf.cert}.service") (builtins.tail confs);
+ in nameValuePair "acme-account-${hash}" {
+ requiredBy = dependantServices;
+ before = dependantServices;
+ requires = [ leader ];
+ after = [ leader ];
+ }) (groupBy (conf: conf.accountHash) (attrValues certConfigs));
+ in finishedTargets // accountTargets;
})
];
diff --git a/nixos/modules/security/acme.xml b/nixos/modules/security/acme.xml
index f24811291728..b34cbdafb2d3 100644
--- a/nixos/modules/security/acme.xml
+++ b/nixos/modules/security/acme.xml
@@ -162,6 +162,9 @@ services.httpd = {
<xref linkend="opt-security.acme.certs"/>."foo.example.com" = {
<link linkend="opt-security.acme.certs._name_.webroot">webroot</link> = "/var/lib/acme/.challenges";
<link linkend="opt-security.acme.certs._name_.email">email</link> = "foo@example.com";
+ # Ensure that the web server you use can read the generated certs
+ # Take a look at the <link linkend="opt-services.nginx.group">group</link> option for the web server you choose.
+ <link linkend="opt-security.acme.certs._name_.group">group</link> = "nginx";
# Since we have a wildcard vhost to handle port 80,
# we can generate certs for anything!
# Just make sure your DNS resolves them.
@@ -257,10 +260,11 @@ chmod 400 /var/lib/secrets/certs.secret
<para>
Should you need to regenerate a particular certificate in a hurry, such
as when a vulnerability is found in Let's Encrypt, there is now a convenient
- mechanism for doing so. Running <literal>systemctl clean acme-example.com.service</literal>
- will remove all certificate files for the given domain, allowing you to then
- <literal>systemctl start acme-example.com.service</literal> to generate fresh
- ones.
+ mechanism for doing so. Running
+ <literal>systemctl clean --what=state acme-example.com.service</literal>
+ will remove all certificate files and the account data for the given domain,
+ allowing you to then <literal>systemctl start acme-example.com.service</literal>
+ to generate fresh ones.
</para>
</section>
<section xml:id="module-security-acme-fix-jws">
diff --git a/nixos/modules/security/wrappers/default.nix b/nixos/modules/security/wrappers/default.nix
index de6213714ac3..3cbf22fea7a9 100644
--- a/nixos/modules/security/wrappers/default.nix
+++ b/nixos/modules/security/wrappers/default.nix
@@ -10,16 +10,8 @@ let
(n: v: (if v ? program then v else v // {program=n;}))
wrappers);
- securityWrapper = pkgs.stdenv.mkDerivation {
- name = "security-wrapper";
- phases = [ "installPhase" "fixupPhase" ];
- buildInputs = [ pkgs.libcap pkgs.libcap_ng pkgs.linuxHeaders ];
- hardeningEnable = [ "pie" ];
- installPhase = ''
- mkdir -p $out/bin
- $CC -Wall -O2 -DWRAPPER_DIR=\"${parentWrapperDir}\" \
- -lcap-ng -lcap ${./wrapper.c} -o $out/bin/security-wrapper
- '';
+ securityWrapper = pkgs.callPackage ./wrapper.nix {
+ inherit parentWrapperDir;
};
###### Activation script for the setcap wrappers
diff --git a/nixos/modules/security/wrappers/wrapper.c b/nixos/modules/security/wrappers/wrapper.c
index 494e9e93ac22..529669facda8 100644
--- a/nixos/modules/security/wrappers/wrapper.c
+++ b/nixos/modules/security/wrappers/wrapper.c
@@ -4,15 +4,17 @@
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/xattr.h>
#include <fcntl.h>
#include <dirent.h>
#include <assert.h>
#include <errno.h>
#include <linux/capability.h>
-#include <sys/capability.h>
#include <sys/prctl.h>
#include <limits.h>
-#include <cap-ng.h>
+#include <stdint.h>
+#include <syscall.h>
+#include <byteswap.h>
// Make sure assertions are not compiled out, we use them to codify
// invariants about this program and we want it to fail fast and
@@ -23,182 +25,172 @@ extern char **environ;
// The WRAPPER_DIR macro is supplied at compile time so that it cannot
// be changed at runtime
-static char * wrapperDir = WRAPPER_DIR;
+static char *wrapper_dir = WRAPPER_DIR;
// Wrapper debug variable name
-static char * wrapperDebug = "WRAPPER_DEBUG";
-
-// Update the capabilities of the running process to include the given
-// capability in the Ambient set.
-static void set_ambient_cap(cap_value_t cap)
-{
- capng_get_caps_process();
-
- if (capng_update(CAPNG_ADD, CAPNG_INHERITABLE, (unsigned long) cap))