로그인할 때 사용자별로 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_systemdboot 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_ADDRESS더 이상 설정되지 않지만 서비스에 의해 설정되어야 하기 때문입니다 systemd-logind.service. 분명히 luks@xxx전체 초기화 프로세스가 어떻게든 손상된 것 같지만 로그에 정보가 부족하여 정확한 이유를 알 수 없습니다. 따라서 현재 권한 부족에 대한 의심이 남아 있습니다.

교육적인 조언을 기대합니다. 감사해요.

답변1

또 다른 해결 방법은 NOPASSWD 옵션이 활성화된 상태에서 루트 권한으로 실행할 sudoers수 있도록 관련 사용자의 권한을 추가하도록 파일을 편집하는 것입니다 ./usr/lib/systemd/systemd-cryptsetup

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

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'

활성화해야 하는지 잘 모르겠습니다.!필요하다이 일을 위해

고쳐 쓰다:

보안 강화를 위해, 특히 다중 사용자 시스템의 경우 sudo 액세스 권한을 직접 부여하는 대신 사용자를 대신하여 "연결" 및 "분리" 단계를 수행하는 몇 가지 스크립트를 생성하는 것이 좋습니다. /usr/lib/systemd/systemd-cryptsetup그렇지 않으면 이 실행 권한이 있는 모든 사용자에게 명령은 다른 암호화된 볼륨을 방해할 수 있습니다.

답변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]생성 시 유닛을 활성화하고, 삭제 시 유닛을 비활성화하여 사용자 서비스에 대한 시스템 서비스의 간접적인 종속성을 설정합니다.

안전한 작업을 위해 파일이 생성된 디렉터리는 물론 사용자만 쓸 수 있어야 합니다.

관련 정보