Como permitir que não-superusuários montem qualquer sistema de arquivos?

47

É possível permitir que alguns usuários em particular (por exemplo, membros de um grupo) montem qualquer sistema de arquivos sem privilégios de superusuário no Linux?

Outra pergunta pode ter sido "de que maneira um usuário pode prejudicar um sistema montando sistemas de arquivos?"

Ciro Santilli adicionou uma nova foto
fonte
Talvezgvfs-mount-d /dev/sdX
KrisWebDev
relacionada unix.stackexchange.com/questions/20838/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

44

Existem algumas abordagens, algumas na maior parte seguras, outras nem um pouco.

A maneira insegura

Permita que qualquer uso seja executado mount, por exemplo, através do sudo. Você também pode dar-lhes raiz; é a mesma coisa. O usuário pode montar um sistema de arquivos com uma cópia raiz suid de - bashexecução que instantaneamente fornece raiz (provavelmente sem nenhum registro, além do fato de que mountfoi executada).

Como alternativa, um usuário pode montar seu próprio sistema de arquivos em cima de /etc, contendo sua própria cópia de /etc/shadowou /etc/sudoers, e então obter root com suou sudo. Ou, possivelmente, bind-mount ( mount --bind) sobre um desses dois arquivos. Ou um novo arquivo em /etc/sudoers.d.

Ataques semelhantes podem ser realizados em /etc/pam.dmuitos outros lugares.

Lembre-se de que os sistemas de arquivos nem precisam estar em um dispositivo, -o loopmontarão um arquivo que é de propriedade (e, portanto, modificável) do usuário.

A maneira mais segura: udiscos ou similar

Os vários ambientes de desktop já criaram soluções para isso, para permitir que os usuários montem mídias removíveis. Eles funcionam montando apenas em um subdiretório /mediae desativando o suporte a set-user / group-id através das opções do kernel. Opções aqui incluem udisks, udisks2, pmount, usbmount,

Se necessário, você pode escrever seu próprio script para fazer algo semelhante e invocá-lo através do sudo - mas você deve ter muito cuidado ao escrever esse script para não deixar explorações de raiz. Se você não quiser que seus usuários se lembrem do sudo, faça algo assim em um script:

#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "$@"
fi

# rest of script goes here 

A maneira como um dia estará seguro: espaços de nome de usuário

Os namespaces do Linux são uma forma muito leve de virtualização (contêineres, para ser mais específico). Em particular, com espaços de nome de usuário, qualquer usuário no sistema pode criar seu próprio ambiente no qual é raiz. Isso permitiria que eles montassem sistemas de arquivos, exceto que foram explicitamente bloqueados, exceto por alguns sistemas de arquivos virtuais. Eventualmente, os sistemas de arquivos FUSE provavelmente serão permitidos, mas os patches mais recentes que pude encontrar não cobrem dispositivos de bloco, apenas coisas como sshfs.

Além disso, muitos kernels de distribuição (por motivos de segurança) adotaram o padrão de não permitir que usuários não privilegiados usem espaços de nome de usuário; por exemplo, o Debian tem um kernel.unprivileged_userns_clonepadrão de 0. Outras distros têm configurações semelhantes, embora geralmente com nomes ligeiramente diferentes.

A melhor documentação que eu conheço sobre espaços para nome de usuário é um artigo LWN Namespaces em operação, parte 5: Espaços para nome de usuário .

Por enquanto, eu usaria o udisks2.

derobert
fonte
Obrigado pela sua resposta! BTW, você acha que é seguro permitir que os usuários do grupo mountpossam montar sistemas de arquivos como o root faz? Vou ler o documento dos espaços para nome que você vinculou e tentarei implementar essa coisa do grupo de montagem, pelo menos como um exercício.
@ gkya Espero que minha primeira seção tenha deixado claro que permitir (a) montar um sistema de arquivos sem forçar o nosuid [e também nodev]; ou (b) em um local arbitrário está basicamente dando raiz. Se você der permissão a alguém para executar mountcomandos arbitrários , é o mesmo que dar root.
Derobert 18/10/2013
@ gkya do seu comentário "muitas unidades removíveis com muitas partições em cada" em outra resposta, acho que você deseja a abordagem "udisks or similar".
Derobert 18/10/2013
1
@derobert desde que você estava falando sobre namespaces de usuário, você pode conferir o Plano 9 do Bell Labs (é o sucessor do UNIX, feito pelas mesmas pessoas). ele modela a árvore de arquivos como um namespace por processo (e não existe raiz). coisas fascinantes.
strugee
1
@ Malan OK, eu atualizei. Acho que usar namespaces de usuário para isso parece ainda mais futuro.
derobert 4/01
16

