Monitoramento de acesso a arquivos Linux

20

Existe alguma maneira no unix de descobrir quem acessou determinado arquivo na última semana? Pode ser usuário ou algum script, faça o ftp para outro local. Posso obter uma lista do nome de usuário que acessou determinado arquivo? Como posso descobrir quem está acessando um arquivo específico?

Jack
fonte

Respostas:

39

A menos que você tenha políticas de registro extremamente incomuns, quem acessou o arquivo que não está registrado (isso seria uma enorme quantidade de informações). Você pode descobrir quem estava conectado a que horas nos logs do sistema; o lastcomando fornece o histórico de login e outros logs, como /var/log/auth.logo dirá como os usuários se autenticaram e de onde eles fizeram login (qual terminal ou qual host se remotamente).

A data em que um arquivo foi lido pela última vez é chamada de tempo de acesso ou atime . Todos os sistemas de arquivos unix podem armazená-lo, mas muitos sistemas não o gravam, porque ele tem uma (geralmente pequena) penalidade de desempenho. ls -ltu /path/to/fileou stat /path/to/filemostra o tempo de acesso do arquivo.

Se um usuário acessou o arquivo e não estava tentando ocultar suas faixas, seu histórico de shell (por exemplo ~/.bash_history) pode ter pistas.

Para descobrir o que ou quem tem um arquivo aberto agora, use lsof /path/to/file.

Para registrar o que acontece com um arquivo no futuro, existem algumas maneiras:

  • Use inotifywait . inotifywait -e access /path/toimprimirá uma linha /path/to/ ACCESS filequando alguém ler file. Essa interface não informa quem acessou o arquivo; você pode ligar lsof /path/to/fileassim que essa linha aparecer, mas há uma condição de corrida (o acesso pode terminar quando lsof começar).

  • O LoggedFS é um sistema de arquivos empilhável que fornece uma visão de uma árvore do sistema de arquivos e pode executar um log mais sofisticado de todos os acessos através dessa visão. Para configurá-lo, consulte Sintaxe do arquivo de configuração do LoggedFS .

  • Você pode usar o subsistema de auditoria do Linux para registrar um grande número de coisas, incluindo acessos ao sistema de arquivos. Verifique se o auditddaemon foi iniciado e, em seguida, configure com o qual deseja fazer logon auditctl. Cada operação registrada é registrada em /var/log/audit/audit.log(em distribuições típicas). Para começar a assistir um arquivo específico:

    auditctl -w /path/to/file
    

    Se você colocar uma observação em um diretório, os arquivos nele e seus subdiretórios recursivamente também serão observados.

Gilles 'SO- parar de ser mau'
fonte
Obrigado Gilles .. Eu tenho esse arquivo dat criado pelo script. Eu só quero saber o que acontece com esse arquivo depois que ele está sendo criado .. não dos outros scripts são pegá-la para posterior processo assim que eu quero ver se alguém está acessando manualmente que dat arquivo
Jack
@Jack: É difícil dizer sem saber muito mais sobre sua configuração, mas enquanto nada remover ou renomear o arquivo, estará disponível para os outros scripts buscá-lo, independentemente de alguém estar acessando ou não. Pelo seu comentário, acho que você deveria observar o que acontece quando você executa seus scripts.
Gilles 'SO- stop be evil'
2
Ei, você poderia criar um loop circular agradável com este:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359
7

O exemplo acima com inotifywait deve ser um dos (consulte a página do manual para obter mais informações):

inotifywait /path/to/file
inotifywait -e open /pat/to/file

Ou com o modo de monitoramento e o carimbo de data e hora:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Milan Kerslager
fonte
6

A resposta anterior não é a melhor prática para fazer o que você pede. O Linux tem uma API para isso. A inotifyAPI http://linux.die.net/man/7/inotify

  1. Você pode escrever um programa C para fazer o que deseja, apenas chamando a inotifyAPI diretamente
  2. Você pode usar o kfsmd, http://www.linux.com/archive/feature/124903 , um daemon que usainotify
  3. Se você deseja algo que funcione em várias plataformas ( inotifyé específico do Linux) e está usando Java, o JNotify funciona em várias plataformas (Linux, Mac, Windows), abstraindo a API subjacente do SO nativo.
Glen
fonte
3
Bem-vindo ao Stack Exchange . As respostas não são apresentadas em ordem cronológica; portanto, a "resposta anterior" não indica qual resposta você quer dizer. Eu me pergunto a qual dos outros dois você está se referindo de qualquer maneira: um não tem nada que pareça uma boa ou má prática e o outro menciona a API inotify.
Gilles 'SO- stop be evil'
Provavelmente Glen se refere à resposta acima com a classificação padrão dos votos. De fato, a resposta mais popular falha em apresentar uma solução para a pergunta. Pode haver várias razões pelas quais é necessário ver quantas vezes um arquivo é acessado por um determinado período de tempo.
Wtower 3/03/2017
1
Conforme explicado em unix.stackexchange.com/a/12251/20336, a API inotify não fornece informações sobre quem acessou um determinado arquivo. Além disso, o inotify realmente não ajuda a descobrir quem acessou o arquivo na semana passada. Você precisa de recursos de auditoria para isso, o que requer o uso de software chamado auditd(no entanto, mesmo isso não ajuda em descobrir quem acessou o arquivo na semana passada, a menos que você já auditdestivesse executando na semana passada).
Mikko Rantalainen
3

Isso não é, em geral, viável. Eu já vi sistemas de arquivos com auditoria suficiente para tornar isso possível de uma maneira ou de outra, mas não é uma coisa geral do Unix, não.

tchrist
fonte