私はLAMP Webアプリで作業しており、サイトのルートにshop
というフォルダーを作成し続ける予定のプロセスがどこかにあります。これが表示されるたびに、アプリの書き換えルールとの競合が発生します。
問題のあるスクリプトが見つかるまで、ルートにshop
というフォルダが作成されないようにする方法はありますか?フォルダーのアクセス許可を変更して、その内容が変更されないようにすることはできますが、特定の名前のフォルダーが作成されるのを防ぐ方法はわかりません。
ディレクトリを作成しているユーザーが親ディレクトリに書き込むための十分な権限を持っている場合、それはできません。
代わりに、Linuxカーネルが提供するシステムコールのinotify
ファミリーを利用して、指定したディレクトリにディレクトリmv
が作成される(およびオプションでshop
- ing)のを監視できます。 、作成された場合(またはオプションでmv
- ed)、rm
ディレクトリ。
この場合に必要なユーザースペースプログラムはinotifywait
です(_inotify-tools
_に付属、必要に応じて最初にインストール)。
ディレクトリshop
が_/foo/bar
_ディレクトリにあると想定して、_/foo/bar/shop
_の作成と、作成された場合はrm
のモニタリングを設定しましょう。
_inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
_
_inotifywait -qme create /foo/bar
_作成される可能性のあるファイル/ディレクトリの_/foo/bar
_ディレクトリを監視します。つまり、create
イベントを監視します
作成された場合、awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
は、ファイルがディレクトリであり、名前がshop
(_/,ISDIR shop$/
_)であるかどうかをチェックします。そうである場合は、rm
ディレクトリ(system("rm -r -- /foo/bar/shop")
)
ディレクトリからshop
を削除するには、ディレクトリ_/foo/bar
_に対する書き込み権限を持つユーザーとしてコマンドを実行する必要があります。
mv
- ing操作も監視する場合は、_moved_to
_イベントの監視も追加します。
_inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
_
注:shop
という名前のディレクトリではなくファイルを探している場合:
_inotifywait -qme create /foo/bar | \
awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'
inotifywait -qme create,moved_to /foo/bar | \
awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'
_
特定の名前のfolderが作成されないようにするという質問に基づいて文字通り回答する。
touch shop
同じ名前のファイルが存在する場合、ディレクトリを作成できません
mkdir: cannot create directory ‘shop’: File exists
mkdir
syscallをLD_PRELOAD
...でハイジャックするのはどうですか?
$ ls
test.c
$ cat test.c
#define _GNU_SOURCE
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>
typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);
int mkdir(const char *path, mode_t mode) {
if(!strcmp(path, "shop")) return 1;
orig_mkdir_func_type orig_func;
orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir test
$ LD_PRELOAD='./test.so' mkdir shop
mkdir: cannot create directory ‘shop’: No such file or directory
$ ls
test test.c test.so
このハンドラー内では、代わりにこのディレクトリを作成するプロセスのPIDをログに記録できることに注意してください。
$ cat test.c
#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>
typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);
int mkdir(const char *path, mode_t mode) {
if(!strcmp(path, "shop")) {
FILE* fp = fopen("/tmp/log.txt", "w");
fprintf(fp, "PID of evil script: %d\n", (int)getpid());
fclose(fp);
}
orig_mkdir_func_type orig_func;
orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir shop
$ cat /tmp/log.txt
PID of evil script: 8706
これを使用するには、ルート(またはアプリを実行している人)の~/.bashrc
に配置する必要があります。
export LD_PRELOAD=/path/to/test.so
(Miatiの回答についてはコメントしましたが、私の古いアカウントを思い出せず、この新しいアカウントについて十分な評判がありません...)
ファイルを作成してからファイル属性を変更することで、作成をブロックできます。
$ Sudo touch shop
$ Sudo chattr +i shop
次に、そのファイルを使用して何かを実行しようとすると、ユーザーがrootになってもブロックされます。
$ rm shop
rm: remove write-protected regular empty file ‘shop’? y
rm: cannot remove ‘shop’: Operation not permitted
$ Sudo rm shop
rm: cannot remove ‘shop’: Operation not permitted
存在しないディレクトリ内の存在しない場所を指すシンボリックリンクを作成します。これには楽しい意味があります。
$ ln -s non-existent/foobar foo
$ ls -ln
total 0
lrwxrwxrwx 1 1000 1000 19 Okt 4 17:17 foo -> non-existent/foobar
$ mkdir foo
mkdir: cannot create directory ‘foo’: File exists
$ cat foo
cat: foo: No such file or directory
$ echo foo > foo
zsh: no such file or directory: foo
EEXIST
で失敗します(ファイルが存在します)。ENOENT
で失敗します(そのようなファイルまたはディレクトリはありません)ENOENT
で失敗します。 lstatはもちろん、シンボリックリンクに関する情報を返します。これには、ここで提案されている他のいくつかのソリューションに比べて2つの利点があります。(a)ディレクトリの作成を追跡するサービスを実行する必要がないこと、(b)ほとんどのコマンドで名前が存在しないように見えること.
あなたはそれを試してみる必要がありますが、私はあなたが持っているどんな書き換えルールでも、それらがlstatや他の非参照コマンドを使用しないので、失敗するのではないかと思います。