웹사이트 검색

Debian 8에서 mod_unixd로 Apache 2.4 Chroot하기(Jessie)


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 데비안 8(제시)
  • 데비안 4(에치)

이 페이지에서

  1. 1 서문
  2. 2 Apache 구성
    1. 2.1 첫 번째 방법: DocumentRoot 변경
    2. 2.2 두 번째 방법: 파일 시스템에서 심볼릭 링크 만들기

    이 가이드는 Debian Jessie 시스템에서 Apache 2.4로 mod_unixd를 설정하는 방법을 설명합니다. mod_unixd를 사용하면 안전한 chroot 환경에서 Apache를 실행할 수 있고 Apache 또는 설치된 웹 응용 프로그램의 취약점을 악용하려는 침입 시도에 서버가 덜 취약하도록 만들 수 있습니다. 모듈 mod_unixd는 이전 아파치 2.2에서 사용되었던 mod_chroot 모듈을 대체합니다.

    1 서문

    Apache가 작동하는 Debian 8 시스템이 있다고 가정합니다. 이 튜토리얼에 표시된 대로: Apache 2, PHP 5 및 MariaDB를 사용하는 Debian 8 Jessie LAMP 서버 튜토리얼. 그 외에도 /var/www 디렉토리 내에 하나 이상의 웹 사이트가 설정되어 있다고 가정합니다(예: ISPConfig를 사용하는 경우).

    여기서 사용하는 서버는 IP 주소 192.168.1.100과 호스트 이름 server1.example.com을 가지고 있습니다. 튜토리얼에서 발생할 때마다 이 값을 서버의 IP 주소와 호스트 이름으로 바꾸십시오.

    2 아파치 구성

    Apache 2.4에서 Chroot 기능을 제공하는 apache 모듈 mod_unixd는 Apache 코어 모듈의 일부이며 데비안 8에서 Apache 바이너리로 정적으로 컴파일되므로 이를 사용하기 위해 추가 소프트웨어를 설치할 필요가 없습니다.

    /var/www 디렉토리를 chroot 감옥을 포함하는 디렉토리로 사용하고 싶습니다. Debians Apache는 PID 파일 /var/run/apache2.pid를 사용합니다. Apache가 /var/www로 chroot되면 /var/run/apache2.pid는 /var/www/var/run/apache2.pid로 변환됩니다. 따라서 지금 해당 디렉터리를 만듭니다.

    mkdir -p /var/www/var/run
    chown -R root:root /var/www/var/run

    이제 /var/www를 chroot 디렉토리로 사용하고 싶다고 Apache에 알려야 합니다. /etc/apache2/apache2.conf를 열고 PidFile 줄 바로 아래에 ChrootDir 줄을 추가합니다.

    nano /etc/apache2/apache2.conf
    [...]
    #
    # PidFile: The file in which the server should record its process
    # identification number when it starts.
    # This needs to be set in /etc/apache2/envvars
    #
    PidFile ${APACHE_PID_FILE}
    ChrootDir /var/www
    [...]

    다음으로 가상 호스트에게 문서 루트가 변경되었음을 알려야 합니다(예를 들어 DocumentRoot /var/www는 이제 DocumentRoot /로 변환됨). 각 가상 호스트의 DocumentRoot 지시문을 변경하거나 파일 시스템에서 심볼릭 링크를 생성하여 더 쉽게 이를 수행할 수 있습니다.

    2.1 첫 번째 방법: DocumentRoot 변경

    DocumentRoot /var/www가 있는 가상 호스트가 있다고 가정합니다. 이제 해당 가상 호스트의 가상 호스트 구성을 열고 DocumentRoot /var/www를 DocumentRoot /로 변경해야 합니다. 따라서 DocumentRoot /var/www/web1/web은 이제 DocumentRoot /web1/web 등으로 변환됩니다. 이 방법을 사용하려면 가상 호스트마다 DocumentRoot를 변경해야 합니다.

    2.2 두 번째 방법: 파일 시스템에서 심볼릭 링크 만들기

    이 방법은 한 번만 수행하면 되고 가상 호스트 구성을 수정할 필요가 없기 때문에 더 쉽습니다. /var/www/var/www에서 /var/www를 가리키는 심볼릭 링크를 만듭니다.

    mkdir -p /var/www/var
    cd /var/www/var
    ln -s ../../ www

    마지막으로 Apache를 중지하고 /var/run/apache2.pid에서 /var/www/var/run/apache2.pid로 심볼릭 링크를 만든 다음 다시 시작해야 합니다.

    service apache2 stop
    ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
    service apache2 start

    그게 다야. 이제 이전과 같이 웹 페이지를 호출할 수 있으며 정적 HTML 파일이거나 mod_php를 사용하는 한 문제 없이 제공되어야 합니다.

    이제 이것을 phpinfo() 페이지로 테스트하겠습니다. 기본 웹사이트의 문서 루트에서 nano를 사용하여 새 info.php 파일을 엽니다.

    nano /var/www/html/info.php

    다음 콘텐츠를 추가합니다.

    <php
    phpinfo();

    파일을 저장하고 브라우저에서 서버의 호스트 이름 또는 IP 주소를 연 다음 /info.php를 엽니다. 예:

    PHP가 올바르게 작동하면 다음 페이지가 표시됩니다.

    지금까지는 좋았지만 Apache가 실제로 chroot되었는지 어떻게 알 수 있습니까? chroot 외부에 있는 파일에 액세스해 보겠습니다. 여기서는 예를 들어 /etc/hosts를 사용하겠습니다.

    nano /var/www/html/testchroot.php

    이 콘텐츠:

    <?php
    $var = file_get_contents('/etc/hosts');
    echo 'The content of /etc/hosts is: <br />' . $var;

    브라우저에서 테스트 파일의 URL을 엽니다. 결과는 다음과 같습니다.

    보시다시피 /etc/hosts 파일의 내용은 이 PHP 스크립트에서 더 이상 액세스할 수 없습니다.

    더 이상 필요하지 않으면 테스트 파일을 삭제하십시오.

    rm /var/www/html/testchroot.php
    rm /var/www/html/info.php

    예를 들어 CGI를 사용하는 경우. Perl, Ruby 등의 경우 인터프리터(예: /usr/bin/perl 등)를 인터프리터에 필요한 모든 라이브러리와 함께 chroot 감옥에 복사해야 합니다. ldd 명령을 사용하여 필요한 라이브러리에 대해 알아볼 수 있습니다.

    ldd /usr/bin/perl
    :/var/www/html#

    또는 jailkit 도구를 사용하여 감옥 환경을 구축하십시오. 필요한 모든 파일을 복사했지만 페이지가 여전히 작동하지 않는 경우 Apache 오류 로그 /var/log/apache2/error.log를 살펴봐야 합니다. 일반적으로 문제가 있는 위치를 알려줍니다.

    3 링크

    • mod_unixd: https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
    • 아파치: http://httpd.apache.org/
    • 데비안: http://www.debian.org/