Adicionando permissões para udiskie-mount ao policykit

3

Estou usando o Debian jessie / stable (8.4).

Quando tento montar uma unidade USB externa usando udiskie-mount de dentro de uma tarefa cron, recebo um erro da seguinte forma abaixo. Usar udiskie-mount diretamente da linha de comando funciona bem.

+ udiskie-mount -o umask=0022 /dev/disk/by-uuid/4E1AEA7B1AEA6007 --verbose
DEBUG [2016-04-19 23:00:01,762] udiskie.config: Failed to read config file: [Errno 2] No such file or directory: '/home/faheem/.config/udiskie/config.yml'
DEBUG [2016-04-19 23:00:01,764] udiskie.config: Failed to read config file: [Errno 2] No such file or directory: '/home/faheem/.config/udiskie/config.json'
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
DEBUG [2016-04-19 23:00:02,020] udiskie.config: IgnoreDevice(match={'is_block': False}, value=True) created
DEBUG [2016-04-19 23:00:02,021] udiskie.config: IgnoreDevice(match={'is_external': False}, value=True) created
DEBUG [2016-04-19 23:00:02,021] udiskie.config: IgnoreDevice(match={'is_ignored': True}, value=True) created
DEBUG [2016-04-19 23:00:02,021] udiskie.udisks2: found device owning "/dev/disk/by-uuid/4E1AEA7B1AEA6007": "/org/freedesktop/UDisks2/block_devices/sde1"
DEBUG [2016-04-19 23:00:02,021] udiskie.mount: mounting /org/freedesktop/UDisks2/block_devices/sde1 with {'options': ['umask=0022'], 'fstype': 'ntfs'}
ERROR [2016-04-19 23:00:02,027] udiskie.mount: failed to mount /org/freedesktop/UDisks2/block_devices/sde1:
GDBus.Error:org.freedesktop.UDisks2.Error.NotAuthorizedCanObtain: Not authorized to perform operation

Eu perguntei ao mantenedor udiskie sobre isso, no link , veja link

Ele disse que eu deveria adicionar permissões ao polkit, então eu adicionei /etc/polkit-1/rules.d/50-udiskie.rules por script no link , como segue:

polkit.addRule(function(action, subject) {
  var YES = polkit.Result.YES;
    // NOTE: there must be a comma at the end of each line except for the last:
      var permission = {   
              // // required for udisks1:
              // "org.freedesktop.udisks.filesystem-mount": YES,
              // "org.freedesktop.udisks.luks-unlock": YES,
              // "org.freedesktop.udisks.drive-eject": YES,
              // "org.freedesktop.udisks.drive-detach": YES,
              // // required for udisks2:
              // "org.freedesktop.udisks2.filesystem-mount": YES,
              // "org.freedesktop.udisks2.encrypted-unlock": YES,
              // "org.freedesktop.udisks2.eject-media": YES,
              // "org.freedesktop.udisks2.power-off-drive": YES,
              // required for udisks2 if using udiskie from another seat (e.g. systemd):
              "org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
              "org.freedesktop.udisks2.filesystem-unmount-others": YES,
              "org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
              "org.freedesktop.udisks2.eject-media-other-seat": YES,
              "org.freedesktop.udisks2.power-off-drive-other-seat": YES
              };
              if (subject.isInGroup("backup")) {
                return permission[action.id];
              }
             });

Comentei tudo, exceto a parte "usando udiskie de outro lugar", de acordo com os comentários do mantenedor.

Eu reiniciei usando

# systemctl restart polkitd

Mas a montagem ainda não funciona.

A partir de uma perspectiva de imagem grande, não entendo porque montar diretamente da linha de comando é tratado de maneira diferente de uma tarefa cron. Alguém pode me esclarecer?

@derobert gentilmente me informou que a versão do PolicyKit no Debian jessie não reconhece a sintaxe JavaScript, o que pode explicar por que isso não está funcionando. Então presumivelmente eu preciso de uma versão em uma sintaxe diferente.

ATUALIZAÇÃO: de acordo com as instruções na parte inferior do link (seção "PolicyKit") eu criei o arquivo /etc/polkit-1/localauthority/50-local.d/10-udiskie.pkla com o conteúdo:

[udiskie]
Identity=unix-group:backup
Action=org.freedesktop.udisks2.filesystem-mount-other-seat;org.freedesktop.udisks2.filesystem-unmount-others;org.freedesktop.udisks2.encrypted-unlock-other-seat;org.freedesktop.udisks2.eject-media-other-seat;org.freedesktop.udisks2.power-off-drive-other-seat
ResultAny=yes

