Como descriptografar o dispositivo criptografado LUKS por usuário no login?

6

Eu criei o seguinte [email protected] service para 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

A idéia é descriptografar determinado dispositivo xxx criptografado pelo LUKS como xxx.luks apenas para um determinado usuário, que ativa o serviço com, por exemplo:

systemctl --user enable luks@xxx

Infelizmente, até testá-lo com

systemctl --user start luks@xxx

falha, pois sempre retorna com o código de saída 1 sem informar o motivo real. Para mim, ficou claro que o problema provavelmente está nas permissões. Ou seja, tenho certeza de que, para acionar manualmente cryptsetup luksOpen ... , é preciso elevar o shell, por exemplo, com sudo . De fato, se eu emitir

sudo systemctl start luks@xxx

funciona como um charme e similarmente

sudo systemctl enable luks@xxx

funcionaria para a fase de inicialização.

NOTE:
For such system-wide installation, it is of course needed to modify the service by replacing %h with the actual home directory of a giver user, which is ugly and does not serve the final purpose anyway.

Agora, estou ciente de pam_mount , que é capaz de realizar montagens semelhantes (que não posso usar porque não suporta cabeçalhos LUKS desanexados e porque monta dispositivos, algo que eu não quero) por usuário base e, de fato, pam_systemd lança systemctl --user , então definitivamente deve haver uma maneira de obter privilégios durante a inicialização por usuário para executar a descriptografia do dispositivo.

A propósito, os sintomas de falha de

systemctl --user enable luks@xxx

são ainda piores que os testes com

systemctl --user start luks@xxx

(que retorna apenas o código de saída 1 ). Isso é que eu não posso nem entrar com o usuário dado que se queixa de

Failed to create bus connection: No such file or directory

porque XDG_RUNTIME_DIR e DBUS_SESSION_BUS_ADDRESS não estão mais definidos, enquanto deveriam ter sido pelo serviço systemd-logind.service . Claramente, luks@xxx de alguma forma interrompe todo o processo de inicialização, mas devido a informações insuficientes no diário, não consigo identificar exatamente o motivo. Assim, minha suspeita atual sobre a falta de permissões ainda permanece.

Ansioso para propostas educadas. Obrigado.

    
por Alexander Shukaev 26.04.2017 / 23:46

2 respostas

3

Uma solução alternativa seria editar o arquivo sudoers para adicionar permissões para o usuário em questão executar /usr/lib/systemd/systemd-cryptsetup com permissões de root com a opção NOPASSWD ativada.

Você poderia editar o arquivo de serviço (específico do usuário) acima para ler:

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'

Não sei se você também deve ativar ! requiretty para que isso funcione

Atualização:

Para aumentar a segurança em torno disso, especialmente para um sistema com vários usuários, é altamente recomendável criar alguns scripts para executar as etapas 'anexar' e 'desanexar' em nome do usuário, em vez de conceder acesso ao sudo a /usr/lib/systemd/systemd-cryptsetup diretamente, caso contrário, qualquer usuário que tenha acesso para executar este comando poderá interferir potencialmente com outros volumes criptografados.

    
por 12.05.2017 / 13:34
2

Eu sugeriria criar e ativar um serviço Type=oneshot RemainAfterExit=yes para o usuário que cria um arquivo com a diretiva ExecStart e removê-lo com a diretiva ExecStop , por exemplo,

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

Você pode criar e ativar um arquivo [email protected] unit para o usuário do sistema com um caminho absoluto:

PathExists="/home/user/.decrypt"

Isso verificaria o caminho criado pelo serviço de usuário acima, ativando a unidade [email protected] quando ela é criada e desativando-a quando for removida, estabelecendo assim uma dependência indireta do serviço do sistema no serviço do usuário.

Note que para que isso funcione de forma segura, o diretório no qual o arquivo é criado deve ser gravável apenas pelo usuário, é claro.

    
por 12.05.2017 / 12:27