Você pode fazê-lo, mas precisa modificar a entrada /etc/fstabcorrespondente ao sistema de arquivos que deseja montar, adicionando o sinalizador usera esta entrada. Usuários sem privilégios poderão montá-lo.

Veja man mountpara mais detalhes.

MBR
fonte
1
Esta é a única resposta que posso encontrar no Google. Eu descobri que no FreeBSD, é possível permitir que os usuários montem sistemas de arquivos configurando uma variável (a saber vfs.usermount). Eu quero sth. análogo a isso. Eu uso muitas unidades removíveis com muitas partições em cada uma delas e seria complicado adicionar uma dúzia ou duas entradas ao fstab para cada uma delas.
Solução alternativa feia poderia ser permitir udevgerenciar as entradas à medida que novos dispositivos aparecem e desaparecem.
Jester
Eu não encontrei isso para funcionar no Mint ou Ubuntu. Sim, a conta de usuário padrão pode ser montada sem raiz, mas os usuários 'padrão' / 'desktop' não podem montá-la.
johny why
6

Aqui está o wiki para configurar regras do polkit para udisks / udisks2 para montar partições por grupo não raiz (por exemplo, usuários).

Salve o código abaixo em /etc/polkit-1/rules.d/50-udisks.rules

polkit.addRule(function(action, subject) {
  var YES = polkit.Result.YES;
  var permission = {
    // only required for udisks1:
    "org.freedesktop.udisks.filesystem-mount": YES,
    "org.freedesktop.udisks.filesystem-mount-system-internal": YES,
    "org.freedesktop.udisks.luks-unlock": YES,
    "org.freedesktop.udisks.drive-eject": YES,
    "org.freedesktop.udisks.drive-detach": YES,
    // only required for udisks2:
    "org.freedesktop.udisks2.filesystem-mount": YES,
    "org.freedesktop.udisks2.filesystem-mount-system": 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.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("users")) {
    return permission[action.id];
  }
});

Suponha que você esteja no grupo "usuários", usando o seguinte comando para montar uma partição (não é necessário sudo).

# udisks2
udisksctl mount --block-device /dev/sda1

# udisks
udisks --mount /dev/sda1
Miau
fonte
2
Parece o caminho a percorrer, mas não funcionou para mim.
Stéphane Gourichon 18/03/16
5

1 Veja onde funciona

No Xubuntu, ele funciona imediatamente para montar e ejetar o armazenamento em massa USB, partições do disco rígido, CD / DVDs e provavelmente mais.

Vamos supor que a solução escolhida pelo Ubuntu, usando o policyKit, seja suficientemente segura.

2 Escolha a parte relevante

No XFCE no Debian 8.3, eu precisava permitir que o usuário monte e ejete sistemas de arquivos do thunar sem senha. O que funcionou para mim é escolher um arquivo de permissão do Ubuntu.

Adicionar as linhas abaixo como raiz a um arquivo chamado /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkladeve fazer o truque:

