序章

一般に公開されている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
[[email protected] ~]$

このコマンドは、親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 initial install screen

適切な値を入力し、準備ができたら下部にある[WordPressのインストール]をクリックします。 新しく作成した管理者アカウントでログインする必要があります。 その後、WordPressダッシュボードに移動します。

WordPress dashboard

ここですべてが期待どおりに機能する場合は、インストールが成功したことを意味します。 これで、この構成を繰り返し可能で永続的なものにすることに取り組むことができます。

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-upuppost-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は、最小限のリソースで非常に多くの異なるシナリオを処理できる柔軟性と機能を備えているため、優れたソリューションです。