SSH가 치명적인 오류로 종료되지 않습니다

SSH가 치명적인 오류로 종료되지 않습니다

ssytemd에서 시작된 사용자 정의 SSHD 서비스가 있습니다. 해당 서비스 파일은 기본적으로 기본 서비스 파일과 동일 openssh-server하지만 sshd_config사용자 정의 포트 및 기타 비표준 설정을 사용하여 사용자 정의 파일을 지정합니다.

때때로 누군가가 /run/sshd시스템의 디렉토리를 삭제합니다. 이로 인해 이 SSHD에 대한 모든 후속 연결이 실패하고 표시됩니다 fatal: Missing priviledge separation directory: /run/sshd.

  1. 이 메시지의 원인은 무엇입니까?
  2. 이와 같은 치명적인 오류로 인해 SSHD pid가 종료되지 않는 이유는 무엇입니까? 프로세스가 종료되지 않으면 systemd는 서비스를 다시 시작해야 한다는 사실을 알지 못합니다.

답변1

sshd.service내 시스템에는 다음이 있습니다.

[Service]
...
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

RuntimeDirectorysystemd의 많은 샌드박스 기능 중 하나입니다. man systyemd.exec자세히보다. 서비스가 시작되면 /run/sshd0755 권한으로 생성되었는지 확인합니다. 단, 기기가 정지되면 삭제됩니다.

두 서비스가 동일한 서비스에 의존하는 경우 문제가 발생할 수 있습니다 RuntimeDirectory=. 성공적으로 실행 중인데 RuntimeDirectory=동일한 구성으로 다른 장치가 시작된다고 가정해 보겠습니다. 두 번째 단위가 시작되면 모든 파일은 chown해당 단위의 User=합계 로 재귀됩니다 Group=. 장치가 중지되면 RuntimeDirectory=제거됩니다. 이러한 조치는 귀하의 서비스에 큰 해를 끼칠 수 있습니다.

이러한 상황으로부터 자신을 보호하려면 다음 두 가지 옵션이 있습니다.

  1. 동일한 를 사용하는 다른 단위를 찾으십시오 RuntimeDirectory=. 거의 확실하게 sshd.service원본을 복사하고 있습니다. 그런 다음 장치가 Conflicts=함께 제공되는지 확인하십시오. 이렇게 하면 두 서비스가 동시에 활성화되어 경쟁하는 것을 방지할 수 있습니다. 원하지 않는 경우 다른 서비스를 사용하여 해당 서비스가 실행되지 않도록 Conflict=할 수도 있습니다 .systemctl mask
[Unit]
...
Conflicts=sshd.service
  1. RuntimeDirectory=서비스와 관련된 디렉터리로 변경합니다 .

두 번째 질문은 제가 답변하기가 좀 어렵습니다. 치명적인 오류 마스터 PID를 종료하지 않기로 한 결정은 sshd의 설계 결정(또는 버그)입니다. 잠깐 살펴봐도 "치명적 중단"이나 이와 유사한 옵션을 찾는 데 도움이 되지 않았습니다 man sshd.man sshd_config

관련 정보