서버 설정 · 3 min read · Dec 26, 2025

Debian 8 (Jessie)에서 mod_unixd와 함께 Apache 2.4 설정하기

이 가이드는 Debian Jessie 시스템에서 Apache 2.4와 함께 mod_unixd를 설정하는 방법을 설명합니다. mod_unixd를 사용하면 Apache를 안전한 chroot 환경에서 실행할 수 있으며, Apache 또는 설치된 웹 애플리케이션의 취약점을 악용하려는 침입 시도로부터 서버를 덜 취약하게 만들 수 있습니다. mod_unixd 모듈은 이전의 apache 2.2에서 사용되었던 mod_chroot 모듈의 대체물입니다.

1 사전 참고

저는 여러분이 작동 중인 Debian 8 시스템과 작동하는 Apache를 가지고 있다고 가정합니다. 예를 들어, 이 튜토리얼에서 보여주는 것처럼: Debian 8 Jessie LAMP 서버 튜토리얼은 Apache 2, PHP 5 및 MariaDB와 함께합니다. 또한 /var/www 디렉토리 내에 하나 이상의 웹 사이트가 설정되어 있다고 가정합니다 (예: ISPConfig를 사용하는 경우).

제가 사용하는 서버의 IP 주소는 192.168.1.100이고 호스트 이름은 server1.example.com입니다. 이 튜토리얼에서 발생하는 모든 곳에서 이 값을 여러분의 서버의 IP 주소와 호스트 이름으로 바꿔주세요.

2 Apache 구성하기

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

저는 /var/www 디렉토리를 chroot 감옥을 포함하는 디렉토리로 사용하고자 합니다. Debian의 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

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

nano /etc/apache2/apache2.conf
[...]  
#  
# PidFile: 서버가 시작할 때 프로세스  
# 식별 번호를 기록해야 하는 파일입니다.  
# 이는 /etc/apache2/envvars에 설정해야 합니다.  
#  
PidFile ${APACHE_PID_FILE}  
ChrootDir /var/www  
[...]  

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


2.1 첫 번째 방법: DocumentRoot 변경하기

DocumentRoot /var/www인 vhost가 있다고 가정해 보겠습니다. 이제 해당 vhost의 vhost 구성을 열고 DocumentRoot /var/www를 DocumentRoot /로 변경해야 합니다. 따라서 DocumentRoot /var/www/web1/web는 이제 DocumentRoot /web1/web으로 변환됩니다. 이 방법을 사용하려면 모든 vhost에 대해 DocumentRoot를 변경해야 합니다.

2.2 두 번째 방법: 파일 시스템에 심볼릭 링크 생성하기

이 방법은 더 쉽습니다. 한 번만 수행하면 되고 vhost 구성을 수정할 필요가 없습니다. /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

다음 내용을 추가합니다:

파일을 저장하고 브라우저에서 서버의 호스트 이름이나 IP 주소 뒤에 /info.php를 추가하여 엽니다. 예:

http://192.168.1.100/info.php

PHP가 올바르게 작동하면 다음 페이지가 표시되어야 합니다:

PHP 정보 페이지.

지금까지 잘 진행되었습니다. 그러나 Apache가 실제로 chroot되었는지 어떻게 알 수 있을까요? chroot 외부의 파일에 접근해 보겠습니다. 여기서는 예를 들어 /etc/hosts를 사용하겠습니다.

nano /var/www/html/testchroot.php

다음 내용을 추가합니다:

' . $var;

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

테스트 Chroot

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

더 이상 필요하지 않은 경우 테스트 파일을 삭제합니다:

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

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

ldd /usr/bin/perl
root@server1:/var/www/html# ldd /usr/bin/perl  
linux-vdso.so.1 (0x00007ffe951f4000)  
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)  
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)  
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)  
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)  
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)  
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)  
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)  
root@server1:/var/www/html#

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

3 링크

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.