É possível evitar que arquivos criados sejam legíveis pelo mundo?

4

Suponha que um usuário uid = 1000 e guids = 1000,33,277 tenha permissão para criar um arquivo na pasta /files/ . Existe alguma maneira que eu possa impedir que este usuário permita que outras pessoas leiam o arquivo (que não estão pelo menos nos grupos 1000, 33 ou 277)?

Deixe o arquivo criado ser /files/user1000.file , então a pergunta pode ser específica:

Existe uma maneira de evitar esse resultado de ls /files/user1000.file -al

-rw-rw-r-- 1 1000 1000 6 May 15 17:21 user1000.file

e tem isso em vez disso:

-rw-rw---- 1 1000 1000 6 May 15 17:21 user1000.file

Talvez usando umask ? Eu sei que existem coisas como setgid drw-rws--- , então estou otimista de que possa haver um jeito.

Ainda assim, imagino que cabe ao usuário decidir fazer um chmod o+rw user1000.file

    
por humanityANDpeace 15.05.2014 / 18:42

2 respostas

6

Existem duas soluções possíveis para o seu problema, que abordam cenários ligeiramente diferentes.

O primeiro seria usar umask . O umask é um valor que informa ao kernel, quais bits de acesso limpam os arquivos recém-criados (isso afeta principalmente as chamadas do sistema open(2) e creat(2) - você ainda seria capaz de definir bits de acesso »proibidos« através do valor umask chamando explicitamente chmod(2) no arquivo recém-criado). Portanto, se você definir umask como 0 , todos os bits de acesso solicitados pelo programa que criou o arquivo serão definidos. Se você definir como 04777 , todos os bits serão apagados.

Na maioria das vezes, o valor padrão de umask seria 022 , o que significa que as permissões de gravação estão desmarcadas para o grupo e outras.

Para resolver o problema, você pode ter o valor de umask definido como 027 , o que resultaria em todos os arquivos criados com acesso de gravação removido para o grupo e todos os bits limpos para os outros:

$ umask
022
$ touch testfile.022
$ ls -l testfile.022
-rw-r--r-- 1 user user 0 May 15 18:56 testfile.022
$ umask 027
$ touch testfile.027
$ ls -l testfile.027
-rw-r----- 1 user user 0 May 15 18:57 testfile.027

Para definir isso em cada shell iniciado, coloque a chamada umask apropriada em um dos arquivos de inicialização do seu shell ( ~/.profile ou ~/.bashrc é um bom lugar para começar).

Outra abordagem seria o uso de listas de controle de acesso (ACLs) padrão no diretório em que você deseja que esses bits sejam eliminados. Essa abordagem tem duas vantagens em comparação ao uso de umask . Primeiro, ele adiciona mais granularidade, ou seja, no nível de diretório e, segundo, funciona para todos (você não precisará alterar o valor global umask ):

$ umask
022
$ mkdir acldir
$ cd acldir
$ getfacl .
# file .
# owner: user
# group: user
user::rwx
group::r-x
other::r-x
$ ls -la
total 12
drwxr-xr-x  2 user user    6 May 15 19:11 .
drwxr-xr-x 83 user user 8192 May 15:19:08 ..
$ touch testfile.noacl
$ ls -l testfile.noacl
-rw-r--r-- 1 user user 0 May 15 19:14 testfile.noacl
$ setfacl    -m 'user::rwx,group::r-x,other::---' .
$ setfacl -d -m 'user::rwx,group::r-x,other::---' .
# file: .
# owner: user
# group: user
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::---
$ touch testfile.acl
$ ls -l testfile.acl
-rw-r----- 1 user user 0 May 15 19:16 testfile.acl

Como você pode ver, com a ACL padrão em vigor, testfile.acl tem bits de acesso para outras pessoas limpas, mesmo com o valor umask definido como 022 .

Para uma compreensão mais profunda das ACLs, dê uma olhada no acl (5) página man.

Editar: Se você quiser impedir o proprietário do arquivo de fazer um chown(2) explícito no arquivo, você teria que trazer a artilharia pesada; Eu acho que não é possível de forma compatível com os padrões (em termos de POSIX). Existem várias estruturas de segurança que podem permitir a interceptação e filtragem de chamadas do sistema, mas que precisam de configuração adicional. Alguns deles são:

  • O SELinux (ainda não tinha trabalhado com isso, mas geralmente está disponível; usado pelo RedHat por padrão, por exemplo)
  • A configuração do RSBAC ( pesado permite, mas você terá um controle realmente preciso sobre o que os usuários específicos podem fazer e quais não)
  • AppArmor (acho que o Ubuntu usa isso)
por 15.05.2014 / 19:26
3

Sim, você pode fazer isso com muita facilidade. Você só precisa definir um umask padrão no seu ~/.profile (ou em /etc/profile se quiser alterá-lo para todos os usuários):

umask 0007

Com isso, novos arquivos serão criados como você deseja:

$ touch user1000.file
$ ls -l user1000.file 
-rw-rw---- 1 terdon terdon 0 May 15 18:56 user1000.file

Para mais informações sobre umask , você pode ler a, normalmente excelente, página wiki do Arch no assunto.

    
por 15.05.2014 / 18:57