3.5. Dois métodos de criação de perfis

Tendo em vista a sintaxe dos perfis do Novell AppArmor (consulte a Seção 3.1, “Componentes e sintaxe dos perfis” (↑Guia de Administração do Novell AppArmor 2.0)), você pode criá-los sem recorrer a ferramentas. Entretanto, o trabalho será muito maior. Para evitar esse inconveniente, use as ferramentas do Novell AppArmor para automatizar a criação e o aprimoramento de perfis.

Há duas formas de criar perfis do Novell AppArmor e ferramentas de suporte a ambos os métodos.

Geração independente de perfis

Presta-se à criação de perfis de aplicativos pequenos, com tempo de execução finito (por exemplo: aplicativos clientes de usuário, como os clientes de e-mail). Para obter mais informações, consulte a Seção 3.5.1, “Geração independente de perfis” (↑Guia de Administração do Novell AppArmor 2.0).

Geração sistêmica de perfis

Presta-se à criação simultânea de perfis de muitos programas, bem como de aplicativos cujo tempo de execução é de dias, semanas ou contínuo ao longo de reinicializações (por exemplo: aplicativos de servidores de rede, como servidores Web e de e-mail). Para obter mais informações, consulte a Seção 3.5.2, “Geração sistêmica de perfis” (↑Guia de Administração do Novell AppArmor 2.0).

O desenvolvimento automatizado de perfis fica mais fácil com as ferramentas do Novell AppArmor:

  1. Escolha qual método de criação de perfis atende às suas necessidades.

  2. Execute uma análise estática. Execute genprof ou autodep, dependendo do método de criação de perfis escolhido.

  3. Habilite a aprendizagem dinâmica. Habilite o modo de aprendizagem para todos os programas cujo perfil deseja criar.

3.5.1. Geração independente de perfis

A geração e o aprimoramento independentes de perfis são gerenciados por um programa chamado genprof. Trata-se de um método fácil porque o genprof cuida de tudo, mas é limitado porque requer que o genprof seja executado durante toda a execução do teste do programa (você não pode reinicializar a máquina enquanto estiver desenvolvendo o perfil).

Para usar o genprof no método de geração independente de perfis, consulte Seção 3.5.3.4, “genprof” (↑Guia de Administração do Novell AppArmor 2.0).

3.5.2. Geração sistêmica de perfis

Este método se chama geração sistêmica de perfis porque atualiza de uma só vez todos os perfis do sistema, ao contrário do genprof ou da geração independente de perfis, que se volta apenas para um ou poucos perfis.

Com a geração sistêmica, a criação e o aprimoramento de perfis são um pouco menos automatizados, porém mais flexíveis. Este método se presta à criação de perfis de aplicativos de execução longa, cujo comportamento persiste após a reinicialização, ou de grandes quantidades de programas cujos perfis devem ser criados de uma só vez.

