/ run과 / tmp를 모두 가질 이유가 없습니다.
내 생각 엔 당신이 맞다. /tmp
우리는 이제 기본적으로 더 이상 사용되지 않습니다 /run
. 프로그램이 그렇게 할 수있는 위치에 있다면 ( 권한있는 작업 으로 설치 해야 함 ) 요즘에는 하위 디렉토리를 사용 /run
합니다. 이것은 보안상의 이유입니다.
예를 들어 CUPS 인쇄 데몬은 루트로 실행되지 않지만 일반적으로 OS 패키지에서 설치됩니다. 이 패키지는 설치 /usr/lib/tmpfiles.d/cups.conf
하고, systemd-tmpfiles
이 액세스 할 수있는 디렉토리를 생성합니다. 디렉토리가 아래 /run
에 있으므로 권한이없는 사용자 /tmp
가 이름을 세계적으로 쓸 수있는 것과 달리 악의적으로 주장 할 수 없습니다 .
/run
직접 사용할 수없는 "권한없는 프로그램"
실제 구별은 프로그램이 임의의 권한이없는 사용자가 자신의 사용자 ID로 실행중인 경우입니다. 그러나 /tmp
권한이없는 다른 사용자가 액세스 할 수 있기 때문에 일반적으로 여전히 사용하고 싶지 않습니다 . 을 사용하는 것이 좋습니다 $XDG_RUNTIME_DIR
. 일반적으로 이것은 다음과 같이 구현 /run/user/$(id -u)
되므로 하위 디렉토리이기도 /run
합니다. 그러나 위치는 보장되지 않습니다. 프로그램은 항상 환경 변수를 사용해야합니다.
/tmp
시스템의 권한이없는 다른 사용자들 사이의 임시 협력에만 유용합니다. 이러한 임시 시스템은 악의적 인 사용자가 모든 사람을 위해 협력하고 망치는 것을 거부하기에 취약합니다. 한 가지 예는 권한이없는 사용자 talk
가 유닉스 소켓을 사용하여 데몬 버전을 실행하기로 결정하는 것 입니다.
Lennart Poettering의 원본 정보
아래 Poettering의 체크리스트 /tmp
는 "작은 파일"에 유용하지만 /run
"통신 프리미티브"에만 사용해야한다고 주장했다 . 이 차이도 사실이라고 생각하지 않습니다. 에 대한 포스터 소년 /run
이다 udev
, 나는 확신 /run/udev
내부 데이터베이스가 포함되어 있습니다. 일단 당신이 /run
디렉토리 를 가지고 있다면 , 나는 누군가가 주장 된 구별을 따르고 다른 디렉토리를 만들고 싶어서 생각하지 않는다고 생각 합니다 /tmp
. 실제로 우리는 /run
요즘에 사용 합니다.
통신을 위해 세계적으로 쓸 수있는 공유 네임 스페이스 (예 : / tmp)를 사용하는 것은 항상 문제가되었습니다. 통신을 설정하려면 안정적인 이름이 필요하지만 안정적인 이름은 DoS 공격의 문을 엽니 다. 초기 부팅 중에 특정 서비스에 대해 보호 된 앱별 디렉토리를 설정하면 부분적으로 문제를 해결할 수 있지만 (X11에서와 같이) 모든 패키지 설치 후 재부팅 한 경우에만 올바르게 작동하므로 문제를 부분적으로 만 수정합니다.
...
Fedora 17의 또 다른 Fedora 기능은 다양한 서비스의 / tmp 네임 스페이스를 격리함으로써 더 많은 시스템 서비스의 보안을 강화하기 위해 / tmp의 의미를 변경했습니다.
...
/ tmp는 더 이상 공유 네임 스페이스 일 필요가 없으므로 일반적으로 통신 기본 요소의 위치로 적합하지 않습니다.
...
[/ run]은 tmpfs임을 보증하므로 부팅시 자동으로 플러시됩니다. 그 이상으로 자동 정리가 수행되지 않습니다.
...
다음은 Linux 응용 프로그램 개발자가 올바른 디렉토리를 선택하도록 제안하는 대략적인 지침입니다.
- 소켓 (또는 다른 통신 기본 요소)을 넣을 장소가 필요하고 코드가 특권을 실행합니다. / run 아래의 하위 디렉토리를 사용하십시오. (또는 추가 호환성을 위해 / var / run 아래에 있습니다.)
- 소켓 (또는 다른 통신 프리미티브)을 넣을 장소가 필요하고 코드가 권한없이 실행됩니다. $ XDG_RUNTIME_DIR 아래의 하위 디렉토리를 사용하십시오.
- 더 큰 다운로드 및 다운로드를 진행하고 권한이없는 상태로 실행하려면 장소가 필요합니다. $ XDG_DOWNLOAD_DIR을 사용하십시오.
- 지속적이고 권한이없는 캐시 파일을 넣을 장소가 필요합니다 : $ XDG_CACHE_HOME을 사용하십시오.
- 위의 어느 것도 적용되지 않으며 지속성이 필요없는 작은 파일을 배치해야합니다. / tmp에 폴백으로 $ TMPDIR을 사용하십시오. 그리고 mkstemp ()와 mkdtemp ()를 사용하십시오.
- 그렇지 않으면 / var / tmp의 폴 백과 함께 $ TMPDIR을 사용하십시오. mkstemp () / mkdtemp ()도 사용하십시오.
위의 규칙은 당사에서만 제안합니다. 이 규칙은 우리가이 주제에 대해 알고있는 모든 것을 고려하고, 현재와 미래의 배포에서 볼 수있는 한 문제를 피합니다. 이 규칙을 따르도록 프로젝트를 업데이트하고 새 코드를 작성할 때 명심하십시오.
우리가 강조하고 싶은 한 가지는 / tmp 및 / var / tmp가 실제로 사용 사례에 적합하지 않은 것보다 더 자주 있다는 것입니다. 이러한 디렉토리의 올바른 사용법이 있지만 실제로는 다른 디렉토리가 더 나은 곳일 수 있습니다. 따라서 다른 옵션을 고려하십시오. 그러나 / tmp 또는 / var / tmp를 사용하는 경우 최소한 mkstemp () / mkdtemp ()를 사용해야합니다.
우리 /tmp
는 위에서 설명한 것처럼 X 윈도우 시스템에서 사용되는 레거시 소켓을 사용하지 않습니다. 나는 잘못 읽었다 tmpfiles.d/x11.conf
. 그것이 협력에 의존하는 것처럼 보입니다 :). 서비스 거부가 발생할 수있는 최악의 코드와 같이 코드가 감사되었다고 가정합니다.