序章

一般に公開されている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ユーザーとして実行されます。

ホストマシンコンポーネントをダウンロードして構成する

開始するには、使用するツールのいくつかをサーバーにダウンロードする必要があります。

まず、ダウンロードする必要があります .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のデフォルトリポジトリからいくつかの追加パッケージを取得する必要があります。 具体的には、 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宛てのトラフィックを、刑務所の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パッケージがヒットすると、トラフィックはポート80にリダイレクトされます。 10.10.20.10 ネットワークアドレス変換を介して。

また、データベースとWebサーバーがインターネットにクエリを実行できるようにする一連のルールを設定して、WordPressからコンポーネントを更新できるようにする必要があります。 まず、マスカレードルールを追加して br0 ホストマシンを介して通信を正常にルーティングするためのインターフェイス:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

次に、FORWARDチェーンのルールを調整することにより、インターフェイス間の通信をロックダウンできます。

まず、ポート80からポート80へのトラフィックを明示的に許可できるように、確立された以前のNATルールをミラーリングする必要があります。 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

これで、ホストシステムは、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

これで、2つの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、およびこの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]

と呼ばれるディレクティブが表示されます bind-address に設定されています 127.0.0.1 現在。 ブリッジインターフェイスでリッスンしている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 指すディレクティブ /var/www/html、WordPressファイルを保存する場所。
  • を変更します index 検索するパラメータ index.php 他のインデックスファイルの前にファイルします。
  • の値を変更します server_name ホストサーバーのIPアドレスまたはドメインを指すディレクティブ
  • の最後の値を調整します try_files にリクエストを渡すためのディレクティブ index.php ファイルまたはディレクトリとして見つからない場合はファイル。 これは内部にあります location / ブロック。
  • エラーページを許可するには、すべてのエラーページディレクティブのコメントを解除します。
  • コメントを外す location ~ \.php$ ブロック、含まれています fastcgi_split_path_info ディレクティブ、 fastcgi_pass ソケットライン、 fastgci_indexinclude 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');

終了したら、ファイルを保存して閉じます。

次に、を作成する必要があります /var/www/html Nginx構成ファイルでドキュメントルートとして参照したディレクトリ。 次に、すべての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 この刑務所に与えたい正確なアドレスを指定するパラメータ(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が起動し、指定されたプロセスが順番に実行され始めます。 このプロセスの結果は、 --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プロセスがまだ稼働していることを確認すると、jailの起動が完了していることがわかります。

Webサーバーのjailの場合、同じ基本設定が必要です。 chrootルートの場所、ブリッジインターフェース、および割り当てられている実際のIPアドレスを指定する必要があります(10.10.20.10)、 そしてその --private 国旗。

プロセスリストに関しては、かなりの数の追加の考慮事項があります。 まず、 /var/log jail内のディレクトリは、開始するたびに動的に作成されます。 このため、Nginxファイルのログディレクティブは存在しない場所を指しています。 Nginxを起動する前に、これらの場所を作成できます。

また、Nginxプロセスはシステムロガーに依存しています。 起動します rsyslog Nginxの前にも処理します。 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が起動するまでに少し時間がかかる場合があります。引き続き確認してください。 firejail --list プロセスが sleep inf 州。

これで、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-upup コマンドでは、ブリッジを作成してから、以前に手動で行ったのと同じ方法でインターフェイスを起動します。 The $IFACE 動的に置き換えられます br0 コマンドが実行されるとき、ここでそれらを変更するべきではありません:

iface br0 inet manual
    pre-up brctl addbr $IFACE
    up ifconfig $IFACE 10.10.20.1/24

のために post-downdown コマンドの場合、これらのコマンドを逆にします。 インターフェイスを元に戻し、ブリッジを削除します。

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つあります。それは、カーネルが転送を許可していることを確認する必要があるということです。

以前は、「1」をファイル内のファイルにエコーしました /proc この機能を有効にする疑似ファイルシステム。 次回の起動時にこの変更を自動的に行うには、 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-filesystemsnet-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は、最小限のリソースで非常に多くの異なるシナリオを処理できる柔軟性と機能を備えているため、優れたソリューションです。