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

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

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

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

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

아래 디렉터리에 소켓을 두면 /tmp이식 가능하지만, 디렉터리 삭제 시 경쟁 조건이 생길까 걱정됩니다. 또한 /tmp고정 비트가 모든 플랫폼에서 설정될 수 있는지 여부도 걱정됩니다 (예: 사용자가 다른 사용자의 임시 파일을 삭제하거나 이름을 바꿀 수 없음). 그러나 나는 그것이 /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에는 없음) 또는 mkstempC 라이브러리 기능을 사용할 수 있습니다 . 뒤에서는 open여전히 creat플래그로 호출해야 합니다 O_EXCL.
  • 를 사용하여 디렉토리를 생성할 수 있습니다 mkdir. 이렇게 하면 기존 파일을 재사용하지 않으므로 소유권 스푸핑을 방지할 수 있지만 일반 파일처럼 서비스 거부가 발생하기 쉬우므로 임의의 이름을 사용해야 합니다. mktemp -d이 작업을 수행하는 좋은 방법입니다.
  • 소켓을 생성할 수 있습니다(표준 쉘 유틸리티는 없습니다). 디렉토리의 경우와 마찬가지로 소유권 스푸핑으로부터 보호하지만 서비스 거부는 방지하지 않습니다.
    Linux는 명명된 소켓에 대한 권한을 존중하지만 일부 Unix 변형에서는 그렇지 않습니다. 이것이 /tmp소켓이 일반적으로 하위 디렉터리에 생성되는 이유입니다.

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

관련 정보