/tmp 파일 생성을 모니터링하고 파일 삭제를 방지하시겠습니까? [복사]

/tmp 파일 생성을 모니터링하고 파일 삭제를 방지하시겠습니까? [복사]

/tmp/*some folder*일부 파일을 만들고 실행하는 바이너리가 있습니다 . 동일한 바이너리는 이러한 파일을 실행한 후 즉시 삭제합니다. 이러한 파일을 차단할 수 있는 방법이 있나요?

바이너리 파일에는 쓰기 권한이 필요하기 때문에 폴더를 읽기 전용으로 만들 수 없습니다. 실행 시 파일을 복사하거나 원본 바이너리가 파일을 삭제하는 것을 방지하는 방법이 필요합니다.

답변1

chattr +a /tmp/*some folder*폴더를 추가만하도록 설정합니다. 파일을 생성하고 쓸 수 있지만 삭제할 수는 없습니다. chattr -a /tmp/*some folder*완료되면 사용하세요.

답변2

다음 inotifywait명령을 사용할 수 있습니다이노티파이 도구예를 들어 다음에서 생성 /tmp/some_folder된 모든 파일을 하드링크합니다 ./tmp/some_folder/tmp/some_folder_bak

#!/bin/sh

ORIG_DIR=/tmp/some_folder
CLONE_DIR=/tmp/some_folder_bak

mkdir -p $CLONE_DIR

inotifywait -mr --format='%w%f' -e create $ORIG_DIR | while read file; do
  echo $file
  DIR=`dirname "$file"`
  mkdir -p "${CLONE_DIR}/${DIR#$ORIG_DIR/}"
  cp -rl "$file" "${CLONE_DIR}/${file#$ORIG_DIR/}"
done

하드링크이기 때문에 프로그램이 수정하면 업데이트해야 하지만, 프로그램이 삭제할 때 삭제하면 안 됩니다. 하드 링크 클론은 정상적으로 삭제할 수 있습니다.

이 방법은 원자적이지 않으므로 프로그램이 새로 생성된 파일을 삭제하기 전에 이 스크립트를 사용하여 하드 링크를 생성해야 합니다.

복제하고 싶다면모두로 변경하면 /tmp보다 분산된 스크립트 버전을 사용할 수 있습니다.

#!/bin/sh

TMP_DIR=/tmp
CLONE_DIR=/tmp/clone
mkdir -p $CLONE_DIR

wait_dir() {
  inotifywait -mr --format='%w%f' -e create "$1" 2>/dev/null | while read file; do
    echo $file
    DIR=`dirname "$file"`
    mkdir -p "${CLONE_DIR}/${DIR#$TMP_DIR/}"
    cp -rl "$file" "${CLONE_DIR}/${file#$TMP_DIR/}"
  done
}

trap "trap - TERM && kill -- -$$" INT TERM EXIT

inotifywait -m --format='%w%f' -e create "$TMP_DIR" | while read file; do
  if ! [ -d "$file" ]; then
    continue
  fi

  echo "setting up wait for $file"
  wait_dir "$file" &
done

답변3

/tmp에서 실행된 프로그램이 여전히 실행 중인 경우 파일 시스템에서 "제거"되더라도 inode가 여전히 데이터와 함께 존재하기 때문에 일반적으로 원래 바이너리를 검색할 수 있습니다. 삭제하면 단순히 디렉터리에서 이름의 연결이 해제됩니다.

Linux에서는 /proc/PID/exe 링크를 통해 inode의 내용에 액세스할 수 있습니다. 비슷한 도구를 사용 ls하면 원래 경로가 표시되고 링크가 끊어진 것으로 표시됩니다(색상별로). 그러면 목록의 이름에 "(삭제됨)"과 같은 내용이 표시됩니다. 그러나 파일을 읽어 검색할 수는 있습니다.

이 개념을 보여주는 예(수면을 예시 도구로 사용):

$ cp /bin/sleep /tmp/otherprog
$ /tmp/otherprog 300 &
[1] 3572
$ rm /tmp/otherprog
$ ls -l /proc/3572/exe
lrwxrwxrwx 1 john john 0 Feb 27 08:54 /proc/3572/exe -> /tmp/otherprog (deleted)
$ cp /proc/3572/exe /tmp/saved
$ diff /tmp/saved /bin/sleep
$ echo $?
0

수면 프로그램의 내용을 "otherprog"라는 새로운 프로그램에 복사해서 "새" 프로그램을 만들고, 한동안 계속 실행되도록 실행해 봤습니다. 그런 다음 /tmp에서 프로그램을 삭제했습니다. 셸에서 얻은 PID를 사용하여(관심 있는 프로그램의 PID를 찾으면 관심 있는 프로그램의 PID를 찾을 수 있습니다. ps) /proc에 있는 exe 링크를 살펴본 다음 파일의 내용을 복사했습니다(심지어 대상 파일 이름은 사라졌지만) 내용이 원본과 동일한지 확인했습니다.

물론 /tmp에 있는 프로그램이 일시적인 경우에는 작동하지 않습니다. 왜냐하면 프로그램이 종료되면 inode의 링크 수가 데이터가 실제로 디스크에서 해제되는 지점까지 떨어지기 때문입니다.

/tmp 디렉토리에서 링크를 해제하기 전에 서둘러 파일을 복사하는 것을 방지합니다.

관련 정보