63 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
import ./make-test-python.nix ({ pkgs, ... }: {
 | 
						|
  name = "usbguard";
 | 
						|
  meta = with pkgs.lib.maintainers; {
 | 
						|
    maintainers = [ tnias ];
 | 
						|
  };
 | 
						|
 | 
						|
  machine =
 | 
						|
    { ... }:
 | 
						|
    {
 | 
						|
      services.usbguard = {
 | 
						|
        enable = true;
 | 
						|
        IPCAllowedUsers = [ "alice" "root" ];
 | 
						|
 | 
						|
        # As virtual USB devices get attached to the "QEMU USB Hub" we need to
 | 
						|
        # allow Hubs. Otherwise we would have to explicitly allow them too.
 | 
						|
        rules = ''
 | 
						|
          allow with-interface equals { 09:00:00 }
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      imports = [ ./common/user-account.nix ];
 | 
						|
    };
 | 
						|
 | 
						|
  testScript = ''
 | 
						|
    # create a blank disk image for our fake USB stick
 | 
						|
    with open(machine.state_dir + "/usbstick.img", "wb") as stick:
 | 
						|
        stick.write(b"\x00" * (1024 * 1024))
 | 
						|
 | 
						|
    # wait for machine to have started and the usbguard service to be up
 | 
						|
    machine.wait_for_unit("usbguard.service")
 | 
						|
 | 
						|
    with subtest("IPC access control"):
 | 
						|
        # User "alice" is allowed to access the IPC interface
 | 
						|
        machine.succeed("su alice -c 'usbguard list-devices'")
 | 
						|
 | 
						|
        # User "bob" is not allowed to access the IPC interface
 | 
						|
        machine.fail("su bob -c 'usbguard list-devices'")
 | 
						|
 | 
						|
    with subtest("check basic functionality"):
 | 
						|
        # at this point we expect that no USB HDD is connected
 | 
						|
        machine.fail("usbguard list-devices | grep -E 'QEMU USB HARDDRIVE'")
 | 
						|
 | 
						|
        # insert usb device
 | 
						|
        machine.send_monitor_command(
 | 
						|
            f"drive_add 0 id=stick,if=none,file={stick.name},format=raw"
 | 
						|
        )
 | 
						|
        machine.send_monitor_command("device_add usb-storage,id=stick,drive=stick")
 | 
						|
 | 
						|
        # the attached USB HDD should show up after a short while
 | 
						|
        machine.wait_until_succeeds("usbguard list-devices | grep -E 'QEMU USB HARDDRIVE'")
 | 
						|
 | 
						|
        # at this point there should be a **blocked** USB HDD
 | 
						|
        machine.succeed("usbguard list-devices | grep -E 'block.*QEMU USB HARDDRIVE'")
 | 
						|
        machine.fail("usbguard list-devices | grep -E ' allow .*QEMU USB HARDDRIVE'")
 | 
						|
 | 
						|
        # allow storage devices
 | 
						|
        machine.succeed("usbguard allow-device 'with-interface { 08:*:* }'")
 | 
						|
 | 
						|
        # at this point there should be an **allowed** USB HDD
 | 
						|
        machine.succeed("usbguard list-devices | grep -E ' allow .*QEMU USB HARDDRIVE'")
 | 
						|
        machine.fail("usbguard list-devices | grep -E ' block .*QEMU USB HARDDRIVE'")
 | 
						|
  '';
 | 
						|
})
 |