3

選択したファイルとディレクトリの変更を監視するプログラムを作成しています。一部のファイルは誰でも書き込み可能で、一部の所有者、一部のグループです。

私がする必要があるのは、ファイルを(アクセスするだけでなく)最後に変更した人を見つけることができることです。ファイルのiノードがわかっているので、どういうわけかこれは簡単だと思いました。しかし、これを取得する方法が見つからないようです。特定のiノードを最後にアクセスしたuidに関連付ける実用的な方法があると思いました。

私はそのトピックについて私に与えるすべてのことのためにグーグルを絞ったと思います。

どんな助けでも大歓迎です。私はCでプログラムを書いています。

編集:

ファイルを変更したプログラムのPIDが長い間なくなった後、これを実行できるようにする必要があります。

4

4 に答える 4

5

2.6カーネルを使用している場合は、カーネルのauditdデーモンを利用できます。このURLをチェックしてください。それはあなたがしようとしていることを達成する方法についてあなたにいくつかのヒントを与えるかもしれません。Cで使用できるAPIがあると確信しています。

于 2009-03-18T03:34:31.203 に答える
2

私の知る限り、この情報は一般的なファイルシステムのいずれにも保存されませんが、inotifyにフックして、どのプロセスがどのファイルにアクセスするかを監査することができるようにする必要があります。

于 2009-03-18T03:37:40.073 に答える
2

さて、通常のファイル システムで古い標準の Linux をそのまま使用しても、それはできません。その情報はどこにも保存されません (man lstat保存されるかを参照してください)。

@pablo が示唆するように、セキュリティ監査をオンにしてこれを行うことができます。彼が指摘するリンクは良い出発点ですが、その要点は次のとおりです。

  • 監査デーモンをオンにすると、カーネルからの監査が有効になります
  • 必要なものをキャプチャするようにルールファイルを構成します
  • 必要なイベントの監査ファイルを検索します。

ここでの問題は、すべてのファイルのすべてのファイル操作の監査を開始すると、監査が大きくなるということです。

では、あなたが満たしたい実際のニーズは何ですか?

于 2009-03-18T03:44:03.910 に答える
-4

非常に基本的ですが、機能します。必要なことを行う小さな C プログラムを簡単に作成できます。この例では、ファイル、ディレクトリ、またはリンクの UID を取得します。必要なプロパティを見つけてみてください。

次のようにコンパイルします。

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

それから:

./my-prog /etc

このように他の多くの情報を取得できます

堅牢ではありません。とにかく、私はそれを使用する方法を知っており、bashシェルでチェックを行います:-)

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

ソースコード:

# 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;
}
于 2010-05-19T11:59:57.360 に答える