Trong bài viết sau, Quản Trị Mạng sẽ giới thiệu với bạn cách cài đặt mod_chroot với Apache2 trên hệ thống OpenSUSE 11.2. Với module mod_chroot, bạn có thể chạy Apache2 trong môi trường chroot bảo mật và phòng tránh được nhiều hiểm họa, nhằm vào những lỗ hổng thường xuất hiện trên Apache2.
Thuật ngữ chroot khi sử dụng trên hệ thống Unix chỉ hành động thay đổi thư mục root của bất cứ tài khoản nào.
Trong bài viết này, chúng ta sử dụng hệ thống OpenSUSE 11.2 và Apache2, và trong thư mục /srv/www sẽ có chứa 1 hoặc nhiều website.
Cài đặt mod_chroot
Nhưng không có gói mod_chroot đi kèm với OpenSUSE 11.2, do đó chúng ta phải tự xây dựng. Trước tiên, cài đặt thành phần yêu cầu:
yast2 -i libgcc glibc-devel gcc flex lynx compat-readline4 db-devel wget gcc-c++ make vim
yast2 -i apache2-devel
Tiếp theo, xây dựng module mod_chroot như sau:
cd /tmp
wget http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz
tar xvfz mod_chroot-0.5.tar.gz
cd mod_chroot-0.5
apxs2 -cia mod_chroot.c
Khởi động lại Apache:
/etc/init.d/apache2 restart
Cấu hình Apache
Tại đây, chúng ta sẽ sử dụng thư mục /srv/www thành nơi chứa chroot jail. Thực chất, Apache của OpenSUSE sử dụng file /var/run/httpd2.pid; khi Apache trỏ tới /srv/www, /var/run/httpd2.pid được biên dịch thành /srv/www/var/run/httpd2.pid. Tạo thư mục:
mkdir -p /srv/www/var/run
chown -R root:www /srv/www/var/run
Tiếp theo, chúng ta phải “thông báo” cho Apache rằng muốn sử dụng /srv/www như thư mục chroot. Mở file /etc/apache2/httpd.conf, và ngay bên dưới dòng Include /etc/apache2/sysconfig.d/loadmodule.conf, thêm dòng ChrootDir /srv/www; trong đoạn <Directory />, chú thích bên ngoài dòng Options None và thêm dòng sau Options +FollowSymLinks:
vi /etc/apache2/httpd.conf
[...]
# generated from APACHE_MODULES in /etc/sysconfig/apache2
Include /etc/apache2/sysconfig.d/loadmodule.conf
ChrootDir /srv/www
[...]
# forbid access to the entire filesystem by default
<Directory />
#Options None
Options +FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
[...]
Tiếp đến, áp dụng sự thay đổi của thư mục root trên vhost (ví dụ DocumentRoot /srv/www sẽ thành DocumentRoot /). Hoặc chúng ta có thể làm được việc này bằng cách thay đổi DocumentRoot trỏ tới từng vhost riêng biệt, hoặc đơn giản hơn, tạo liên kết động trong hệ thống.
Phương pháp thay đổi DocumentRoot
Giả sử rằng chúng ta sử dụng vhost với DocumentRoot /srv/www. Mở file cấu hình của vhost đó, và thay đổi DocumentRoot /srv/www thành DocumentRoot /. Theo đó, DocumentRoot /srv/www/web1/web sẽ trở thành DocumentRoot /web1/web, và tương tự. Nếu muốn sử dụng phương pháp này, bạn phải thay đổi DocumentRoot cho từng vhost riêng biệt.
Phương pháp tạo liên kết động trong hệ thống
Cách này đơn giản hơn, bởi vì người sử dụng chỉ phải thực hiện thao tác này 1 lần và không phải thiết lập lại đối với từng vhost. Chúng ta sẽ tạo liên kết trỏ từ /srv/www/srv/www tới /srv/www:
mkdir -p /srv/www/srv
cd /srv/www/srv
ln -s ../ www
Sau đó, dừng hoạt động Apache, và tạo liên kết từ /var/run/httpd2.pid tới /srv/www/var/run/httpd2.pid, khởi động lại Apache:
/etc/init.d/apache2 stop
ln -sf /srv/www/var/run/httpd2.pid /var/run/httpd2.pid
/etc/init.d/apache2 start
Vậy là đã xong các bước cần thiết, và các bạn có thể gọi trang web như bình thường, cho dù đang sử dụng web HTML tĩnh hoặc module mod_php:
Nếu bạn đang sử dụng CGI nào đó như Perl, suPHP, Ruby … thì bạn cần phải copy file biên dịch (ví dụ /usr/bin/perl, /usr/sbin/suphp…) tới thư mục chroot jail với tất cả các thư viện cần thiết đi kèm. Các bạn có thể sử dụng câu lệnh sau để tìm ra tất cả thư viện động cần thiết:
ldd /usr/sbin/suphp
server2:/var/www/web1/log# ldd /usr/sbin/suphp
linux-gate.so.1 => (0xffffe000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7e34000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7e0f000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e03000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7cd2000)
/lib/ld-linux.so.2 (0xb7f23000)
server2:/var/www/web1/log#
Nếu sau khi copy tất cả các file cần thiết mà trang web không hoạt động, thì nên xem lại sự kiện trong file Apache error log. Hoặc tham khảo thêm tại đây để biết các trường hợp thường gặp và cách giải quyết.
Chúc các bạn thành công!