はじめに
コンテナ仮想化の最初の紹介は、FreeBSDの
刑務所でした。このアプローチは、安全な環境でさまざまなサービスを分離します。 刑務所の欠点は、
ゾーン Solarisとは異なり、独自のネットワークサブシステムを作成する方法がないことです。 この出版物では、独自のネットワークサブシステムを使用したゾーンの作成とゾーンの作成について説明します。
ファイアウォール
「ファイアウォール」として、OpenBSDのパケットフィルターが使用されます。 パケットフィルターを使用して、独自のネットワークサブシステムを持つゾーンからのNATが実装され、グローバルゾーンのネットワーク制限が実装されます。 パケットフィルターをインストールして実行するには、次のコマンドを実行します。
pkg install firewall svcadm enable firewall
次に、将来のルールでファイルを開きます。
nano /etc/firewall/pf.conf
nanoエディターで、次の行を追加します。
table <good> {192.168.1.105,192.168.1.106} table <nat> {192.168.0.0/24} pass quick on lo0 from any to any no state pass quick on vnic0 from any to any pass out quick on net0 from <nat> to any nat-to (net0) pass in quick on net0 proto tcp from any to 192.168.1.105 port 80 rdr-to 192.168.0.2 pass in quick on net0 proto tcp from any to <good> port=22 flags S/SA modulate state pass out quick on net0 proto tcp from <good> to any port {80,443,21,53} flags S/SA modulate state pass out quick on net0 proto udp from <good> to any port=53 keep state pass out quick on net0 proto icmp from <good> to any block from any to any fragment block from any to any block all
パケットフィルターで使用するファイルを指定します。
pfctl -f /etc/firewall/pf.conf
このルールファイルには、IPアドレスのリストを持つ2つのテーブルがあります。
table <good> {192.168.1.105,192.168.1.106} table <nat> {192.168.0.0/24}
適切なテーブルには、グローバルゾーンと独自のネットワークサブシステムを持たないゾーンのIPアドレスが一覧表示されます。そのようなゾーンを複数使用する場合は、IPアドレスのリストをコンマで区切って指定します。 これらのIPアドレスに対して発信トラフィックが許可され、sshを介して接続することも可能になります。 たとえば、Webサーバーを大域ゾーン、またはネットワークサブシステムのないゾーンに編成する場合、この場合、次の行を追加する必要があります。
pass in quick on net0 proto tcp from any to 192.168.1.106 port=80 flags S/SA modulate state
またはポートのグループ:
pass in quick on net0 proto tcp from any to 192.168.1.106 port {80, 443, 21,22} flags S/SA modulate state
このような場合、http、https、ftp、sshを介して接続することができます。
natテーブルは、独自のネットワークサブシステムを持つゾーンのサブネットを示します。そのようなネットワークを複数計画する場合は、それらをコンマで区切って指定します。 以下の行では、natテーブルのすべてのサブネットのnet0を介して「ネッティング」が実行されます。
pass out quick on net0 from <nat> to any nat-to (net0)
独自のネットワークサブシステムを持つゾーンは
DMZとして使用できますが、このために必要なポートを転送する必要があります。次の行は、Webサーバーのポートをゾーン80に転送します。
pass in quick on net0 proto tcp from any to 192.168.1.105 port 80 rdr-to 192.168.0.2
次の行にも注意する必要があります。
pass quick on vnic0 from any to any
この行により、vnic0仮想インターフェイス上のすべてのトラフィックが許可され、このインターフェイスはゲートウェイとして機能します。 このインターフェースのIPアドレスは192.168.0.1です。このインターフェースは大域ゾーンでアクティブになるため、ルールファイルで指定する必要があります。 異なるサブネット用に複数のゲートウェイを計画する場合、この場合、仮想インターフェースの名前で同様の行を追加する必要があります。 たとえば、別のサブネット192.168.2.0/24を計画し、アダプターvnic5 ip(これを行う方法については次の章で説明します)にアドレス192.168.2.1を割り当てた場合、行は次のようになります。
pass quick on vnic5 from any to any
非大域ゾーン用に作成された仮想インターフェースを指定する必要はありません。
ゾーン作成
仮想インターフェイスを作成してこの章を開始できます。また、パケットがインターフェイスnet0とvnic0の間を通過できるようにする必要があります。
dladm create-vnic -l net0 vnic0 dladm create-vnic -l net0 vnic1 ipadm set-ifprop -p forwarding=on -m ipv4 net0 ipadm set-ifprop -p forwarding=on -m ipv4 vnic0
作成後、vnic0がIPアドレスを作成する必要があります。
ipadm create-ip vnic0 ipadm create-addr -T static -a 192.168.0.1/24 vnic0/v4
もちろん、さらにいくつかのサブネットを作成する必要がない限り、これはすべて仮想インターフェイスで行われます。
次のステップは、ゾーンを保存するためのzfsプールを作成し、イメージファイルからプールを作成することです。
mkfile 10g /disk
このコマンドは、サイズが10ギガバイト(必要なサイズを指定)のファイルを作成し、コマンドでプールを作成します:
zpool create zones /disk
将来のゾーン用に2つのセクションを作成し、各クォータを5ギガバイトに割り当てましょう。
zfs create zones/zone1 zfs create zones/zone2 zfs set quota=5g zones/zone1 zfs set quota=5g zones/zone2
この記事の執筆時点では、Solaris 11.4はベータ版でしたが、このバージョンではzfsパーティションの読み取りと書き込みを制限する機能(バージョン11.3には適用されません)が追加されました。
zfs set writelimit=50mb zones/zone1 zfs set readlimit=50mb zones/zone2
ゾーンの作成に直接進み、最初に独自のネットワークサブシステムなしでゾーンを作成し、次のコマンドを入力します。
zonecfg -z zone1
createコマンドで基本パラメーターを作成した後、次のステップはanetパラメーター(ネットワーク名、MACアドレス、mtuなどを含む)を削除することです。
remove anet
次に、将来のゾーンのパスを示し、ゾーンの自動起動とIPアドレスのタイプを設定します。
set zonepath=/zones/zone1 set autoboot=true set ip-type=shared
次に、ゾーンのネットワークを作成する必要があります。
add net
次の手順は、ゾーンの物理インターフェイスとIPアドレスを指定し、ネットワーク設定を終了する(終了)ことです。
set physical=net0 set address=192.168.1.106/24 end
変更を保存し、コマンドでzonecfgを終了します。
commit exit
ゾーンの設定は、コマンドの後に発生します。
zoneadm -z zone1 install
インターネットへのアクセス速度が十分に大きい場合、プロセス全体の所要時間は5分以内です。 ゾーンのインストール後、ゾーンを起動して初期設定(ホスト名、DNS、ドメイン検索、ルートのパスワード、アカウントの作成)を実行する必要があります。設定はシステムのインストール時と同じ方法で行われます。 次のコマンドを実行します(ゾーンと初期セットアップを開始します):
zoneadm -z zone1 boot zlogin -C zone1
「セットアップウィザード」が表示されるまで待ちます。 将来的には、次のコマンドを使用してゾーンに接続できます。
zlogin zone1
これで、ゾーンのセットアップとインストールが完了しました。 独自のネットワークサブシステムを使用してゾーンを設定することは、通常のゾーンを作成することとそれほど変わりません。IPアドレスのタイプを指定し、仮想アダプターvnic1(IPアドレスが作成されなかった)を指定するだけで、ゾーンネットワークのIPアドレス、IPアドレスも作成しないでくださいゾーンに初めて接続するときに作成されます(zlogin -C zone2)。 この資料によると、すべてが正しく機能するためには、IPアドレス192.168.0.2を指定する必要があります。
zonecfg -z zone2 create remove anet set zonepath=/zones/zone2 set autoboot=true set ip-type=exclusive add net set physical=vnic1 end commit exit zoneadm -z zone2 install zoneadm -z zone2 boot zlogin -C zone2
初期セットアップが完了したら、Apache、Nano、およびパケットフィルターをインストールし、Apacheおよびパケットフィルターも実行します
pkg install apache-24 pkg install firewall pkg install nano svcadm enable apache24 svcadm enable firewall
pf.confを編集します。
nano /etc/firewall/pf.conf
nanoに次の行を追加します。
ip=192.168.0.2 pass in quick on vnic1 proto tcp from any to $ip port 80 flags S/SA modulate state pass out quick on vnic1 proto tcp from $ip to any port {80,443,21,53} flags S/SA modulate state pass out quick on vnic1 proto udp from $ip to any port=53 keep state pass out quick on vnic1 proto icmp from $ip to any block from any to any fragment block from any to any block all
パケットフィルターで使用するファイルを指定します。
pfctl -f /etc/firewall/pf.conf
この例では、異なるIPアドレスを指定した場合、変数$ ipが使用され、最初の行を正しいアドレスに変更するだけです。
オプショナル
最後の章では、ゾーンの制限、フォルダのマウント、および拡張されたゾーンのアクセス許可に焦点を当てます。 大域ゾーンから特定のディレクトリをマウントする必要があるとします。これには、必要なゾーンを選択します。
zonecfg -z zone1
次に、ファイルシステムを追加します。
add fs
大域ゾーンのディレクトリ(たとえば、/ testディレクトリ)を指定します。
set special=/test
マウントする場所を指定します。
set dir=/usr/test
ファイルシステムタイプはループバックです。
set type=lofs
ディレクトリのアクセス許可を読み取り専用に設定します(必要に応じて、書き込みにrwを指定するか、このパラメーターをまったく追加しません)。
add options [ro,nodevices]
ファイルシステム設定を終了し、変更を保存します。
end commit exit
zfsセクションをマウントすることもできます。
add dataset set name=rpool/export/home end commit
ゾーンを再起動します。
zoneadm -z zone1 reboot
次に、RAM、スワップ、およびプロセッサの使用を制限し、必要なゾーンを選択します。
zonecfg -z zone1
メモリ制限を追加します。
add capped-memory
RAMを1ギガバイトに制限し、500メガバイトにスワップします。
set physical=1024m set swap=500m end commit
各プロセッサコアの使用を30%制限します。
add capped-cpu set ncpus=.30 end commit
最後に、デフォルトの特権ゾーンを追加します。すべての特権のリストは、次のコマンドを実行して表示できます。
ppriv -l -v
この
ガイドでデフォルトで使用されている(および必要に応じて追加できる)特権を理解することができます。 次のコマンドで特権を追加できます(zonecfgから)。
set limitpriv="default,sys_time"
この
ガイドで示されているように、この行はデフォルトで特権を設定し、非大域ゾーンからシステム時間を変更することもできます。 私の意見では、少数の特権を持つゾーンは機能がより制限され、したがってより保護されるため、ゾーンに追加の特権を追加しない方がよいと考えています。
おわりに
この出版物からわかるように、ゾーンは非常に簡単に構成できますが、同時に、「許可されていないすべて」ポリシーに構成されたパケットフィルターと組み合わせて、高度な保護を提供します(特に、独自のネットワークサブシステムを持つゾーン)。 構成と展開にかかる時間は最小限です。
この出版物を書くのを助けたソースのリスト。
ゾーンパケットフィルター