Quando um processo executa uma operação em um arquivo, o kernel do Linux executa a verificação na seguinte ordem:
-
Controle de Acesso Discricionário (DAC) ou controle de acesso ditado pelo usuário. Isso inclui as verificações de permissão clássicas do estilo UNIX e as Listas de Controle de Acesso POSIX (ACL) . As verificações clássicas do UNIX comparam o UID e o GID do processo atual com o UID e o GID do arquivo que está sendo acessado em relação a quais modos foram definidos (Read / Write / eXecute). A Lista de Controle de Acesso estende as verificações clássicas do UNIX para permitir mais opções com relação ao controle de permissão.
-
Controle de acesso obrigatório (MAC) ou controle de acesso baseado em políticas. Isso é implementado usando Módulos de segurança do Linux (LSM) que não são mais módulos reais (eles costumavam ser, mas foram descartados) . Eles permitem verificações adicionais com base em outros modelos além das verificações de segurança clássicas do estilo UNIX. Todos esses modelos são baseados em uma política descrevendo que tipo de operações são permitidas para qual processo em qual contexto.
Aqui está um exemplo de acesso de inodes (que inclui acesso a arquivos) para retornar minha resposta com links para uma Referência Cruzada . O " function_name
(filename: line)" dado é para a versão 3.14 do kernel Linux.
A função inode_permission
( fs / namei.c: 449 ) primeiro verifica a permissão de leitura no próprio sistema de arquivos ( sb_permission
em fs /namei.c:425 ), depois chama __inode_permission
( fs / namei.c: 394 ) para verificar permissões de leitura / gravação / execução e POSIX ACL em um inode em do_inode_permission
(fs/namei.c:368 ) (DAC) e, em seguida, permissões relacionadas ao LSM (MAC) em security_inode_permission
(security/security.c:550 ).
Houve apenas uma exceção para este pedido (DAC e MAC): foi para as verificações do mmap. Mas isso foi corrigido na versão 3.15 do kernel do Linux ( commit relevante ).