커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 웹 서버(web, httpd, apache) 도움말
검색 : 사이트 WHOIS 웹서버 종류

WebDAV (7, 글 1, 자료 4)
웹서버 튜닝 (5, 글 4, 자료 2)
웹서버 사용 통계 자료 (2, 자료 1)
Apache SSL / mod_ssl (4, 글 3, 자료 2)

  아파치 설정 활용 예(서비스 제한측면) 작성일 : 2005/01/28 23:48
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 14672
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : 아파치 설정 활용 예(서비스 제한측면)
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2003.2~
    정리일 : 2005.1.28(금)
    수정일 : 2005.7.16(토) : 2-4) 내용 추가
             2005.11.5(토) : 2-3) 내용 추가

    아파치 웹서버의 활용에 있어, 보다나은 보안 설정 방법 몇 가지를 소개한다.

    특정 Agent가 자꾸 사이트에 들어와서 긁어간다든지,
    이미지 파일을 외부에서 링크하지 못하도록 한다든지,
    특정 IP에서는 인증없이, 그 이외 IP에서는 아파치 인증을 통해서만 페이지를 보게하는
    등의 응용적인 측면에서 방법들이다.
    이 방법들은 제가 사용하고 있는 몇가지 방법을 정리하는 의미에서 적은 것이다.

    1. 특정 브라우저의 접속을 차단

     
    SetEnvIfNoCase User-Agent "^Microsoft URL Control" dont_want

    <Directory /usr/local/apache/htdocs>
       <Limit GET POST>
       Order Allow,Deny
       Allow from all
       Deny  from env=dont_want
       </Limit>
    </Directory>
     


    ----------------------------------------------
    SetEnvIfNoCase User-Agent "^Wget" bad_bot
    SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot
    SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot

    The 'SetEnvIfNoCase' simply sets an enviornment (SetEnv) variable called
    'bad_bot' If (SetEnvIf) the 'User-Agent' string contains Wget, EmailSiphon, or
    EmailWolf, regardless of case (SetEnvIfNoCase). In english, anytime a browser
    with a name containing 'wget, emailsiphon, or emailwolf' accesses our website,
    we set a variable called 'bad_bot'. We'd also want to add a line for the
    User-Agent string of any other Spidert we want to deny.

    Now we tell Apache which directories to block the Spiderts from with the
    <Directory> directive:

    <Directory "/home/evolt/public_html/users/">
            Order Allow,Deny
            Allow from all
            Deny from env=bad_bot
    </Directory>

    2.  다른 곳에서 images를 link하지 못하도록 (hotlink 방지)
                                                                                                            
    다른 곳에서 파일을 링크하지 못하도록 하는 것을 hotlink 방지라고 한다.
    hotlink 방지설정을 통하여
    - 외부 사이트에서 링크를 통한 컨텐츠 유출 방지와
    - 트래픽 감소 효과를 볼 수 있다.
                                                                                                            
    1) 디렉토리를 제한하는 방법
                                                                                                            
    referer 체크를 통해 외부에서 /images 이하디렉토리의 파일을 link하지 못하도록 한다.
    이를테면 truefeel.kr 이라는 사이트가 있을 때
    truefeel.kr내에 있는 동영상을 이 도메인에서는 링크할 수 있지만
    외부 사이트에서는 이 동영상을 링크해도 권한이 없도록 할 수 있다.
                                                                                                            
     
    SetEnvIf Referer "^http://localhost/"  local_referal
    SetEnvIf Referer "^http://127.0.0.1/"  local_referal
    SetEnvIf Referer "^http://홈페이지명/" local_referal
    SetEnvIf Referer "^$"                  local_referal
                                                                                                            
    <Directory /usr/local/apache/htdocs/images>
       Order Deny,Allow
       Deny  from all
       Allow from env=local_referal
    </Directory>
     

                                                                                                            
    2) 이미지 파일 확장자로 제한하는 방법 (Referer 사용)
       서비스 페이지가 ????.truefeel.kr 일 때
                                                                                                            
     
    SetEnvIfNoCase Referer "^http://localhost/"        local_referal
    SetEnvIf       Referer "^http://127.0.0.1/"        local_referal
    SetEnvIfNoCase Referer "^http://(.*).truefeel.kr/" local_referal
    SetEnvIfNoCase Referer "^http://truefeel.kr/"      local_referal
    SetEnvIfNoCase Referer "^$"                        local_referal
                                                                                                            
    <Files ~ "\.(gif|jpg|jpeg|png|bmp)$">
       Order deny,allow
       Deny  from all
       Allow from env=local_referal
    </Files>
     

                                                                                                            
    3) 이미지 파일 확장자로 제한하는 방법 2 (Rewriting Rule 사용)
                                                                                                            
     
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://truefeel.aaa/.*$          [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.truefeel.aaa/.*$      [NC]
    RewriteRule \.(jpg|jpeg|gif|png|bmp)$ /images/deny.jpg [NC,L]
     


    위처럼 설정하면 위 2개의 URL과 브라우저의 주소창에 이미지를 직접입력한 경우를 제외하고는
    /images/deny.jpg를 보여주게 된다.
    NC(no case)는 대소문자 구분하지 않음. L은 마지막 룰임을 표시한다.
                                                                                                            
    4) 이미지 파일 확장자로 제한시 특정 디렉토리는 제외하는 방법
                                                                                                            
    위의 '2)' 설정에 다음 내용을 추가하면 /upload/ 디렉토리에 있는 .jpg 파일이라도
    외부 링크를 허용하게 된다.
                                                                                                            
     
    SetEnvIfNoCase Request_URI "^/upload/"            local_referal
     


    3. 특정 IP에서만 접근 가능하게

    너무나도 흔한 방법이긴 한데, 개인적으로 저에게 이런 부분을 물어보시는 분이 많았다.
    아래의 예는 /usr/local/apache/htdocs 디렉토리를 211.111.222.0/24 대역에서만 접근가능한 설정이다.

     
    <Directory "/usr/local/apache/htdocs">
        Options FollowSymLinks MultiViews
        AllowOverride AuthConfig
        Order deny,allow
        Deny from all
        Allow from 211.111.222.0/255.255.255.0
    </Directory>
     


    반대로 아래와 같이 하면 지정한 IP대역에서만 접근할 수 없다.

     
    ... 생략 ...
        Order allow,deny
        Allow from all
        Deny from 211.111.222.0/255.255.255.0
    ... 생략 ...
     


    4. 특정페이지를 인증된 사용자만 볼 수 있는 아파치 인증 설정

    이번 글은 5번의 인증 설정을 알기 전에 아파치 인증에 대해 모르는 분을 위해 적은 것으로
    아파치 인증이 무엇인지 안다면 5번으로 바로 넘어가기 바란다.

    아파치에서는 특정 페이지를 접근할 때 ID와 비밀번호를 알아야만 접근하도록 설정할 수 있다.
    다음 예를 보자.

     
    <Directory "/home/truefeel/public_html">
                Options FollowSymLinks MultiViews
                AllowOverride AuthConfig
    </Directory>
     


    위 처럼 AllowOverride AuthConfig 설정을 하면 ~truefeel/public_html 디렉토리에 인증 과정을
    거치는 기본 설정은 된 것이다.
    만약 ~truefeel/public_html/manager/ 아래의 디렉토리에 인증을 걸려고 한다면 그 디렉토리에
    다음과 같은 형식의 .htaccess 파일을 생성한다.

    [ ~truefee/public_html/manger/.htaccess 파일 내용 ]
     
    AuthType Basic
    AuthName User   <-- "User" 는 인증창에 표시될 메시지 중의 하나일 뿐 신경쓸 필요 없다.
    AuthUserFile /home/truefeel/manage/.htpasswd
    AuthGroupFile /dev/null
    <Limit GET POST>
    require valid-user
    </Limit>
     


    .htpasswd 파일에 ID/PW를 생성해두면 해당페이지 인증을 할 수 있게 된다.

    5. 특정 IP는 인증없이, 그 이외는 아파치 인증 거치도록

    아래의 설정은 위의 4번 글을 읽었다면 뭔가 종합적인 설정을 한 것 처럼 보일 것이다.

     
    <Location />
        AuthType Basic
        AuthName User
        AuthUserFile /home/truefeel/manage/.htpasswd
        AuthGroupFile /dev/null

        require valid-user
        order deny,allow
        deny  from all
        allow from 211.111.222.0/255.255.255.0
        Satisfy any
    </Location>
     


    위의 설정은
    - 211.111.222.0/24 IP 대역에 있는 접속자는 인증없이 통과하고,
    - 그 이외의 IP 대역에서 접속하면 인증을 거쳐야하는 설정이다.
    이 설정은 Satisfy any 지시자를 통해서 이뤄진다. IP가 맞거나 ID/PW가 맞으면 되는 것이다. (OR)

    만약 Satisfy all 이라고 적었다면
    - IP대역이 211.111.222.0/24 이면서
    - 인증까지 모두 통과 해야
    해당 페이지에 접근이 가능하다. (AND)

    6. 업로드 디렉토리의 .php파일은 text처럼 인식하기

    php나 cgi 등으로 파일 업로드 가능하도록 구현된 경우 .php나 .html 등의 파일을 업로드할 수
    있는 실수를 범할 수 있다.

    이런 실수를 하더라도 지정한 업로드 디렉토리에 있는 .php나 .html 파일을 php프로그램으로
    인식하지 않고 일반 텍스트 파일로 판단하도록 설정하여 보다 안전한 웹페이지 구성이 가능하다.
    다음은 /upload/ 와 /files/ 디렉토리 아래의 php파일은 일반 텍스트로 인식하라는 설정이다.

     
    <Directory ~ "/usr/local/apache/htdocs/(upload|files)">
            RemoveType .html .php
    </Directory>
     


    위에서 ~ 기호는 디렉토리 경로에 정규 표현식을 사용하겠다는 의미로 (upload|files) 부분을
    정규 표현식으로 인식한다. 따라서 htdocs/ 이하의 upload 디렉토리와 files 디렉토리를 의미한다.

    단순히 /home/truefeel/public_html/data 디렉토리라면
    <Directory "/home/truefeel/public_html/data"> 와 같이 설정하면 된다.

    7. 참고 자료

    * Apache Directives
      http://httpd.apache.org/docs/mod/directives.html
    * Apache Authentication and Access Control
      http://www.apache.kr.net/documents/authplus-story.html
      커피닉스 카페 최근 글
    [08/25] #gpt_question_subje
    [08/20] From what I've seen
    [08/14] сайт
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~