
저는 LAMP 웹 앱을 개발 중이며 shop
사이트 루트에 폴더를 계속 생성하는 예약된 프로세스가 어딘가에 있습니다. 이것이 나타날 때마다 앱의 다시 쓰기 규칙과 충돌이 발생하지만 좋지 않습니다.
shop
문제가 되는 스크립트를 찾을 때까지 루트에 폴더가 생성되는 것을 방지할 수 있는 방법이 있습니까 ? 내용이 변경되는 것을 방지하기 위해 폴더에 대한 권한을 변경할 수 있다는 것을 알고 있지만 특정 이름의 폴더가 생성되는 것을 방지하는 방법을 찾지 못했습니다.
답변1
디렉터리를 생성하는 사용자에게 상위 디렉터리에 쓸 수 있는 충분한 권한이 있으면 그렇게 할 수 없습니다.
대신 Linux 커널에서 제공하는 시스템 호출 계열을 활용하여 지정된 디렉터리에서 디렉터리 inotify
생성(선택적으로 -ing)을 감시할 수 있습니다(만약 생성된 경우(또는 선택적으로 -ed)) .mv
shop
mv
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")
디렉터리에서 /foo/bar
제거하려면 디렉터리에 대한 쓰기 권한이 있는 사용자로 명령을 실행해야 합니다 .shop
-ing 작업도 모니터링하려면 이벤트 mv
감시 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
예방에 대한 질문에 기초하여 문자 그대로 대답하려면폴더특정 이름으로 생성됩니다.
touch shop
동일한 이름의 파일이 존재하는 경우 디렉터리를 생성할 수 없습니다.
mkdir: cannot create directory ‘shop’: File exists
답변3
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
존재하지 않는 디렉토리 내의 존재하지 않는 위치를 가리키는 심볼릭 링크를 만듭니다. 여기에는 몇 가지 재미있는 의미가 있습니다.
$ 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
- mkdir, link 및 기타 항목은 (파일이 있음)으로 인해 실패합니다
EEXIST
. - 읽기, 쓰기 또는 추가를 위해 경로를 열려고 하면 실패합니다
ENOENT
(해당 파일 또는 디렉터리 없음). - 위치에서 stat(2)(lstat(2) 또는 stat(1) 아님)을 사용하면 에서도 실패합니다
ENOENT
. 물론 lstat는 심볼릭 링크에 대한 정보를 반환합니다.
여기에 제안된 다른 솔루션에 비해 두 가지 장점이 있습니다. (a) 디렉터리 생성을 추적하는 서비스 실행이 필요하지 않으며 (b) 이름이 대부분의 명령에 존재하지 않는 것처럼 보입니다.
시도해 보아야 할 것입니다. 그러나 재작성 규칙이 무엇이든 lstat 또는 기타 비참조 명령을 사용하지 않아 실패하게 되는 것 같습니다.