Linux에서 프로세스를 종료 불가능하게 만들기

Linux에서 프로세스를 종료 불가능하게 만들기

비밀번호 관리자 애플리케이션을 개발 중인데 보안상의 이유로 종료할 수 없는 프로세스를 시작하고 싶습니다.

게다가 나는 이 프로그램이 데몬이 되는 것을 원하지 않습니다. 왜냐하면 stdin에서 읽고 써야 하기 때문입니다.

이를 수행할 수 있는 방법이 있습니까?

답변1

비밀번호 관리자를 별도의 사용자로 실행하고 터미널( SIGINT, SIGQUIT, SIGHUP, SIGTSTP및 ) SIGTTIN에서 생성된 신호를 처리/무시/차단합니다.SIGTTOU

유효 ID가 0(루트)이 아니면 실제 uid 및 저장 세트 uid가 유효 uid와 다른 다른 사용자로 실행 중인 프로세스에 신호를 보낼(=종료) 수 없습니다.

모든 프로세스는 여전히 루트에 의해 종료될 수 있습니다.

자세한 내용은 다음을 참조하세요.죽이다(2).

답변2

프로세스를 종료할 수 없도록 만드는 유일한 방법은 다음과 같이 프로세스를 구현하는 것입니다.커널 스레드, 이것은 작은 문제가 아닙니다.

여전히 죽일 수는 있지만 이는 운영 체제 종료로 인한 부수적 손상이 될 것입니다.

SIGNAL_UNKILLABLE프로세스에 대한 플래그를 설정하는 사용자 정의 커널 모듈을 개발할 수도 있습니다. 이 플래그는 무조건 종료로부터 보호되는 유일한 사용자 모드 프로세스인 init(또는 커널에 의해 시작된 모든 초기 프로세스) 에만 설정되도록 설계되었지만 systemd이 플래그가 일반 프로세스에 나타나는 것을 금지하는 것은 없는 것 같습니다.

답변3

기술적으로 사용자는 프로세스를 종료할 수 없게 만들 수 없습니다.

물론 루트가 아닌 사용자의 경우 자신과 동일한 사용자 ID를 가진 프로세스만 종료할 수 있으므로 다른 계정을 만들 수 있는 경우 해당 프로세스에 대해 "고유" 사용자 ID를 사용할 수 있으며 루트만 종료할 수 있습니다. 그것 .

간단하지만 덜 강력한 솔루션은 프로세스에서 가능한 한 많은 신호를 포착하도록 하는 것입니다(아마도 무시할 수 있음). KILL 신호(신호 9)를 포착할 수 없기 때문에 이것은 장난감 예제나 비적대적 환경에서만 작동하지만 그렇지 않으면 이들에 의해 살해되는 것을 피할 수 있습니다.

마지막으로 프로세스가 종료되면 다시 생성되도록 예약할 수 있습니다. 이것도 깨지기 쉬우나 제거하기가 더 어려워집니다. 이는 자체 모니터링 프로세스를 사용하거나 inittab을 사용하여 수행할 수 있습니다. 자신이 무엇을 하는지 알고 있는 공격자는 여러 프로세스를 한 번에 종료하여 이를 피할 수 있습니다.

관련 정보