나는 fork.sh라는 스크립트를 얻었습니다.
#!/bin/sh
forkbomb() { forkbomb | forkbomb & } ; forkbomb
suexec를 통해 호출하면 전체 시스템이 CPU의 99%를 소비합니다. 일반적인 bash 포크 폭격을 방지하기 위해 Limit.conf를 사용하고 nproc를 50으로 설정했습니다. 이것은 예상대로 작동합니다.
그러나 httpd에서 suexec를 통해 위 스크립트를 호출하면 6000개 이상의 작업과 시스템 CPU 사용량이 >97%로 표시됩니다. user3 fork.sh에 대한 여러 항목을 볼 수 있으며 CPU 사용량은 약 0.6%입니다. systemd-cgtop을 호출하면 system.slice의 CPU 사용률은 100%이고 system.slice/httpd.service의 CPU 사용률은 75%입니다.
httpd를 제한하기 위해 cgroup을 사용했습니다.
systemctl set-property --runtime httpd.service CPUShares=600 MemoryLimit=500M
ulimits와 cgroups가 왜 이것을 처리할 수 없는지 이해할 수 없습니다.
답변1
이러한 limits
파일은 여전히 PAM
.apache 제공 인벤토리 에서 suexec
인식되거나 사용되지 않습니다 PAM
.패치가 존재합니다.호출할 소스 코드를 직접 수정할 수 있지만 setrlimit
(간단해 보입니다. setlimit(2)
매뉴얼 페이지를 참조하세요.) 현재 suexec
로서는 limits
.
아파치에서 여전히 ulimit를 설정할 수 있지만, 특히 프리포크 모델에서는 이것이 바람직하지 않다고 생각합니다. 왜냐하면 그렇게 하면 http 서버가 처리할 수 있는 로드가 제한되기 때문입니다. 또한 제한이 어떻게 작동하는지 suexec
모르기 때문에 제한 사항이 환경에도 적용되는지 잘 모르겠습니다 .suexec
CPUShares
포크 폭탄은 리소스를 많이 잡아먹지만 리소스는 실제로 사용자 영역 CPU 사이클에 있지 않기 때문에 여기서는 그 이유가 도움이 되지 않습니다. CPU 통계에 관해서는 너무 늦었습니다. 시스템에 프로그램을 실행하는 데 사용할 수 있는 여유 메모리나 프로세스 슬롯이 없습니다.
prlimit
그 중 일부를 시도해 볼 수 있으므로 util-linux
설치 표준을 충족해야 합니다. 이렇게 하면:
$ prlimit --nproc=1 bash -c bash -c id
bash: fork: retry: No child processes
그래서 이 작은 2포크 프로세스는 실패했습니다.
불행하게도 나는 prlimit가 실행 체인에 참여하도록 하는 합리적인 방법을 찾지 못했습니다. Apache는 suexec
기본적인 요구 사항을 충족할 만큼 유연하지 않고 너무 제한적이어서 보안을 깨뜨려야 하는 더 이상 사용되지 않는 모듈을 제공함으로써 자신과 우리 모두를 망쳤습니다 .