Apache + mod_fcgid + mod_security chroot를 실행하는 웹 서버를 설정하려고 하는데 제대로 작동하는 데 어려움을 겪고 있습니다. Apache는 공식 CentOS 저장소에서 설치되고, mod_fcgid 및 mod_security는 EPEL 저장소에서 설치됩니다.
처음에는 chroot를 활성화한 상태에서 Apache를 시작할 수도 없었는데, 많은 부분을 수정했지만 아직 해결해야 할 문제가 남아 있습니다.
첫 번째 문제는 Apache가 중지된 상태에서 시작하려고 하면 아무 문제 없이 시작되지만, 실행 중인 동안 다시 시작하려고 하면 다음과 같은 결과가 나타납니다.
$ service httpd restart
Stopping httpd: [FAILED]
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[FAILED]
아파치 오류 로그;
[Mon Jun 17 07:47:51 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: chroot checkpoint #1 (pid=954 ppid=953)
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/) configured.
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: APR compiled version="1.3.9"; loaded version="1.3.9"
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: LUA compiled version="Lua 5.1"
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: LIBXML compiled version="2.7.6"
[Mon Jun 17 07:47:52 2013] [notice] Digest: generating secret for digest authentication ...
[Mon Jun 17 07:47:52 2013] [notice] Digest: done
[Mon Jun 17 07:47:53 2013] [notice] ModSecurity: chroot checkpoint #2 (pid=955 ppid=1)
[Mon Jun 17 07:47:53 2013] [notice] ModSecurity: chroot successful, path=/var/www
[Mon Jun 17 07:47:53 2013] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fcgid/2.3.7 configured -- resuming normal operations
두 번째 문제는 일반 HTML 파일은 문제 없이 실행되지만 PHP 페이지는 그렇지 않다는 것입니다.
mod_security 로그;
--98586c48-A--
[17/Jun/2013:08:01:37 --0400] Ub76oUJVtI0AAAPEDiYAAAAG CLIENT_IP_GOES_HERE 51722 SERVER_IP_GOES_HERE 80
--98586c48-B--
GET /testphp.php HTTP/1.1
Host: hostname
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=5a9jqak7dt30l2vvrs9c74lo81
Connection: keep-alive
Cache-Control: max-age=0
--98586c48-F--
HTTP/1.1 500 Internal Server Error
Content-Length: 543
Connection: close
Content-Type: text/html; charset=iso-8859-1
--98586c48-E--
--98586c48-H--
Apache-Error: [file "fcgid_proc_unix.c"] [line 637] [level 4] [status 104] mod_fcgid: error reading data from FastCGI server
Apache-Error: [file "/builddir/build/BUILD/httpd-2.2.15/server/util_script.c"] [line 435] [level 19] Premature end of script headers: testphp.php
Apache-Handler: fcgid-script
Stopwatch: 1371470497629709 2809 (- - -)
Stopwatch2: 1371470497629709 2809; combined=25, p1=3, p2=10, p3=1, p4=1, p5=9, sr=0, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/).
Server: Apache
Engine-Mode: "ENABLED"
--98586c48-Z--
내가 어디서 잘못됐나요? 내가 무엇을 놓치고 있나요?
답변1
주요 문제
첫 번째 질문은 비교적 쉽습니다. 이는 다른 데몬/서비스가 이미 포트 80을 사용하고 있음을 의미합니다. 이는 Apache가 브라우저의 연결을 수신할 것으로 예상하는 TCP 포트입니다.
이 명령은 이를 사용하는 내용을 보여줍니다.
$ netstat -tapn |grep :80
예를 들어:
$ netstat -tapn |grep :80
tcp 0 0 :::80 :::* LISTEN 13415/httpd
tcp 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:35880 TIME_WAIT -
tcp 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:35909 TIME_WAIT -
tcp 0 0 ::ffff:192.168.1.105:80 ::ffff:192.168.1.6:40061 TIME_WAIT -
tcp 0 0 ::ffff:192.168.1.105:80 ::ffff:192.168.1.6:40060 TIME_WAIT -
여기서는 Apache(httpd)가 이미 실행 중이고 해당 프로세스 ID가 13415임을 알 수 있습니다.
이를 종료하거나 포트 80에서 수신 대기 중인 다른 항목을 알아낼 수 있습니다.
두 번째 용어
두 번째 질문에 대해 말씀드리자면, 현재 Apache 서버가 이미 실행 중이지만 상상했던 방식이 아닌 것 같습니다. 그러니 그것을 죽이고 두 번째 문제가 사라지는지 확인하십시오.
그렇지 않은 경우 CentOS 저장소에서 일부 추가 패키지를 설치해야 합니다. 특히 PHP와 특정 애플리케이션에 필요한 기타 모든 것.
sudo
그런데 Apache 서비스를 루트로 중지/시작하거나 명령을 사용했는지 확인하십시오. 일반 사용자는 이 서비스를 중지/시작할 수 없습니다.
세 번째 문제
suEXEC
OP가 지적했듯이 Chrooted Jail에서의 사용은 직접 지원되지 않으므로 suEXEC
패치가 필요합니다. 현재 버전 suEXEC
.
다음은 전반적인 아키텍처를 설명하는 매우 좋은 튜토리얼입니다.suEXEC
chroot를 지원할 수 있도록 Apache를 설정하고 이러한 방식으로 단계를 다시 컴파일하십시오 .