Nếu như bạn muốn dựng một trang web với server riêng, mọi thứ đều rất nhẹ nhàng, bạn chỉ việc cài Apache2, PHP và MySQL vào và cài đặt website lên đó. Tuy nhiên, nếu như bạn muốn tạo 2 hay nhiều website hơn, việc sử dụng thêm 1 server khác chắc chắn sẽ rất lãng phí tài nguyên vì khi chạy 1 website, tài nguyên máy chủ tiêu hao rất ít. Chính vì thế ta sẽ đưa tất cả các website này vào cùng một server để tận dụng được nhiều tài nguyên hơn. Lúc này, chỉ cần chi phí vận hành 1 máy chủ, ta có thể vận hành tốt nhiều website. Mỗi website này được gọi là một Virtual Host. Bài viết này sẽ hướng dẫn cho bạn tạo virtual host với Ubuntu và Apache2.

Thực ra việc chia Virtual Host khá đơn giản, gồm 3 bước:
– Tạo thư mục cho website mới
– Tạo file cấu hình cho website
– Enable website

Nếu như kết hợp với bài trước Cài đặt hệ thống Web Server thì ta cần tạo thêm tài khoản người dùng trên server và tài khoản FTP cho người dùng đó. Bài viết này cũng giúp các bạn phòng chống local attack trên server tự quản lý như thế này. Việc phòng chống tấn công này rất đơn giản, ta tạo cho mỗi user một thư mục riêng để chứa website và phân quyền đầy đủ.

Giả sử ta tạo website có tên demo.org

Chuẩn bị:

 root@Server:~$ groupadd websites  // group này sẽ gán cho mọi user chạy web
 root@Server:~$ chown -R www-data:www-data /var/www
 root@Server:~$ apt-get install apache2-mpm-itk

apache2-mpm-itk là module bổ sung cho apache2, giúp cho nó chạy website dưới quyền hạn của user được chỉ định thông qua tham số trong file cấu hình
AssignUserId <user> <group>

1. Tạo thư mục và người dùng cho website

 root@Server:~$ mkdir /var/www/demo.org/
 root@Server:~$ mkdir /var/www/demo.org/public_html
 root@Server:~$ mkdir /var/www/demo.org/tmp
 root@Server:~$ mkdir /var/log/apache2/demo.org
 root@Server:~$ chmod 700 -R /var/www/demo.org

Mỗi website sẽ có thư mục public_html chứa dữ liệu website và thư mục temp riêng.

 root@Server:~$ useradd demo.org -g websites
 root@Server:~$ passwd demo.org // nhập password cho user này
 root@Server:~$ chown -R demo.org:websites /var/www/demo.org

2. Tạo file cấu hình cho website

Tên file cấu hình nên tuân theo một chuẩn nhất định. Nếu website của bạn là demo.org thì tên của file cấu hình sẽ là demo.org.conf. Riêng file 000-default.conf sẽ là website mặc định, khi gói HTTP Request không chỉ rõ domain cần request hoặc domain đó không tồn tại trên server thì trang mặc định sẽ được load.

root@Server:~$ nano  /etc/apache2/sites-available/demo.org.conf

<VirtualHost *:80>
 ServerAdmin [email protected]
 ServerName demo.org
 ServerAlias www.demo.org
 DocumentRoot /var/www/demo.org/public_html
 php_admin_value open_basedir /var/www/demo.org/
 php_admin_value upload_tmp_dir /var/www/demo.org/tmp
 php_admin_value sys_temp_dir /var/www/demo.org/tmp
 ErrorLog /var/log/apache2/demo.org/error.log
 CustomLog /var/log/apache2/demo.org/access.log combined
 LogLevel warn
 <IfModule mpm_itk_module>
 AssignUserId demo.org websites
 </IfModule>
 <IfModule mod_suphp.c>
 suPHP_UserGroup demo.org websites
 </IfModule>
</VirtualHost>

open_basedir là tham số cực kì quan trọng trong việc phòng chống local attack, khi website chạy trong thư mục này, nó sẽ không thể thực hiện thao tác với các thư mục bên ngoài

upload_tmp_dir và sys_temp_dir là tham số điều chỉnh lại thư mục temp từ /var/tmp sang thư mục tmp riêng của website, trước đây có vài lần tôi cài xong server nhưng phát hiện một điều là không thể upload được file lên server (trừ mã nguồn wordpress) dù trước đó vài tuần lại không có vấn đề gì, và cuối cùng tôi phát hiện ra 2 tham số này mặc định chưa được gán trong phiên bản PHP mới nhất mà tôi sử dụng.

<IfModule mpm_itk_module>
 AssignUserId demo.org websites
</IfModule>

Đây là dòng mã thông báo cho apache2 biết rằng nếu module apache2-mpm-itk tồn tại thì tất cả mọi tài nguyên trong thư mục chứa dữ liệu của website này đều chạy dưới quyền user demo.org và group websites.

suPHP cũng có chức năng tương tự.

3. Enable website

 root@Server:~$ a2ensite demo.org
 root@Server:~$ service apache2 reload

a2dissite demo.org nếu bạn muốn disable website.

Thế là mọi thứ đã xong, lúc này bạn truy xuất server bằng tên miền demo.org thì kết quả trả về sẽ là nội dung trong thư mục /var/www/demo.org/public_html chứ không phải trang mặc định nữa.

Bước cuối cùng ta chỉ việc tạo FTP user cho website này thôi.

 root@Server:~$ pure-pw useradd demo.org -u demo.org -d /var/www/demo.org
 root@Server:~$ pure-pw mkdb

Đến đây, ta phân tích qua về lý do tại sao server lại khó bị tấn công local attack.

User demo.org  sẽ làm chủ thư mục /var/www/demo.org và các thư mục con bên trong. Thư mục này được chỉ định open_basedir nên file PHP bên trong bị giới hạn các quyền đọc ghi đối với các tài nguyên bên ngoài. Hơn nữa, các file PHP trong thư mục này đều được chạy dưới quyền user demo.org và group websites trong khi các thư mục của nó và user khác đều được phân quyền group là zero nên các user khác ở cùng trong group chắc chắn không thể đọc được, cho dù bạn có phân quyền everyone là 7. Ở đây ta phân quyền 700. Tất cả các file và thư mục bên trong bạn có thể phân quyền 700 toàn bộ và website của chúng ta vẫn chạy tốt.

Luôn nhớ rằng website của bạn không bao giờ chạy database dưới quyền root, hãy tạo user riêng trong mysql cho từng website.

Đào Xuân Hưng – AdminVietnam.org