 962e15aebc
			
		
	
	
		962e15aebc
		
	
	
	
	
		
			
			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 ];
 | |
| }
 |