Como montar um arquivo de imagem sem permissão root?


41

Posso montar uma imagem do sistema de arquivos sem permissão root? Normalmente eu faria:

mount -o loop DISK_IMAGE FOLDER

Sem usar o sudo ou ativar o suid mount, existe alguma maneira adequada de fazer isso?

Eu sei que posso usar fusermountcom algumas imagens ISO, mas isso é bastante limitado, mesmo para imagens ISO, algumas das minhas imagens não podem ser montadas, mas mountsempre funcionam.


1
Se o seu mountbinário não exigir permissões SUID, você poderá usar o fakeroot sem problemas.
22412 sakisk

5
O @faif fakerootnão vai ajudar aqui: ele finge que a propriedade do arquivo é diferente, mas não pode fornecer permissões que você não possui, como ligar mount(2)quando você não é root.
Gilles 'SO- stop be evil'

O @faif Mount requer absolutamente permissões de root. Caso contrário, as possíveis consequências seriam bastante desastrosas.
Shadur

Respostas:


25

Você não pode montar nada que o administrador não tenha dado permissão para montar. Somente o root pode chamar a chamada do mountsistema. A razão para isso é que existem muitas maneiras de escalar privilégios através da montagem, como montar algo em um local do sistema, fazer com que os arquivos pareçam pertencer a outro usuário e explorar um programa que depende da propriedade do arquivo, criar arquivos setuid ou explorar bugs nos drivers do sistema de arquivos.

O mountcomando é raiz setuid. Mas apenas permite montar coisas mencionadas em fstab.

O fusermountcomando é raiz setuid. Ele só permite montar coisas através de um driver FUSE e restringe sua capacidade de fornecer arquivos com propriedade ou permissões arbitrárias dessa maneira (na maioria das configurações, todos os arquivos em uma montagem FUSE pertencem a você).

Sua melhor aposta é encontrar um sistema de arquivos FUSE capaz de ler sua imagem de disco. Para imagens ISO 9660, tente o suporte a fuseiso e ISO 9660 da UMfuse (disponível no Debian como o fuseiso9660pacote ).


+1 por explicar que sudo(embora tenha o bit SUID definido) apenas permite montar fstabentradas. A partir disso, segue-se que (a) o bit SUID faz sentido, pois um usuário comum pode montar fstabentradas (e tem permissão para executar o mountsyscall) e (b) que é uma mountrestrição do utilitário permitir apenas que as fstabentradas sejam montadas por usuários root.
David

Se você estiver trabalhando com imagens de disquete, também poderá usar o mtools para gravar apenas dados na imagem. Veja: stackoverflow.com/questions/11202706/…
Giles Bathgate

@ David, isso mudou agora? As únicas entradas que tenho no meu fstabsão para rootfs e boot. Para montar unidades USB, eu olho lsblke de mountacordo. Não tive problemas para fazer isso.
precisa saber é o seguinte

16

O Debian Wiki mostra várias maneiras de fazer isso. Aqui está uma maneira. (Isso requer o udisks2pacote.)

Primeiro

$ udisksctl loop-setup -f $PATH_TO_IMAGE
Mapped file $PATH_TO_IMAGE as /dev/loop0.

/dev/loop0 será usado para o seguinte.

Mas se o udisksctl loop-setupcomando tivesse retornado /dev/loop1, /dev/loop1teria sido usado para o seguinte.

Pode ser necessário executar se o dispositivo de auto-retorno (criado anteriormente) não for montado automaticamente:

$ udisksctl mount -b /dev/loop0
Mounted /dev/loop0 at /media/$USER/$IMAGE_NAME

Você pode ver os arquivos no disco

$ ls -l /media/$USER/$IMAGE_NAME/

Você pode desmontá-lo quando terminar

$ udisksctl unmount -b /dev/loop0
Unmounted /dev/loop0.

e se necessário:

$ udisksctl loop-delete -b /dev/loop0

1
udevil foi a opção mais conveniente
Anwar

Funcionou no Ubuntu 16.04, mas como? Parece usar dispositivos de loop que eu esperaria ser sudoapenas. travessuras setsid ou relacionadas ?
Ciro Santilli # 10/18

1
@CiroSantilli 法轮功 改造 中心 六四 事件 法轮功 Não tenho certeza. O código fonte da ferramenta está aqui . Parece usar o DBus para conversar com um daemon, mas não conheço muito bem o DBus ou o Glib.
Nick ODell

1
Observe que a -ropção para udisksctl loop-setupsignifica somente leitura, que o OP não solicitou, abandone isso para obter uma montagem gravável.
Pelle Nilsson

15

Você pode usar o módulo de montagem do FUSE para montar vários tipos de imagens de disco. Faz parte do ecossistema guestfs e não requer permissões de root.

Dê uma olhada na página de manual para obter mais detalhes.

