apache - suexec 와 virtual host 의 궁합 문제

raymundo의 이미지

안녕하세요,

제가 가상서버 호스팅을 하나 신청해서 서버를 받았습니다. 이 서버 주소를 SERVER 라고 하고,

제가 도메인도 하나 신청해서 물렸습니다. A 라고 하겠습니다.

A라는 주소로 접속할 경우 a 사용자의 public_html 으로 연결되게 설정하였습니다.

<VirtualHost *:80>
    DocumentRoot   /home/a/public_html
    ServerName     A
    Alias /cgi-bin /home/a/public_html/cgi-bin
 
    SuexecUserGroup a a   # 이게 문제
</VirtualHost>

suEXEC 란 걸 이번에야 처음 알았습니다. 전에 있던 서버에는 그런 게 없었는데, 이번에 호스팅한 서버에는 깔려 있더군요.

- CGI를 실행할 때 기존에는 웹서버의 uid로 실행되었는데, suexec를 거치면서 해당 스크립트 주인의 (아니면 그 스크립트가 있는 디렉토리의?) uid로 실행하고,
- 따라서 CGI를 통해서 다른 사용자의 것을 읽거나 쓰는 것을 막고
- 부가 장점으로 파일을 생성할 때 그 파일의 소유주가 실제 사용자가 되니까 관리가 편하고 (이게 너무 좋더군요)
- 대신 매우 깐깐하게 각종 퍼미션을 검사해서 실행을 허용하거나 거부한다

보아하니 이런 개념이던데...

.

문제는 이렇습니다.

1) 제가 ~a/public_html/cgi-bin/script.pl 스크립트를 하나 만들어놨을 때

2) 브라우저에서 SERVER/~a/cgi-bin/script.pl 이렇게 접근하면 seEXEC 가 아주 잘 동작합니다.
도메인만 바꿔서 A/~a/cgi-bin/script.pl 이래도 잘 동작합니다.
(찾아보니 mod_userdir 모듈을 통해서 실행하는 경우더군요)

3) 그런데 저 가상호스트를 통해 접근하기 위해서
A/cgi-bin/script.pl
이러면 suEXEC 를 거치지 않더군요. 퍼미션 검사 같은 거 전혀 안 합니다. 그리고 스크립트가 생성한 파일 역시 다시 apache/apache 권한이 되더군요.

4) 문서를 뒤져보니, userdir 을 통해 접근하지 않고 가상 호스트를 통해 접근할 때는 SuexecUserGroup 지시자를 넣어주라 하더군요. 그래서 위에 적은 것처럼 추가했습니다.
(처음엔 User,Group 설정값과 똑같이 apache apache 로 했더만 아예 거부되더군요, 실제 권한을 행사할 유저명을 적으라는 걸로 생각됩니다)

이랬더니 이번에는 뭐가 문제냐... 실행하면 suEXEC를 거치는데, 그래서 거부됩니다ㅠㅠ

[2013-03-20 18:21:26]: uid: (500/a) gid: (500/500) cmd: script.pl
[2013-03-20 18:21:26]: command not in docroot (/home/a/public_html/cgi-bin/script.pl)

suexec -V 로 확인하면

 -D AP_DOC_ROOT="/var/www"

아마도 저 "/var/www" 아래에 있어야 한다는 말 같은데... 이건 말이 안 되잖습니까 =ㅅ=

처음엔 당연히 docroot 란게 저 가상 호스트의 DocumentRoot를 의미한다고 생각하고 ~a/public_html/ 여기로 옮겨봤습니다만 소용없었습니다.

그러니 저는 지금
1) suEXEC 사용을 포기하거나
2) a 사용자 이름으로 돌리려던 홈페이지를 메인으로 옮기거나
3) a 사용자 public_html을 docroot로 하도록 suexec 를 재컴파일해야 하는데

1)은 원하지 않고 2와3은 말이 좀 안 되어서... 다른 사용자 계정을 더 만들면 그땐 답도 없고요. (그럴 일은 없을 것 같지만)

4) 방금 해봤는데, .htaccess 에서 RewriteRule 을 마구 집어넣어서 주소를 ~a 를 거치게 만드는 방법이 있긴 한데,

RewriteRule ^cgi-bin(/.*)$ ~a/cgi-bin$1 [L]   # 이러면 무한재귀 빠지면서 죽음
 
RewriteRule ^CGI(/.*)$ ~a/cgi-bin$1 [L]  # 이러면 해결은 되는데, 주소와 실제 경로가 다르게 일일이 조절해줘야 한다는 얘기...

(제가 아파치 설정에 익숙하지 않아서 그럴지도 모르겠습니다)

아뭏든 이런 형태로, 이러지도 저러지도 못하는 상태가 되었습니다.

구글링해보니, 저와 똑같이 멘붕에 빠진 사람이 있더군요.

질문: http://mail-archives.apache.org/mod_mbox/httpd-users/200603.mbox/%3C440F1FE8.7070603@int-evry.fr%3E
답: http://mail-archives.apache.org/mod_mbox/httpd-users/200603.mbox/%3Ce498c1660603081050x84b48edu4446b602c3ad81f8@mail.gmail.com%3E

결국 재컴파일이 답인 걸로...

다른 방법이 없는 건가요? suexec 와 가상호스트, 일반유저 계정 이 세 가지가 혼합된 상태인데 다른 분들은 이걸 어떻게 처리하고 계신가요?

raymundo의 이미지

어라 편집 버튼이 안 보이네요...

위에 적은 해결책4)의 경우는, 게다가 CGI 라는 경로를 통해 접근하면 suexec가 동작하지만, 원래 경로인
cgi-bin을 통하면 안 된다는 문제도 있겠네요ㅠ

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.