로그인 시 사용자별로 LUKS로 암호화된 장치를 해독하는 방법은 무엇입니까?

로그인 시 사용자별로 LUKS로 암호화된 장치를 해독하는 방법은 무엇입니까?

[email protected]다음 서비스를 만들었 습니다 systemd.

[Unit]
Description=Cryptography Setup for '%I'
After=cryptsetup-pre.target
After=dev-mapper-%i.device
Before=cryptsetup.target
Before=umount.target
BindsTo=dev-mapper-%i.device
BindsTo=dev-mapper-%i.luks.device
Conflicts=umount.target
DefaultDependencies=no
IgnoreOnIsolate=true
RequiresMountsFor=/home

[Service]
ExecStart=/usr/lib/systemd/systemd-cryptsetup attach '%I.luks' '/dev/mapper/%I' '%h/%I/secret.key' 'luks,header=%h/%I/header'
ExecStop=/usr/lib/systemd/systemd-cryptsetup detach '%I.luks'
KillMode=none
RemainAfterExit=yes
TimeoutSec=0
Type=oneshot

[Install]
WantedBy=default.target

아이디어는 다음과 같은 서비스를 활성화하는 특정 사용자에 대해서만 특정 LUKS 암호화 xxx장치를 해독하는 것입니다.xxx.luks

systemctl --user enable luks@xxx

불행히도, 그것을 테스트하더라도

systemctl --user start luks@xxx

1실제 이유를 명시하지 않고 항상 종료 코드와 함께 반환되므로 실패합니다 . 나에게는 문제가 권한에 있을 가능성이 있다는 것이 분명했습니다. 즉, 를 수동으로 실행하려면 cryptsetup luksOpen ...예를 들어 를 사용하여 셸을 올려야 한다는 것을 확실히 알고 있습니다 sudo. 실제로 내가 발행하면

sudo systemctl start luks@xxx

그것은 매력처럼 작동하고 비슷하게 작동합니다

sudo systemctl enable luks@xxx

부팅 단계에서 작동합니다.

메모:
이러한 시스템 전체 설치의 경우 제공자 사용자의 실제 홈 디렉터리로 대체하여 서비스를 수정해야 하는 것은 물론이며 %h이는 추악하고 어쨌든 최종 목적에 부합하지 않습니다.

pam_mount이제 나는 사용자별로 유사한 마운트(분리된 LUKS 헤더를 지원하지 않고 실제로 장치를 마운트하기 때문에 사용할 수 없음)를 수행할 수 있다는 것을 알고 있습니다. 실제로는 내가 원하지 않는 것입니다. , pam_systemd실행 systemctl --user되므로 장치 암호 해독을 수행하기 위해 사용자별로 부팅하는 동안 권한을 얻을 수 있는 방법이 있어야 합니다.

그런데 고장 증상은

systemctl --user enable luks@xxx

테스트하는 것보다 훨씬 나쁩니다.

systemctl --user start luks@xxx

(종료 코드만 반환함 1) 즉, 주어진 사용자로 로그인할 수도 없습니다.

Failed to create bus connection: No such file or directory

서비스에 있어야 했지만 더 이상 설정되지 않았기 XDG_RUNTIME_DIR때문 입니다 . 분명히 어떻게든 전체 초기화 프로세스가 중단되지만 저널의 정보가 부족하여 정확한 이유를 알 수 없습니다. 따라서 권한 부족에 대한 현재의 의심은 여전히 ​​​​남아 있습니다.DBUS_SESSION_BUS_ADDRESSsystemd-logind.serviceluks@xxx

교육적인 제안을 기대합니다. 감사합니다.

답변1

대체 솔루션은 sudoers해당 사용자가 /usr/lib/systemd/systemd-cryptsetupNOPASSWD 옵션을 활성화한 상태에서 루트 권한으로 실행할 수 있는 권한을 추가하도록 파일을 편집하는 것입니다.

그런 다음 위의 (사용자별) 서비스 파일을 편집하여 다음을 읽습니다.

ExecStart=/usr/bin/sudo /usr/lib/systemd/systemd-cryptsetup attach '%I.luks' '/dev/mapper/%I' '%h/%I/secret.key' 'luks,header=%h/%I/header'
ExecStop=/usr/bin/sudo /usr/lib/systemd/systemd-cryptsetup detach '%I.luks'

당신도 활성화해야할지 잘 모르겠습니다!필수이것이 작동하려면

업데이트:

/usr/lib/systemd/systemd-cryptsetup특히 다중 사용자 시스템의 경우 보안을 강화하려면 sudo에 직접 액세스 권한을 부여하는 대신 사용자를 대신하여 '연결' 및 '분리' 단계를 수행하는 두 개의 스크립트를 만드는 것이 좋습니다. 이 명령을 실행할 수 있는 액세스 권한이 부여된 모든 사용자는 잠재적으로 다른 암호화된 볼륨을 방해할 수 있습니다.

답변2

지시어로 파일을 생성하고 지시어로 제거하는 Type=oneshot RemainAfterExit=yes사용자를 위한 서비스를 생성하고 활성화하는 것이 좋습니다 . 예:ExecStartExecStop

ExecStart="/usr/bin/touch %h/.decrypt"
ExecStop="/usr/bin/rm %h/.decrypt"

[email protected]그런 다음 절대 경로를 사용하여 시스템 사용자를 위한 유닛 파일을 생성하고 활성화할 수 있습니다 .

PathExists="/home/user/.decrypt"

이는 위의 사용자 서비스에 의해 생성된 경로를 확인하여 [email protected]생성 시 장치를 활성화하고 제거 시 장치를 비활성화하여 사용자 서비스에 대한 시스템 서비스의 간접적인 종속성을 설정합니다.

이것이 안전하게 작동하려면 물론 파일이 생성된 디렉터리에 사용자만 쓸 수 있어야 합니다.

관련 정보