Exemplos

1. Para um hóspede típico do Windows, que possui seu sistema de arquivos principal na primeira partição:

guestmount -a windows.img -m /dev/sda1 --ro /mnt

2. Para um hóspede típico do Linux que possui um sistema de arquivos / boot na primeira partição e o sistema de arquivos raiz em um volume lógico:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt

1
Irritantemente, a execução de guestmount no Ubuntu agora requer algum acesso root para ler imagens do kernel: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément

@ Clément Gostaria de entender por que libguestfs precisa da imagem do kernel para o seu trabalho ...
Ciro Santilli新疆改造中心法轮功六四事件

1
@CiroSantilli 法轮功 改造 中心 六四 事件 porque a libguestfs evita a necessidade de root iniciando um sistema Linux mínimo dentro de uma máquina virtual qemu (qualquer um pode iniciar uma máquina virtual qemu sem ser root). Para inicializar essa máquina, ela precisa de algum kernel e initrd.
josch 22/01

3

A maneira possível seria adicionar uma /etc/fstabentrada para o ISO com o parâmetro 'user', como

/test.iso /mnt/iso auto defaults,user 0 1

Mas você geralmente precisa de acesso root de qualquer maneira para editar este arquivo, portanto não é muito útil.


2

Na verdade, é muito fácil montar mais ou menos o que você deseja como usuário normal, sem privilégios de root, desde que a entrada correta tenha sido criada /etc/fstab.

Obviamente, modificações para /etc/fstabexigir privilégios de root. Mas uma única entrada pode ser usada com muita flexibilidade para (u) montar muitos arquivos diferentes em diferentes pontos de montagem, sem nenhuma edição adicional /etc/fstab.

Aqui estão dois scripts Bash muito curtos (5 linhas + comentários) que farão o trabalho:

para montagem

#!/bin/sh
# usage: usmount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to mount device $1 on mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
mount /tmp/UFS/drive || mount /tmp/UFS/mountpoint
# The last statement should be a bit more subtle
# Trying both is generally not useful.

e para desmontar

#!/bin/sh
# usage: usumount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to umount device $1 from mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
umount /tmp/UFS/drive || umount /tmp/UFS/mountpoint
# One of the two umounts may fail because it is ambiguous
# Actually both could fail, with careless mounting organization :-)

O diretório /tmp/UFS/é criado para isolar os links e evitar conflitos. Mas os links simbólicos podem estar em qualquer lugar no espaço do usuário, desde que permaneçam no mesmo local (mesmo caminho). A /etc/fstabentrada também não muda.

AVISO VITAL: A montagem é restrita por boas razões de segurança. Torná-lo mais flexível pode abrir portas para software malicioso. Não sou especialista em segurança e recomendo que você abra as portas não mais do que o absolutamente necessário ... usando opções para restringir o que pode ser feito com os sistemas de arquivos que podem ser montados. Se um colaborador experiente puder comentar mais sobre questões de segurança, pode ser útil.

Várias opções estão disponíveis para restringir o uso de sistemas de arquivos montados, como o noexecque impede a execução de binários ou nosuid, portanto, contribuem para a segurança. Na verdade, essas opções são adicionados como opções padrão quando as opções userou userssão usadas, que é necessariamente o caso no que fazemos abaixo. Pense duas vezes antes de substituir esses padrões. http://en.wikipedia.org/wiki/Fstab

Outras opções podem ser adicionadas para proteção adicional. Por exemplo, a opção owner na /etc/fstab entrada permitirá que os usuários lidem apenas com arquivos ou dispositivos que possuem. Veja man mount uma lista de opções: http://linux.die.net/man/8/mount .

O uso dessa /etc/fstabentrada também pode ser restrito pela propriedade user.group do diretório (ou diretórios) que contém os links simbólicos.

Explicação

Essa explicação foi escrita antes que eu percebesse que poderia simplificar as coisas nos dois scripts acima. Não pensei neles imediatamente, em parte porque tenho em mãos um problema um pouco mais complexo que eles não resolvem sem máquinas extras. Portanto, minha explicação pode ser um pouco mais complexa do que deveria, mas não tenho coragem de reescrever tudo do zero.

A idéia básica é criar entradas /etc/fstabque incluam a opção userou userspara que um usuário possa solicitar mounta montagem especificada nessa entrada, fornecendo como argumento o arquivo a ser montado ou o ponto de montagem a ser usado (mas não na minha experiência) .

Você também precisa de uma entrada adequada para umount(que é um problema ligeiramente diferente - veja abaixo). A opção usergeralmente é melhor do que, usersuma vez que restringe a permissão ao umountusuário que montou o sistema de arquivos, enquanto userspermite isso a todos. Infelizmente, a opção usernem sempre funciona e pode implicar em outras etapas a serem feitas para funcionar. Isso é discutido na opção "usuário", trabalho para montagem, não para quantidade .

