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)