CGI 에서 파일 open

hivaless의 이미지

리눅스에서 아파치로 웹서버를 실행하고,(디폴트로 셋팅되어있는 사항을 그대로 사용했습니다.) cgi 에서 파일을 open 하는데,

open(filename,O_RDONLY); 로 파일을 열면 파일이 열리는데
open(filename,_RDWR);로 파일을 열면 파일 열기가 실패합니다.

디렉토리 권한이나 파일 권한을 모든 사용자에게 읽기,쓰기,실행 권한을
주었는데도 불구하고, 쓰기 권한으로 파일을 여는게 실패하네요.

윈도우 시스템을 리눅스로 포팅하다보니, 이런 어려움을 겪고 있습니다.

CGI 에서 어떻게 하면 쓰기 권한을 주고 파일을 열 수 있는지...

답변 부탁드립니다~~ 꾸벅~

cinsk의 이미지

CGI는 web server를 통해 아무나 실행할 수 있는 파일이기 때문에, 실행될 때, CGI file 소유자로 실행되지 않습니다.

Web server에 따라 다를 수 있지만, 보통 CGI를 특정 그룹의 특정 사용자로 실행하거나, Web server와 같은 그룹:사용자로 실행됩니다.

보통은 apache:apache나 nobody:nobody로 실행됩니다. 따라서 사용자 권한으로 만든 디렉토리에 (즉, user만 쓰기 권한이 있고, other에 쓰기 권한이 없는 경우) 새로 파일을 만든다거나, 기존 파일을 수정할 수 없습니다.

방법은 여러가지가 있습니다..

먼저, CGI에 setuid를 주는 것입니다. 이 방법으로 CGI를, CGI 파일 소유자 권한으로 실행시킬 수 있습니다. 그러나 이 방법은 CGI에 취약점이 있을 경우, 보안상 매우 위험합니다. (chmod a+s CGI-FILE로 설정)

둘째, CGI가 쓸 수 있는 특정 디렉토리를 만들고, 이 안에 있는 모든 파일과 디렉토리의 소유자를 web server를 실행할 때와 동일한 방법으로 주는 것입니다. 예를 들어 apache가 nobody로 실행될 경우, 다음 명령으로 디렉토리와 그 하위 모든 파일들을 nobody 권한으로 변경할 수 있습니다:

# chown -R nobody SOME_DIR
# chgrp -R nobody SOME_DIR
# _

이 방식을 쓸 경우, 해당 디렉토리에 setgid를 주어, 이후, 이 디렉토리에서 생성하는 모든 파일들이 group id를, 디렉토리에서 계승받도록 하는 것도 좋은 생각입니다.

아울러, 어떤 방식을 쓰든, 크래커들에게 시스템을 공격할 수 있는 문이 하나 생기는 셈이므로, 이 문을 잘 보호해야 할 것입니다.

제가 apache를 비롯 기타 web server 관리 전문가가 아니기 때문에, apache나 다른 web server 자체에서 제공하는 특수한? 기능을 쓰면 더욱 안전하게 CGI를 실행하고, 이 CGI가 파일을 수정할 수 있도록 할 수 있을 겁니다. 다른 분들의 답변을 기대합니다.

alwaysrainy의 이미지

전문가의 답변은 아니구요.. nobody:nobody의 디렉토리를
http로 접속이 가능한 위치에 두는 것은 좀 위험할 듯 싶네요..
ㅁ ㅓ.. 크게 상관이 없다면 cgi를 사용하는 계정으로 아파치를
띠우심이 어떠할런지요?

아파치 2.x 기준의 설정 파일인데요..

### /etc/apache2/conf/commonapache2.conf
### $Id: commonapache2.conf,v 1.5 2004/07/08 16:27:12 zul Exp $
###
### Common server configuration.
###
User nobody
Group nobody

저 곳을 cgi를 사용하는 계정의 사용자와 그룹으로 수정해서 아파치를 재가동 시켜서 테스트 해보세요.

---------------------------------------
세계는 넓고, 할일은 많다.

익명 사용자의 이미지

cinsk wrote:
CGI는 web server를 통해 아무나 실행할 수 있는 파일이기 때문에, 실행될 때, CGI file 소유자로 실행되지 않습니다.

Web server에 따라 다를 수 있지만, 보통 CGI를 특정 그룹의 특정 사용자로 실행하거나, Web server와 같은 그룹:사용자로 실행됩니다.

보통은 apache:apache나 nobody:nobody로 실행됩니다. 따라서 사용자 권한으로 만든 디렉토리에 (즉, user만 쓰기 권한이 있고, other에 쓰기 권한이 없는 경우) 새로 파일을 만든다거나, 기존 파일을 수정할 수 없습니다.