Primeiro você adiciona a /etc/fstabuma entrada como:

/tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto, 0 0

e use /tmp/UFS/drivecomo um link simbólico (ou link simbólico) para qualquer dispositivo ou arquivo que você deseja montar, digamos, um arquivo contendo a imagem de um sistema de arquivos ISO /home/johndoe/john-image-file.iso.

Você também define /tmp/UFS/mountpointcomo um link simbólico para o ponto de montagem que deseja usar, por exemplo /mnt/iso.

Você pode montar john-image-file.isocom o comando:

$ mount /tmp/UFS/drive

Isso é suficiente no meu Mageia Linux, já que o uso de dispositivos de loop agora está implícito e não requer mais o uso -o loopexplícito. Não sei como isso é geral hoje. Consulte Ao montar, quando devo usar um dispositivo de loop?

Esta montagem aparece em tabelas e comandos:

$ df | tail -1
/dev/loop0       5,1G  5,1G     0 100% /mnt/iso
$ tail -1 /etc/mtab
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ mount | tail -1
/home/johndoe/john-image-file.iso on /mnt/iso type udf (ro,nosuid,nodev,noexec,relatime,utf8)
$ tail -1 /proc/mounts
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ tail -1 /proc/self/mountinfo
46 22 7:0 / /mnt/iso rw,nosuid,nodev,noexec,relatime - udf /dev/loop0 ro,utf8
$ tail -1 /proc/self/mountstats 
device /dev/loop0 mounted on /mnt/iso with fstype udf

A operação de montagem pode funcionar para qualquer arquivo ou unidade e requer apenas a criação de um link simbólico /tmp/UFS/drivepara esse arquivo ou para o dispositivo da unidade. Obviamente, outro nome e local podem ser escolhidos para o link simbólico, desde que nunca mude.

A desmontagem do arquivo depende da mesma maneira do uso apropriado de links simbólicos. No caso de um dispositivo normal correspondente a alguma unidade de harware, basta usar os mesmos links.

No entanto, os arquivos que contêm a imagem de um sistema de arquivos são montados por meio de um tipo especial de dispositivo chamado dispositivo de loop, alocado automaticamente quando você monta o arquivo.

Para desmontar o arquivo, você precisa se referir ao dispositivo de loop, não ao arquivo. Portanto, você precisa de /etc/fstabuma entrada que corresponda ao dispositivo de loop usado /etc/mtabaqui /dev/loop0e ao ponto de montagem aqui /mnt/iso.

Você não pode criar essa entrada antecipadamente, pois o dispositivo de loop pode variar, pois eles são alocados dinamicamente. Observe que também é possível usar um dispositivo de loop fixo, mas é inconveniente de outras maneiras. Consulte http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( este blog realmente inspirou a resposta aqui ).

No entanto, você pode encontrar o nome do dispositivo de loop aqui /dev/loop0, perguntando ao sistema, como fizemos acima, de várias maneiras diferentes. Em seguida, nossa /etc/fstabentrada padrão pode ser feita para apontar para o dispositivo de loop direito via link simbólico /tmp/UFS/drivee para o ponto de montagem, como feito anteriormente /tmp/UFS/mountpoint. Feito isso, o arquivo pode ser desmontado com qualquer um dos seguintes comandos (desde que não exista ambiguidade /etc/mtab, o que é um problema diferente):

$ umount /tmp/UFS/drive
$ umount /dev/loop0
$ umount /mnt/iso
$ umount /tmp/UFS/mountpoint

Como os dois links simbólicos são necessários apenas quando os comandos são emitidos, eles podem ser alterados dinamicamente. Portanto, nossa /etc/fstabentrada única permite montar qualquer número de arquivos e montá-los em qualquer ordem, sem privilégios de root.

Outras referências:


Quando as entradas do fstab apontam para links simbólicos, elas não podem ser exploradas para montar algo sem raiz, apenas criando links simbólicos? Indiretamente, não está apenas elevando o mountcomando para todos os usuários normais? E, portanto, os problemas de segurança associados a ele? Corrija-me se eu estiver errado.
Bharat G

E versões recentes das distribuições GNU / Linux (digamos debian jessie) não fornecerão um login gui quando detectar uma entrada inválida no fstab. Ele volta à sessão de login do console se devicea mountpointseção ou do fstab não apontar para uma entrada válida. O usuário precisa fazer login via sessão do console e entrar startxpara iniciar explicitamente um gerenciador de exibição.
Bharat G

0

O pacote libguestfs-tools-c possui o comando guestmount, portanto

mkdir dvd    
guestmount -a image.iso -r -i dvd 

o df mostrará image.iso montado

df

para montar temos:

guestunmount dvd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.