Por motivos de auditoria de configuração, desejo poder pesquisar no meu sistema de arquivos ext3 arquivos que tenham o atributo imutável definido (via chattr +i
). Não consigo encontrar nenhuma opção find
ou similar que faça isso. Neste ponto, receio que tenha que escrever meu próprio script para analisar a lsattr
saída de cada diretório. Existe um utilitário padrão que fornece uma maneira melhor?
17
Respostas:
Isso pode ser parcialmente realizado canalizando o
grep
comando paralsattr
comando.No entanto, acredito que quando você menciona todo
ext3
o sistema de arquivos que a pesquisa pode envolver/proc
,/dev
e alguns outros diretórios que, se informam algum erro, você apenas deseja ignorar. Você provavelmente pode executar o comando como,Você pode querer tornar
grep
um pouco mais rigoroso usandogrep
o recurso PCRE para corresponder mais explicitamente ao "-i-".Isso funcionará para situações como esta:
Mas é imperfeito. Se houver atributos adicionais ativados em torno do sinalizador imutável, não os corresponderemos, e isso será enganado pelos arquivos cujos nomes coincidem também com o padrão acima, como este:
Podemos reforçar o padrão um pouco mais como este:
Mas ainda é um pouco frágil e exigiria ajustes adicionais, dependendo dos arquivos do seu sistema de arquivos. Sem mencionar que @StephaneChazeles mencionou nos comentários que isso pode ser jogado com bastante facilidade pela inclusão de novas linhas com um nome de arquivo para ignorar o padrão acima
grep
.Referências
https://groups.google.com/forum/#!topic/alt.os.linux/LkatROg2SlM
fonte
-i-
seu nome (há 34 no sistema em que estou conectado no momento). Você provavelmente vai querer a-a
opção também+i
suposto ser no primeiro exemplo? Isso não funciona para mim. Além disso, grepping for-i-
supõe que os atributos que aparecem adjacentes ai
(comoa
) estejam desmarcados.^....i
? Ou pelo menos algo como^[^ ]*i
se oi
pode estar em outra posição que não a quinta.Dado que o objetivo do script é a auditoria, é especialmente importante lidar corretamente com nomes de arquivos arbitrários, por exemplo, com nomes contendo novas linhas. Isso torna impossível o uso
lsattr
em vários arquivos simultaneamente, pois a saída delsattr
pode ser ambígua nesse caso.Você pode recursar
find
e chamarlsattr
um arquivo de cada vez. Vai ser bem lento.Eu recomendo usar uma linguagem menos irritadiça como Perl, Python ou Ruby e fazer o trabalho
lsattr
sozinho.lsattr
opera emitindo umFS_IOC_GETFLAGS
syscall ioctl e recuperando os sinalizadores de inode do arquivo . Aqui está uma prova de conceito do Python.fonte
FS_IOC_GETFLAGS
é0x80046601
.FS_IOC_GETFLAGS
dependesizeof(long)
. Veja por exemplo o seguinte comando bash para descobrir o que o expande macro no C:gcc -E - <<< $'#include <linux/fs.h>\nFS_IOC_GETFLAGS' | tail -n1
. Obtive dela a seguinte expressão(((2U) << (((0 +8)+8)+14)) | ((('f')) << (0 +8)) | (((1)) << 0) | ((((sizeof(long)))) << ((0 +8)+8)))
:, que simplifica para(2U << 30) | ('f' << 8) | 1 | (sizeof(long) << 16)
.Para lidar com nomes de arquivos arbitrários (incluindo aqueles que contêm caracteres de nova linha), o truque usual é encontrar arquivos dentro deles, em
.//.
vez de.
. Como//
normalmente não pode ocorrer ao percorrer a árvore de diretórios, você tem certeza de que um//
sinaliza o início de um novo nome de arquivo na saídafind
(ou aquilsattr -R
).Observe que a saída ainda será separada por nova linha. Se você precisar pós-processá-lo, precisará adaptá-lo. Por exemplo, você pode adicionar um
-v ORS='\0'
para poder alimentá-lo nos GNUsxargs -r0
.Observe também que
lsattr -R
(pelo menos 1.42.13) não pode relatar os sinalizadores de arquivos cujo caminho é maior que PATH_MAX (geralmente 4096), para que alguém possa ocultar um arquivo imutável movendo seu diretório pai (ou qualquer um dos componentes do caminho que levam a , exceto a si mesmo, pois é imutável) em um diretório muito profundo.Uma solução alternativa seria usar
find
com-execdir
:Agora, com
-print0
, isso é pós-processável, mas se você pretende fazer algo com esses caminhos, observe que qualquer chamada do sistema em caminhos de arquivo maiores que PATH_MAX ainda falhará e os componentes do diretório poderão ter sido renomeados no intervalo.Se quisermos obter um relatório confiável em uma árvore de diretórios potencialmente gravável por outras pessoas, existem mais alguns problemas inerentes ao
lsattr
próprio comando que precisaríamos mencionar:lsattr -R .
percorre a árvore de diretórios, está sujeita às condições de corrida. Pode-se descer para diretórios fora da árvore de diretórios roteados.
substituindo alguns diretórios por links simbólicos no momento certo.lsattr -d file
tem uma condição de corrida. Esses atributos são aplicáveis apenas a arquivos ou diretórios regulares. O mesmolsattr
acontecelstat()
primeiro para verificar se o arquivo é do tipo certo e, em seguida, éopen()
seguido porioctl()
para recuperar os atributos. Mas chamaopen()
semO_NOFOLLOW
(nem O_NOCTTY). Alguém poderia substituirfile
com um link simbólico para/dev/watchdog
, por exemplo, entre olstat()
eopen()
e causa a reinicialização do sistema. Deve fazeropen(O_PATH|O_NOFOLLOW)
seguido porfstat()
,openat()
eioctl()
aqui para evitar as condições da corrida.fonte
Agradeço a Ramesh, slm e Stéphane por me apontarem na direção certa (estava faltando a
-R
opçãolsattr
). Infelizmente, nenhuma das respostas até agora funcionou corretamente para mim.Eu vim com o seguinte:
Isso protege contra a utilização de novas linhas para fazer com que um arquivo pareça imutável quando não estiver. Ele não protege contra arquivos definidos como imutáveis e com novas linhas em seus nomes de arquivos. Mas como esse arquivo teria que ser criado dessa maneira pela raiz, posso ter certeza de que esses arquivos não existem no meu sistema de arquivos para o meu caso de uso. (Esse método não é adequado para a detecção de intrusões nos casos em que o usuário root pode estar comprometido, mas nenhum dos dois usa o mesmo
lsattr
utilitário do sistema, que também pertence ao mesmo usuário root.)fonte
O uso
find -exec
é muito lento, a análise de saída de nãolsattr
é confiável, da mesma forma que als
utilização de Python, como na resposta de Gilles, requer a escolha da constante paraioctl
se o interpretador de Python é de 32 ou 64 bits ...O problema em questão é de nível mais ou menos baixo, então vamos para um nível mais baixo: C ++ não é tão ruim quanto uma linguagem de script :) Como um bônus, ele tem acesso aos cabeçalhos C do sistema com toda a potência do pré-processador C.
O programa a seguir procura arquivos imutáveis, permanecendo dentro de um sistema de arquivos, ou seja, nunca cruza os pontos de montagem. Para pesquisar na árvore aparente, cruzando os pontos de montagem conforme necessário, remova o
FTW_MOUNT
sinalizador nanftw
chamada. Também não segue links simbólicos. Para segui-los, remova oFTW_PHYS
sinalizador.fonte
Em vez de canalizar a saída para grep, por que não usar o awk para corresponder apenas ao 'i' no primeiro campo da saída?
Na verdade, eu executo isso diariamente via cron para varrer o diretório / etc em centenas de servidores e enviar a saída para o syslog. Posso gerar um relatório diário via Splunk:
fonte
/etc
. Mas ambos os comandos incorretamente encontrar um arquivo não-imutável criado comtouch `"echo -e "bogus\n---------i---e-- changeable"`"
touch "`echo -e 'bogus\n---------i---e-- changeable'`"
Muito simples, vá para a pasta suspeita e execute o comando:
fonte