Firejailを使用して投獄された環境でWordPressのインストールを設定する方法
序章
一般に公開されているWebサーバーを実行している場合、コンテンツにアクセスできるようにすることと安全な構成を確立することのバランスをとることが難しくなる可能性があります。 注意深い精査の対象とすべき多くの異なる領域があります。 これらの1つは、プロセスの分離と可視性です。
firejail と呼ばれるプロジェクトは、カーネルの名前空間を利用して分離ポリシーを適用する軽量のセキュリティコンテナ化メカニズムを提供することにより、この分野を支援しようとしています。 これにより、chroot環境は非常に軽量になります。
このガイドでは、独自のchroot環境でプロセスを分離するためにfirejailを使用する方法を示します。 これを実際の例で示すために、2つのchroot環境をセットアップします。1つはWordPressを提供するNginx Webサーバーを使用し、もう1つはサイトデータを処理するMySQLデータベースを使用します。 これらの2つのインスタンスには、独自のファイルシステムとインストールがあり、ブリッジネットワークデバイスを介して通信します。
前提条件と目標
このガイドでは、基本インストールとして64ビットのUbuntu14.04サーバーを使用します。 これにより、ビルド済みのfirejail
パッケージを利用できるようになり、chroot環境を簡単に作成できるようになります。
インストールの適切なベースを取得するには、Ubuntu14.04の初期サーバーセットアップがここで完了していることを確認してください。
ホストシステムに2つのchroot環境を設定します。 これらは実際にはDebianの安定した環境になります。これは、Debian環境が使用するdebootstrap
ツールでよりよくテストされているために選択されたものです。
ホストマシンはパブリックIPアドレスで構成され、刑務所と通信するためにセットアップするブリッジネットワークのゲートウェイとして機能します。 ジェイルされた環境は、ブリッジインターフェイスを利用するようにのみ構成され、ホスト上のNATルールを介してのみより広いインターネットにアクセスできます。
構成する3つの環境には、次のプロパティがあります。
環境 | パブリックIPアドレス | ブリッジIPアドレス |
---|---|---|
亭主 | 192.0.2.1 | 10.10.20.1 |
Webサーバー | (無し) | 10.10.20.10 |
データベースサーバー | (無し) | 10.10.20.20 |
上記の赤い値は、ホストサーバーのパブリックIPアドレスに置き換える必要があることに注意してください。 ただし、このインターフェイスとこれらのアドレスはガイド全体で設定するため、ブリッジIPアドレスはそのまま使用する必要があります。
このガイド全体を通して、すべてのコマンドはrootユーザーとして実行されます。
ホストマシンコンポーネントをダウンロードして構成する
開始するには、使用するツールのいくつかをサーバーにダウンロードする必要があります。
まず、firejailプログラムの.deb
パッケージをダウンロードする必要があります。 サイトのダウンロードページで最新の.deb
パッケージ名を見つけ、以下のURLのファイル名部分をそのバージョンに置き換えます。 以下のURLは、パッケージへの直接ダウンロードリンクです。
cd ~ wget http://downloads.sourceforge.net/project/firejail/firejail/firejail_0.9.8.1_1_amd64.deb
ファイルがダウンロードされたら、dpkg
を使用してインストールします。
dpkg -i firejail*
firejailプログラムをインストールした後、Ubuntuのデフォルトリポジトリからいくつかの追加パッケージを取得する必要があります。 具体的には、chrootファイルシステムの作成に役立つdebootstrap
ツールと、jailが通信に使用するネットワークブリッジインターフェイスの作成を可能にするbridge-utils
が必要です。
apt-get update apt-get install debootstrap bridge-utils
ブリッジインターフェイスを構成する
実際の刑務所に入る前に、ブリッジネットワークインターフェイスを設定します。
bridge-utils
パッケージの一部であるbrctl
コマンドを使用して、新しいインターフェイスを作成できます。 私たちの橋は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宛てのトラフィックを、刑務所の1つにインストールするWebサーバーにルーティングできるようにする必要があります。 WebサーバーのIPアドレスは10.10.20.10です。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.10.20.10:80
これにより、「nat」テーブルの「PREROUTING」チェーンの最下部にルールが追加されます。 ポート80宛てのTCPパッケージがヒットすると、トラフィックはネットワークアドレス変換を介して10.10.20.10
のポート80にリダイレクトされます。
また、データベースとWebサーバーがインターネットにクエリを実行できるようにする一連のルールを設定して、WordPressからコンポーネントを更新できるようにする必要があります。 まず、br0
インターフェイスがホストマシンを介して通信を正常にルーティングできるようにするマスカレードルールを追加します。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
次に、FORWARDチェーンのルールを調整することにより、インターフェイス間の通信をロックダウンできます。
まず、ポート80からbr0
ネットワークへのトラフィックを明示的に許可できるように、確立された以前のNATルールをミラーリングする必要があります。
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
これで、ホストシステムは、jailされた環境との通信に使用するブリッジインターフェイスで構成されました。
Chrootディレクトリ構造を作成する
これで、chrootディレクトリ構造を作成する準備が整いました。
前に述べたように、Webサーバーとデータベースサーバーは完全に別々のファイルシステムで動作します。 これらのファイルシステムは両方とも/jails
というディレクトリ内に保持されます。 今すぐそのディレクトリを作成します。
mkdir /jails
作成したディレクトリに移動します。
cd /jails
次に、jailされたオペレーティングシステムで使用されるファイル構造を作成する必要があります。 これを行うには、debootstrap
ツールを使用します。 このユーティリティは、既存のファイルシステム内でDebian環境をブートストラップするために作成されました。 これは、Debianリポジトリからパッケージをプルダウンし、正しい場所に「インストール」することで実現します。
debootstrap
を使用してUbuntu環境をブートストラップできますが、代わりに安定したDebianインストールを選択します。 このツールはDebianで動作するように作成されているため、これらの環境はこのツールで最もよくテストされています。
データベース環境を「db」というディレクトリにインストールします。 適切なディレクトリ構造を作成し、必要なパッケージをダウンロードしてインストールするには、次のように入力します。
debootstrap --arch=amd64 stable db
/jails/db
ディレクトリの下にファイルシステムが構築されたので、rsync
を使用して、Webサーバーが使用できる別のディレクトリに構造をコピーできます。 新しいディレクトリは「www」と呼ばれます。 次のコマンドのスラッシュ(/)に注意してください。 これにより、ディレクトリ自体をコピーする代わりに、最初のディレクトリのcontentsが2番目のディレクトリにコピーされます。
rsync -azvh db/ www
これで、firejail
プログラムで使用できる2つのchrootディレクトリ構造ができました。
Firejailを使用してWordPressデータベースを設定する
ディレクトリ構造ができたので、firejail
を使用して、/jails/db
ディレクトリ構造内にchroot環境を作成できます。
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、およびこのjailセッション内で構成されているインターフェースを出力します(この時点では、インターフェースを制限または構成していません)。 その後、jailされた環境内のコマンドプロンプトに移動します。
最初に行う必要があるのは、パッケージデータベースを更新し、chroot環境内にMySQLサーバーをインストールすることです。 次のように入力すると、次のように入力できます。
apt-get update apt-get install mysql-server
更新プロセス中に、Debianリポジトリがチェックされていることを確認する必要があります。 これは、chroot環境がDebianインストールであるためです。
インストールプロセス中に、ルートMySQLアカウントのパスワードを選択して確認するように求められます。
インストールが完了したら、次のように入力してMySQLデータディレクトリ構造を生成する必要があります。
mysql_install_db
次に、含まれているスクリプトを使用して、いくつかの安全でないデフォルトをロックダウンします。
mysql_secure_installation
インストール中に設定したルートMySQLパスワードの入力を求められます。 その後、パスワードを変更するかどうかを尋ねられます。 選択に満足している場合は、「いいえ」を選択してください。 残りのプロンプトでは、Enterキーを押してデフォルトの選択肢を選択します。
WordPressデータベースとユーザーを作成する
次に、WordPress用に別のデータベースを設定します。 MySQLルートアカウントを使用してMySQLサーバーにログインします。 プロンプトが表示されたら、そのユーザー用に選択したパスワードを入力します。
mysql -u root -p
MySQLプロンプトが表示されます。 WordPressが使用する新しいデータベースを作成します。
CREATE DATABASE wordpress;
次に、Webサーバーのjailからこのデータベースを操作するユーザーを作成します。 WebサーバーのIPアドレスは10.10.20.10であるため、このユーザーをそのアドレスに関連付ける必要があります。 このユーザーに安全なパスワードを割り当てます。 次に、このユーザーに、作成したデータベースで作業する機能を付与します。
CREATE USER 'wordpressuser'@'10.10.20.10' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'10.10.20.10';
ここで、特権テーブルをフラッシュして終了する必要があります。
FLUSH PRIVILEGES; exit
ブリッジアドレスにバインドするようにMySQL設定を変更します
次に、MySQL構成ファイルを変更する必要があります。 今すぐエディターで開きます。
nano /etc/mysql/my.conf
このファイルはセクションに編成されています。 次のように始まるセクションを見つけます。
[mysqld]
現在127.0.0.1
に設定されているbind-address
というディレクティブが表示されます。 ブリッジインターフェイスでリッスンしているMySQLインスタンスを起動します。 そのインターフェース上のこの刑務所のアドレスは10.10.20.20になるので、次のように変更する必要があります。
bind-address = 10.10.20.20
終了したら、ファイルを保存して閉じます。
これで、現在実行中のMySQLインスタンスを停止して、このjailを終了できます。
service mysql stop exit
Firejailを使用してWordPressWebサーバーをセットアップする
データベースが構成されたので、Webサーバーに使用されるjailに移動できます。 今すぐfirejailを使用して、このjail環境でセッションを開始します。
firejail --chroot=/jail/www --name=www
最初に行う必要があるのは、ローカルパッケージデータベースを更新し、NginxWebサーバーと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の構成
次に、WordPressファイルを正しく提供するようにNginxを設定する必要があります。 これには、/var/www/html
での新しいドキュメントルートの確立、server_name
のホストシステムのパブリックIPアドレスへの設定、およびPHP処理の構成が含まれます。
デフォルトのNginx構成ファイルを開きます。
vim /etc/nginx/sites-available/default
行う必要のある変更の概要は次のとおりです。
listen 80
ディレクティブのコメントを解除して、ポート番号を明示的に指定します。root
ディレクティブの値を変更して、WordPressファイルを保持する場所である/var/www/html
を指すようにします。index
パラメータを変更して、他のインデックスファイルの前にindex.php
ファイルを探します。server_name
ディレクティブの値を変更して、ホストサーバーのIPアドレスまたはドメインを指すようにします。try_files
ディレクティブの最後の値を調整して、リクエストがファイルまたはディレクトリとして見つからない場合にindex.php
ファイルにリクエストを渡します。 これはlocation /
ブロック内にあります。- エラーページを許可するには、すべてのエラーページディレクティブのコメントを解除します。
location ~ \.php$
ブロック、含まれているfastcgi_split_path_info
ディレクティブ、fastcgi_pass
socket 行、fastgci_index
およびinclude fastcgi_params
のコメントを解除します。ディレクティブを追加し、try_files
ディレクティブを追加します。このディレクティブは、指定されたとおりに要求を試行し、それ以外の場合は404を返します。
上記の変更が完了すると、ファイルは次のようになります(簡潔にするためにコメントは削除されています)。
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; } }
簡単な場合は、ここに表示されているコンテンツ全体を貼り付けることができます。 server_name
ディレクティブを調整するだけで、ホストシステムのパブリックIPアドレスまたはドメイン名を参照できます。
終了したら、ファイルを保存して閉じます。
WordPressファイルのダウンロードと設定
Nginxがファイルを正しく提供するように構成されたので、ファイルをダウンロード、構成、およびインストールできます。
ルートユーザーのホームディレクトリに移動し、最新のWordPresstarballをダウンロードすることから始めます。
cd ~ wget http://wordpress.org/latest.tar.gz
tarballの内容を抽出し、~/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', 'password'); /** MySQL hostname */ define('DB_HOST', '10.10.20.20');
終了したら、ファイルを保存して閉じます。
次に、Nginx構成ファイルでドキュメントルートとして参照した/var/www/html
ディレクトリを作成する必要があります。 次に、すべてのWordPressファイルをそのディレクトリにコピーします。
mkdir -p /var/www/html cp -r ~/wordpress/* /var/www/html
これで、ファイルの所有権をWebユーザーに与えることができます。
cd /var/www/html chown -R www-data:www-data /var/www/html/*
これで、Webサーバーのjailが完全に構成されました。 次のように入力することで、WebサーバーとPHPプロセスを正常にシャットダウンできます。
service nginx stop service php5-fpm stop
ここで、jailを終了して、ホストサーバーセッションに戻ります。
exit
刑務所を始める
これで、刑務所が完全に構成されました。 ネットワークブリッジインターフェイスを使用して、個別に起動できます。
まず、データベースサーバーの方が簡単なので起動します。 前と同じようにchrootルートの場所を指定する必要があります。 今回は、--net
パラメータを使用してブリッジインターフェイスも指定します。 これを--ip
パラメーターと組み合わせて使用して、このjailに指定する正確なアドレスを指定します(構成から思い出すと、10.10.20.20
)。
また、--private
フラグを渡して、新しい/tmp
、/root
、および/home/user
ディレクトリを刑務所内にマウントします。 次に、jailで開始するプロセスを指定し、「&」で終わるバックグラウンドに配置する必要があります。
開始する必要があるプロセスは、MySQLサーバープロセスであり、sleep inf
プロセスでもあります。 これにより、前のプロセスが完了したときに終了するのではなく、jailが無期限に実行され続けます。 全体として、コマンドは次のようになります。
firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 \ "/etc/init.d/mysql start; \ sleep inf" &
jailが起動し、指定されたプロセスが順番に実行され始めます。 firejail
の--list
オプションを使用すると、このプロセスの結果を確認できます。
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プロセスがまだ稼働していることを確認できるため、jailの起動が完了していることがわかります。
Webサーバーのjailの場合、同じ基本設定が必要です。 chrootルートの場所、ブリッジされたインターフェイス、割り当てられている実際のIPアドレス(10.10.20.10
)、および--private
フラグを指定する必要があります。
プロセスリストに関しては、かなりの数の追加の考慮事項があります。 まず、jail内の/var/log
ディレクトリは、開始するたびに動的に作成されます。 このため、Nginxファイルのログディレクティブは存在しない場所を指しています。 Nginxを起動する前に、これらの場所を作成できます。
また、Nginxプロセスはシステムロガーに依存しています。 Nginxの前にもrsyslog
プロセスを開始します。 Nginxを起動した後、PHPプロセッサを起動することも忘れないでください。これにより、必要に応じてデータベースjailにリクエストが渡されます。 繰り返しになりますが、sleep inf
で終了して、サービスが開始された時点を過ぎても刑務所が存続するようにします。
最終的に、Webサーバーのjailを起動するコマンドは次のようになります。
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" &
Webサーバーのjailが起動するまで少し時間がかかる場合があります。プロセスがsleep inf
状態に達するかどうかを確認するために、firejail --list
をチェックし続けてください。
これで、WebブラウザでホストサーバーのパブリックIPアドレスまたはドメイン名にアクセスすると、WordPressの初期インストールページが表示されます。
http://host_server_domain_or_IP
適切な値を入力し、準備ができたら下部にある[WordPressのインストール]をクリックします。 新しく作成した管理者アカウントでログインする必要があります。 その後、WordPressダッシュボードに移動します。
ここですべてが期待どおりに機能する場合は、インストールが成功したことを意味します。 これで、この構成を繰り返し可能で永続的なものにする作業を行うことができます。
Firejailインスタンスサービスの作成
構成が稼働しているので、再起動後に簡単にここに戻ることができるようにします。 これを行うには、対処する必要のあるいくつかの領域があります。 これらには以下が含まれます:
- 起動時に起動するようにhost-to-jailおよびjail-to-jailネットワークを構成します。
iptables
の変更を永続的にします。- ホストサーバーの起動時に自動的に起動するようにjailを構成します。
これら3つをすぐに始めることができます。
起動時のJailのネットワークの構成
最初に焦点を当てるのは、ブリッジネットワークを稼働させることです。 これは、ファイアウォールルールについて心配する前、およびジェイル環境を開始する前に必要です。
実際のブリッジ接続を構成する必要があります。 この接続を起動時に起動して実行するには、/etc/network/interfaces
ファイルを変更する必要があります。 このファイルを今すぐ開きます。
nano /etc/network/interfaces
内部には、起動時に開始されるインターフェイスを示すいくつかのセクションと、各インターフェイスを説明する他の行が表示されます。 br0
ネットワークを2番目のauto
行の末尾に追加して、起動時に定義するインターフェイスを開始することから始めます。
auto eth0 eth1 br0
次に、インターフェースを定義するセクションを設定する必要があります。 これはブリッジインターフェイスであり、2つのネットワークを結合する従来のブリッジのように機能しないため、インターフェイスを手動で定義します。つまり、ネットワークの構成に使用する必要がある正確なコマンドを指定します。
セクションヘッダーから始めます。
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
疑似ファイルシステムのファイルに「1」をエコーしました。 この変更を次回の起動時に自動的に行うには、sysctl.conf
ファイルを編集します。
nano /etc/sysctl.conf
次の行のコメントを解除します。
net.ipv4.ip_forward=1
終了したら、ファイルを保存して閉じます。
WordPressJailsを開始するためのUpstartスクリプトを作成する
起動時に起動するようにjailを構成するには、起動スクリプトを作成する必要があります。 スクリプトを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スクリプトなので、bashへの標準的なshebang呼び出しから始めます。
#!/bin/bash
次に、2つのfirejailコマンドを追加しますが、1つ小さな変更を加えます。 不明な理由により、upstartで起動したときに、jailされた環境内でNginxinitスクリプトを実行する際に問題が発生します。 この問題は、他の方法で呼び出された場合には発生しません。
これを回避するために、内部のjailedinitスクリプトの代わりに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" &
これが刑務所の開始直後に終了するタスクではなく、継続的なサービスであることを確認するには、もう1つのコマンドが必要です。 スクリプトの最後の行として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のjailed環境は、起動時に起動するように完全に構成されます。
ホストサーバーを再起動して、これを試すことができます。
shutdown -r now
すべてが正しく構成されていれば、すべてが起動する時間が経過した後、WordPressサイトにアクセスできるようになります。
結論
このガイドは、firejailなどのツールで実行できる多くのことの1つの例にすぎません。 サーバーに分離されたコンポーネントを設定する方法は他にもたくさんありますが、firejailは、最小限のリソースで非常に多くの異なるシナリオを処理できる柔軟性と機能を備えているため、優れたソリューションです。