特定の名前のフォルダーが作成されないようにできますか?


16

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

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


4
何が作成されているかを調べるには、監査有効にします
アンドリューヘンレ

回答:


30

ディレクトリを作成しているユーザーに、親ディレクトリに書き込むための十分なアクセス許可がある場合は、できません。

代わりに活用することができますinotify作成を監視するために、Linuxのカーネルが提供するシステムコールの家族を(必要に応じてmv-ing)ディレクトリのshop作成(または必要に応じている場合、指定されたディレクトリにmv-ed)、rmディレクトリ。

この場合に必要なユーザー空間プログラムはinotifywaitinotify-tools必要に応じて最初にインストールします)です。


ディレクトリshopがディレクトリに存在すると仮定して、作成の/foo/barためのモニタリングを設定し、作成された場合はすぐに設定しましょう:/foo/bar/shoprm

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")

ディレクトリ/foo/barから削除するにshopは、ディレクトリに対する書き込み権限を持つユーザーとしてコマンドを実行する必要があります。


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") }'

2
さらに、inotifywaitこれを行うために使用している場合、トリガーがプロセスをキャッチできる可能性もありますps -ef
-roaima

30

特定の名前のフォルダーが作成されないようにするという質問に基づいて、文字通り答えます

touch shop

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

mkdir: cannot create directory ‘shop’: File exists


6
これでは不十分な場合があります。mkdirでは実行できませんが、実行できます。しかし、それは良い最初の試みです。
coteyr

9
Linuxシステムでは、chattr +i shop不変にするために使用します。不変フラグが削除されるまで、名前の変更や削除はできません。
R .. GitHub停止ヘルプICE

1
これはスマートな小さなトリックであり、私の状況にはまったく適切ではありませんが、特定の状況に対する賢いアイデアです。👍-
アンドリュー

1
@R ..面白い。rename(2)名前はiノードの一部ではありませんが、機能しないため、引き続き機能することを期待していました。簡単なインターネット検索では、その理由が明らかになりません。ヒントはありますか?
-domen

@domen:それは「不変」属性の目的の一部だからです。rename動作を防ぐためには、実装レベルで重要な追加作業が必要だと思います。
R .. GitHub停止ヘルプICE

4

...でmkdirsyscallをハイジャックするのはどう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

2
これは、それが解決し、良いものだ、downvoteを持つべきではない

4
スーツケースの核を使って豆の缶を開けています。でもねえ、少なくとも彼らは...調理することがあります
モニカと明度レース

2
@cat:私は同意しません。LD_PRELOADこのようなハックは基本的に常に間違っており、何をしているのかわからない限り、置き換える関数のasync-signal-safetyのようなプロパティを壊すことで、ロードするプログラムをひどく壊す可能性があります。
R .. GitHub STOP HELPING ICE

1
また、私は考えるfopen必要があります"a"代わりに"w"、それは以前のログ保存することができますので、

2
これは、不良コードがlibcを介さずに直接syscallを呼び出す場合にも機能しません。または、不良コードが静的にリンクされている場合。
-domen

3

(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

2
古いアカウントの名前/メールアドレスがわかっている場合は、すべてのページの下部にある連絡先フォームからアカウントの統合をリクエストできます
wizzwizz4

また、なぜ投稿することにしたのではなく、これが他の回答とどのように関連しているかを教えてください。
jpaugh

2

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

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

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

試してみる必要がありますが、書き換えルールが何であれ、lstatや他の非参照コマンドを使用しないため、失敗します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.