Crie um perfil do Novell AppArmor para um grupo de aplicativos da seguinte forma:

  1. Crie perfis para cada programa que compõe o aplicativo.  Embora esse método seja sistêmico, o Novell AppArmor ainda monitora apenas os programas que têm perfis e seus filhos. Desta forma, para que o Novell AppArmor considere um programa, é necessário que pelo menos o autodep crie um perfil aproximado para ele. Para criar esse perfil aproximado, consulte Seção 3.5.3.1, “autodep” (↑Guia de Administração do Novell AppArmor 2.0).

  2. Coloque os perfis relevantes no modo de aprendizagem ou reclamação.  Habilite o modo de aprendizagem ou reclamação para todos os programas que têm perfis digitando complain /etc/apparmor.d/* em uma janela de terminal quando estiver conectado como Root.

    Quando o modo de aprendizagem está habilitado, não há bloqueio das solicitações de acesso mesmo que o perfil informe que elas devem ser bloqueadas. Isso lhe permite executar diversos testes (como mostra o Passo 3 (↑Guia de Administração do Novell AppArmor 2.0)) e "aprender" as necessidades de acesso do programa para que ele funcione adequadamente. Com essas informações, você pode decidir qual o grau de segurança do perfil.

    Consulte Seção 3.5.3.2, “Modo de aprendizagem ou reclamação” (↑Guia de Administração do Novell AppArmor 2.0) para obter instruções mais detalhadas sobre o uso do modo de aprendizagem ou reclamação.

  3. Exercite o aplicativo.  Execute o aplicativo e exerça suas funções. Cabe a você decidir o quanto durará o teste do programa, mas é preciso que ele acesse todos os arquivos que representam suas necessidades de acesso. Como a execução não é supervisionada pelo genprof, esta etapa pode durar vários dias ou semanas e abranger reinicializações completas do sistema.

  4. Analise o registro.  Na geração sistêmica de perfis, execute o logprof diretamente, em vez de deixar que o genprof o execute (como na geração independente). A forma geral do logprof é:

    logprof [ -d /caminho/dos/perfis ] [ -f /caminho/do/arquivo/de/perfil ]

    Consulte Seção 3.5.3.5, “logprof” (↑Guia de Administração do Novell AppArmor 2.0) para obter mais informações sobre o uso do logprof.

  5. Repita as etapas 3-4.  Isso promoverá a geração de perfis ideais. A abordagem iterativa capta conjuntos de dados menores, que podem ser treinados e recarregados no mecanismo de políticas. As repetições subseqüentes geram menos mensagens e se processam mais rápido.

  6. Edite os perfis.  Procure examinar os perfis gerados. Abra-os e edite-os em /etc/apparmor.d/ usando o vim. Para obter informações sobre como extrair o máximo do vim, consulte Seção 3.5.3.8, “apparmor.vim” (↑Guia de Administração do Novell AppArmor 2.0).

  7. Retorne ao modo “forçado”.  É neste momento que o sistema volta a forçar as regras dos perfis, em vez de apenas registrar informações. Isso pode ser feito manualmente, através da remoção do texto flags=(complain) dos perfis, ou automaticamente, através do uso do comando enforce (forçar), que funciona da mesma forma que o comando complain (reclamar), mas coloca os perfis no modo forçado.

    Para garantir que todos os perfis saiam do modo de reclamação e entrem no modo forçado, digite enforce /etc/apparmor.d/*.

  8. Pesquise de novo todos os perfis.  Para que o Novell AppArmor pesquise de novo todos os perfis e mude o modo forçado no kernel, digite /etc/init.d/apparmor restart.

3.5.3. Resumo das ferramentas de perfil

Todos os utilitários de criação de perfis do Novell AppArmor são fornecidos no pacote RPM apparmor-utils. A maioria está armazenada em /usr/sbin. As seções a seguir apresentam cada ferramenta.

3.5.3.1. autodep

Ferramenta que cria um perfil aproximado para o programa ou aplicativo que você está submetendo a autodep. Você pode gerar perfis aproximados para executáveis binários e programas de scripts interpretados. O perfil resultante é chamado de “aproximado” porque não contém necessariamente todas as entradas de perfil que o programa precisa para ser adequadamente delimitado pelo Novell AppArmor. O perfil aproximado mínimo do autodep tem pelo menos uma diretiva de inclusão básica, a qual contém as entradas de perfil essenciais à maioria dos programas. No caso de certos tipos de programa, o autodep gera um perfil mais extenso. O perfil é gerado chamando recursivamente ldd(1) nos executáveis relacionados na linha de comando.

Para gerar um perfil aproximado, use o programa autodep. O argumento do programa pode ser simplesmente o nome do programa, que o autodep encontra pesquisando a variável do caminho de seu shell, ou um caminho plenamente qualificado. O programa em si pode ser de qualquer tipo (binário ELF, script de shell, script de Perl etc.), e o autodep gera um perfil aproximado que deve ser aprimorado através do procedimento dinâmico apresentado a seguir.

O perfil aproximado resultante é gravado no diretório /etc/apparmor.d usando a convenção do Novell AppArmor segundo a qual o perfil é nomeado com base no caminho absoluto do programa, substituindo-se as barras (/) do caminho por pontos (.). A forma geral do autodep requer que você digite o seguinte em uma janela de terminal quando estiver conectado como Root:

 autodep [ -d /caminho/dos/perfis ] [programa1 programa2...]

Se você não digitar o(s) nome(s) do programa, um prompt lhe solicitará que o faça. /caminho/dos/perfis substitui a localização padrão /etc/apparmor.d.

Para dar início ao processo, você deve criar perfis para o serviço de cada um dos principais executáveis que fazem parte do aplicativo (tudo que possa começar sem a condição de filho de outro programa que já tem um perfil). Se todos esses programas serão encontrados depende do aplicativo em questão. Eis aqui várias estratégias para encontrar esse tipo de programa:

Diretórios

Se todos os programas cujos perfis você quer criar estiverem em um diretório que não tenha nenhum outro programa, basta usar o comando autodep /caminho/dos/seus/programas/* para criar perfis nominais para todos os programas existentes nesse diretório.

Comando ps

Execute o aplicativo e use o comando padrão ps do Linux para detectar todos os processos em execução. Em seguida, você terá de localizar manualmente esses programas e executar o autodep para cada um. Se os programas estiverem em seu caminho, o autodep os localizará para você. Se não estiverem, o comando padrão locate (localizar) do Linux o ajudará a localizar esses programas. Se o comando locate não funcionar (ele não é instalado por padrão no SUSE Linux), use find . -name '*foo*' -print.

3.5.3.2. Modo de aprendizagem ou reclamação

A ferramenta do modo de aprendizagem ou reclamação detecta violações de regras de perfis do Novell AppArmor (por exemplo, quando um programa acessa arquivos não permitidos por seu perfil). Embora sejam permitidas, as violações são também registradas. Para aprimorar perfis, habilite o modo de reclamação, execute o programa através de um conjunto de testes para gerar eventos de registro que caracterizem as necessidades de acesso do programa e façam o pós-processamento do registro com as ferramentas do Novell AppArmor, a fim de transformar os eventos de registro em perfis aprimorados.

A habilitação manual do modo de reclamação (usando a linha de comando) adiciona um flag ao início do perfil, de modo que /bin/foo se torna /bin/foo flags=(complain). Para usar o modo de reclamação, abra uma janela de terminal quando estiver conectado como usuário Root e digite uma das linhas a seguir.

  • Se o programa de exemplo (programa1) estiver em seu caminho, use:

    complain [programa1 programa2 ...]
  • Se o programa não estiver em seu caminho, especifique o caminho inteiro da seguinte forma:

    complain /sbin/programa1 
  • Se os perfis não estiverem em /etc/apparmor.d, digite o seguinte para substituir a localização padrão:

    complain /caminho/dos/perfis/ programa1 
  • Especifique o perfil para o programa1 da seguinte forma:

    complain /etc/apparmor.d/sbin.programa1

Cada um dos comandos acima habilita o modo de reclamação para os perfis/programas relacionados. O comando pode relacionar tanto programas quanto perfis. Se o nome do programa não incluir seu caminho na íntegra, a ferramenta pesquisará $PATH para o programa. Então, para exemplificar, complain /usr/sbin/* localiza perfis associados a todos os programas existentes em /usr/sbin e os coloca no modo de reclamação, e complain /etc/apparmor.d/* coloca todos os perfis existentes em /etc/apparmor.d no modo de reclamação.

3.5.3.3. Modo forçado

A ferramenta do modo forçado detecta violações de regras de perfis do Novell AppArmor (por exemplo, quando um programa acessa arquivos não permitidos por seu perfil). As violações são registradas e não são permitidas. Por padrão, o modo forçado está habilitado. Habilite o modo de reclamação quando quiser que os perfis do Novell AppArmor controlem o acesso de um programa que possua perfil. O modo forçado alterna com o de reclamação.

A habilitação manual do modo forçado (usando a linha de comando) adiciona um flag ao início do perfil, de modo que /bin/foo se torna /bin/foo flags=(enforce). Para usar o modo forçado, abra uma janela de terminal quando estiver conectado como usuário Root e digite uma das linhas a seguir.

  • Se o programa de exemplo (programa1) estiver em seu caminho, use:

    enforce [programa1 programa2 ...]
  • Se o programa não estiver em seu caminho, especifique o caminho inteiro da seguinte forma:

    enforce /sbin/programa1 
  • Se os perfis não estiverem em /etc/apparmor.d, digite o seguinte para substituir a localização padrão:

    enforce /caminho/dos/perfis/ programa1 
  • Especifique o perfil para o programa1 da seguinte forma:

    enforce /etc/apparmor.d/sbin.programa1

Cada um dos comandos acima habilita o modo forçado para os perfis e programas relacionados.

Se você não digitar o nome do programa ou perfil, um prompt lhe solicitará que o faça. /caminho/dos/perfis substitui a localização padrão /etc/apparmor.d.

O argumento pode ser tanto uma lista de programas quanto uma lista de perfis. Se o nome do programa não incluir seu caminho na íntegra, a ferramenta pesquisará $PATH para o programa. Para exemplificar, enforce /usr/sbin/* localiza perfis associados a todos os programas existentes em /usr/sbin e os coloca no modo forçado, e enforce /etc/apparmor.d/* coloca todos os perfis existentes em /etc/apparmor.d no modo forçado.

3.5.3.4. genprof

genprof (ou Gerar Perfil) é o utilitário de geração de perfis do Novell AppArmor. Ele executa autodep para o programa especificado, criando um perfil aproximado (caso o programa ainda não tenha perfil), coloca-o no modo de reclamação, recarrega-o no Novell AppArmor, marca o syslog e solicita ao usuário que execute o programa e exerça suas funções. Sua sintaxe é a seguinte:

genprof [ -d /caminho/dos/perfis ]  programa

Caso desejasse criar um perfil para o programa httpd2-prefork do servidor Web do Apache, você teria de fazer o seguinte no shell do Root:

  1. Digitar rcapache2 stop.

  2. Em seguida, digitar genprof httpd2-prefork.

    Então o genprof faria o seguinte:

    • Resolveria o caminho inteiro do httpd2-prefork com base nas variáveis do caminho de seu shell. Você também poderia especificar um caminho inteiro. No SUSE Linux, o caminho completo seria /usr/sbin/httpd2-prefork.

    • Verificaria se já havia algum perfil para httpd2-prefork. Se houvesse, ele o atualizaria. Se não, ele criaria um usando o programa autodep, descrito na Seção 3.5.3, “Resumo das ferramentas de perfil” (↑Guia de Administração do Novell AppArmor 2.0).

      [Note]Nota

      Existe uma convenção de nomeação que relaciona o caminho completo de um programa ao nome de arquivo de seu perfil, de forma que as várias ferramentas de perfil do Novell AppArmor possam manipulá-lo com consistência. A convenção é substituir a barra (/) pelo ponto (.), de modo que o perfil do /usr/sbin/httpd2-prefork seja armazenado em /etc/apparmor.d/usr.sbin.httpd2-prefork.

    • Colocaria o perfil desse programa no modo de aprendizagem ou reclamação para que as violações de perfis fossem registradas, porém permitidas. O evento de registro teria a seguinte aparência:

      Oct  9 15:40:31 AppArmor: PERMITTING r access to /etc/apache2/httpd.conf (httpd2-prefork(6068) profile /usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)
    • Marcaria o syslog com um sinalizador de início de eventos de registro para consideração. Exemplo:

      Sep 13 17:48:52 h2o root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. Quando a ferramenta solicitar, execute o aplicativo cujo perfil deve ser criado em outra janela de terminal e use o máximo possível de funções do aplicativo para que o modo de aprendizagem possa registrar os arquivos e diretórios cujo acesso o programa exige para funcionar adequadamente. Por exemplo, digite rcapache2 start em outra janela de terminal.

  4. Selecione uma das seguintes opções quando concluir a execução das funções do programa:

    • S executa o logprof com base no registro do sistema a partir do ponto em que foi marcado quando o genprof foi iniciado e recarrega o perfil.

      Se houver eventos de sistema no registro, o Novell AppArmor analisará os arquivos de registro do modo de aprendizagem. Isso gera uma série de perguntas que devem ser respondidas para guiar o genprof na geração do perfil de segurança.

    • F sai da ferramenta e retorna ao menu principal.

  5. Você deve responder a dois tipos de perguntas:

    Cada um desses casos gera uma série de perguntas que devem ser respondidas para adicionar o recurso ou o programa ao perfil. As duas figuras a seguir são um exemplo de cada caso. As etapas subseqüentes mostram as opções de resposta a essas perguntas.

    Exemplo 3.1. Exceção do modo de aprendizagem: controlando o acesso a recursos específicos

    Lendo entradas de registro de /var/log/messages.
    Atualizando perfis do apparmor em /etc/apparmor.d.
    
    Perfil: /usr/sbin/xinetd 
    Executar: /usr/sbin/vsftpd
    
    [(I)nherit] (Herdar)/ (P)rofile (Perfil) / (U)nconfined (Não delimitado) / (D)eny (Negar) / Abo(r)t (Interromper) / (F)inish) (Concluir) 

    Não é fácil lidar com acessos de execução. Você deve decidir qual dos três tipos de permissões de execução deve conceder ao programa:

    herdar (ix)

    O filho herda o perfil do pai, sendo executado com os mesmos controles de acesso que ele. Esse modo é útil quando um programa delimitado precisa chamar outro programa delimitado sem ganhar as permissões do perfil de destino nem perder as permissões do perfil atual. Ele é usado muitas vezes quando o programa filho é um aplicativo ajudante, como quando o cliente de /usr/bin/mail usa o programa inferior como pager ou o navegador Mozilla usa o programa Acrobat para exibir arquivos PDF.

    perfil (px)

    O filho é executado usando seu próprio perfil, que deve ser carregado no kernel. Se o perfil não estiver presente, as tentativas de execução do filho serão malsucedidas (permissão negada). Isso tudo é mais útil quando o programa pai está invocando um serviço global, como as pesquisas DNS, ou enviando e-mail através do MTA do sistema.

    não delimitado (ux)

    O filho é executado sem nenhuma delimitação e sem a aplicação de nenhum perfil do Novell AppArmor ao recurso em execução.

    Exemplo 3.2. Exceção do modo de aprendizagem: definindo permissões de execução para uma entrada

    Adicionando /bin/ps ix ao perfil.
    
    Perfil:  /usr/sbin/xinetd Caminho:     /etc/hosts.allow Novo Modo: r
    
     [1 - /etc/hosts.allow]
    
    [(A)llow] (Permitir) / (D)eny (Negar) / (N)ew (Novo) / (G)lob (Englobar) / Glob w/(E)xt (Englobar c/ Ext) / Abo(r)t (Interromper) / (F)inish (Concluir) 

    O menu acima mostra o Novell AppArmor sugerindo entradas de caminho de diretório que foram acessadas pelo aplicativo cujo perfil você está criando. Talvez ele exigisse que você definisse permissões de execução para entradas.

    O Novell AppArmor fornece um ou mais nomes de caminho ou inclusões. Clique no número da opção para selecionar dentre uma ou mais das seguintes opções e vá para a próxima etapa.

    [Note]Nota

    Nem sempre essas opções são apresentadas no menu do Novell AppArmor.

    #include

    É a parte de um perfil do Novell AppArmor relativa a um arquivo de inclusão (arquivo que obtém permissões de acesso para programas). Com uma inclusão, você pode fornecer ao programa acesso a arquivos ou caminhos de diretórios que são necessários também a outros programas. Além disso, pode reduzir o tamanho do perfil. É recomendável selecionar inclusões quando sugerido.

    Versão englobada

    Para acessá-la, clique em Englobar, conforme descrito na próxima etapa. Para obter informações sobre a sintaxe de englobamento, consulte a Seção 3.6, “Nomes de caminhos e englobamento” (↑Guia de Administração do Novell AppArmor 2.0).

    Nome do caminho

    O próprio caminho que o programa precisa acessar para funcionar adequadamente.

  6. Após selecionar o nome do caminho ou inclusão, você pode processá-lo como entrada no perfil do Novell AppArmor. Para isso, clique em Permitir ou Negar. Caso não fique satisfeito com a entrada de caminho de diretório exibida, você poderá usar as opções Englobar ou Editar.

    As seguintes opções estão disponíveis para processar as entradas do modo de aprendizagem e criar o perfil:

    Pressionar Enter

    Permite acesso ao caminho de diretório selecionado.

    Permitir

    Permite acesso às entradas de caminho de diretório especificadas. O Novell AppArmor sugere acesso a permissão de arquivo. Para obter mais informações, consulte a Seção 3.7, “Modos de acesso a permissões de arquivo” (↑Guia de Administração do Novell AppArmor 2.0).

    Negar

    Impede que o programa acesse as entradas de caminho de diretório especificadas. O Novell AppArmor então passa para o próximo evento.

    Nova

    Solicita-lhe que forneça sua própria regra para esse evento, permitindo que você especifique a forma da expressão regular que quiser. Se a expressão fornecida não satisfizer ao evento que deu origem à solicitação, o Novell AppArmor pedirá confirmação e solicitará que você redigite a expressão.

    Englobar

    Se acessada com um clique, esta opção modifica o caminho do diretório (usando curingas) para incluir todos os arquivos no diretório de entrada sugerido. Se acessada com dois cliques, ela permite acesso a todos os arquivos e subdiretórios abaixo do mostrado.

    Para obter mais informações sobre a sintaxe de englobamento, consulte a Seção 3.6, “Nomes de caminhos e englobamento” (↑Guia de Administração do Novell AppArmor 2.0).

    Englobar c/ ext.

    Quando selecionada, esta opção modifica o caminho do diretório original mantendo a extensão do arquivo. Por exemplo, /etc/apache2/arquivo.ext se tornará /etc/apache2/*.ext, com o acréscimo do curinga (asterisco) no lugar do nome do arquivo. Isso permite ao programa acessar todos os arquivos do diretório sugerido que tiverem a extensão .ext. Se acessada com dois cliques, a opção permite acesso a todos os arquivos (que tiverem a extensão indicada) e subdiretórios abaixo do mostrado.

    Editar

    Permite a edição da linha selecionada. A nova linha (editada) aparece na parte inferior da lista.

    Interromper

    Interrompe o logprof, descartando todas as mudanças de regra inseridas e deixando inalterados todos os perfis.

    Concluir

    Fecha o logprof, gravando todas as mudanças de regra inseridas e modificando todos os perfis.

  7. Para visualizar e editar um perfil usando o vim, digite vim /etc/apparmor.d/nome do perfil em uma janela de terminal. Para habilitar o colorido de sintaxe ao editar um perfil do Novell AppArmor no vim, use os comandos :syntax on e, em seguida, :set syntax=apparmor. Para obter mais informações sobre o vim e o colorido de sintaxe, consulte Seção 3.5.3.8, “apparmor.vim” (↑Guia de Administração do Novell AppArmor 2.0).

3.5.3.5. logprof

O logprof é uma ferramenta interativa usada para examinar a saída dos modos de aprendizagem ou reclamação encontrada nas entradas do syslog e depois gerar novas entradas nos perfis de segurança do Novell AppArmor.

Quando é executado, o logprof começa a verificar os arquivos de registro produzidos no modo de aprendizagem ou reclamação. Se houver novos eventos de segurança que não estejam cobertos pelo conjunto de perfis existentes, ele sugere modificações para o perfil. O modo de aprendizagem ou reclamação rastreia o comportamento dos programas e o registra no syslog. O logprof usa essas informações para observar o comportamento dos programas.

Quando um programa delimitado bifurca e executa outro programa, o logprof percebe isso e pergunta ao usuário qual modo de execução deve ser usado ao iniciar o processo filho. Os seguintes modos de execução são opções para iniciar o processo filho: ix, px e ux. Se o processo filho possui um perfil à parte, a seleção padrão é px. Caso contrário, o padrão do perfil é ix. Os processos filhos que possuem perfil à parte são submetidos à execução do autodep e carregados no Novell AppArmor, caso este esteja em execução.

Quando o logprof é encerrado, os perfis são atualizados com as mudanças. Se o módulo AppArmor estiver em execução, os perfis atualizados serão recarregados. Se algum processo que tenha gerado eventos de segurança ainda estiver em execução no null-complain-profile, ele passará a ser executado com base em seu próprio perfil.

Para executar o logprof, digite logprof em uma janela de terminal quando estiver conectado como Root. As opções a seguir também podem ser usadas com o logprof:

logprof -d /caminho/do/diretório/do/perfil/

Especifica o caminho completo da localização dos perfis se eles não estiverem armazenados no diretório padrão, /etc/apparmor.d/.

logprof -f /caminho/do/arquivo/de/perfil/

Especifica o caminho inteiro para a localização do arquivo de registro se este não estiver armazenado no diretório padrão, /var/log/messages.

logprof -m "string marker in logfile"

Marca o ponto em que o logprof deve iniciar a pesquisa do registro do sistema. O logprof ignora todos os eventos do registro que estiverem antes da marca especificada. Se essa marca contiver espaços, deve estar entre aspas para funcionar corretamente. Exemplo: logprof -m e2ff78636296f16d0b5301209a04430d

O logprof verifica o registro, perguntando como lidar com cada evento registrado. Cada pergunta contém uma lista numerada de regras do Novell AppArmor, as quais podem ser adicionadas pressionando-se o número correspondente.

Por padrão, o logprof busca perfis em /etc/apparmor.d/ e verifica o registro de /var/log/messages. Portanto, em muitos casos, basta executar logprof como Root para criar o perfil.

Contudo, às vezes é preciso pesquisar arquivos de registro arquivados, como é o caso quando o período de exercício do programa excede janela de rotação do registro (quando o arquivo de registro é arquivado e um novo arquivo de registro é iniciado). Nesse caso, digite zcat -f `ls -1tr /var/log/messages*` | logprof -f -.

3.5.3.6. Exemplo 1 do logprof

A seguir, é apresentado um exemplo de como o logprof lida com o acesso do httpd2-prefork ao arquivo /etc/group. O exemplo usa [] para indicar a opção padrão.

Nesse exemplo, o acesso a /etc/group é parte do acesso do httpd2-prefork a serviços de nomes. A resposta adequada é 1, a qual extrai um conjunto predefinido de regras do Novell AppArmor. Ao selecionar 1 para #include, o pacote de serviços de nomes resolve todas as perguntas futuras relativas às pesquisas DNS, além de tornar o perfil menos frágil, pois qualquer mudança na configuração DNS e no respectivo pacote de perfis de serviços de nomes só precisará ser feita uma vez, em vez de exigir a revisão de muitos perfis.

Perfil:  /usr/sbin/httpd2-prefork 
Caminho:     /etc/group 
Novo Modo: r

[1 - #include <abstractions/nameservice>]
 2 - /etc/group
[(A)llow] (Permitir) / (D)eny (Negar) / (N)ew (Novo) / (G)lob (Englobar) / Glob w/(E)xt (Englobar c/ Ext) / Abo(r)t (Interromper) / (F)inish (Concluir)

Selecione uma das seguintes respostas:

Pressionar Enter

Permite acesso ao caminho de diretório selecionado.

Permitir

Permite acesso às entradas de caminho de diretório especificadas. O Novell AppArmor sugere acesso a permissão de arquivo. Para obter mais informações sobre isso, consulte a Seção 3.7, “Modos de acesso a permissões de arquivo” (↑Guia de Administração do Novell AppArmor 2.0).

Negar

Impede que o programa acesse as entradas de caminho de diretório especificadas. O Novell AppArmor então move para o próximo evento.

Nova

Solicita-lhe que forneça sua própria regra para esse evento, permitindo que você especifique a forma da expressão regular que quiser. Se a expressão fornecida não atender ao evento que deu origem à solicitação, o Novell AppArmor pedirá confirmação e solicitará que você redigite a expressão.

Englobar

Se acessada com um clique, esta opção modifica o caminho do diretório (usando curingas) para incluir todos os arquivos no diretório de entrada sugerido. Se acessada com dois cliques, ela permite acesso a todos os arquivos e subdiretórios abaixo do mostrado.

Para obter mais informações sobre a sintaxe de englobamento, consulte a Seção 3.6, “Nomes de caminhos e englobamento” (↑Guia de Administração do Novell AppArmor 2.0).

Englobar c/ ext.

Quando selecionada, esta opção modifica o caminho do diretório original mantendo a extensão do arquivo. Por exemplo, /etc/apache2/arquivo.ext se tornará /etc/apache2/*.ext, com o acréscimo do curinga (asterisco) no lugar do nome do arquivo. Isso permite ao programa acessar todos os arquivos do diretório sugerido que tiverem a extensão .ext. Se acessada com dois cliques, a opção permite acesso a todos os arquivos (que tiverem a extensão indicada) e subdiretórios abaixo do mostrado.

Editar

Permite a edição da linha selecionada. A nova linha (editada) aparece na parte inferior da lista.

Interromper

Interrompe o logprof, descartando todas as mudanças de regra inseridas e deixando inalterados todos os perfis.

Concluir

Fecha o logprof, gravando todas as mudanças de regra inseridas e modificando todos os perfis.

3.5.3.7. Exemplo 2 do logprof

Ao criar o perfil de vsftpd, vemos a seguinte pergunta:

Perfil:  /usr/sbin/vsftpd
Caminho:  /y2k.jpg
Novo Modo: r

[1 - /y2k.jpg]

(A)llow (Permitir) / [(D)eny] (Negar) / (N)ew (Novo) / (G)lob (Englobar) / Glob w/(E)xt (Englobar c/ Ext) / Abo(r)t (Interromper) / (F)inish (Concluir)

A pergunta traz à tona várias coisas interessantes. Em primeiro lugar, observe que o vsftpd está solicitando uma entrada de caminho no topo da árvore, embora no SUSE Linux por padrão ele atenda arquivos de FTP de /srv/ftp. Isso é porque o httpd2-prefork usa chroot e, na parte de código dentro da cadeia chroot, o Novell AppArmor vê os acessos a arquivos em termos do ambiente chroot, em vez do caminho absoluto global.

O segundo ponto de interesse é que, caso se queira conceder acesso de leitura no FTP a todos os arquivos JPEG do diretório, é possível usar Englobar c/ Ext e o caminho sugerido (/*.jpg). Isso derrubaria todas as regras que antes concediam acesso individualmente a cada arquivo .jpg e evitaria todas as futuras perguntas relativas ao acesso a arquivos .jpg.

Por fim, pode ser que o objetivo seja conceder mais acesso geral a arquivos de FTP. Se você selecionasse Englobar na última entrada, o logprof substituiria o caminho sugerido (/y2k.jpg) por /*. Ou, se você quisesse conceder ainda mais acesso a toda a árvore do diretório, poderia usar a opção de caminho Nova e digitar /**.jpg (o que concederia acesso a todos os arquivos .jpg de toda a árvore do diretório) ou /** (o que concederia acesso a todos os arquivos da árvore do diretório).

O exemplo acima diz respeito a acessos de leitura. Os acessos de gravação são similares. Mas é recomendável mais cautela no emprego de expressões regulares para esse tipo de acesso.

Os acessos de execução são mais complexos. Você deve decidir qual dos três tipos de permissões de execução deve conceder:

Herdar (ix)

O filho herda o perfil do pai, sendo executado com os mesmos controles de acesso que ele. Esse modo é útil quando um programa delimitado precisa chamar outro programa delimitado sem ganhar as permissões do perfil de destino nem perder as permissões do perfil atual. Ele é usado muitas vezes quando o programa filho é um aplicativo ajudante, como quando o cliente de /usr/bin/mail usa o programa inferior como pager ou o navegador Mozilla usa o programa Acrobat para exibir arquivos PDF.

perfil (px)

O filho é executado usando seu próprio perfil, que deve ser carregado no kernel. Se o perfil não estiver presente, as tentativas de execução do filho serão malsucedidas (permissão negada). Isso tudo é mais útil quando o programa pai está invocando um serviço global, como as pesquisas DNS, ou enviando e-mail através do MTA do sistema.

não delimitado (ux)

O filho é executado sem nenhuma delimitação e sem a aplicação de nenhum perfil do Novell AppArmor ao recurso em execução.

No exemplo seguinte, está sendo criado o perfil do /usr/bin/mail, um cliente de e-mail, e o logprof descobriu que o /usr/bin/mail executa o /usr/bin/less como aplicativo ajudante para fazer a “paginação” de mensagens de e-mail longas. Conseqüentemente, ele apresenta este prompt:

/usr/bin/nail -> /usr/bin/less
(I)nherit (Herdar) / (P)rofile (Perfil) / (U)nconstrained (Não delimitado) / (D)eny (Negar)
[Tip]Dica

Ocorre que o arquivo executável real do /usr/bin/mail é o /usr/bin/nail, o que não é um erro tipográfico.

Aparentemente, o /usr/bin/less é um programa simples para rolagem de texto mais longo que a tela e, com efeito, é para isso que o /usr/bin/mail o utiliza. Porém, na verdade, o less é um programa grande e potente que usa muitos outros aplicativos ajudantes, como tar e rpm.

[Tip]Dica

Execute o less em um arquivo tarball ou RPM para exibir o inventário desses containers.

Não se deve executar o rpm automaticamente ao ler mensagens de e-mail (isso promoveria ataques de vírus do tipo Microsoft* Outlook, pois o rpm pode instalar e modificar programas do sistema). Nesse caso, a melhor opção é usar Herdar. Isso fará o programa less ser executado nesse contexto com o perfil de /usr/bin/mail, o que terá dois efeitos:

  • Você terá de adicionar todos os acessos de arquivo básicos de /usr/bin/less ao perfil do /usr/bin/mail.

  • Você poderá evitar adicionar os aplicativos ajudantes, como tar e rpm, ao perfil do /usr/bin/mail, de modo que quando o /usr/bin/mail executar o /usr/bin/mail/less nesse contexto, o programa less se torne bem menos perigoso do que seria sem a proteção do Novell AppArmor.

Em outras circunstâncias, você poderia usar a opção Perfil. Isso teria dois efeitos sobre o logprof:

  • A regra gravada no perfil seria px, o que forçaria a transição para o perfil do próprio filho.

  • O logprof interpretaria um perfil para o filho e começaria a criá-lo da mesma forma que havia criado o perfil do pai: atribuindo eventos do processo do filho ao perfil do filho e fazendo ao usuário perguntas como as acima.

Finalmente, você poderia conceder ao processo filho um acesso muito amplo especificando Não delimitado, o que gravaria ux no perfil do pai. Desse modo, quando fosse executado, o filho não estaria aplicando nenhum perfil do Novell AppArmor. Isso significa execução sem proteção e só deve ser feito quando absolutamente necessário.

3.5.3.8. apparmor.vim

Para realçar com cores as várias características de um perfil do Novell AppArmor, use um arquivo de colorido de sintaxe do editor de texto vim. Usando o vim e o modo de sintaxe que o Novell AppArmor tem para ele, você pode visualizar as implicações semânticas de seus perfis realçadas em diferentes cores. Para visualizar e editar perfis usando o vim, digite vim em uma janela de terminal.

Para habilitar o colorido de sintaxe ao editar um perfil do Novell AppArmor no vim, use os comandos :syntax on e, em seguida, :set syntax=apparmor. Outra opção é colocar as seguintes linhas em seu arquivo ~/.vimrc:

syntax on
set modeline
set modelines=5

Quando esse recurso é habilitado, o vim colore as linhas do perfil da seguinte forma:

Azul

Linhas #include que extraem outras regras e comentários do Novell AppArmor que começam com #

Branco

Linhas de acesso de leitura normais

Marrom

Declarações de capacidade e flags de reclamação

Amarelo

Linhas que concedem acesso para gravação

Verde

Linhas que concedem permissão de execução (ix ou px)

Vermelho

Linhas que concedem acesso não delimitado (ux)

Fundo vermelho

Erros de sintaxe que não estão sendo adequadamente carregados nos módulos AppArmor

[Note]Nota

Existe um risco de segurança quando se usam essas linhas no arquivo .vimrc, pois assim o vim passa a confiar no modo de sintaxe apresentado nos arquivos que estão sendo editados. Isso poderia permitir a um invasor que lhe enviasse um arquivo perigoso para abertura no vim.

Use as páginas de manual apparmor.vim e vim e a sintaxe :help a partir do editor vim para obter ajuda do próprio vim quanto a realce de sintaxe. A sintaxe do Novell AppArmor está armazenada em /usr/share/vim/current/syntax/apparmor.vim.

3.5.3.9. Não delimitado

O comando unconfined (não delimitado) examina as portas de rede abertas no sistema, compara-as ao conjunto de perfis carregados no sistema e informa os serviços de rede que não possuem perfis do Novell AppArmor. Ele requer privilégio de Root e ausência de delimitação por um perfil do Novell AppArmor.

O comando unconfined deve ser executado como Root para recuperar o link executável do sistema de arquivos do processo. Esse programa é suscetível às seguintes condições de race (falhas):

  • Um executável não vinculado será mal gerenciado

  • Um executável iniciado antes que um perfil do Novell AppArmor seja carregado não aparecerá na saída, apesar de ser executado sem delimitação

  • Um processo terminado entre netstat(8) e verificações subseqüentes será mal gerenciado

[Note]Nota

Esse programa só lista processos usando TCP e UDP. Em resumo, ele não se presta a investigações, sendo fornecido apenas para auxiliar na criação dos perfis dos processos disponíveis em rede no laboratório.

Para obter mais informações sobre a tecnologia e a segurança do Novell AppArmor, consulte os seguintes documentos:

SubDomain: Parsimonious Server Security, de Crispin Cowan, Steve Beattie, Greg Kroah-Hartman, Calton Pu, Perry Wagle e Virgil Gligor

Descreve o design e a implementação inicial do Novell AppArmor. Publicado nos anais da USENIX LISA Conference, dezembro de 2000, Nova Orleans, LA.

Esse documento agora está desatualizado, descrevendo recursos e sintaxe diferentes do atual Novell AppArmor. Ele deve ser usado apenas como base científica, e não como documentação técnica.

Defcon Capture the Flag: Defending Vulnerable Code from Intense Attack, de Crispin Cowan, Seth Arnold, Steve Beattie, Chris Wright e John Viega

Um bom guia para uso estratégico e tático do Novell AppArmor na solução a curto prazo de problemas graves de segurança. Publicado nos anais da DARPA Information Survivability Conference and Expo (DISCEX III), abril de 2003, Washington, DC.