ssytemd에서 시작된 사용자 정의 SSHD 서비스가 있습니다. 해당 서비스 파일은 기본적으로 기본 서비스 파일과 동일 openssh-server
하지만 sshd_config
사용자 정의 포트 및 기타 비표준 설정을 사용하여 사용자 정의 파일을 지정합니다.
때때로 누군가가 /run/sshd
시스템의 디렉토리를 삭제합니다. 이로 인해 이 SSHD에 대한 모든 후속 연결이 실패하고 표시됩니다 fatal: Missing priviledge separation directory: /run/sshd
.
- 이 메시지의 원인은 무엇입니까?
- 이와 같은 치명적인 오류로 인해 SSHD pid가 종료되지 않는 이유는 무엇입니까? 프로세스가 종료되지 않으면 systemd는 서비스를 다시 시작해야 한다는 사실을 알지 못합니다.
답변1
sshd.service
내 시스템에는 다음이 있습니다.
[Service]
...
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
RuntimeDirectory
systemd의 많은 샌드박스 기능 중 하나입니다. man systyemd.exec
자세히보다. 서비스가 시작되면 /run/sshd
0755 권한으로 생성되었는지 확인합니다. 단, 기기가 정지되면 삭제됩니다.
두 서비스가 동일한 서비스에 의존하는 경우 문제가 발생할 수 있습니다 RuntimeDirectory=
. 성공적으로 실행 중인데 RuntimeDirectory=
동일한 구성으로 다른 장치가 시작된다고 가정해 보겠습니다. 두 번째 단위가 시작되면 모든 파일은 chown
해당 단위의 User=
합계 로 재귀됩니다 Group=
. 장치가 중지되면 RuntimeDirectory=
제거됩니다. 이러한 조치는 귀하의 서비스에 큰 해를 끼칠 수 있습니다.
이러한 상황으로부터 자신을 보호하려면 다음 두 가지 옵션이 있습니다.
- 동일한 를 사용하는 다른 단위를 찾으십시오
RuntimeDirectory=
. 거의 확실하게sshd.service
원본을 복사하고 있습니다. 그런 다음 장치가Conflicts=
함께 제공되는지 확인하십시오. 이렇게 하면 두 서비스가 동시에 활성화되어 경쟁하는 것을 방지할 수 있습니다. 원하지 않는 경우 다른 서비스를 사용하여 해당 서비스가 실행되지 않도록Conflict=
할 수도 있습니다 .systemctl mask
[Unit]
...
Conflicts=sshd.service
RuntimeDirectory=
서비스와 관련된 디렉터리로 변경합니다 .
두 번째 질문은 제가 답변하기가 좀 어렵습니다. 치명적인 오류 마스터 PID를 종료하지 않기로 한 결정은 sshd의 설계 결정(또는 버그)입니다. 잠깐 살펴봐도 "치명적 중단"이나 이와 유사한 옵션을 찾는 데 도움이 되지 않았습니다 man sshd
.man sshd_config