web-dev-qa-db-ja.com

特定の名前のフォルダが作成されるのを防ぐことはできますか?

私はLAMP Webアプリで作業しており、サイトのルートにshopというフォルダーを作成し続ける予定のプロセスがどこかにあります。これが表示されるたびに、アプリの書き換えルールとの競合が発生します。

問題のあるスクリプトが見つかるまで、ルートにshopというフォルダが作成されないようにする方法はありますか?フォルダーのアクセス許可を変更して、その内容が変更されないようにすることはできますが、特定の名前のフォルダーが作成されるのを防ぐ方法はわかりません。

16
Andrew

ディレクトリを作成しているユーザーが親ディレクトリに書き込むための十分な権限を持っている場合、それはできません。

代わりに、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") }'
_
30
heemayl

特定の名前のfolderが作成されないようにするという質問に基づいて文字通り回答する。

touch shop

同じ名前のファイルが存在する場合、ディレクトリを作成できません

mkdir: cannot create directory ‘shop’: File exists

30
Miati

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
4
Nykakin

(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
3
N. Clements

存在しないディレクトリ内の存在しない場所を指すシンボリックリンクを作成します。これには楽しい意味があります。

$ 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
  1. mkdir、linkなどはEEXISTで失敗します(ファイルが存在します)。
  2. 読み取り、書き込み、または追加のためにパスを開こうとすると、ENOENTで失敗します(そのようなファイルまたはディレクトリはありません)
  3. ロケーションでstat(2)(lstat(2)またはstat(1)ではない)を使用すると、ENOENTで失敗します。 lstatはもちろん、シンボリックリンクに関する情報を返します。

これには、ここで提案されている他のいくつかのソリューションに比べて2つの利点があります。(a)ディレクトリの作成を追跡するサービスを実行する必要がないこと、(b)ほとんどのコマンドで名前が存在しないように見えること.

あなたはそれを試してみる必要がありますが、私はあなたが持っているどんな書き換えルールでも、それらがlstatや他の非参照コマンドを使用しないので、失敗するのではないかと思います。

2
Jonas Schäfer