systemd-ask-password-console 和 systemd-cryptsetup 在 ssh.target 之后附加密码提示且无超时

systemd-ask-password-console 和 systemd-cryptsetup 在 ssh.target 之后附加密码提示且无超时

我的目标是将此 USB 的解锁延迟到系统启动后处于ssh.service活动状态,并且在输入之前永远不会超时。然而,超时仍然发生并继续getty。一旦出现密码提示(未连接 TTY),您就无法输入密码

我一直在通过 复制auto结果/etc/crypttabsystemd-cryptsetup-generator我也一直在查看systemctl list-dependencies附加到控制台 TTY 的sysinit.target操作。systemd-ask-password-console.path

在/etc/crypttab中

crypt   /dev/disk/by-label/crypt        none    nofail,noauto,timeout=0,x-systemd.device-timeout=0

/etc/systemd/system/finish.target

[Unit]
Description=Mount crypt USB
Requires=multi-user.target
[email protected] systemd-ask-password-console.path
After=ssh.target
[email protected]

[Install]
WantedBy=multi-user.target

如果我这样做Wants=mnt-crypt.mount或者Wants=dev-mapper-crypt.device它实际上尊重超时,但仍然不接受密码输入。

ls -la /etc/systemd/system/multi-user.target.wants/finish.target

lrwxrwxrwx. 1 root root 33 Jun  6 00:04 /etc/systemd/system/multi-user.target.wants/finish.target -> /etc/systemd/system/finish.target

systemctl list-dependencies

●   ├─finish.target
●   │ ├─systemd-ask-password-console.path
●   │ ├─[email protected]
    │   └─...

如果我这样做,systemctl restart systemd-ask-password-console.service我实际上可以开始输入密码,并且它都可以在执行终端和屏幕上的控制台上按预期工作(/dev/tty1)。

似乎某处存在某种关系,阻止systemd-ask-password-console在初始启动后启动,因为它会很乐意稍后同时启动systemd-ask-password-wall

同样,如果我复制它并将其编辑为新服务,它也将启动该systemd-ask password --watch --console过程。

答案1

经过多次尝试和错误,我发现您无法重用任何内置单元,因为它们严重依赖于启动过程早期的单元。我们必须创建自己的单元并使用非常简单的命令。

这些带有解锁的默认超时时间 300 秒(如果需要,请删除),然后超时后它将像往常一样通过墙壁通知其他密码请求。

我们禁用 ask-password-wall 服务,然后在控制台查询单个密码。为什么不使用systemd-ask-password-console.path|systemd-ask-password-console.service

  • 因为它也与早期启动过程密切相关,并且是--watch为了多个查询而启动的,因为在这种情况下我们只需要 1 个。

如您所见attach-crypt-usb.service[email protected]这首先是因为集成,其次是因为否则挂载单元mnt-crypt.mount会在请求时触发 systemd-cryptsetup 同时尝试连接 dm-disk。

如果您有任何意见或反馈,请随时留下 - 我会在经过实战测试后回来更新。

# /etc/systemd/system/crypt-usb.target
[Unit]
Description= Mount crypt USB late at boot

Before= [email protected]

After= sysinit.target

Conflicts= systemd-ask-password-wall.service systemd-ask-password-wall.path systemd-ask-password-console.service systemd-ask-password-console.path
Wants= attach-crypt-usb.service unlock-crypt-usb.service mount-crypt-usb.service

[Install]
WantedBy= multi-user.target

# /etc/systemd/system/attach-crypt-usb.service
[Unit]
Description= Attach Crypt USB

After= dm-event.service

# requires After=dm-event.service
ConditionPathExists= !/dev/mapper/crypt

ConditionPathIsSymbolicLink= /dev/disk/by-label/crypt

# To avoid mnt-crypt.mount attempting [email protected]
Conflicts= umount.target [email protected]
BindsTo= dev-disk-by\x2dlabel-crypt.device
After= dev-disk-by\x2dlabel-crypt.device

[Service]
ExecStart= /lib/systemd/systemd-cryptsetup attach 'crypt' '/dev/disk/by-label/crypt' 'none' 'nofail,noauto'
ExecStop= /usr/bin/umount /mnt/crypt
ExecStopPost= /usr/sbin/cryptsetup close crypt
Type= exec
RemainAfterExit= true
Restart= on-failure

[Install]
WantedBy= crypt-usb.target

# /etc/systemd/system/unlock-crypt-usb.service
[Unit]
Description= Unlock Crypt USB on console

Before= mount-crypt-usb.service
After= attach-crypt-usb.service dm-event.service

# requires After=dm-event.service
ConditionPathExists= !/dev/mapper/crypt

[Service]
TimeoutStartSec= 300
ExecStart= /usr/bin/systemd-tty-ask-password-agent --query --console=/dev/tty1
Type= oneshot
RemainAfterExit= yes

[Install]
WantedBy= crypt-usb.target

# /etc/systemd/system/mount-crypt-usb.service
[Unit]
Description= Mount crypt USB and reactivate ask-password-wall

After= unlock-crypt-usb.service dev-mapper-crypt.device

Wants= mnt-crypt.mount

[Service]
ExecStart= /usr/bin/systemctl start systemd-ask-password-wall.service systemd-ask-password-wall.path
Type= oneshot
RemainAfterExit= yes

[Install]
WantedBy= crypt-usb.target

相关内容