Sistema de arquivos de fusíveis com a opção “permissão padrão”

0

Eu sou novo para fundir. Eu montei o fusível com o seguinte comando.

/home/bin/fusexmp /mnt/fuse -o default_permissions -o allow_other -o nonempty -o hard_remove -d

Agora, se eu fizer login como usuário "teste" e tentar criar um arquivo chamado "testfile".

test@11540302:/registration> touch testfile
touch: setting times of 'testfile': Permission denied

Saída de Strace:

uname({sys="Linux", node="11540302", ...}) = 0
brk(0)                                  = 0x8055000
brk(0x8076000)                          = 0x8076000
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) =    3
dup2(3, 0)                              = 0
close(3)                                = 0
utimensat(0, NULL, NULL, 0)             = -1 EACCES (Permission denied)
close(0)                                = 0

Mas a criação do "testfile" é bem-sucedida com o proprietário como usuário root ,

-rw-r--r--  1 root trusted     0 Jan 19 13:51 testfile

Eu posso entender que o aplicativo de fusível está sendo executado no nível de raiz, a criação do arquivo aconteceu com o proprietário como raiz. Por causa desse teste, o usuário não pode executar nenhuma operação no "testfile".

Minha pergunta:

1. Desde que eu dei "allow_other" durante a montagem, por que o usuário de teste não pode ter privilégios para acessar o "testfile"?

2. Depois de logar como usuário "test" e tentar criar "testfile", por que ele está atribuindo "root" como proprietário do arquivo ao invés de "test". Isso é observado mesmo depois de fornecer "default_permission" durante a montagem.

Por favor, corrija-me se meu entendimento estiver errado.

    
por kayle 11.01.2017 / 05:46

2 respostas

1

Ok, deixe-me esclarecer: você não "montou o fusível", usou o programa de exemplo fusexmp , que é um programa de fusível muito simples que apenas transmite todas as operações para as chamadas de biblioteca padrão do Linux. Este é apenas um programa de exemplo, e um muito chato.

Você não disse como o usuário fez essa operação de montagem, mas suponho que você fez isso como root (porque senão allow_other não teria funcionado e não teria criado testfile com dono root ). Note que você pode, em princípio, montar sistemas de arquivos FUSE como qualquer usuário.

Portanto, quando o usuário test executou touch , primeiro ele abriu o arquivo no sistema de arquivos montado por fusível. Como você usou default_permissions , o sistema verificou se o usuário test tem permissão para criar arquivos nesse diretório específico (o que aparentemente foi bem-sucedido) e, em seguida, deixar fusexmp criar o arquivo. Como fusexmp é executado como root , esse arquivo foi criado como root .

Em seguida, touch queria definir a data. Como você usou default_permissions , o sistema verificou se o usuário test tem permissão para definir a data nesse arquivo específico. Esse não é o caso, portanto o sistema foi abortado com um erro de permissão, não importando se o programa fusexmp realmente seria capaz de definir a data (o que seria, executando como root).

Ainda não tenho certeza do objetivo deste exercício: você usou um programa de exemplo de uma maneira incomum e, em seguida, questionou-se sobre os resultados. Se você der default_permissions , então também deve certificar-se de que seu programa de espaço do usuário crie arquivos com o proprietário correto, etc. (que fusexmp não possui).

Se você quiser entender os sistemas de arquivos de fusíveis do ponto de vista do usuário, sugiro que experimente exemplos reais, como sshfs . Ou escreva o seu próprio programa de fusíveis e manuseie permissões, etc., você mesmo.

    
por 11.01.2017 / 12:33
0

Eu tenho a solução para esse problema.

Explicação detalhada para este problema.

Solução:

Como @dirkt disse que precisamos lidar com as permissões por conta própria.

Código para obter o chamador uid e gid:

fuse_get_context()->uid;

fuse_get_context()->gid;

Obtenha o ID do usuário chamador e o ID do grupo e defina a propriedade do arquivo / diretório enquanto cria via API do fusível.

Sempre há espaço para melhorias. Por favor, corrija-me se não estiver correto.

Obrigado dirkt pela sua explicação.

    
por 13.01.2017 / 07:40