Вступление
При работе с веб-сервером, доступным для широкой публики, достижение баланса между обеспечением доступности вашего контента и настройкой безопасной конфигурации может оказаться затруднительным. Есть много разных областей, которые должны быть предметом тщательного изучения. Одним из них является изоляция процесса и видимость.
Проект под названием * firejail * стремится помочь в этой области, предоставляя облегченный механизм контейнеризации безопасности, который использует пространство имен ядра для реализации политик разделения. Это делает среду chroot чрезвычайно легкой.
В этом руководстве мы покажем вам, как использовать firejail для изоляции процессов в их собственной среде chroot. Чтобы продемонстрировать это на реальном примере, мы настроим две среды chroot: одну с веб-сервером Nginx, обслуживающим WordPress, а другую - с базой данных MySQL, которая будет обрабатывать данные сайта. Эти два экземпляра будут иметь свои собственные файловые системы и установки и будут взаимодействовать через сетевое устройство с мостовыми соединениями.
Предпосылки и цели
В этом руководстве мы будем использовать 64-битный сервер Ubuntu 14.04 в качестве базовой установки. Это позволит нам использовать предварительно созданные пакеты + firejail +
и позволит легко создавать среды chroot.
Чтобы получить хорошую основу для установки, убедитесь, что вы выполнили настройку начального сервера https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 для Ubuntu 14.04]. Вот.
Мы будем настраивать две среды chroot в нашей хост-системе. На самом деле это будут стабильные среды Debian, и этот выбор выбран потому, что среды Debian лучше тестируются с помощью инструмента + debootstrap +
, который мы будем использовать.
Наш хост-компьютер будет настроен с общедоступным IP-адресом и будет служить шлюзом для мостовой сети, которую мы настроим для связи с тюрьмами. Заключенные в тюрьму среды будут настроены только на использование интерфейса моста и смогут получать доступ к более широкому Интернету только через правила NAT на хосте.
Три среды, которые мы будем настраивать, будут иметь следующие свойства:
Environment | Public IP Address | Bridge IP Address |
---|---|---|
Host |
10.10.20.1 |
|
Web Server |
(none) |
10.10.20.10 |
Database Server |
(none) |
10.10.20.20 |
Обратите внимание, что значение красного цвета выше должно быть заменено публичным IP-адресом вашего хост-сервера. Однако IP-адреса моста следует использовать как есть, поскольку мы будем настраивать этот интерфейс и эти адреса в руководстве.
В этом руководстве все команды будут выполняться от имени пользователя * root *.
Загрузите и настройте компоненты хост-машины
Для начала нам необходимо загрузить некоторые инструменты, которые мы будем использовать, на наш сервер.
Сначала нам нужно скачать пакет + .deb +
для программы firejail. Найдите последнее имя пакета + .deb +
на странице download сайта и замените часть имени файла в приведенном ниже URL-адресе на эту версию. URL-адрес ниже является прямой ссылкой на скачивание пакета:
cd ~
wget http://downloads.sourceforge.net/project/firejail/firejail/
Когда файл будет загружен, установите его с помощью + dpkg +
:
dpkg -i firejail*
После установки программы firejail нам нужно получить дополнительные пакеты из стандартных репозиториев Ubuntu. В частности, нам нужен инструмент + debootstrap +
, который поможет нам создать наши файловые системы chroot, и + bridge-utils +
, который позволит нам создать интерфейс сетевого моста, который наши тюрьмы будут использовать для связи:
apt-get update
apt-get install debootstrap bridge-utils
Настройте интерфейс моста
Прежде чем мы начнем с настоящими тюрьмами, мы настроим сетевой мостовой интерфейс.
Мы можем создать новый интерфейс с помощью команды + brctl +
, которая была частью пакета + bridge-utils +
. Наш мост будет называться + br0 +
:
brctl addbr br0
Далее нам нужно поднять интерфейс. Наряду с активацией интерфейса мы назначаем диапазон сети CIDR. Наш хост-сервер будет иметь адрес * 10.10.20.1 * на этом интерфейсе:
ifconfig br0 10.10.20.1/24
Когда интерфейс запущен и работает, мы должны указать ядру разрешить переадресацию IP или маршрутизацию между нашими интерфейсами. Мы можем включить эту функцию для этого сеанса, набрав:
echo "1" > /proc/sys/net/ipv4/ip_forward
Теперь нам нужно установить правило + iptables +
, которое позволит перенаправлять трафик, предназначенный для порта 80 на нашем хост-сервере, на веб-сервер, который мы будем устанавливать в одной из наших тюрьм. Наш веб-сервер будет иметь IP-адрес * 10.10.20.10 * на нашем мостовом интерфейсе:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.10.20.10:80
Это добавляет правило в конец цепочки «PREROUTING» в таблице «nat». Когда пакет TCP, предназначенный для порта 80, получает доступ, трафик перенаправляется на порт 80 по + 10.10.20.10 +
посредством трансляции сетевых адресов.
Нам также необходимо установить ряд правил, которые позволят нашей базе данных и веб-серверу запрашивать Интернет, чтобы они могли обновлять компоненты из WordPress. Мы начнем с добавления правила маскарада, которое позволит нашему интерфейсу + br0 +
успешно маршрутизировать связь через наш хост-компьютер:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Затем мы можем заблокировать связь между нашими интерфейсами, изменив правила в цепочке FORWARD.
Во-первых, мы должны отразить наше предыдущее правило NAT, которое было установлено, чтобы мы могли явно разрешить трафик от порта 80 в нашу сеть + br0 +
:
iptables -A FORWARD -i eth0 -o br0 -p tcp -m tcp --dport 80 -j ACCEPT
Мы также хотим разрешить входящий трафик, связанный с нашими установленными соединениями:
iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Мы хотим разрешить пересылку всего трафика, происходящего через интерфейс + br0 +
, чтобы наши тюрьмы могли общаться друг с другом и с внешним миром:
iptables -A FORWARD -i br0 -j ACCEPT
Наконец, мы отбросим все другие переадресационные соединения, чтобы пересылка была разрешена только для исходящих соединений из сети + br0 +
. Исключения из этой политики уже были установлены в предыдущих правилах.
iptables -P FORWARD DROP
Теперь наша хост-система настроена с мостовым интерфейсом, который она будет использовать для связи с окруженными средами.
Создайте структуру каталогов Chroot
Теперь мы готовы создать наши структуры каталогов chroot.
Как мы уже говорили, наш веб-сервер и наш сервер баз данных будут работать в совершенно разных файловых системах. Мы будем хранить обе эти файловые системы в каталоге под названием + / jails +
. Создайте этот каталог сейчас:
mkdir /jails
Перейдите в каталог, который вы только что создали:
cd /jails
Теперь нам нужно создать файловые структуры, которые будут использоваться нашими заключенными в тюрьму операционными системами. Для этого мы будем использовать инструмент + debootstrap +
. Эта утилита была создана для начальной загрузки среды Debian в существующей файловой системе. Это делается путем извлечения пакетов из репозиториев Debian и «установки» их в правильное местоположение.
Хотя + debootstrap +
можно использовать для начальной загрузки среды Ubuntu, вместо этого мы будем выбирать стабильные установки Debian. Поскольку инструмент был создан для работы с Debian, эти среды являются наиболее хорошо протестированными для этого инструмента.
Мы будем устанавливать нашу базу данных в каталог с именем «db». Чтобы создать соответствующую структуру каталогов, а также загрузить и установить необходимые пакеты, введите:
debootstrap --arch=amd64 stable db
Теперь, когда наша файловая система построена в каталоге + / jails / db +
, мы можем использовать + rsync +
, чтобы скопировать структуру в другой каталог, который может использовать наш веб-сервер. Новый каталог будет называться «www». Убедитесь, что вы обратили внимание на косую черту (/) в следующей команде. Это скопирует contents первого каталога во второй, вместо копирования самого каталога:
rsync -azvh db/ www
Теперь у нас есть две структуры каталогов chroot, которые мы можем использовать с нашей программой + firejail +
.
Используйте Firejail для настройки базы данных WordPress
Теперь, когда у нас есть структура каталогов, мы можем использовать + firejail +
для создания среды chroot в нашей структуре каталогов + / jails / db +
.
Чтобы создать среду chroot и запустить сессию bash внутри, нам просто нужно указать местоположение каталога корня chroot и имя хоста, которое мы хотим использовать для сессии:
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 ~]$
Команда выведет родительский pid, дочерний pid и интерфейсы, настроенные в этом сеансе тюрьмы (на данный момент мы не ограничивали и не настраивали интерфейсы). После этого вы попадете в командную строку в вашей тюрьме.
Первое, что нам нужно сделать, это обновить нашу базу данных пакетов и установить сервер MySQL в среде chroot. Вы можете сделать это, набрав:
apt-get update
apt-get install mysql-server
В процессе обновления вы должны увидеть, что репозитории Debian проверяются. Это потому, что наша среда chroot является установкой Debian.
В процессе установки вам будет предложено выбрать и подтвердить пароль для учетной записи root MySQL.
Когда установка завершится, мы должны сгенерировать структуру каталогов данных MySQL, набрав:
mysql_install_db
Затем заблокируйте некоторые небезопасные значения по умолчанию с помощью включенного скрипта:
mysql_secure_installation
Вам будет предложено ввести пароль root MySQL, который вы установили во время установки. После этого вас спросят, хотите ли вы сменить пароль. Выберите «Нет», если вас устраивает ваш выбор. В оставшейся части запросов просто нажмите ENTER, чтобы выбрать варианты по умолчанию.
Создайте базу данных и пользователя WordPress
Далее мы хотим создать отдельную базу данных для WordPress. Войдите на сервер MySQL, используя корневую учетную запись MySQL. Введите пароль, который вы выбрали для этого пользователя при появлении запроса:
mysql -u root -p
Вы попадете в приглашение MySQL. Создайте новую базу данных для WordPress для использования:
CREATE DATABASE wordpress;
Далее мы создадим пользователя для работы с этой базой данных из тюрьмы веб-сервера. Веб-сервер будет иметь IP-адрес * 10.10.20.10 * на интерфейсе моста, поэтому нам нужно связать этого пользователя с этим адресом. Назначьте безопасный пароль для этого пользователя. Затем мы дадим этому пользователю возможность работать с базой данных, которую мы создали:
CREATE USER 'wordpressuser'@'10.10.20.10' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'10.10.20.10';
Теперь нам просто нужно очистить таблицу привилегий и выйти:
FLUSH PRIVILEGES;
exit
Измените настройки MySQL для привязки к адресу моста
Далее нам нужно изменить файл конфигурации MySQL. Откройте его в вашем редакторе сейчас:
nano /etc/mysql/my.conf
Этот файл организован в разделы. Найдите раздел, который начинается так:
[mysqld]
Вы должны увидеть директиву + bind-address +
, которая в настоящее время установлена в + 127.0.0.1 +
. Мы хотим запустить прослушивание нашего экземпляра MySQL через интерфейс моста. Адрес этой тюрьмы в этом интерфейсе будет * 10.10.20.20 *, поэтому мы должны изменить его так, чтобы он выглядел следующим образом:
bind-address = 10.10.20.20
Сохраните и закройте файл, когда вы закончите.
Теперь мы можем остановить текущий запущенный экземпляр MySQL и выйти из этой тюрьмы:
service mysql stop
exit
Используйте Firejail для настройки веб-сервера WordPress
Теперь, когда наша база данных настроена, мы можем перейти к нашей тюрьме, которая будет использоваться для веб-сервера. Используйте firejail, чтобы начать сеанс в этой среде:
firejail --chroot=/jail/www --name=www
Первое, что нам нужно сделать, это обновить нашу локальную базу данных пакетов и установить веб-сервер Nginx и компоненты PHP. Это необходимо для обработки динамических запросов и подключения к базе данных MySQL:
apt-get update
apt-get install nginx php5-fpm php5-mysql
Настройка PHP
Мы начнем с редактирования файла конфигурации процессора PHP, чтобы отключить функцию, которая может быть проблемой безопасности:
nano /etc/php5/fpm/php.ini
Найдите в файле директиву + cgi.fix_pathinfo +
. Это будет закомментировано и установлено в «1». Нам нужно раскомментировать и изменить его на «0»:
cgi.fix_pathinfo=0
Сохраните и закройте файл, когда вы закончите.
Настройка Nginx
Теперь нам нужно настроить Nginx для корректной работы с файлами WordPress. Это включает в себя создание нового корня документа в + / var / www / html
, установку` + server_name _` в качестве публичного IP-адреса вашей хост-системы и настройку обработки PHP.
Откройте файл конфигурации Nginx по умолчанию:
vim /etc/nginx/sites-available/default
Краткое описание изменений, которые мы должны сделать, приведено ниже:
-
Раскомментируйте директиву
+ listen 80 +
, чтобы явно указать номер порта. -
Измените значение директивы
+ root +
, указав+ / var / www / html +
, где мы будем хранить наши файлы WordPress. -
Измените параметр
+ index
, чтобы искать файл` + index.php` перед другими индексными файлами. -
Измените значение директивы
+ server_name +
, указав * IP-адрес или домен хост-сервера * -
Настройте последнее значение для директивы
+ try_files
, чтобы передавать запросы в файл` + index.php`, когда они не найдены в виде файлов или каталогов. Он находится внутри блока+ location / +
. -
Раскомментируйте все директивы страницы ошибок, чтобы разрешить страницы ошибок.
-
Раскомментируйте блок
+ location ~ \ .php $ +
, включенную директиву+ fastcgi_split_path_info +
, строку+ fastcgi_pass +
* socket *,+ fastgci_index +
и+ включайте директивы fastcgi_params +
и добавьте `+ директива try_files + `, которая пробует запрос как заданный и возвращает 404 в противном случае.
Когда вы закончите вносить изменения выше, файл должен выглядеть примерно так, как показано ниже (для краткости комментарии были удалены):
server {
listen 80;
root ;
index index.html index.htm;
server_name ;
location / {
try_files $uri $uri/ ;
}
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$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Вы можете вставить все содержимое, показанное здесь, если это проще. Вам нужно всего лишь изменить директиву + server_name
, чтобы она ссылалась на публичный IP-адрес или имя домена вашей хост-системы.
Сохраните и закройте файл, когда вы закончите.
Загрузка и настройка файлов WordPress
Теперь, когда Nginx настроен на правильное обслуживание файлов, мы можем загружать, настраивать и устанавливать их.
Начните с перехода в домашний каталог пользователя root и загрузите последнюю версию пакета WordPress:
cd ~
wget http://wordpress.org/latest.tar.gz
Распакуйте содержимое архива, создав каталог + ~ / wordpress +
:
tar xzvf latest.tar.gz
Скопируйте пример файла конфигурации в допустимое имя файла конфигурации, которое будет проверено:
cd ~/wordpress
cp wp-config-sample.php wp-config.php
Теперь откройте новый файл конфигурации в вашем текстовом редакторе:
nano wp-config.php
Внутри нам нужно изменить значения, связанные с хранилищем базы данных. Нам нужно заполнить параметры конфигурации деталями выбора, который мы сделали в нашей базе данных MySQL.
За исключением поля пароля, которое вы должны были изменить на свое собственное значение ранее, вы можете использовать значения, представленные ниже:
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpressuser');
/** MySQL database password */
define('DB_PASSWORD', '');
/** MySQL hostname */
define('DB_HOST', '10.10.20.20');
Когда вы закончите, сохраните и закройте файл.
Затем нам нужно создать каталог + / var / www / html
, на который мы ссылаемся в нашем конфигурационном файле Nginx, в качестве корня документа. Затем мы скопируем все ваши файлы WordPress в этот каталог:
mkdir -p /var/www/html
cp -r ~/wordpress/* /var/www/html
Теперь мы можем передать право собственности на файлы веб-пользователю:
cd /var/www/html
chown -R www-data:www-data /var/www/html/*
Тюрьма вашего веб-сервера полностью настроена. Мы можем корректно завершить работу нашего веб-сервера и PHP-процессов, набрав:
service nginx stop
service php5-fpm stop
Теперь выйдите из тюрьмы, чтобы вернуться к сеансу хост-сервера:
exit
Начиная тюрьмы
Теперь у нас полностью настроены наши тюрьмы. Мы можем запустить их индивидуально с помощью нашего интерфейса сетевого моста.
Сначала мы запустим сервер базы данных, поскольку он проще. Нам нужно указать корневое местоположение chroot, как и раньше. На этот раз мы также будем использовать параметр + - net +
для указания интерфейса моста. Мы будем использовать это вместе с параметром + - ip +
, чтобы указать точный адрес, который мы хотели бы дать этой тюрьме (+ 10.10.20.20 +
, если вы помните из нашей конфигурации).
Мы также передадим флаг + - private +
для монтирования новых каталогов + / tmp
,` + / root` и + / home / user
внутри тюрьмы. Затем нам нужно указать процессы, которые мы хотим запустить в тюрьме, и поместить их на задний план с окончанием «&».
Процессы, которые мы должны запустить, это процесс сервера MySQL, а также процесс + sleep inf +
. Это будет держать джейл бесконечно долго, а не выходить из него после завершения предыдущих процессов. В целом команда выглядит так:
firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 \
"/etc/init.d/mysql start; \
sleep inf" &
Тюрьма запустится, и указанные процессы начнут выполняться последовательно. Вы можете увидеть результаты этого процесса, используя опцию + - list
для` + 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
Как видите, дерево процессов доступно в нашей хост-системе. Поскольку мы видим, как работает + sleep inf +
, а процессы MySQL по-прежнему работают, мы видим, что джейл завершил загрузку.
Для тюрьмы веб-сервера требуется та же базовая настройка. Нам нужно будет указать корневое местоположение chroot, мостовой интерфейс и фактический назначаемый IP-адрес (+ 10.10.20.10 +
) и флаг + - private +
.
Что касается списка процессов, у нас есть немало дополнительных соображений. Начнем с того, что каталог + / var / log +
в тюрьме динамически создается при каждом запуске. Из-за этого директивы log в наших файлах Nginx указывают на несуществующие местоположения. Мы можем создать эти локации, прежде чем пытаться загрузить Nginx.
Кроме того, процесс Nginx использует системный регистратор. Мы также запустим процесс + rsyslog +
до Nginx. После запуска Nginx нам также нужно помнить о том, чтобы запустить наш процессор PHP, который будет при необходимости передавать запросы в тюрьму базы данных. Опять же, мы хотим закончить с + 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; \
/etc/init.d/nginx start; \
/etc/init.d/php5-fpm start; \
sleep inf" &
Для загрузки джейла веб-сервера может потребоваться некоторое время, продолжайте проверять с помощью + firejail --list +
, чтобы убедиться, что процесс достигает состояния + sleep inf +
.
Теперь, если вы перейдете на общедоступный IP-адрес или имя домена вашего хост-сервера в веб-браузере, вы должны увидеть страницу начальной установки WordPress:
http://
изображение: https: //assets.digitalocean.com/articles/firejail/wp_install.png [экран начальной установки WordPress]
Заполните соответствующие значения и нажмите «Установить WordPress» внизу, когда будете готовы. Вам нужно будет войти в систему с помощью только что созданной учетной записи администратора. После этого вы попадете на панель управления WordPress:
изображение: https: //assets.digitalocean.com/articles/firejail/wp_dashboard.png [Панель управления WordPress]
Если все здесь работает, как ожидалось, это означает, что установка прошла успешно. Теперь мы можем сделать эту конфигурацию повторяемой и постоянной.
Создание служб экземпляров Firejail
Теперь, когда мы настроили и запустили нашу конфигурацию, мы хотим быть уверенными, что сможем легко вернуться сюда после перезагрузки. Для этого у нас есть ряд областей, которые нам необходимо решить. Они включают:
-
Настройка сети хост-тюрьма и тюрьма-тюрьма для загрузки при загрузке.
-
Делать ваши изменения
+ iptables
постоянными. -
Настройка нашей тюрьмы на автоматический запуск при загрузке хост-сервера.
Мы можем начать с этих трех сразу.
Настройка сети для джейлов при загрузке
Первое, на чем мы сконцентрируемся, - это наладить и запустить мостовую сеть. Это необходимо до того, как мы начнем беспокоиться о наших правилах брандмауэра и до того, как мы запустим нашу среду.
Нам нужно настроить фактическое мостовое соединение. Чтобы установить и запустить это соединение при загрузке, нам нужно изменить файлы + / etc / network / interfaces +
. Откройте этот файл сейчас:
nano /etc/network/interfaces
Внутри вы увидите некоторые разделы, которые определяют, какие интерфейсы запускаются при загрузке, и другие строки, которые описывают каждый интерфейс. Начните с добавления сети + br0 +
в конец второй строки + auto +
, чтобы запустить интерфейс, который мы определим при загрузке:
auto eth0 eth1
Далее нам нужно настроить раздел, который будет определять интерфейс. Поскольку это мостовой интерфейс, и он не функционирует как обычный мост для объединения двух сетей, мы определим наш интерфейс вручную, то есть мы дадим точные команды, которые следует использовать для настройки сети.
Начните с заголовка раздела:
iface br0 inet manual
При этом мы будем использовать директивы + pre-up +
, + up +
, + post-down +
и + down +
для определения команд, которые должны выполняться на каждом этапе. Для команд + pre-up +
и + up +
мы хотим создать мост, а затем запустить интерфейс так же, как мы делали это ранее вручную. + $ IFACE +
будет динамически заменяться на + br0 +
при запуске команд, поэтому вам не следует изменять их здесь:
iface br0 inet manual
pre-up brctl addbr $IFACE
up ifconfig $IFACE 10.10.20.1/24
Для команд + post-down +
и + down +
мы просто хотим изменить эти команды. Мы вернем интерфейс вниз, а затем удалим мост:
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
Наш интерфейс + br0 +
теперь определен, и мы настроили его на автоматический запуск при загрузке. Сохраните и закройте файл, когда вы закончите.
Настройте IPTables, чтобы разрешить ограниченную пересылку в тюрьмы
Далее нам нужно настроить iptables с правилами, которые мы добавили ранее. К счастью, это просто с помощью пакета + iptables-persistent +
.
Установите пакет, набрав:
apt-get install iptables-persistent
В процессе установки вас спросят, хотите ли вы сохранить текущий набор правил IPv4 и IPv6. Выберите * yes * в этих подсказках, чтобы автоматически сохранить текущие наборы правил. Они будут автоматически повторно применены при загрузке.
Если вам когда-либо понадобится изменить правила, применяемые при загрузке, внесите необходимые изменения, а затем введите:
/etc/init.d/iptables-persistent save
Текущий набор правил будет обновлен.
Наши правила iptables теперь возвращаются при загрузке сервера. Однако есть еще один момент, который мы еще не рассмотрели: нам нужно убедиться, что наше ядро позволяет пересылать.
Ранее мы включали «1» в файл в псевдофайловой системе + / proc +
, чтобы включить эту возможность. Чтобы это изменение произошло автоматически при следующей загрузке, отредактируйте файл + sysctl.conf +
:
nano /etc/sysctl.conf
Раскомментируйте следующую строку:
net.ipv4.ip_forward=1
Сохраните и закройте файл, когда вы закончите.
Создать сценарий Upstart для запуска WordPress Jails
Чтобы настроить наши тюрьмы для запуска при загрузке, нам нужно создать сценарий upstart. Мы назовем наш скрипт + firejail_wp.conf +
.
Откройте файл с этим именем в каталоге + / etc / init +
в вашем текстовом редакторе:
nano /etc/init/firejail_wp.conf
Внутри мы сначала заполняем краткое описание того, для чего предназначен этот сервис:
description "WordPress jail"
Затем мы настраиваем обстоятельства, которые должны быть истинными, чтобы эта служба автоматически запускалась. Мы хотим убедиться, что файловая система доступна, и мы также должны убедиться, что сеть + br0 + 'была создана. Если сеть `+ br0 +
не работает, обе наши команды firejail завершатся неудачно.
Для этого мы будем использовать директиву + start on +
и спецификаторы + local-filesystems +
и + net-device-up +
для построения наших начальных условий. Мы также настроим наш скрипт так, чтобы он останавливался всякий раз, когда машина переходит в режим перезагрузки или выключения (на что указывает любой уровень выполнения, отличный от 1-5):
description "WordPress jail"
start on (local-filesystems and net-device-up IFACE=br0)
stop on runlevel [!12345]
Наконец, нам нужно установить фактическую команду, которая будет выполняться при запуске этой службы. В связи с тем, что службы запускаются, мы будем размещать команды firejail во внешнем скрипте, поэтому нам просто нужно указать здесь имя скрипта:
description "WordPress jail"
start on (local-filesystems and net-device-up IFACE=br0)
stop on runlevel [!12345]
exec /startjails.sh
Когда вы закончите, сохраните и закройте файл.
Теперь нам нужно создать файл сценария, на который мы только что ссылались. Используйте ваш текстовый редактор, чтобы открыть файл в этом месте:
nano /startjails.sh
Поскольку это скрипт bash, начните со стандартного вызова shebang для bash:
#!/bin/bash
Далее мы добавим две наши команды firejail с одной небольшой модификацией. По неизвестной причине существует проблема с запуском сценария инициализации Nginx в окруженной тюрьме среде при запуске upstart. Эта проблема отсутствует при вызове любым другим методом.
Чтобы обойти это, мы просто вызовем исполняемый файл Nginx вместо внутреннего заключенного в тюрьму сценария инициализации. Кроме этого, команды точно такие же, как мы использовали их ранее:
#!/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 +
в качестве последней строки в скрипте. Это позволит upstart правильно управлять сервисом:
#!/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
Когда вы закончите, сохраните и закройте файл.
Теперь нам просто нужно сделать этот файл исполняемым, чтобы его мог запустить сценарий upstart:
chmod +x /startjails.sh
На этом этапе среда WordPress в тюрьме полностью настроена для запуска во время загрузки.
Вы можете перезагрузить хост-сервер, чтобы попробовать это:
shutdown -r now
Если все настроено правильно, вы сможете добраться до своего сайта WordPress после того, как все успело запуститься.
Заключение
Это руководство было просто примером одной из многих вещей, которые вы можете сделать с помощью такого инструмента, как firejail. Хотя существует множество других способов настройки изолированных компонентов для ваших серверов, firejail является отличным решением благодаря своей гибкости и способности обрабатывать множество различных сценариев с минимальными ресурсами.