Solaris 11.3でのゾーンの構成

はじめに



コンテナ仮想化の最初の紹介は、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"
      
      





このガイドで示されているように、この行はデフォルトで特権を設定し、非大域ゾーンからシステム時間を変更することもできます。 私の意見では、少数の特権を持つゾーンは機能がより制限され、したがってより保護されるため、ゾーンに追加の特権を追加しない方がよいと考えています。



おわりに



この出版物からわかるように、ゾーンは非常に簡単に構成できますが、同時に、「許可されていないすべて」ポリシーに構成されたパケットフィルターと組み合わせて、高度な保護を提供します(特に、独自のネットワークサブシステムを持つゾーン)。 構成と展開にかかる時間は最小限です。



この出版物を書くのを助けたソースのリスト。



ゾーン



パケットフィルター



All Articles