summaryrefslogtreecommitdiff
path: root/modules/security
diff options
context:
space:
mode:
authorDomen Kožar <domen@dev.si>2022-09-20 13:42:31 +0100
committerGitHub <noreply@github.com>2022-09-20 13:42:31 +0100
commitb3de9dded8476b85e0210c8deab17895180ad2c3 (patch)
tree2bb77424e3c64d456a1de2f6440381e636fe50df /modules/security
parent14a12e9ee72215b5f1e7dcbbff52e21a2e1d688c (diff)
parentc1ac8e9b3df081a897a0a97f9927aee1ae9ccec3 (diff)
Merge pull request #228 from malob/sudo-touchid
Add option to enable sudo authentication with Touch ID
Diffstat (limited to 'modules/security')
-rw-r--r--modules/security/pam.nix62
1 files changed, 62 insertions, 0 deletions
diff --git a/modules/security/pam.nix b/modules/security/pam.nix
new file mode 100644
index 0000000..ac7603f
--- /dev/null
+++ b/modules/security/pam.nix
@@ -0,0 +1,62 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.security.pam;
+
+ # Implementation Notes
+ #
+ # We don't use `environment.etc` because this would require that the user manually delete
+ # `/etc/pam.d/sudo` which seems unwise given that applying the nix-darwin configuration requires
+ # sudo. We also can't use `system.patchs` since it only runs once, and so won't patch in the
+ # changes again after OS updates (which remove modifications to this file).
+ #
+ # As such, we resort to line addition/deletion in place using `sed`. We add a comment to the
+ # added line that includes the name of the option, to make it easier to identify the line that
+ # should be deleted when the option is disabled.
+ mkSudoTouchIdAuthScript = isEnabled:
+ let
+ file = "/etc/pam.d/sudo";
+ option = "security.pam.enableSudoTouchIdAuth";
+ sed = "${pkgs.gnused}/bin/sed";
+ in ''
+ ${if isEnabled then ''
+ # Enable sudo Touch ID authentication, if not already enabled
+ if ! grep 'pam_tid.so' ${file} > /dev/null; then
+ ${sed} -i '2i\
+ auth sufficient pam_tid.so # nix-darwin: ${option}
+ ' ${file}
+ fi
+ '' else ''
+ # Disable sudo Touch ID authentication, if added by nix-darwin
+ if grep '${option}' ${file} > /dev/null; then
+ ${sed} -i '/${option}/d' ${file}
+ fi
+ ''}
+ '';
+in
+
+{
+ options = {
+ security.pam.enableSudoTouchIdAuth = mkEnableOption ''
+ Enable sudo authentication with Touch ID
+
+ When enabled, this option adds the following line to /etc/pam.d/sudo:
+
+ auth sufficient pam_tid.so
+
+ (Note that macOS resets this file when doing a system update. As such, sudo
+ authentication with Touch ID won't work after a system update until the nix-darwin
+ configuration is reapplied.)
+ '';
+ };
+
+ config = {
+ system.activationScripts.pam.text = ''
+ # PAM settings
+ echo >&2 "setting up pam..."
+ ${mkSudoTouchIdAuthScript cfg.enableSudoTouchIdAuth}
+ '';
+ };
+}