Since systemd 243, docs were already steering users towards using `journal`:eedaf7f322systemd 246 will go one step further, it shows warnings for these units during bootup, and will [automatically convert these occurences to `journal`](f3dc6af20f): > [ 6.955976] systemd[1]: /nix/store/hwyfgbwg804vmr92fxc1vkmqfq2k9s17-unit-display-manager.service/display-manager.service:27: Standard output type syslog is obsolete, automatically updating to journal. Please update│······················ your unit file, and consider removing the setting altogether. So there's no point of keeping `syslog` here, and it's probably a better idea to just not set it, due to: > This setting defaults to the value set with DefaultStandardOutput= in > systemd-system.conf(5), which defaults to journal.
		
			
				
	
	
		
			185 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ lib, pkgs, config, ... }:
 | 
						|
let
 | 
						|
  cfg = config.security.tpm2;
 | 
						|
 | 
						|
  # This snippet is taken from tpm2-tss/dist/tpm-udev.rules, but modified to allow custom user/groups
 | 
						|
  # The idea is that the tssUser is allowed to acess the TPM and kernel TPM resource manager, while
 | 
						|
  # the tssGroup is only allowed to access the kernel resource manager
 | 
						|
  # Therefore, if either of the two are null, the respective part isn't generated
 | 
						|
  udevRules = tssUser: tssGroup: ''
 | 
						|
    ${lib.optionalString (tssUser != null) ''KERNEL=="tpm[0-9]*", MODE="0660", OWNER="${tssUser}"''}
 | 
						|
    ${lib.optionalString (tssUser != null || tssGroup != null)
 | 
						|
      ''KERNEL=="tpmrm[0-9]*", MODE="0660"''
 | 
						|
      + lib.optionalString (tssUser != null) '', OWNER="${tssUser}"''
 | 
						|
      + lib.optionalString (tssGroup != null) '', GROUP="${tssGroup}"''
 | 
						|
     }
 | 
						|
  '';
 | 
						|
 | 
						|
