2009-03-18 4 views
4

변경 사항을 확인하기 위해 선택한 파일 및 디렉토리를 모니터링하는 프로그램을 작성 중입니다. 일부 파일은 세계에서 쓰기 가능하고 일부 소유자는 일부 그룹입니다.Linux에서 파일을 마지막으로 수정 한 UID를 결정 하시겠습니까?

내가해야할 일은 파일을 수정하는 마지막 사람을 알아낼 수 있어야한다는 것입니다. 어쨌든 우리는 파일의 아이 노드를 알기 때문에 이것이 간단 할 것이라고 생각했습니다. 그러나 이것을 얻는 방법을 찾지 못하고 있습니다. 마지막으로 액세스 한 uid에 주어진 inode를 상관시키는 실용적인 방법이 있다고 생각했습니다.

나는 주제에 관해 나에게 줄 모든 것을 google에 넣었다고 생각한다.

도움을 주시면 감사하겠습니다. 나는 C.

에서 프로그램을 쓰고 있어요

편집 : 나는 프로그램이 파일이 사라 졌어요 수정 어떤의 PID 후이 작업을 수행 할 수 있어야합니다

.

+0

재 : 당신의 편집, 당신이 요구하는 것은 단순히 수 없습니다 . –

+0

예, 알고 있습니다. 파일에 접근하자마자 pid를 캡처하기 위해 더 많은 코드를 작성하기 전에 확인하고 싶었습니다. –

답변

5

2.6 커널에있는 경우 커널의 auditd 데몬을 사용할 수 있습니다. Check this URL out. 당신이 시도하고있는 것을 성취하는 방법에 대한 힌트를 줄 수도 있습니다. C에서 사용할 수있는 API가 있다고 확신합니다.

+0

감사합니다. 지금 커널과의 인터페이스를 확인하기 위해 소스를 얻으려고합니다. –

+0

찾는 정보는 직접 저장되지 않습니다. 그러나 감사 기능이 켜져있는 경우 감사 추적 기능은 (구성된 경우) 마지막 프로세스 (및 해당 AUID, EUID, RUID)를 표시하여 파일을 쓸 수 있습니다. 실제로 변경되었는지 여부는 알 수 없지만 변경 될 수 있습니다. – mpez0

2

본인이 아는 한이 정보는 일반적인 파일 시스템에 저장되지 않지만, inotify에 연결하여 감사 추적을 유지할 수 있어야합니다 프로세스가 어떤 파일을 터치합니다.

+0

inotify에서 수정 프로세스의 uid/gid/pid를 가져 오는 방법이 보이지 않습니까? 이벤트와 경로가 수정되었습니다. –

+0

커널이 코드를 호출하면 누가 파일을 열 었는지 확인하고 로그에 메시지를 쓸 수 있습니다. –

2

정상적인 파일 시스템을 사용하는 일반적인 표준 Linux를 사용하면 그렇게 할 수 없습니다. 이 정보는 어디에도 저장되지 않고 (저장 무엇인지에 대한 man lstat를 참조하십시오.)

을 @pablo에서 알 수 있듯이, 당신은 보안 감사이 켜져 할 수 있습니다. 그는 노트 링크는 좋은 시작이지만, 그것의 요점은 이것이다 :

  • 당신이 감사 당신이
  • 을 원하는 캡처 규칙 파일을 구성 커널에게
  • 을 형성 할 수있는 감사 데몬을 켭니다
  • 감사 파일에서 원하는 이벤트를 검색하십시오.

모든 파일 작업에 대한 감사를 시작하면 감사가 커질 수 있습니다.

그래서 원하는 실제 필요 항목은 무엇입니까?

+0

Auditd는 내가하고있는 일을 어느 정도 복제하고 있지만 더 비싼 방법으로 진행할 것입니다. 필자가 작성한 프로그램은 침입 가능성에 대한 실시간 알림을 제공합니다. 나는 auditd가 커널과 어떻게 인터페이싱 하는지를 알기위한 소스를 얻고있다. 아마이 코드를 다시 사용할 수 있어야한다. –

-4

아주 기본적인,하지만 작동합니다 당신은 쉽게 그냥 당신이 원하는 속성을 찾아보십시오,이 예제 파일이나 디렉토리 또는 링크의 UID를 검색 를 원하는 것을 조금 C-프로그램을 작성할 수 있습니다.다음

gcc -x c my-prog.c -o my-prog 

:

는 컴파일 다른 많은 정보가이

같이 얻을 수

./my-prog /etc 

는 강력한 아니다. 하지만 내가 아는대로, 를 사용하고

[ -x /etc ] && my-prog /etc 

소스 코드 :-) bash 쉘에서 검사를 수행하는 방법 :

# retrieve the uid of a file 
# source code: my-prog.c 
# 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
int main(int argc, char **argv) { 
    struct stat buffer; 
    int status; 
    char *fname; 
    fname=argv[1]; 
    status = stat(fname, &buffer); 
    printf("%i",buffer.st_uid); 
    return 0; 
} 
+4

stat 버퍼의 st_uid 필드에는 마지막 소유자의 UID가 아닌 파일의 소유자가 포함됩니다. –

관련 문제