방법은 여러가지가 있습니다..

먼저, CGI에 setuid를 주는 것입니다. 이 방법으로 CGI를, CGI 파일 소유자 권한으로 실행시킬 수 있습니다. 그러나 이 방법은 CGI에 취약점이 있을 경우, 보안상 매우 위험합니다. (chmod a+s CGI-FILE로 설정)

둘째, CGI가 쓸 수 있는 특정 디렉토리를 만들고, 이 안에 있는 모든 파일과 디렉토리의 소유자를 web server를 실행할 때와 동일한 방법으로 주는 것입니다. 예를 들어 apache가 nobody로 실행될 경우, 다음 명령으로 디렉토리와 그 하위 모든 파일들을 nobody 권한으로 변경할 수 있습니다:

# chown -R nobody SOME_DIR
# chgrp -R nobody SOME_DIR
# _

이 방식을 쓸 경우, 해당 디렉토리에 setgid를 주어, 이후, 이 디렉토리에서 생성하는 모든 파일들이 group id를, 디렉토리에서 계승받도록 하는 것도 좋은 생각입니다.

아울러, 어떤 방식을 쓰든, 크래커들에게 시스템을 공격할 수 있는 문이 하나 생기는 셈이므로, 이 문을 잘 보호해야 할 것입니다.

제가 apache를 비롯 기타 web server 관리 전문가가 아니기 때문에, apache나 다른 web server 자체에서 제공하는 특수한? 기능을 쓰면 더욱 안전하게 CGI를 실행하고, 이 CGI가 파일을 수정할 수 있도록 할 수 있을 겁니다. 다른 분들의 답변을 기대합니다.

제 생각은 root를 포함한 시스템의 보안을 생각한다면 아파치를 nobody로 실행하는것보다 setuid를 사용하는것이 더 안전한게 아닌가 싶습니다.
물론 root계정이나 시스템의 계정에 setuid를 해선 안되겠죠.

익명 사용자의 이미지

Anonymous wrote:
cinsk wrote:
CGI는 web server를 통해 아무나 실행할 수 있는 파일이기 때문에, 실행될 때, CGI file 소유자로 실행되지 않습니다.

Web server에 따라 다를 수 있지만, 보통 CGI를 특정 그룹의 특정 사용자로 실행하거나, Web server와 같은 그룹:사용자로 실행됩니다.

보통은 apache:apache나 nobody:nobody로 실행됩니다. 따라서 사용자 권한으로 만든 디렉토리에 (즉, user만 쓰기 권한이 있고, other에 쓰기 권한이 없는 경우) 새로 파일을 만든다거나, 기존 파일을 수정할 수 없습니다.

방법은 여러가지가 있습니다..

먼저, CGI에 setuid를 주는 것입니다. 이 방법으로 CGI를, CGI 파일 소유자 권한으로 실행시킬 수 있습니다. 그러나 이 방법은 CGI에 취약점이 있을 경우, 보안상 매우 위험합니다. (chmod a+s CGI-FILE로 설정)

둘째, CGI가 쓸 수 있는 특정 디렉토리를 만들고, 이 안에 있는 모든 파일과 디렉토리의 소유자를 web server를 실행할 때와 동일한 방법으로 주는 것입니다. 예를 들어 apache가 nobody로 실행될 경우, 다음 명령으로 디렉토리와 그 하위 모든 파일들을 nobody 권한으로 변경할 수 있습니다:

# chown -R nobody SOME_DIR
# chgrp -R nobody SOME_DIR
# _

이 방식을 쓸 경우, 해당 디렉토리에 setgid를 주어, 이후, 이 디렉토리에서 생성하는 모든 파일들이 group id를, 디렉토리에서 계승받도록 하는 것도 좋은 생각입니다.

아울러, 어떤 방식을 쓰든, 크래커들에게 시스템을 공격할 수 있는 문이 하나 생기는 셈이므로, 이 문을 잘 보호해야 할 것입니다.

제가 apache를 비롯 기타 web server 관리 전문가가 아니기 때문에, apache나 다른 web server 자체에서 제공하는 특수한? 기능을 쓰면 더욱 안전하게 CGI를 실행하고, 이 CGI가 파일을 수정할 수 있도록 할 수 있을 겁니다. 다른 분들의 답변을 기대합니다.

제 생각은 root를 포함한 시스템의 보안을 생각한다면 아파치를 nobody로 실행하는것보다 setuid를 사용하는것이 더 안전한게 아닌가 싶습니다.
물론 root계정이나 시스템의 계정에 setuid를 해선 안되겠죠.
그리고 nobody로 하면 자신의 계정 디렉토리나 파일을 자기가 수정못하는 엄한 상황이 발생하기도 합니다..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.