O kernel faz o seguinte procedimento para determinar qual será o tipo de arquivo de um arquivo recém-criado.
- Existe na política uma regra de transição de arquivos específica. Então aplique isso.
- Faça com que o arquivo recém-criado adquira o tipo do diretório pai.
Na grande maioria dos casos, novos arquivos herdam o tipo de diretórios pai. Às vezes isso não é desejável - portanto, um redator de política pode criar regras baseadas nas condições de quem está fazendo a rotulagem e para onde fazer a transição para outro tipo.
Isso é controlado na política com a instrução type_transition
, embora normalmente um gravador de políticas chame a macro filetrans_pattern
.
No kernel, essas decisões não são baseadas em caminhos, mas em tipos (embora exista uma pequena exceção em políticas mais recentes).
Uma regra normalmente é assim:
type_transition httpd_t var_log_t:file httpd_var_log_t;
Neste exemplo, a regra afirma isso. Se o processo / usuário que executa a criação do arquivo for httpd_t
e o diretório no qual o objeto está sendo criado for var_log_t
e o objeto for classificado como file
, o novo arquivo deverá ser rotulado como httpd_var_log_t
. / p>
Isso, obviamente, tem várias limitações, um bom exemplo disso é a condição quando você cria arquivos .htaccess no apache (em / var / www / html). Neste exemplo, a política padrão de criar um tipo de arquivo com o mesmo tipo de seu diretório pai aplica-se, mas, na realidade, o tipo adequado desse arquivo é httpd_sys_htacess_t
, e não o padrão httpd_sys_content_t
.
Este foi um problema conhecido por vários anos e acabou sendo resolvido permitindo que os redatores de políticas especifiquem o nome do arquivo ao qual a transição se aplica na política - infelizmente, esses recursos não estão disponíveis no EL6.
No seu caso específico - como você mencionou, há algumas soluções envolvendo o restauro. Além disso, você deve idealmente dividir seus dados em diferentes tipos, colocando-os em subdiretórios separados, nos quais o subdiretório é um tipo adequadamente rotulado. Se isso ainda não for possível, e o restorecond não for possível - a única solução é uma correção posterior da execução da restauração no arquivo após sua criação.
Mesmo o 'mais recente' chamado filetrans tem problemas porque no final ele não suporta globbing ou regex, o que limita severamente sua funcionalidade a arquivos especificamente bem-nomeados (como .htaccess).
No momento, não existe nenhum mecanismo no kernel tão flexível quanto restorecon
e suas expressões regulares para rotular corretamente os arquivos corretamente nesse grau.