mas ainda sem sorte. Esta é aparentemente a versão antiga, e não JS, da sintaxe, que funciona com Jessie.

A seção Depurando um problema: Pollkit sugere adicionar a estrofe

polkit.addRule(function(action, subject) {
  var prefix = "org.freedesktop.udisks";
  if (action.id.slice(0, prefix.length) == prefix)
    polkit.log(action.id);
});

para o arquivo /etc/polkit-1/rules.d/10-udisks.rules . Alguém sabe o que seria a sintaxe e o nome de arquivo corretos para a sintaxe "antiga"? Eu só estaria adivinhando aqui.

    
por Faheem Mitha 19.04.2016 / 20:05

1 resposta

2

Depois de uma boa quantidade de puxões de cabelo, eu finalmente decidi usar curingas, no interesse de preservar minha sanidade, como sugerido por link .

Eu criei o arquivo %código%: com o conteúdo:

[udisks]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks.*
ResultAny=yes
[udisks2]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks2.*
ResultAny=yes

Com o script

#!/bin/bash
set -ex
udiskie-mount -o umask=0022 /dev/disk/by-uuid/4E1AEA7B1AEA6007 --verbose
udiskie-umount /dev/disk/by-uuid/4E1AEA7B1AEA6007 --verbose

Eu recebo a seguinte saída:

+ udiskie-mount -o umask=0022 /dev/disk/by-uuid/4E1AEA7B1AEA6007 --verbose
DEBUG [2016-04-21 15:29:01,634] udiskie.config: Failed to read config file: [Errno 2] No such file or directory: '/home/faheem/.config/udiskie/config.yml'
DEBUG [2016-04-21 15:29:01,637] udiskie.config: Failed to read config file: [Errno 2] No such file or directory: '/home/faheem/.config/udiskie/config.json'
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
DEBUG [2016-04-21 15:29:01,862] udiskie.config: IgnoreDevice(match={'is_block': False}, value=True) created
DEBUG [2016-04-21 15:29:01,862] udiskie.config: IgnoreDevice(match={'is_external': False}, value=True) created
DEBUG [2016-04-21 15:29:01,862] udiskie.config: IgnoreDevice(match={'is_ignored': True}, value=True) created
DEBUG [2016-04-21 15:29:01,866] udiskie.udisks2: found device owning "/dev/disk/by-uuid/4E1AEA7B1AEA6007": "/org/freedesktop/UDisks2/block_devices/sde1"
DEBUG [2016-04-21 15:29:01,866] udiskie.mount: mounting /org/freedesktop/UDisks2/block_devices/sde1 with {'fstype': 'ntfs', 'options': ['umask=0022']}
DEBUG [2016-04-21 15:29:03,354] udiskie.udisks2: +++ device_mounted: /org/freedesktop/UDisks2/block_devices/sde1
DEBUG [2016-04-21 15:29:03,354] udiskie.udisks2: +++ device_changed: /org/freedesktop/UDisks2/block_devices/sde1
INFO [2016-04-21 15:29:03,354] udiskie.mount: mounted /org/freedesktop/UDisks2/block_devices/sde1 on /media/faheem/My Passport
+ udiskie-umount /dev/disk/by-uuid/4E1AEA7B1AEA6007 --verbose
DEBUG [2016-04-21 15:29:03,490] udiskie.config: Failed to read config file: [Errno 2] No such file or directory: '/home/faheem/.config/udiskie/config.yml'
DEBUG [2016-04-21 15:29:03,492] udiskie.config: Failed to read config file: [Errno 2] No such file or directory: '/home/faheem/.config/udiskie/config.json'
DEBUG [2016-04-21 15:29:03,679] udiskie.config: IgnoreDevice(match={'is_block': False}, value=True) created
DEBUG [2016-04-21 15:29:03,679] udiskie.config: IgnoreDevice(match={'is_external': False}, value=True) created
DEBUG [2016-04-21 15:29:03,679] udiskie.config: IgnoreDevice(match={'is_ignored': True}, value=True) created
DEBUG [2016-04-21 15:29:03,681] udiskie.udisks2: found device owning "/dev/disk/by-uuid/4E1AEA7B1AEA6007": "/org/freedesktop/UDisks2/block_devices/sde1"
DEBUG [2016-04-21 15:29:03,681] udiskie.mount: unmounting /org/freedesktop/UDisks2/block_devices/sde1
DEBUG [2016-04-21 15:29:03,691] udiskie.udisks2: +++ device_changed: /org/freedesktop/UDisks2/block_devices/sde1
DEBUG [2016-04-21 15:29:03,712] udiskie.udisks2: +++ device_unmounted: /org/freedesktop/UDisks2/block_devices/sde1
INFO [2016-04-21 15:29:03,712] udiskie.mount: unmounted /org/freedesktop/UDisks2/block_devices/sde1

