Cách sử dụng Firejail để thiết lập cài đặt WordPress trong môi trường bị giam giữ
Khi chạy một web server sẵn có cho công chúng, việc cân bằng giữa việc làm cho nội dung của bạn có thể truy cập và cài đặt một cấu hình an toàn có thể trở nên khó khăn. Có nhiều lĩnh vực khác nhau cần được xem xét kỹ . Một trong số đó là sự cô lập quy trình và khả năng hiển thị.Một dự án được gọi là firejail tìm cách hỗ trợ trong lĩnh vực này bằng cách cung cấp một cơ chế chứa bảo mật nhẹ sử dụng không gian tên kernel để thực thi các policy phân tách. Điều này làm cho môi trường chroot cực kỳ nhẹ.
Trong hướng dẫn này, ta sẽ chỉ cho bạn cách sử dụng firejail để cô lập các tiến trình trong môi trường chroot của riêng chúng. Để chứng minh điều này bằng một ví dụ thực tế, ta sẽ cài đặt hai môi trường chroot, một với web server Nginx phục vụ WordPress và môi trường kia với database MySQL sẽ xử lý dữ liệu trang web. Hai version này sẽ có hệ thống file và cài đặt riêng của chúng và sẽ giao tiếp thông qua một thiết bị mạng bắc cầu.
Yêu cầu và Mục tiêu
Trong hướng dẫn này, ta sẽ sử dụng server Ubuntu 14.04 64-bit làm cài đặt cơ sở của ta . Điều này sẽ cho phép ta sử dụng các gói firejail
được tạo sẵn và cho phép ta dễ dàng tạo môi trường chroot.
Để có được cơ sở tốt cho việc cài đặt, hãy đảm bảo bạn đã hoàn tất cài đặt server ban đầu cho Ubuntu 14.04 tại đây.
Ta sẽ cài đặt hai môi trường chroot trên hệ thống server của ta . Đây thực sự sẽ là những môi trường ổn định của Debian, một lựa chọn được chọn vì môi trường Debian được kiểm tra tốt hơn với công cụ debootstrap
mà ta sẽ sử dụng.
Server của ta sẽ được cấu hình với một địa chỉ IP công cộng và hoạt động như một cổng cho mạng bắc cầu mà ta sẽ cài đặt để giao tiếp với các nhà tù. Các môi trường bị giam giữ sẽ chỉ được cấu hình để sử dụng giao diện cầu nối và sẽ chỉ có thể truy cập internet rộng hơn thông qua các luật NAT trên server .
Ba môi trường mà ta sẽ cấu hình sẽ có các thuộc tính sau:
Môi trường | Địa chỉ IP công cộng | Địa chỉ IP cầu nối |
---|---|---|
Tổ chức | 192.0.2.1 | 10.10.20.1 |
Web server | (không ai) | 10.10.20.10 |
Server database | (không ai) | 10.10.20.20 |
Lưu ý giá trị màu đỏ ở trên phải được thay thế bằng địa chỉ IP công cộng của server lưu trữ của bạn. Tuy nhiên, các địa chỉ IP cầu nối nên được sử dụng nguyên trạng, bởi vì ta sẽ cài đặt giao diện này và các địa chỉ này trong suốt hướng dẫn.
Trong suốt hướng dẫn này, tất cả các lệnh sẽ được thực thi với quyền là user gốc .
Download và cấu hình các thành phần server
Để bắt đầu, ta cần download một số công cụ mà ta sẽ sử dụng vào server của bạn .
Đầu tiên, ta cần download .deb
cho chương trình firejail. Tìm tên gói .deb
mới nhất trên trang download của trang web và thay thế phần tên file của URL bên dưới bằng version đó. URL bên dưới là liên kết download trực tiếp đến gói:
cd ~ wget http://downloads.sourceforge.net/project/firejail/firejail/firejail_0.9.8.1_1_amd64.deb
Khi file đã được download , hãy cài đặt nó bằng dpkg
:
dpkg -i firejail*
Sau khi chương trình firejail được cài đặt, ta cần lấy thêm một số gói từ repository mặc định của Ubuntu. Cụ thể, ta cần công cụ debootstrap
giúp ta tạo hệ thống file chroot và bridge-utils
cho phép ta tạo giao diện cầu nối mạng mà các nhà tù của ta sẽ sử dụng để giao tiếp:
apt-get update apt-get install debootstrap bridge-utils
Cấu hình giao diện cầu nối
Trước khi bắt đầu với nhà tù thực sự, ta sẽ cài đặt network interface bắc cầu.
Ta có thể tạo giao diện mới bằng lệnh brctl
là một phần của gói bridge-utils
. Cầu của ta sẽ được gọi là br0
:
brctl addbr br0
Tiếp theo, ta cần đưa giao diện lên. Cùng với việc kích hoạt giao diện, ta đang chỉ định một phạm vi mạng CIDR. Server lưu trữ của ta sẽ có địa chỉ là 10.10.20.1 trên giao diện này:
ifconfig br0 10.10.20.1/24
Với giao diện được cài đặt và đang chạy, ta cần yêu cầu kernel cho phép chuyển tiếp IP hoặc định tuyến giữa các giao diện của ta . Ta có thể bật tính năng này cho phiên này bằng lệnh :
echo "1" > /proc/sys/net/ipv4/ip_forward
Bây giờ, ta cần cài đặt một luật iptables
sẽ cho phép lưu lượng truy cập dành cho cổng 80 trên server lưu trữ của ta được chuyển đến web server mà ta sẽ cài đặt trong một trong các nhà tù của ta . Web server của ta sẽ có địa chỉ IP là 10.10.20.10 trên giao diện cầu nối của ta :
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.10.20.10:80
Điều này thêm một luật vào cuối chuỗi "PREROUTING" trong bảng "nat". Khi một gói TCP dành cho cổng 80 truy cập, truy cập được chuyển hướng đến cổng 80 vào ngày 10.10.20.10
thông qua dịch địa chỉ mạng.
Ta cũng cần cài đặt một loạt các luật cho phép database và web server của ta truy vấn internet để chúng có thể cập nhật các thành phần từ WordPress. Ta sẽ bắt đầu bằng cách thêm luật giả trang sẽ cho phép giao diện br0
của ta định tuyến thông tin liên lạc thành công thông qua server của ta :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Sau đó, ta có thể khóa liên lạc giữa các giao diện của bạn bằng cách điều chỉnh các luật trong chuỗi FORWARD.
Đầu tiên, ta nên phản chiếu luật NAT trước đó đã được cài đặt để ta có thể cho phép rõ ràng lưu lượng truy cập từ cổng 80 vào mạng br0
của ta :
iptables -A FORWARD -i eth0 -o br0 -p tcp -m tcp --dport 80 -j ACCEPT
Ta cũng muốn cho phép lưu lượng đến có liên quan đến các kết nối đã cài đặt của ta :
iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Ta muốn cho phép chuyển tiếp tất cả lưu lượng truy cập bắt nguồn từ giao diện br0
để các nhà tù của ta giao tiếp với nhau và với thế giới bên ngoài:
iptables -A FORWARD -i br0 -j ACCEPT
Cuối cùng, ta sẽ loại bỏ tất cả các kết nối chuyển tiếp khác để chuyển tiếp chỉ được phép cho các kết nối gửi đi từ mạng br0
. Các ngoại lệ đối với policy này đã được cài đặt trong các luật trước đó.
iptables -P FORWARD DROP
Bây giờ hệ thống server của ta được cấu hình với giao diện cầu nối mà nó sẽ sử dụng để giao tiếp với các môi trường bị giam giữ.
Tạo cấu trúc folder Chroot
Bây giờ, ta đã sẵn sàng để tạo cấu trúc folder chroot của bạn .
Như ta đã nói trước đây, web server và server database của ta sẽ hoạt động trong các hệ thống file hoàn toàn riêng biệt. Ta sẽ giữ cả hai hệ thống file này trong một folder có tên là /jails
. Tạo folder đó ngay bây giờ:
mkdir /jails
Di chuyển vào folder bạn vừa tạo:
cd /jails
Bây giờ, ta cần tạo cấu trúc file sẽ được sử dụng bởi hệ điều hành bị giam giữ của ta . Để làm điều này, ta sẽ sử dụng công cụ debootstrap
. Tiện ích này được tạo để khởi động các môi trường Debian trong hệ thống file hiện có. Nó thực hiện điều này bằng cách kéo xuống các gói từ kho Debian và “cài đặt” chúng vào đúng vị trí.
Mặc dù debootstrap
được dùng để bootstrap môi trường Ubuntu, thay vào đó ta sẽ chọn các bản cài đặt Debian ổn định. Vì công cụ này được tạo ra để hoạt động với Debian, nên những môi trường này được kiểm tra tốt nhất cho công cụ này.
Ta sẽ cài đặt môi trường database của bạn vào một folder có tên là “db”. Để tạo cấu trúc folder thích hợp, download và cài đặt các gói cần thiết, hãy nhập:
debootstrap --arch=amd64 stable db
Bây giờ ta đã xây dựng hệ thống file trong folder /jails/db
, ta có thể sử dụng rsync
để sao chép cấu trúc sang một folder khác mà web server của ta có thể sử dụng. Thư mục mới sẽ được gọi là “www”. Đảm bảo rằng bạn chú ý đến dấu gạch chéo (/) trong lệnh sau đó. Thao tác này sẽ sao chép nội dung của folder đầu tiên vào folder thứ hai, thay vì sao chép chính folder :
rsync -azvh db/ www
Bây giờ, ta có hai cấu trúc folder chroot mà ta có thể sử dụng với chương trình firejail
của firejail
.
Sử dụng Firejail để cài đặt database WordPress
Bây giờ ta đã có cấu trúc folder của bạn , ta có thể sử dụng firejail
để tạo môi trường chroot trong cấu trúc folder /jails/db
firejail
/jails/db
của ta .
Để tạo môi trường chroot và bắt đầu phiên bash bên trong, ta chỉ cần chỉ định vị trí folder của root chroot và tên server mà ta muốn sử dụng cho phiên:
firejail --chroot=/jails/db --name=db
Parent pid 17390, child pid 17391 Interface IP Mask Status lo 127.0.0.1 255.0.0.0 UP eth0 192.0.2.1 255.255.255.0 UP eth1 10.128.1.228 255.255.0.0 UP br0 10.10.20.1 255.255.255.0 UP Child process initialized [root@db ~]$
Lệnh sẽ xuất ra pid mẹ, pid con và các giao diện được cấu hình trong phiên giam này ( ta chưa giới hạn hoặc cấu hình các giao diện tại thời điểm này). Sau đó, nó sẽ đưa bạn vào một dấu nhắc lệnh trong môi trường bị giam giữ của bạn.
Điều đầu tiên ta cần làm là cập nhật database gói của bạn và cài đặt server MySQL trong môi trường chroot. Bạn có thể thực hiện bằng cách gõ:
apt-get update apt-get install mysql-server
Trong quá trình cập nhật, bạn sẽ thấy rằng các kho Debian đang được kiểm tra. Điều này là do môi trường chroot của ta là một cài đặt Debian.
Trong quá trình cài đặt, bạn cần chọn và xác nhận password cho account MySQL root .
Khi quá trình cài đặt hoàn tất, ta nên tạo cấu trúc folder dữ liệu MySQL bằng lệnh :
mysql_install_db
Tiếp theo, khóa một số mặc định không an toàn bằng một tập lệnh được bao gồm:
mysql_secure_installation
Bạn cần nhập password MySQL root mà bạn đã cài đặt trong quá trình cài đặt. Sau đó, bạn sẽ được hỏi có muốn thay đổi password hay không. Chọn “Không” nếu bạn hài lòng với lựa chọn của bạn . Đối với phần còn lại của dấu nhắc , chỉ cần nhấn ENTER để chọn các lựa chọn mặc định.
Tạo Database và User WordPress
Tiếp theo, ta muốn cài đặt một database riêng cho WordPress. Đăng nhập vào server MySQL bằng account root MySQL. Nhập password bạn đã chọn cho user đó khi được yêu cầu :
mysql -u root -p
Bạn sẽ được đưa vào một dấu nhắc MySQL. Tạo database mới cho WordPress để sử dụng:
CREATE DATABASE wordpress;
Tiếp theo, ta sẽ tạo một user để làm việc với database này từ web server tù. Web server sẽ có địa chỉ IP là 10.10.20.10 trên giao diện cầu nối, vì vậy ta cần liên kết user này với địa chỉ đó. Gán password an toàn cho user này. Sau đó, ta sẽ cấp cho user này khả năng làm việc trên database mà ta đã tạo:
CREATE USER 'wordpressuser'@'10.10.20.10' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'10.10.20.10';
Bây giờ, ta chỉ cần xóa bảng quyền và thoát:
FLUSH PRIVILEGES; exit
Sửa đổi Cài đặt MySQL để Liên kết với Địa chỉ Cầu nối
Tiếp theo, ta cần sửa đổi file cấu hình MySQL. Mở nó bằng editor ngay bây giờ:
nano /etc/mysql/my.conf
Tệp này được tổ chức thành các phần. Tìm phần bắt đầu như sau:
[mysqld]
Bạn sẽ thấy một chỉ thị tên là bind-address
hiện được đặt thành 127.0.0.1
. Ta muốn bắt đầu lắng nghe version MySQL của ta trên giao diện cầu nối. Địa chỉ của nhà tù này trên giao diện đó sẽ là 10.10.20.20 , vì vậy ta nên sửa đổi nó thành như sau:
bind-address = 10.10.20.20
Lưu file khi bạn hoàn tất.
Bây giờ, ta có thể dừng version MySQL hiện đang chạy và thoát khỏi nhà tù này:
service mysql stop exit
Sử dụng Firejail để cài đặt web server WordPress
Bây giờ database của ta đã được cấu hình, ta có thể chuyển sang nhà tù của ta sẽ được sử dụng cho web server . Sử dụng firejail để bắt đầu một phiên trong môi trường tù này ngay bây giờ:
firejail --chroot=/jail/www --name=www
Điều đầu tiên ta cần làm là cập nhật database gói local và cài đặt web server Nginx và các thành phần PHP. Chúng cần thiết để xử lý các yêu cầu động và kết nối với database MySQL:
apt-get update apt-get install nginx php5-fpm php5-mysql
Cấu hình PHP
Ta sẽ bắt đầu bằng cách chỉnh sửa file cấu hình của PHP processor để vô hiệu hóa một tính năng có thể là sự cố bảo mật:
nano /etc/php5/fpm/php.ini
Tìm chỉ thị cgi.fix_pathinfo
trong file . Nó sẽ được comment ra và đặt thành “1”. Ta cần bỏ ghi chú nó và thay đổi nó thành “0”:
cgi.fix_pathinfo=0
Lưu file khi bạn hoàn tất.
Cấu hình Nginx
Bây giờ ta cần cài đặt Nginx để phân phát các file WordPress một cách chính xác. Điều này liên quan đến việc cài đặt một root tài liệu mới tại /var/www/html
, đặt server_name
thành địa chỉ IP công cộng của hệ thống server của ta và cấu hình PHP processor .
Mở file cấu hình Nginx mặc định:
vim /etc/nginx/sites-available/default
Dưới đây là tóm tắt về những thay đổi ta cần thực hiện:
- Bỏ ghi chú chỉ thị
listen 80
để chỉ định rõ ràng số cổng. - Thay đổi giá trị của chỉ thị
root
để trỏ tới/var/www/html
, vị trí mà ta sẽ lưu giữ các file WordPress của bạn . - Sửa đổi tham số
index
để tìm kiếmindex.php
trước các file index khác. - Thay đổi giá trị của chỉ thị
server_name
để trỏ đến địa chỉ IP hoặc domain của server lưu trữ - Điều chỉnh giá trị cuối cùng cho chỉ thị
try_files
để chuyển các yêu cầu đếnindex.php
khi chúng không được tìm thấy dưới dạng file hoặc folder . Điều này nằm bên tronglocation /
khối. - Bỏ ghi chú tất cả các chỉ thị trang lỗi để cho phép các trang lỗi.
- Bỏ ghi chú
location ~ \.php$
block, chỉ thịfastcgi_split_path_info
kèm, dòng socketfastcgi_pass
,fastgci_index
vàinclude fastcgi_params
chỉ thịinclude fastcgi_params
, đồng thời thêm chỉ thịtry_files
để thử yêu cầu như đã cho và trả về 404 nếu không.
Khi bạn thực hiện xong các thay đổi ở trên, file sẽ trông giống như file bên dưới (các comment đã được xóa cho ngắn gọn):
server { listen 80; root /var/www/html; index index.php index.html index.htm; server_name 192.0.2.1; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; allow ::1; deny all; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
Bạn có thể dán toàn bộ nội dung hiển thị ở đây nếu điều đó dễ dàng hơn. Bạn sẽ chỉ cần điều chỉnh chỉ thị server_name
để tham chiếu đến địa chỉ IP công cộng hoặc domain của hệ thống server lưu trữ của bạn.
Lưu file khi bạn hoàn tất.
Download và cấu hình file WordPress
Bây giờ Nginx đã được cấu hình để phân phát các file một cách chính xác, ta có thể download , cấu hình và cài đặt chúng.
Bắt đầu bằng cách thay đổi folder chính của user root và download tarball WordPress mới nhất:
cd ~ wget http://wordpress.org/latest.tar.gz
Extract nội dung rball, tạo một folder có tên ~/wordpress
:
tar xzvf latest.tar.gz
Sao chép file cấu hình mẫu sang tên file cấu hình hợp lệ sẽ được kiểm tra:
cd ~/wordpress cp wp-config-sample.php wp-config.php
Bây giờ, hãy mở file cấu hình mới trong editor của bạn:
nano wp-config.php
Bên trong, ta cần thay đổi các giá trị được liên kết với bộ lưu trữ database . Ta cần điền vào các tùy chọn cấu hình với chi tiết của các lựa chọn mà ta đã thực hiện trong database MySQL của bạn .
Ngoại trừ trường password mà bạn nên sửa đổi thành giá trị của riêng mình trước đó, bạn có thể sử dụng các giá trị được trình bày bên dưới:
/** The name of the database for WordPress */ define('DB_NAME', 'wordpress'); /** MySQL database username */ define('DB_USER', 'wordpressuser'); /** MySQL database password */ define('DB_PASSWORD', 'password'); /** MySQL hostname */ define('DB_HOST', '10.10.20.20');
Khi bạn hoàn tất, hãy lưu file .
Tiếp theo, ta cần tạo folder /var/www/html
mà ta đã tham chiếu trong file cấu hình Nginx của ta làm folder root của tài liệu. Sau đó, ta sẽ sao chép tất cả các file WordPress của bạn vào folder đó:
mkdir -p /var/www/html cp -r ~/wordpress/* /var/www/html
Bây giờ ta có thể cấp quyền sở hữu các file cho user web:
cd /var/www/html chown -R www-data:www-data /var/www/html/*
Web server của bạn đã được cấu hình xong. Ta có thể tắt web server và các quy trình PHP một cách duyên dáng bằng lệnh :
service nginx stop service php5-fpm stop
Bây giờ, hãy thoát khỏi nhà tù để quay lại phiên server lưu trữ:
exit
Bắt đầu nhà tù
Bây giờ ta đã cấu hình xong nhà tù của bạn . Ta có thể khởi động chúng riêng lẻ với giao diện cầu nối mạng của ta .
Đầu tiên, ta sẽ khởi động server database , vì nó đơn giản hơn. Ta cần chỉ định vị trí root chroot như trước. Lần này, ta cũng sẽ sử dụng tham số --net
để chỉ định giao diện cầu nối. Ta sẽ sử dụng điều này kết hợp với tham số --ip
để chỉ định địa chỉ chính xác mà ta muốn cung cấp cho nhà tù này ( 10.10.20.20
, nếu bạn nhớ lại từ cấu hình của ta ).
Ta cũng sẽ chuyển cờ --private
để mount các /tmp
mới /tmp
, /root
và /home/user
bên trong jail. Sau đó, ta cần chỉ định các quy trình mà ta muốn bắt đầu trong tù và đặt nó vào nền với đuôi “&”.
Các quy trình mà ta nên bắt đầu là quy trình server MySQL và cũng là quy trình sleep inf
. Điều này sẽ giữ cho máy giam hoạt động vô thời hạn thay vì thoát ra khi các quá trình trước đó hoàn tất. Tổng cộng, lệnh trông như thế này:
firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 \ "/etc/init.d/mysql start; \ sleep inf" &
Nhà tù sẽ khởi động và các quá trình được chỉ định sẽ bắt đầu được thực hiện tuần tự. Bạn có thể xem kết quả của quá trình này bằng cách sử dụng tùy chọn --list
cho firejail
:
firejail --list
21913:root:firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 /etc/init.d/mysql 21916:root:bash -c /etc/init.d/mysql start; sleep inf 21970:root:/bin/sh /usr/bin/mysqld_safe 22322:syslog:/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/ 22323:root:logger -t mysqld -p daemon.error 22409:root:sleep inf
Như bạn thấy , cây quy trình có sẵn từ hệ thống server của ta . Bởi vì ta có thể thấy thông tin sleep inf
đang chạy và thấy các quy trình MySQL vẫn hoạt động, ta có thể thấy rằng bản jail đã khởi động xong.
Đối với jail web server , cần cài đặt cơ bản tương tự. Ta cần chỉ định vị trí root của chroot, giao diện bắc cầu và địa chỉ IP thực đang được gán ( 10.10.20.10
) và cờ --private
.
Về danh sách tiến trình , ta có một số cân nhắc bổ sung. Để bắt đầu, folder /var/log
trong nhà tù được tạo động ở mỗi lần bắt đầu. Do đó, các chỉ thị log trong file Nginx của ta trỏ đến các vị trí không tồn tại. Ta có thể tạo các vị trí này trước khi cố gắng khởi động Nginx.
Ngoài ra, tiến trình Nginx dựa vào trình ghi log hệ thống. Ta cũng sẽ bắt đầu quá trình rsyslog
trước Nginx. Sau khi khởi động Nginx, ta cũng cần nhớ khởi động PHP processor của bạn , bộ xử lý này sẽ chuyển các yêu cầu tới database jail khi cần thiết. , ta muốn kết thúc bằng sleep inf
để nhà tù vẫn tồn tại qua thời điểm mà các dịch vụ đã bắt đầu.
Cuối cùng, lệnh khởi động web server của ta sẽ trông giống như sau:
firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 \ "mkdir -p /var/log/nginx; \ touch /var/log/nginx/error.log; \ touch /var/log/nginx/access.log; \ /etc/init.d/rsyslog start; \ /etc/init.d/nginx start; \ /etc/init.d/php5-fpm start; \ sleep inf" &
Có thể mất một lúc để jail web server khởi động, hãy tiếp tục kiểm tra bằng firejail --list
để xem quá trình có đạt đến trạng thái sleep inf
.
Bây giờ, nếu bạn truy cập địa chỉ IP công cộng hoặc domain của server lưu trữ trong trình duyệt web của bạn , bạn sẽ thấy trang cài đặt ban đầu của WordPress:
http://host_server_domain_or_IP
Điền vào các giá trị thích hợp và nhấp vào “Cài đặt WordPress” ở dưới cùng khi đã sẵn sàng . Bạn cần đăng nhập bằng account quản trị mới tạo của bạn . Sau đó, bạn sẽ được đưa đến console WordPress:
Nếu mọi thứ ở đây hoạt động như mong đợi, nghĩa là quá trình cài đặt đã thành công. Bây giờ ta có thể làm việc để làm cho cấu hình này có thể lặp lại và liên tục.
Thực hiện các Dịch vụ Phiên bản Firejail
Bây giờ ta đã cài đặt và chạy cấu hình, ta muốn đảm bảo ta có thể quay lại đây dễ dàng sau khi khởi động lại. Để làm được điều này, ta có một số lĩnh vực cần giải quyết. Bao gồm các:
- Cấu hình mạng từ server đến tù và từ server đến tù để xuất hiện khi khởi động.
- Làm cho các thay đổi
iptables
của ta liên tục. - Cấu hình nhà tù của ta để bắt đầu tự động khi server lưu trữ được khởi động.
Ta có thể bắt đầu ngay lập tức ba điều này.
Cấu hình mạng cho Jails khi khởi động
Điều đầu tiên ta sẽ tập trung vào là cài đặt và vận hành mạng lưới cầu nối. Điều này là bắt buộc trước khi ta lo lắng về các luật firewall của bạn và trước khi ta bắt đầu môi trường bị giam giữ.
Ta cần cấu hình kết nối bắc cầu thực tế. Để cài đặt và chạy kết nối này khi khởi động, ta cần sửa đổi các file /etc/network/interfaces
. Mở file này ngay bây giờ:
nano /etc/network/interfaces
Bên trong, bạn sẽ thấy một số phần quy định giao diện nào được khởi động khi server khởi động và các dòng khác mô tả từng giao diện. Bắt đầu bằng cách nối mạng br0
vào cuối dòng auto
thứ hai để bắt đầu giao diện mà ta sẽ xác định khi khởi động:
auto eth0 eth1 br0
Tiếp theo, ta cần cài đặt một phần sẽ xác định giao diện. Vì đây là một giao diện cầu nối và không hoạt động như một cầu nối thông thường để kết hợp hai mạng, ta sẽ xác định giao diện của bạn theo cách thủ công, nghĩa là ta sẽ đưa ra các lệnh chính xác cần được sử dụng để cấu hình mạng.
Bắt đầu với tiêu đề phần:
iface br0 inet manual
Dưới đây, ta sẽ sử dụng các lệnh pre-up
, up
, post-down
và down
để xác định các lệnh sẽ được chạy ở mỗi giai đoạn. Đối với các lệnh pre-up
và up
, ta muốn tạo cầu nối và sau đó đưa giao diện lên giống như cách ta đã làm thủ công trước đó. $IFACE
sẽ được thay thế động bằng br0
khi các lệnh được chạy, vì vậy bạn không nên sửa đổi chúng ở đây:
iface br0 inet manual pre-up brctl addbr $IFACE up ifconfig $IFACE 10.10.20.1/24
Đối với các lệnh post-down
và down
, ta chỉ muốn đảo ngược các lệnh này. Ta sẽ đưa giao diện trở lại và sau đó xóa cầu:
iface br0 inet manual pre-up brctl addbr $IFACE up ifconfig $IFACE 10.10.20.1/24 down ifconfig $IFACE down post-down brctl delbr $IFACE
Giao diện br0
của ta hiện đã được xác định và ta đã cài đặt nó để tự động khởi động khi server khởi động . Lưu file khi bạn hoàn tất.
Cài đặt IPTables để cho phép chuyển tiếp bị hạn chế tới các Jail
Tiếp theo, ta cần cài đặt iptables với các luật mà ta đã thêm trước đó. May mắn là điều này rất đơn giản với sự trợ giúp của gói iptables-persistent
.
Cài đặt gói bằng lệnh :
apt-get install iptables-persistent
Bạn sẽ được hỏi trong quá trình cài đặt xem bạn có muốn lưu bộ luật IPv4 và IPv6 hiện tại hay không. Chọn có tại các dấu nhắc này để tự động lưu các bộ luật hiện tại. Những điều này sẽ được tự động áp dụng lại khi khởi động.
Nếu bạn cần điều chỉnh các luật được áp dụng khi khởi động, hãy áp dụng các thay đổi mà bạn muốn sử dụng và sau đó nhập:
/etc/init.d/iptables-persistent save
Bộ luật hiện tại sẽ được cập nhật.
Các luật iptables của ta hiện đã được cài đặt để được đưa trở lại khi server khởi động. Tuy nhiên, có một vấn đề khác mà ta chưa giải quyết: ta cần đảm bảo kernel của ta cho phép chuyển tiếp.
Trước đây, ta đã lặp lại “1” vào một file trong hệ thống file giả /proc
để kích hoạt khả năng này. Để thay đổi này tự động xảy ra ở lần khởi động tiếp theo, hãy chỉnh sửa file sysctl.conf
:
nano /etc/sysctl.conf
Bỏ comment sau:
net.ipv4.ip_forward=1
Lưu file khi bạn hoàn tất.
Tạo Tập lệnh khởi động để bắt đầu WordPress Jails
Để cấu hình các nhà tù của ta khởi động khi server khởi động , ta cần tạo một tập lệnh khởi động. Ta sẽ gọi tập lệnh của ta là firejail_wp.conf
.
Mở file có tên này trong folder /etc/init
trong editor của bạn:
nano /etc/init/firejail_wp.conf
Bên trong, trước tiên ta điền vào mô tả ngắn gọn về dịch vụ này:
description "WordPress jail"
Tiếp theo, ta cấu hình các trường hợp phải đúng để dịch vụ này tự động khởi động. Ta muốn đảm bảo hệ thống file khả dụng và ta cũng cần đảm bảo mạng br0
đã được cài đặt . Nếu mạng br0
bị lỗi, cả hai lệnh firejail của ta sẽ không thành công.
Để làm điều này, ta sẽ sử dụng chỉ thị start on
và các local-filesystems
và net-device-up
để xây dựng các điều kiện bắt đầu của ta . Ta cũng sẽ cấu hình tập lệnh của bạn để dừng khi nào máy chuyển sang chế độ khởi động lại hoặc tắt máy (được chỉ ra bởi bất kỳ cấp chạy nào không phải là 1-5):
description "WordPress jail" start on (local-filesystems and net-device-up IFACE=br0) stop on runlevel [!12345]
Cuối cùng, ta cần cài đặt lệnh thực sự sẽ được thực thi khi dịch vụ này được khởi động. Do cách các dịch vụ được chạy, ta sẽ đặt các lệnh firejail trong một tập lệnh bên ngoài, vì vậy ta chỉ cần tham khảo tên tập lệnh ở đây:
description "WordPress jail" start on (local-filesystems and net-device-up IFACE=br0) stop on runlevel [!12345] exec /startjails.sh
Khi bạn hoàn tất, hãy lưu file .
Bây giờ, ta cần tạo file script thực tế mà ta vừa tham chiếu. Sử dụng editor của bạn để mở file tại vị trí này:
nano /startjails.sh
Vì đây là một tập lệnh bash, hãy bắt đầu với lệnh gọi shebang tiêu chuẩn để bash:
#!/bin/bash
Tiếp theo, ta sẽ thêm hai lệnh firejail của ta , với một sửa đổi nhỏ. Vì một lý do không xác định, đã xảy ra sự cố khi chạy tập lệnh Nginx init trong môi trường bị giam giữ khi bắt đầu bởi người mới nổi. Sự cố này không xuất hiện khi được gọi bằng bất kỳ phương thức nào khác.
Để giải quyết vấn đề này, ta sẽ chỉ cần gọi file thi hành Nginx thay vì tập lệnh init bị giam giữ bên trong. Ngoài ra, các lệnh chính xác như ta đã sử dụng trước đó:
#!/bin/bash firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 "/etc/init.d/mysql start; sleep inf" & firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 "mkdir -p /var/log/nginx; touch /var/log/nginx/error.log; touch /var/log/nginx/access.log; /etc/init.d/rsyslog start; /usr/sbin/nginx; /etc/init.d/php5-fpm start; sleep inf" &
Một lệnh nữa là cần thiết đảm bảo rằng đây là một dịch vụ đang diễn ra thay vì một tác vụ sẽ kết thúc ngay sau khi nhà tù bắt đầu. Ta cần thêm sleep inf
vào dòng cuối cùng trong script. Điều này sẽ cho phép người mới bắt đầu quản lý dịch vụ một cách chính xác:
#!/bin/bash firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 "/etc/init.d/mysql start; sleep inf" & firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 "mkdir -p /var/log/nginx; touch /var/log/nginx/error.log; touch /var/log/nginx/access.log; /etc/init.d/rsyslog start; /usr/sbin/nginx; /etc/init.d/php5-fpm start; sleep inf" & sleep inf
Khi bạn hoàn tất, hãy lưu file .
Bây giờ, ta chỉ cần làm cho file này có thể thực thi được, để tập lệnh khởi động có thể khởi động nó:
chmod +x /startjails.sh
Với bước này, môi trường bị giam giữ trong WordPress được cấu hình hoàn toàn để khởi động vào lúc khởi động.
Bạn có thể khởi động lại server lưu trữ của bạn để thử điều này:
shutdown -r now
Nếu mọi thứ đã được cấu hình chính xác, bạn có thể truy cập trang web WordPress của bạn sau khi mọi thứ đã có thời gian để khởi động.
Kết luận
Hướng dẫn này chỉ đơn giản là một ví dụ về một trong nhiều điều bạn có thể làm với một công cụ như firejail. Trong khi có nhiều cách khác để cài đặt các thành phần biệt lập cho server của bạn, firejail là một giải pháp tuyệt vời vì tính linh hoạt và khả năng xử lý rất nhiều tình huống khác nhau với tài nguyên tối thiểu.
Các tin liên quan