/tmp의 하위 디렉토리가 Unix 소켓에 적합한 장소입니까?

/tmp의 하위 디렉토리가 Unix 소켓에 적합한 장소입니까?

REPL을 제어하는 ​​데 사용할 Unix 도메인 소켓을 배치할 안전한 장소를 찾고 있습니다.

/run/user/$UIDLinux에서는 이식성을 제외한 모든 요구 사항을 충족하는 를 사용합니다 . 이식 가능하도록 처리하는 프로그램이 필요합니다.

한 가지 옵션은 아래 디렉터리를 사용하는 것이지만 ~다른 문제가 발생합니다. 사용자의 홈 디렉터리가 경로 길이 제한으로 인해 Unix 도메인 소켓을 바인딩할 수 없을 만큼 깊은 디렉터리에 있을 수 있습니다.

아래 디렉토리에 소켓을 배치하는 것은 /tmp이식 가능하지만 디렉토리 제거 시 경쟁 조건이 걱정됩니다. 또한 /tmp모든 플랫폼에서 고정 비트를 설정할 수 있는지(즉, 사용자가 다른 사용자의 임시 파일을 삭제하거나 이름을 바꿀 수 없도록) 신뢰할 수 있는지도 걱정됩니다 . 나는 IS가 끈적하다고 가정 /tmp하지만 그렇지 않은 경우 많은 응용 프로그램(을 사용하는 모든 스크립트 mkstemp)은 안전하지 않습니다.

나의 현재 계획은 서버가 에 임시 디렉토리를 생성하고 /tmp클라이언트가 소켓을 사용하기 전에 포함된 디렉토리의 소유권을 확인하는 것입니다. 보안에 적합한가요?

답변1

그만큼정당한기준임시 파일의 위치는 환경 변수에 제공됩니다 TMPDIR.

이 변수는 임시 파일을 생성할 장소가 필요한 프로그램에 사용할 수 있는 디렉토리의 경로 이름을 나타냅니다.

실제로 많은 시스템에서는 TMPDIR. 그만큼사실상임시 파일의 표준 위치는 입니다 /tmp. 따라서 확인 TMPDIR하고, 설정되어 있지 않으면 를 사용하십시오 /tmp. 쉘 스크립트에서는 를 사용할 수 있습니다 ${TMPDIR:-/tmp}. 또는 더 편리하다고 생각되면

if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi

아니면 대처하기 위해set -u

: "${TMPDIR:=/tmp}"

이 위치는 쓰기 가능하다고 가정할 수 있지만 누구나 읽고 쓸 수 있을 수 있습니다. 따라서 다음과 같습니다.

  • 일반 파일을 생성할 때 자신에게 속하지 않을 수 있는 기존 파일을 덮어쓰지 않도록 항상 확인하세요. 이를 위해 쉘 리디렉션을 사용하지 마십시오. 검사를 속이기 위해 프로그램이 실행되는 동안 적이 기호 링크를 이동할 수 있으므로 별도로 소유권을 테스트하는 것은 안전하지 않습니다. 또한 존재하지 않는 특정 이름에 의존할 수도 없습니다. 동시 프로그램이 바로 앞에 동일한 이름의 파일을 생성하여 서비스 거부를 생성하는 것을 방지하려면 임의의 이름을 사용하십시오. mktemp유틸리티(광범위, GNU, BusyBox, BSD에 있지만 POSIX에는 없음) 또는 C 라이브러리 기능을 사용할 수 있습니다 mkstemp. 후드 아래에서 open또는 깃발 creat을 들고 호출해야 합니다 O_EXCL.
  • 으로 디렉토리를 생성할 수 있습니다 mkdir. 이는 기존 파일을 재사용하지 않기 때문에 소유권 속임수 도용으로부터 안전하지만 일반 파일과 동일한 서비스 거부가 발생하기 쉽기 때문에 임의의 이름을 사용해야 합니다. mktemp -d이 작업을 수행하는 좋은 방법입니다.
  • 소켓을 만들 수 있습니다(표준 쉘 유틸리티는 없습니다). 디렉토리 사례와 마찬가지로 소유권 속임수에 대해서는 안전하지만 서비스 거부에 대해서는 안전하지 않습니다.
    Linux는 명명된 소켓에 대한 권한을 존중하지만 그렇지 않은 Unix 변형도 있습니다. 이것이 소켓이 /tmp일반적으로 하위 디렉터리에 생성되는 이유입니다.

/tmp(또는 설정된 경우) 하위 디렉토리를 생성 $TMPDIR하고 거기에 명명된 소켓을 생성하는 프로그램에는 X11 서버, ssh-agent, gpg-agent, KDE, emacs 등이 포함됩니다. ). 보시다시피, 당신은 좋은 친구가 될 것입니다.

관련 정보