[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes

3 Lucro!

(Na verdade, o que fiz foi escolher um pouco mais do arquivo com o mesmo nome no Ubuntu 16.04 e funcionou para mim. Se você precisar, ele se parece principalmente com o conteúdo de https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )

Stéphane Gourichon
fonte
Somente isso funciona em sistemas como o debian, não sei por que colocar regras em / etc / não funcionou.
Anwar
Não funciona no trecho debian.
Philipp Ludwig
1
Funciona no Debian Buster no XFCE! Obrigado!
Maxwel Leite 27/09
3

Você pode configurar sudopara permitir que um conjunto de usuários execute o mountcomando.

Atualização : sobre como você pode danificar um sistema montando? Por exemplo, você pode criar um shell raiz setuid em um sistema de arquivos que pode ser montado e executado para obter privilégios de root.

Bobo da corte
fonte
Eu pensei nisso, mas isso não exigirá que o usuário execute o comando sudo? Além disso, não é o usuário root que monta o sistema de arquivos, apenas nos bastidores, com esse método?
Sim, eles precisariam do sudo e sim, ele seria executado em nome da raiz. Para resolver o primeiro problema, você poderia apelido mountpara sudo mountou usar um script wrapper.
Jester
O que eu gostaria de ter é montar o sistema de arquivos sem a agência do usuário root. Mascarar esta agência com qualquer coisa não é o que eu estou procurando.
Observe que mesmo a adição userao fstab só funciona porque mounté a raiz do setuid. O kernel está verificando a raiz ou a CAP_SYS_ADMINcapacidade, para que você não possa realmente envolver o root.
Jester
Você pode configurar, como? Isso não ajuda.
Nuzzolilo 01/01
0

Para responder à sua pergunta entre parênteses, como um sistema de arquivos é um espaço reservado para arquivos, um usuário pode potencialmente executar operações prejudiciais nesse sistema, como excluir arquivos.

Resumindo as outras 2 perguntas, direi o seguinte:

  • fstabé ótimo para montagem no armazenamento permanente no momento da inicialização . Não é tão bom quando você deseja conectar unidades USB ou montar ocasionalmente alguns compartilhamentos de rede.

  • sudo mounttambém está bom se você estiver em sistemas ubuntu *. Você ainda precisará digitar uma senha.

  • udev cuidará de montar coisas como pendrives, câmeras e cartões de memória flash nos sistemas ubuntu * (mas não em distros menos amigáveis, como debian, slackware, etc.)

Acrescentarei que, historicamente, a maneira unix de dar autoridade a alguns usuários (ou grupos) para fazer coisas é através do sudoersarquivo.

Existem MUITOS guias para usá-lo por aí, então não vou sugerir nenhum detalhe. Vou dizer que usei o site do projeto de documentação do Linux para aprender sobre ele.

O que é mais importante sudoersé que você pode montar dispositivos e compartilhamentos de forma transparente - mesmo sem fornecer uma senha, se você optar por fazê-lo (tenha um cuidado extra com isso).

O que costumo fazer em um ambiente de controle é usar o sudoersarquivo para permitir que usuários de um determinado grupo montem compartilhamentos de rede de forma transparente. Então, adiciono os comandos mount.nfse mount.cifsno arquivo sudoers que permitem operações como "montar a pasta pessoal do usuário a partir de um servidor de arquivos de rede, quando o usuário faz logon no terminal do cliente" e estudo assim.

nass
fonte
1
Se você estiver usando o sudo para permitir que o usuário monte suas pastas pessoais no logon, consulte autofs.
Derobert 18/10/2013
Eu uso isso juntos; Eu não conseguia descobrir como usar autofspor conta própria para montar o /home/$USERdo servidor de arquivos, para o local /home/$USER/fromFS/no PC cliente.
Nass
0

guestmount truques libguestfs

sudo apt-get install libguestfs-tools

# Workarounds for Ubuntu 18.04 bugs.
# https://serverfault.com/questions/246835/convert-directory-to-qemu-kvm-virtual-disk-image/916697#916697
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*

# Create a test image.
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2

# Mount it, have fun, unmount!
mkdir -p mnt
# /dev/sda becuase we have a raw filesystem.
guestmount -a sysroot.ext2.qcow2 -m /dev/sda mnt
cmp sysroot/myfile mnt/myfile
guestunmount mnt

Depende de:

  • implementação dos sistemas de arquivos na área do usuário
  • FUSÍVEL

Documentos: http://libguestfs.org/guestmount.1.html

Testado no Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3.

Ciro Santilli adicionou uma nova foto
fonte