NOTAS E COMENTÁRIOS:

1) Policykit ou Polkit, seja o que for, é uma dor gigantesca.

2) A sintaxe usada após a versão 105 é Javascript - ninguém sabe por quê. A sintaxe usada para a versão 105 ou anterior é mostrada acima. A versão em Jessie é 105. Ver p. link e link

3) /etc/polkit-1/localauthority/50-local.d/10-udiskie.pkla fornece uma lista de todas as ações registradas. Com o script acima, as ações pkaction listadas são:

org.freedesktop.udisks2.ata-check-power
org.freedesktop.udisks2.ata-secure-erase
org.freedesktop.udisks2.ata-smart-enable-disable
org.freedesktop.udisks2.ata-smart-selftest
org.freedesktop.udisks2.ata-smart-simulate
org.freedesktop.udisks2.ata-smart-update
org.freedesktop.udisks2.ata-standby
org.freedesktop.udisks2.ata-standby-other-seat
org.freedesktop.udisks2.ata-standby-system
org.freedesktop.udisks2.cancel-job
org.freedesktop.udisks2.cancel-job-other-user
org.freedesktop.udisks2.eject-media
org.freedesktop.udisks2.eject-media-other-seat
org.freedesktop.udisks2.eject-media-system
org.freedesktop.udisks2.encrypted-change-passphrase
org.freedesktop.udisks2.encrypted-change-passphrase-system
org.freedesktop.udisks2.encrypted-lock-others
org.freedesktop.udisks2.encrypted-unlock
org.freedesktop.udisks2.encrypted-unlock-crypttab
org.freedesktop.udisks2.encrypted-unlock-other-seat
org.freedesktop.udisks2.encrypted-unlock-system
org.freedesktop.udisks2.filesystem-fstab
org.freedesktop.udisks2.filesystem-mount
org.freedesktop.udisks2.filesystem-mount-other-seat
org.freedesktop.udisks2.filesystem-mount-system
org.freedesktop.udisks2.filesystem-unmount-others
org.freedesktop.udisks2.loop-delete-others
org.freedesktop.udisks2.loop-modify-others
org.freedesktop.udisks2.loop-setup
org.freedesktop.udisks2.manage-md-raid
org.freedesktop.udisks2.manage-swapspace
org.freedesktop.udisks2.modify-device
org.freedesktop.udisks2.modify-device-other-seat
org.freedesktop.udisks2.modify-device-system
org.freedesktop.udisks2.modify-drive-settings
org.freedesktop.udisks2.modify-system-configuration
org.freedesktop.udisks2.open-device
org.freedesktop.udisks2.open-device-system
org.freedesktop.udisks2.power-off-drive
org.freedesktop.udisks2.power-off-drive-other-seat
org.freedesktop.udisks2.power-off-drive-system
org.freedesktop.udisks2.read-system-configuration-secrets
org.freedesktop.udisks2.rescan

Há também uma lista em ações do polkit Udisks .

Eu poderia me entreter tentando reduzir essa lista enquanto ainda permitia que o udiskie fosse montado e desmontado em um cron job. A questão é, isso vale a pena? E essas restrições realmente fornecem alguma segurança adicional?

4) Eu ainda estou recebendo o seguinte. Este é aparentemente um aviso - não parece estar impedindo qualquer coisa de trabalhar.

Unable to init server: Could not connect: Connection refused

ATUALIZAÇÃO: Depois de alguma discussão com Thomas G. (como ele disse, "Ótimo que funcionou. No entanto, pode não ser a melhor ideia para permitir cada ação do udisks. "), eu mudei para

[udisks2]
Identity=unix-user:faheem
Action=org.freedesktop.udisks2.filesystem-mount-other-seat;org.freedesktop.udisks2.filesystem-mount
ResultAny=yes

que ainda parece funcionar.

Followups: discussão de um possível patch para o pacote Debian udiskie .

    
por 21.04.2016 / 11:36

Tags