Reminiscence

오늘 갑자기 고객이 설치한 카운터가 안돌아간다고 연락이 왔다..

서버쪽에서 수정을 해달라는데 서버에서는 딱히 수정할 내용이 보이지 않았으며, 소스파일에도 문제는 없어 보였다..

하지만 해당 CGI 파일은 실행이 되지 않고 알수 없는 Internal Server Error만.... -_-;;;;;

에러로그 확인해보니 아래와 같이 뜬다...

[Mon Mar 19 10:36:21 2007] [error] [client 222.112.XXX.XXX] (2)No such file or directory: exec of '/home/XXXXXX/wwwhome/cgi-bin/supercounter/supercount.cgi' failed
[Mon Mar 19 10:36:21 2007] [error] [client 222.112.XXX.XXX] Premature end of script headers: supercount.cgi

아무리 네이버, 구글을 뒤져봐도 이에 대한 해결 방법이 없다.. -_- 썅...

하지만.. 단 한마디로 나를 감동시킨 우리 사수~ ㅜ_ㅜ

-U 옵션을 넣으라는 단 한마디에.. 눈물이 좌르륵~

해결방법은 다음과 같았다..

실행되는 CGI 파일을 열어 Perl에 대한 경로 뒤에 -U 옵션만 붙여주면 되는것이었다.

실행되지 않은 원인은 아마도 제작된 CGI 파일이 오래전에 제작된 구버전의 함수를 사용하기 때문이었으며, 구버전의 함수를 사용할 수 있도록 해주는 -U 옵션을 붙인결과 실행이 된것이다.

크흑.. ㅜ_ㅜ 역시 노하우 및 내공의 차이는 크다는걸.. 새삼 느끼는중.. ㅋ

-U 옵션을 --help로 보니 다음과 같다.

  -U              allow unsafe operations

안전하지 않은 Operation 들을 허용해주는 명령어란다. 즉, 구버전에서 사용된 함수들이 불안전 하기에 해당 옵션을 사용하지 않으면 기본적으로 Disable 되어 있는거 같다.

-_- 머.. 허접한 내가 주절거리는거니.. 이해하시길.. ㅋ
신고

댓글 0개가 달렸습니다.

Apache 를 컴파일 할때
--enable-suexec
옵션을 줘서 컴파일 한다.

위 옵션을 줄때는 반드시 부수적인 옵션 하나 이상이 있어야 한다.
--with-suexec-bin Path to suexec binary
--with-suexec-caller User allowed to call SuExec
--with-suexec-userdir User subdirectory
--with-suexec-docroot SuExec root directory
--with-suexec-uidmin Minimal allowed UID
--with-suexec-gidmin Minimal allowed GID
--with-suexec-logfile Set the logfile
--with-suexec-safepath Set the safepath
--with-suexec-umask umask for suexec'd process
이것중에 적어도 하나는 포함해야 합니다.

저는 httpd-2.0.49 에서
--server-uid=web \
--server-gid=web \
--enable-suexec \
--suexec-uidmin=1000 \
--suexec-gidmin=1000
이렇게 포함했습니다. UID 와 GID 가 1000 미만인 파일은 실행이 안되게끔...
단, web User 의 UID 와 GID 가 1000 이상이여야합니다. 이상이 아닐경우 오류를 출력합니다.

컴파일 설치한 후에는 httpd.conf 파일을 수정합니다.
먼저 CGI 가 실행되게끔 해줍니다.

AddHandler cgi-script .cgi

앞에 # 주석 제거.

<Directory ... > 의 Options 에 IncludesNoExec 를 ExecCGI 로 수정

Section 3 의 Virtual Hosts 를 사용하는 경우

<VirtualHost *:80>
.
.
SuexecUserGroup master master
.
</VirtualHost>
<VirtualHost *:80>
.
.
SuexecUserGroup useraaa groupaaa
.
</VirtualHost>
<VirtualHost *:80>
.
.
SuexecUserGroup userbbb groupbbb
.
</VirtualHost>

이런식으로 SuexecUserGroup 를 써줍니다. 보시면 아시겠지만 SuexecUserGroup 다음에 처음 작성하는게 해당 도메인 User 이고 두번째 작성하는게 해당 도메인 Group 입니다.

이제 간단하게 test.cgi 파일을 작성합니다. 단 조심하실점은 작성된 CGI 파일은 Group 이나 Order 에 Write 권한이 있다면 Internal Server Error 를 출력합니다. (User 에 Write 권한은 오류출력 안함.)

간단하게 CGI 파일의 권한설정을 chmod 500 test.cgi 정도로 주시면 되겠습니다. 이렇게 주시면 Group 이건 Order 건 접근 불가능 입니다.

그리고 위에 저와 같이 UID 와 GID 를 1000 으로 주신경우에 만약 1000 이하의 User 나 Group 의 CGI 를 실행할 경우 역시 Internal Server Error 에러를 출력합니다.

그리고 SuexecUserGroup 에서 지정된 User 와 Group 이 아니여도 Internal Server Error 오류를 출력합니다.

언제든지 suexec 설정을 보실려면

./suexec -V

하시면 되며 수정은 불가입니다. 수정하실려면 Apache 재설치 하셔야합니다.


오류의 원흉 정리)
1. --enable-suexec 옵션을 사용할경우 꼭 부수적인 옵션을 하나이상 포함할것.
2. 웹서버 데몬 User 와 Group 은 --suexec-uidmin=xxx --suexec-gidmin=xxx 에서 지정된 UID 와 GID 보다 클것.
3. 파일소유주와 그룹이 --suexec-uidmin=xxx --suexec-gidmin=xxx 에서 지정된 UID 와 GID 보다 클것.
4. 파일소유주와 그룹이 SuexecUserGroup 에서 지정한 User 와 Group 일것.
5. 파일권한에 Group 과 Order 에 write 권한이 없을것.(Suexec 를 사용하는경우는 그냥 퍼미션을 Group 과 Order 에 주지마세요 User 권한만 있으면 됩니다.)

추신. 저녁에 그냥 심심해서 작성한 글입니다. Suexec 를 사용할려고 하는분이나 설정이 미비하신분들은 사용하시면 좋습니다. Suexec 를 사용하지 않는 경우는 웹CGI 땜시 서버가 흔들리는 경우가 다반사라서...--; Suexec 를 사용한다 하더라도 SuexecUserGroup 를 주지 않는다면 역시 하나마나한거라서...--;

출처 : phpschol.com  글쓴이 : cgi
신고

'Linux > Apache' 카테고리의 다른 글

mod_jk 컴파일 에러 처리... -_-  (0) 2009.04.11
apache - Suexec 와 Cgi 파일간의 관  (0) 2006.11.13
[Kisa] Mod_Security Manual  (0) 2006.10.09

댓글 0개가 달렸습니다.