리눅스 파일 액세스 모니터링


20

유닉스에서 지난 1 주일 동안 누가 특정 파일에 액세스했는지 알아낼 수있는 방법이 있습니까? 사용자 또는 일부 스크립트 일 수 있으며 다른 곳으로 ftp 할 수 있습니다. 특정 파일에 액세스 한 사용자 이름 목록을 얻을 수 있습니까? 누가 특정 파일에 액세스하고 있는지 어떻게 알 수 있습니까?

답변:


39

매우 특이한 로깅 정책이없는 한, 누가 기록하지 않은 파일에 액세스했는지 (대량의 정보). 시스템 로그에서 누가 로그인했는지 확인할 수 있습니다. 이 last명령은 로그인 기록 및 /var/log/auth.log사용자가 인증 한 방법 및 로그인 위치 (어떤 터미널 또는 원격 인 경우 어떤 호스트)를 알려주는 기타 로그를 제공합니다 .

파일을 마지막으로 읽은 날짜를 액세스 시간 또는 짧은 시간 이라고합니다 . 모든 유닉스 파일 시스템은 파일을 저장할 수 있지만 많은 시스템은 (보통 작은) 성능 저하가 있기 때문에 기록하지 않습니다. ls -ltu /path/to/file또는 stat /path/to/file파일의 액세스 시간을 보여줍니다.

사용자가 파일에 액세스했는데 자신의 트랙을 숨기려고하지 않은 경우, 쉘 기록 (예 ~/.bash_history:)에 실마리가있을 수 있습니다.

파일을 무엇 또는 누가 지금 열 었는지 알아 보려면을 사용하십시오 lsof /path/to/file.

나중에 파일에 발생하는 사항을 기록하려면 몇 가지 방법이 있습니다.

  • inotifywait를 사용하십시오 . 누군가 읽을 때 inotifywait -e access /path/to줄을 인쇄합니다 . 이 인터페이스는 파일에 누가 액세스했는지 알려주지 않습니다. 이 회선이 표시되는 즉시 전화 를 걸 수 있지만 경쟁 조건이 있습니다 (lsof가 진행될 때까지 액세스가 종료 될 수 있음)./path/to/ ACCESS filefilelsof /path/to/file

  • LoggedFS 는 파일 시스템 트리의보기를 제공하고 해당보기를 통해 모든 액세스에 대해 더 빠른 로깅을 수행 할 수있는 스택 가능한 파일 시스템입니다. 이를 구성하려면 LoggedFS 구성 파일 구문을 참조하십시오 .

  • Linux의 감사 서브 시스템 을 사용 하여 파일 시스템 액세스를 포함하여 많은 것을 기록 할 수 있습니다 . auditd데몬이 시작 되었는지 확인한 다음로 로그 할 대상을 구성하십시오 auditctl. 기록 된 각 작업은 /var/log/audit/audit.log(일반 배포시)에 기록됩니다 . 특정 파일 시청을 시작하려면

    auditctl -w /path/to/file
    

    디렉토리에 감시를두면 디렉토리에있는 파일과 그 하위 디렉토리도 반복적으로 감시됩니다.


Gilles에게 감사합니다. 스크립트에 의해 생성 된이 dat 파일이 있습니다. 파일을 만든 후에 그 파일에 어떤 일이 발생하는지 알고 싶습니다. 다른 스크립트가 아닌 다른 프로세스에서는 추가 프로세스를 위해 파일을 선택하고 있으므로 누군가 해당 dat 파일에 수동으로 액세스하고 있는지 확인하고 싶습니다.
Jack

@ 잭 : 설정에 대해 더 많이 알지 못하면 말하기가 어렵지만 파일을 제거하거나 이름을 바꾸는 것이 없으면 다른 스크립트가 액세스하고 있는지 여부에 관계없이 다른 스크립트가 파일을 가져올 수 있습니다. 귀하의 의견에서 스크립트를 실행할 때 어떤 일이 발생하는지 살펴 봐야한다고 생각합니다.
Gilles 'SO- 악마 그만해'

2
이봐, 당신은 이것으로 멋진 원형 루프를 만들 수 있습니다 :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

inotifywait를 사용한 위의 예는 다음 중 하나 여야합니다 (자세한 내용은 매뉴얼 페이지 참조).

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

또는 모니터링 모드 및 타임 스탬프를 사용하는 경우 :

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'

6

이전 답변은 귀하가 요청한 것을 수행하는 최선의 방법 이 아닙니다 . 리눅스에는이를위한 API가 있습니다. inotifyAPI http://linux.die.net/man/7/inotify

  1. inotifyAPI를 직접 호출하여 원하는 작업을 수행하는 C 프로그램을 작성할 수 있습니다.
  2. kfsmd, http://www.linux.com/archive/feature/124903 을 사용하는 데몬을 사용할 수 있습니다inotify
  3. 플랫폼에서 작동하는 무언가를 원하고 ( inotifyLinux에 따라 다름) Java를 사용하는 경우 JNotify는 플랫폼 (Linux, Mac, Windows)에서 작동하여 기본 OS의 기본 API를 추상화합니다.

3
Stack Exchange에 오신 것을 환영합니다 . 답변은 시간 순서대로 표시되지 않으므로 "이전 답변"은 어떤 답변을 의미 하는지를 나타내지 않습니다. 어쨌든 당신이 언급하고있는 다른 두 가지 중 하나가 궁금합니다. 하나는 좋은 습관이나 나쁜 습관처럼 보이는 것이 없으며 다른 하나는 inotify API를 언급합니다.
Gilles 'SO- 악의를 멈춰라'

아마도 Glen은 기본 투표 정렬로 위의 답변을 언급합니다. 실제로 가장 인기있는 답변은 질문에 대한 해결책을 제시하지 못합니다. 주어진 시간 프레임 동안 파일이 몇 번 액세스되는지 확인해야하는 여러 가지 이유가있을 수 있습니다.
Wtower

1
unix.stackexchange.com/a/12251/20336에 설명 된 바와 같이 inotify API는 주어진 파일 에 누가 액세스했는지에 대한 정보를 제공하지 않습니다 . 또한 inotify는 지난주에 누가 파일에 액세스했는지 파악하는 데 도움이되지 않습니다. 이를 위해 감사 기능이 필요합니다.이 소프트웨어는라는 소프트웨어를 사용해야합니다 auditd(단, 지난 주에 auditd이미 실행 하지 않은 한 지난 주에 파일에 액세스 한 사람을 파악하는 데 도움이되지 않음 ).
Mikko Rantalainen

3

이것은 일반적으로 실현 가능하지 않습니다. 어떤 방식 으로든 가능하게하기 위해 충분한 감사가있는 파일 시스템을 보았지만 일반적인 Unix는 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.