in {
 | 
						|
  options.security.tpm2 = {
 | 
						|
    enable = lib.mkEnableOption "Trusted Platform Module 2 support";
 | 
						|
 | 
						|
    tssUser = lib.mkOption {
 | 
						|
      description = ''
 | 
						|
        Name of the tpm device-owner and service user, set if applyUdevRules is
 | 
						|
        set.
 | 
						|
      '';
 | 
						|
      type = lib.types.nullOr lib.types.str;
 | 
						|
      default = if cfg.abrmd.enable then "tss" else "root";
 | 
						|
      defaultText = ''"tss" when using the userspace resource manager,'' +
 | 
						|
                    ''"root" otherwise'';
 | 
						|
    };
 | 
						|
 | 
						|
    tssGroup = lib.mkOption {
 | 
						|
      description = ''
 | 
						|
        Group of the tpm kernel resource manager (tpmrm) device-group, set if
 | 
						|
        applyUdevRules is set.
 | 
						|
      '';
 | 
						|
      type = lib.types.nullOr lib.types.str;
 | 
						|
      default = "tss";
 | 
						|
    };
 | 
						|
 | 
						|
    applyUdevRules = lib.mkOption {
 | 
						|
      description = ''
 | 
						|
        Whether to make the /dev/tpm[0-9] devices accessible by the tssUser, or
 | 
						|
        the /dev/tpmrm[0-9] by tssGroup respectively
 | 
						|
      '';
 | 
						|
      type = lib.types.bool;
 | 
						|
      default = true;
 | 
						|
    };
 | 
						|
 | 
						|
    abrmd = {
 | 
						|
      enable = lib.mkEnableOption ''
 | 
						|
        Trusted Platform 2 userspace resource manager daemon
 | 
						|
      '';
 | 
						|
 | 
						|
      package = lib.mkOption {
 | 
						|
        description = "tpm2-abrmd package to use";
 | 
						|
        type = lib.types.package;
 | 
						|
        default = pkgs.tpm2-abrmd;
 | 
						|
        defaultText = "pkgs.tpm2-abrmd";
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    pkcs11 = {
 | 
						|
      enable = lib.mkEnableOption ''
 | 
						|
        TPM2 PKCS#11 tool and shared library in system path
 | 
						|
        (<literal>/run/current-system/sw/lib/libtpm2_pkcs11.so</literal>)
 | 
						|
      '';
 | 
						|
 | 
						|
      package = lib.mkOption {
 | 
						|
        description = "tpm2-pkcs11 package to use";
 | 
						|
        type = lib.types.package;
 | 
						|
        default = pkgs.tpm2-pkcs11;
 | 
						|
        defaultText = "pkgs.tpm2-pkcs11";
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    tctiEnvironment = {
 | 
						|
      enable = lib.mkOption {
 | 
						|
        description = ''
 | 
						|
          Set common TCTI environment variables to the specified value.
 | 
						|
          The variables are
 | 
						|
          <itemizedlist>
 | 
						|
            <listitem>
 | 
						|
              <para>
 | 
						|
                <literal>TPM2TOOLS_TCTI</literal>
 | 
						|
              </para>
 | 
						|
            </listitem>
 | 
						|
            <listitem>
 | 
						|
              <para>
 | 
						|
                <literal>TPM2_PKCS11_TCTI</literal>
 | 
						|
              </para>
 | 
						|
            </listitem>
 | 
						|
          </itemizedlist>
 | 
						|
        '';
 | 
						|
        type = lib.types.bool;
 | 
						|
        default = false;
 | 
						|
      };
 | 
						|
 | 
						|
      interface = lib.mkOption {
 | 
						|
        description = ''
 | 
						|
          The name of the TPM command transmission interface (TCTI) library to
 | 
						|
          use.
 | 
						|
        '';
 | 
						|
        type = lib.types.enum [ "tabrmd" "device" ];
 | 
						|
        default = "device";
 | 
						|
      };
 | 
						|
 | 
						|
      deviceConf = lib.mkOption {
 | 
						|
        description = ''
 | 
						|
          Configuration part of the device TCTI, e.g. the path to the TPM device.
 | 
						|
          Applies if interface is set to "device".
 | 
						|
          The format is specified in the
 | 
						|
          <link xlink:href="https://github.com/tpm2-software/tpm2-tools/blob/master/man/common/tcti.md#tcti-options">
 | 
						|
          tpm2-tools repository</link>.
 | 
						|
        '';
 | 
						|
        type = lib.types.str;
 | 
						|
        default = "/dev/tpmrm0";
 | 
						|
      };
 | 
						|
 | 
						|
      tabrmdConf = lib.mkOption {
 | 
						|
        description = ''
 | 
						|
          Configuration part of the tabrmd TCTI, like the D-Bus bus name.
 | 
						|
          Applies if interface is set to "tabrmd".
 | 
						|
          The format is specified in the
 | 
						|
          <link xlink:href="https://github.com/tpm2-software/tpm2-tools/blob/master/man/common/tcti.md#tcti-options">
 | 
						|
          tpm2-tools repository</link>.
 | 
						|
        '';
 | 
						|
        type = lib.types.str;
 | 
						|
        default = "bus_name=com.intel.tss2.Tabrmd";
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = lib.mkIf cfg.enable (lib.mkMerge [
 | 
						|
    {
 | 
						|
      # PKCS11 tools and library
 | 
						|
      environment.systemPackages = lib.mkIf cfg.pkcs11.enable [
 | 
						|
        (lib.getBin cfg.pkcs11.package)
 | 
						|
        (lib.getLib cfg.pkcs11.package)
 | 
						|
      ];
 | 
						|
 | 
						|
      services.udev.extraRules = lib.mkIf cfg.applyUdevRules
 | 
						|
        (udevRules cfg.tssUser cfg.tssGroup);
 | 
						|
 | 
						|
      # Create the tss user and group only if the default value is used
 | 
						|
      users.users.${cfg.tssUser} = lib.mkIf (cfg.tssUser == "tss") {
 | 
						|
        isSystemUser = true;
 | 
						|
      };
 | 
						|
      users.groups.${cfg.tssGroup} = lib.mkIf (cfg.tssGroup == "tss") {};
 | 
						|
 | 
						|
      environment.variables = lib.mkIf cfg.tctiEnvironment.enable (
 | 
						|
        lib.attrsets.genAttrs [
 | 
						|
          "TPM2TOOLS_TCTI"
 | 
						|
          "TPM2_PKCS11_TCTI"
 | 
						|
        ] (_: ''${cfg.tctiEnvironment.interface}:${
 | 
						|
          if cfg.tctiEnvironment.interface == "tabrmd" then
 | 
						|
            cfg.tctiEnvironment.tabrmdConf
 | 
						|
          else
 | 
						|
            cfg.tctiEnvironment.deviceConf
 | 
						|
        }'')
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    (lib.mkIf cfg.abrmd.enable {
 | 
						|
      systemd.services."tpm2-abrmd" = {
 | 
						|
        wantedBy = [ "multi-user.target" ];
 | 
						|
        serviceConfig = {
 | 
						|
          Type = "dbus";
 | 
						|
          Restart = "always";
 | 
						|
          RestartSec = 30;
 | 
						|
          BusName = "com.intel.tss2.Tabrmd";
 | 
						|
          ExecStart = "${cfg.abrmd.package}/bin/tpm2-abrmd";
 | 
						|
          User = "tss";
 | 
						|
          Group = "nogroup";
 | 
						|
        };
 | 
						|
      };
 | 
						|
 | 
						|
      services.dbus.packages = lib.singleton cfg.abrmd.package;
 | 
						|
    })
 | 
						|
  ]);
 | 
						|
 | 
						|
  meta.maintainers = with lib.maintainers; [ lschuermann ];
 | 
						|
}
 |