acl — Listas de Controle de Acesso
DESCRIÇÃO
Esta página de manual descreve as Listas de Controle de Acesso POSIX, que são usadas para definir direitos de acesso discricionários mais detalhados para arquivos e diretórios.
TIPOS DE ACL
Cada objeto pode ser considerado como tendo associada a ele uma ACL que governa o acesso discricionário a esse objeto; esta ACL é referida como uma ACL de acesso. Além disso, um diretório pode ter associada a ele uma ACL que governa a ACL de acesso inicial para objetos criados dentro desse diretório; esta ACL é referida como uma ACL padrão.
ENTRADAS DE ACL
Uma ACL consiste em um conjunto de entradas de ACL. Uma entrada de ACL especifica as permissões de acesso no objeto associado para um usuário individual ou um grupo de usuários como uma combinação de permissões de leitura, gravação e pesquisa/execução.
Uma entrada de ACL contém um tipo de tag de entrada, um qualificador de tag de entrada opcional e um conjunto de permissões. Usamos o termo qualificador para denotar o qualificador de tag de entrada de uma entrada de ACL.
O qualificador denota o identificador de um usuário ou um grupo, para entradas com tipos de tag de ACL_USER ou ACL_GROUP, respectivamente. As entradas com tipos de tag diferentes de ACL_USER ou ACL_GROUP não têm qualificadores definidos.
Os seguintes tipos de tag de entrada são definidos:
ACL_USER_OBJ A entrada ACL_USER_OBJ denota os direitos de acesso para o proprietário do arquivo.
ACL_USER As entradas ACL_USER denotam os direitos de acesso para usuários identificados pelo qualificador da entrada.
ACL_GROUP_OBJ A entrada ACL_GROUP_OBJ denota os direitos de acesso para o grupo do arquivo.
ACL_GROUP As entradas ACL_GROUP denotam os direitos de acesso para grupos identificados pelo qualificador da entrada.
ACL_MASK A entrada ACL_MASK denota os direitos de acesso máximos que podem ser concedidos por entradas do tipo ACL_USER, ACL_GROUP_OBJ ou ACL_GROUP.
ACL_OTHER A entrada ACL_OTHER denota os direitos de acesso para processos que não correspondem a nenhuma outra entrada na ACL.
Quando uma verificação de acesso é executada, as entradas ACL_USER_OBJ e ACL_USER são testadas em relação ao ID de usuário efetivo. O ID de grupo efetivo, bem como todos os IDs de grupo suplementares, são testados em relação às entradas ACL_GROUP_OBJ e ACL_GROUP.
ACLs VÁLIDAS
Uma ACL válida contém exatamente uma entrada com cada um dos tipos de tag ACL_USER_OBJ, ACL_GROUP_OBJ e ACL_OTHER. As entradas com tags ACL_USER e ACL_GROUP podem aparecer zero ou mais vezes em uma ACL. Uma ACL que contém entradas de tag ACL_USER ou ACL_GROUP deve conter exatamente uma entrada do tipo de tag ACL_MASK. Se uma ACL não contiver entradas de tag ACL_USER ou ACL_GROUP, a entrada ACL_MASK é opcional.
Todos os qualificadores de ID de usuário devem ser exclusivos entre todas as entradas do tipo de tag ACL_USER, e todos os IDs de grupo devem ser exclusivos entre todas as entradas do tipo de tag ACL_GROUP.
A função acl_get_file() retorna uma ACL com zero entradas de ACL como a ACL padrão de um diretório, se o diretório não estiver associado a uma ACL padrão. A função acl_set_file() também aceita uma ACL com zero entradas de ACL como uma ACL padrão válida para diretórios, indicando que o diretório não deve ser associado a uma ACL padrão. Isso é equivalente a usar a função acl_delete_def_file().
CORRESPONDÊNCIA ENTRE ENTRADAS DE ACL E BITS DE PERMISSÃO DE ARQUIVO
As permissões definidas pelas ACLs são um superconjunto das permissões especificadas pelos bits de permissão de arquivo.
Existe uma correspondência entre as permissões de proprietário, grupo e outros e entradas específicas de ACL: as permissões de proprietário correspondem às permissões da entrada ACL_USER_OBJ. Se a ACL tiver uma entrada ACL_MASK, as permissões de grupo correspondem às permissões da entrada ACL_MASK. Caso contrário, se a ACL não tiver uma entrada ACL_MASK, as permissões de grupo correspondem às permissões da entrada ACL_GROUP_OBJ. As permissões de outros correspondem às permissões da entrada ACL_OTHER.
As permissões de proprietário, grupo e outros sempre correspondem às permissões da entrada de ACL correspondente. A modificação dos bits de permissão de arquivo resulta na modificação das entradas de ACL associadas, e a modificação dessas entradas de ACL resulta na modificação dos bits de permissão de arquivo.
CRIAÇÃO DE OBJETOS E ACLs PADRÃO
A ACL de acesso de um objeto de arquivo é inicializada quando o objeto é criado com qualquer uma das funções creat(), mkdir(), mknod(), mkfifo() ou open(). Se uma ACL padrão estiver associada a um diretório, o parâmetro mode das funções que criam objetos de arquivo e a ACL padrão do diretório são usados para determinar a ACL do novo objeto:
O novo objeto herda a ACL padrão do diretório pai como sua ACL de acesso.
As entradas de ACL de acesso correspondentes aos bits de permissão de arquivo são modificadas para que não contenham permissões que não estejam contidas nas permissões especificadas pelo parâmetro `mode`.
Se nenhuma ACL padrão estiver associada a um diretório, o parâmetro mode das funções que criam objetos de arquivo e a máscara de criação de arquivo (veja umask(2)) são usados para determinar a ACL do novo objeto:
O novo objeto recebe uma ACL de acesso contendo entradas dos tipos de tag ACL\_USER\_OBJ, ACL\_GROUP\_OBJ e ACL\_OTHER. As permissões dessas entradas são definidas como as permissões especificadas pela máscara de criação de arquivo.
As entradas de ACL de acesso correspondentes aos bits de permissão de arquivo são modificadas para que não contenham permissões que não estejam contidas nas permissões especificadas pelo parâmetro `mode`.
ALGORITMO DE VERIFICAÇÃO DE ACESSO
Um processo pode solicitar acesso de leitura, gravação ou execução/pesquisa a um objeto de arquivo protegido por uma ACL. O algoritmo de verificação de acesso determina se o acesso ao objeto será concedido.
Se o ID de usuário efetivo do processo corresponder ao ID de usuário do proprietário do objeto de arquivo, então
se a entrada ACL_USER_OBJ contiver as permissões solicitadas, o acesso é concedido,
caso contrário, o acesso é negado.
caso contrário, se o ID de usuário efetivo do processo corresponder ao qualificador de qualquer entrada do tipo
ACL_USER, então
se a entrada ACL_USER correspondente e a entrada ACL_MASK contiverem as permissões solicitadas, o acesso é concedido,
caso contrário, o acesso é negado.
caso contrário, se o ID de grupo efetivo ou qualquer um dos IDs de grupo suplementares do processo corresponderem
ao grupo do arquivo ou ao qualificador de qualquer entrada do tipo ACL_GROUP, então
se a ACL contiver uma entrada ACL_MASK, então
se a entrada ACL_MASK e qualquer uma das entradas ACL_GROUP_OBJ ou ACL_GROUP correspondentes
contiverem as permissões solicitadas, o acesso é concedido,
caso contrário, o acesso é negado.
caso contrário (observe que não pode haver entradas ACL_GROUP sem uma entrada ACL_MASK)
se a entrada ACL_GROUP_OBJ contiver as permissões solicitadas, o acesso é
concedido,
caso contrário, o acesso é negado.
caso contrário, se a entrada ACL_OTHER contiver as permissões solicitadas, o acesso é concedido.
caso contrário, o acesso é negado.
FORMAS DE TEXTO DE ACL
Uma forma de texto longa e uma forma curta para representar ACLs são definidas. Em ambas as formas, as entradas da ACL são
representadas como três campos separados por dois pontos: uma tag de tipo de entrada da ACL, um qualificador de entrada da ACL e
as permissões de acesso discricionário. O primeiro campo contém uma das seguintes palavras-chave de tipo de tag de entrada:
user Uma entrada de ACL de usuário especifica o acesso concedido ao proprietário do arquivo (tag de tipo de entrada ACL_USER_OBJ) ou a um usuário especificado (tag de tipo de entrada ACL_USER).
group Uma entrada de ACL de grupo especifica o acesso concedido ao grupo do arquivo (tag de tipo de entrada ACL_GROUP_OBJ) ou a um grupo especificado (tag de tipo de entrada ACL_GROUP).
mask Uma entrada de máscara especifica o acesso máximo que pode ser concedido por qualquer entrada de ACL, exceto a entrada do usuário para o
proprietário do arquivo e a entrada "other" (tag de tipo de entrada ACL_MASK).
other Uma entrada "other" especifica o acesso concedido a qualquer processo que não corresponda a nenhuma entrada de ACL de usuário ou grupo (tag de tipo de entrada ACL_OTHER).
O segundo campo contém o identificador de usuário ou grupo do usuário ou grupo associado à entrada da ACL para entradas de tipo de tag de entrada ACL_USER ou ACL_GROUP, e está vazio para todas as outras entradas. Um identificador de usuário pode ser um nome de usuário ou um número de ID de usuário em formato decimal. Um identificador de grupo pode ser um nome de grupo ou um número de ID de grupo em formato decimal.
O terceiro campo contém as permissões de acesso discricionário. As permissões de leitura, gravação e busca/execução são representadas pelos caracteres r, w e x, nesta ordem. Cada um desses caracteres é substituído pelo caractere "-" para denotar que uma permissão está ausente na entrada da ACL. Ao converter do formato de texto para a representação interna, as permissões que estão ausentes não precisam ser especificadas.
Espaços em branco são permitidos no início e no final de cada entrada ACL, e imediatamente antes e depois de um separador de campo (o caractere de dois pontos).
FORMA DE TEXTO LONGO
A forma de texto longo contém uma entrada ACL por linha. Além disso, um sinal de número (#) pode iniciar um comentário que se estende até o final da linha. Se uma entrada ACL_USER, ACL_GROUP_OBJ ou ACL_GROUP contiver permissões que não também estejam contidas na entrada ACL_MASK, a entrada é seguida por um sinal de número, a string “effective:” e as permissões de acesso efetivas definidas por essa entrada. Este é um exemplo da forma de texto longo:
user::rw-
user:lisa:rw- #effective:r-
group::r-
group:toolies:rw- #effective:r-
mask::r-
other::r-
FORMA DE TEXTO CURTO
A forma de texto curto é uma sequência de entradas ACL separadas por vírgulas, e é usada para entrada. Comentários não são suportados. As palavras-chave do tipo de tag de entrada podem aparecer em sua forma completa não abreviada ou em sua forma abreviada de uma letra. A abreviação para usuário é u, a abreviação para grupo é g, a abreviação para máscara é m e a abreviação para outros é o. As permissões podem conter no máximo um de cada um dos seguintes caracteres em qualquer ordem: r, w, x.
Estes são exemplos da forma de texto curto:
u::rw-,u:lisa:rw-,g::r--,g:toolies:rw-,m::r--,o::r-
g:toolies:rw,u:lisa:rw,u::wr,g::r,o::r,m::r
JUSTIFICATIVA
O rascunho 17 do IEEE 1003.1e define Listas de Controle de Acesso que incluem entradas do tipo de tag ACL_MASK e define um mapeamento entre bits de permissão de arquivo que não é constante. O grupo de trabalho padrão definiu esta interface relativamente complexa para garantir que os aplicativos que estejam em conformidade com o IEEE 1003.1 (“POSIX.1”) ainda funcionarão conforme o esperado em sistemas com ACLs. O rascunho 100.1e do IEEE 17 contém a justificativa para a escolha desta interface na seção B.23.
MUDANÇAS NAS UTILIDADES DE ARQUIVO
Em um sistema que suporta ACLs, as utilidades de arquivo ls(1), cp(1) e mv(1) alteram seu comportamento da seguinte forma:
Para arquivos que têm uma ACL padrão ou uma ACL de acesso que contém mais do que as três entradas ACL necessárias, a utilidade ls(1) na forma longa produzida por ls -l exibe um sinal de mais (+) após a string de permissão.
Se a flag -p for especificada, a utilidade cp(1) também preserva as ACLs. Se isso não for possível, um aviso será exibido.
A utilidade mv(1) sempre preserva as ACLs. Se isso não for possível, um aviso será exibido.
O efeito da utilidade chmod(1) e da chamada de sistema chmod(2) na ACL de acesso é descrito em “CORRESPONDÊNCIA ENTRE ENTRADAS ACL E BITS DE PERMISSÃO DE ARQUIVO”.
PADRÕES
O documento IEEE 1003.1e draft 17 (“POSIX.1e”) descreve várias extensões de segurança para o padrão IEEE 100.1. Embora o trabalho em 1003.1e tenha sido abandonado, muitos sistemas no estilo UNIX implementam partes do rascunho 17 do POSIX.1e ou de rascunhos anteriores.
As Listas de Controle de Acesso (ACLs) do Linux implementam o conjunto completo de funções e utilitários definidos para Listas de Controle de Acesso no POSIX.1e, e várias extensões. A implementação é totalmente compatível com o rascunho 17 do POSIX.1e; as extensões são marcadas como tal. As funções de manipulação da Lista de Controle de Acesso são definidas na biblioteca ACL (libacl, -lacl). As interfaces compatíveis com o POSIX são declaradas no cabeçalho
NOTAS
PERMISSÕES NEGADAS E NAMESPACES DE USUÁRIO DO LINUX
Embora as ACLs possam ser usadas para negar permissões a processos com base nos grupos dos quais fazem parte, isso é considerado uma prática inadequada. Utilitários privilegiados, como newuidmap(1), podem dar a processos não privilegiados acesso à chamada de sistema setgroups(2), o que permite que eles descartem a filiação ao grupo suplementar e tornem as restrições baseadas nessa filiação ineficazes. Para obter mais detalhes, consulte user_namespaces(7).
VEJA TAMBÉM
chmod(1), creat(2), getfacl(1), ls(1), mkdir(2), mkfifo(2), mknod(2), mount(8), open(2), setfacl(1), stat(2), umask(1)
POSIX 1003.1e RASCUNHO 17
https://wt.tuxomania.net/publications/posix.1e/download.html
FUNÇÕES POSIX 1003.1e POR CATEGORIA
Gerenciamento de armazenamento de ACL
acl_dup(3), acl_free(3), acl_init(3)
Manipulação de entrada de ACL
acl_copy_entry(3), acl_create_entry(3), acl_delete_entry(3), acl_get_entry(3), acl_valid(3)
acl_add_perm(3), acl_calc_mask(3), acl_clear_perms(3), acl_delete_perm(3),
acl_get_permset(3), acl_set_permset(3)
acl_get_qualifier(3), acl_get_tag_type(3), acl_set_qualifier(3), acl_set_tag_type(3)
Manipulação de ACL em um objeto
acl_delete_def_file(3), acl_get_fd(3), acl_get_file(3), acl_set_fd(3), acl_set_file(3)
Tradução de formato de ACL
acl_copy_entry(3), acl_copy_ext(3), acl_from_text(3), acl_to_text(3), acl_size(3)
FUNÇÕES POSIX 1003.1e POR DISPONIBILIDADE
O primeiro grupo de funções é suportado na maioria dos sistemas com Listas de Controle de Acesso (ACLs) semelhantes ao POSIX, enquanto o segundo grupo é suportado em menos sistemas. Para aplicativos que serão portados, é melhor evitar o segundo grupo.
acl_delete_def_file(3), acl_dup(3), acl_free(3), acl_from_text(3), acl_get_fd(3),
acl_get_file(3), acl_init(3), acl_set_fd(3), acl_set_file(3), acl_to_text(3), acl_valid(3)
acl_add_perm(3), acl_calc_mask(3), acl_clear_perms(3), acl_copy_entry(3), acl_copy_ext(3),
acl_copy_int(3), acl_create_entry(3), acl_delete_entry(3), acl_delete_perm(3), acl_get_entry(3),
acl_get_permset(3), acl_get_qualifier(3), acl_get_tag_type(3), acl_set_permset(3),
acl_set_qualifier(3), acl_set_tag_type(3), acl_size(3)
EXTENSÕES LINUX
As seguintes extensões não portáteis estão disponíveis em sistemas Linux. acl_check(3), acl_cmp(3), acl_entries(3), acl_equiv_mode(3), acl_error(3), acl_extended_fd(3), acl_extended_file(3), acl_extended_file_nofollow(3), acl_from_mode(3), acl_get_perm(3), acl_to_any_text(3)
AUTOR
Andreas Gruenbacher, <_>