AppJailの導入と環境構築
始めに
先日、JailにGEMINI CLIを入れて遊ぶを書いた際に「AppJailの導入とVirtual Network(NAT)の設定、appjail-dnsによるJailの名前解決が完了したことを前提とする。」と前置きした。しかし、そもそもAppJailの記事をQiitaで書いたのは私が初めてらしく、これでは前提から躓くので誰も試せない。丁度、新しいPCにFreeBSD環境をゼロから構築するので、ついでにAppJailの環境構築手順を記しておく。
目的
AppJailの紹介と最低限の使用方法までを解説する。AppJailのユーザが増えるとAppJailやAppJail Directorのユーザが増えて、日本語のノウハウが増える事を期待する。
AppJailについて
AppJailは、シェルスクリプトとCで書かれたFreeBSDのJail管理フレームワークである。ライセンスはBSD-3。Jail管理フレームワークは他にもあるが、それらとの差異はAppJail Handbook Comparingを見て欲しい。
AppJailの導入
AppJailはpkgでインストールする。appjailとappjail-develの2種あるが、appjail-develで問題はない。
pkg install appjail-devel
インストールしたら設定ファイル/usr/local/etc/appjail/appjail.confを編集してzfsの使用を指定する。
ENABLE_ZFS=1
その後はサービスを起動する。
sysrc appjail_enable=YES
AppJail-DNSの設定
AppJail-DNSはJailの名前解決する機能で、これを設定するとホストやJailから他のJailのネットワークアドレスをJail名で取得可能になる。コツはAppJail Handbook DNSとAppJail Handbook Packet Filterを同時に設定すること。
pkg install dnsmasq
sysrc pf_enable="YES"
sysrc pflog_enable="YES"
cat << "EOF" >> /etc/pf.conf
nat-anchor "appjail-nat/jail/*"
nat-anchor "appjail-nat/network/*"
rdr-anchor "appjail-rdr/*"
EOF
service pf restart
service pflog restart
sysrc gateway_enable="YES"
sysctl net.inet.ip.forwarding=1
sysrc appjail_dns_enable="YES"
sysrc dnsmasq_enable="YES"
sysrc dnsmasq_conf="/usr/local/share/appjail/files/dnsmasq.conf"
touch /var/tmp/appjail-hosts
service dnsmasq start
service appjail-dns start
Virtual Networkの追加
ネットワークajdnsを追加する。
sysrc cloned_interfaces="tap0"
sysrc ifconfig_tap0_name="ajdns"
sysrc ifconfig_ajdns="inet 172.0.0.1/32"
service netif cloneup
service netif start ajdns
設定ファイル/usr/local/etc/appjail/appjail.confでDNSを設定する。コメントアウトを外すだけで良い。
DEFAULT_RESOLV_CONF=/usr/local/etc/appjail/resolv.conf
/usr/local/etc/appjail/resolv.confは以下の記載を追加する。
nameserver 172.0.0.1
DHCPがあるので、以下の設定を/etc/dhclient.confに追加する。
supersede domain-name-servers 172.0.0.1;
リブートした後に、設定が正しく反映されたか確認する。
cat /etc/resolv.conf
# Generated by resolvconf
nameserver 172.0.0.1
Jailの起動
作成した環境でJailを起動する。最初は種となるFreeBSDを取得し、それを元にJailを作成する。
appjail fetch
appjail quick myjail start login
Jail内で正しくFreeBSD環境が構築された事を確認しておく。この段階ではネットワークがないため、外部とは通信することが不可能だ。ネットワーク設定を修正しても良いが、ここは一旦Jailを削除してから、ネットワークが使用可能なJailを作成する。
appjail stop hello
appjail jail destory hello
appjail quick hello \
virtualnet=":<random>" \
overwrite \
start
正常にネットワークが設定された場合は、Jailの作成後にJail名で名前解決が可能になる。
ping -c 2 hello
PING hello (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: icmp_seq=0 ttl=64 time=0.109 ms
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.484 ms
以上の手順を理解すれば、Jailの作成、削除、名前解決による通信の容易化が可能になる。上の事例ではJailとホスト外部との通信は不可能だが、appjail quickにnatを追加すると、JailとホストのNATが使用可能になり先の記事で紹介したAIエージェントを安全に隔離することが可能だ。
終りに
AppJailを使用した環境構築だが、AppJailそのものが他機能であり本記事では最低限の紹介に過ぎない。特にエフェメラルコンセプトappjail-ephemeral(7)の思想により、Jailで提供するサービスの管理が容易になる。AppJail Directorを使用すれば、一つのJailだけでなくWebとデータベースをそれぞれのJailで作成したサービスを構築するのも可能だ。ユーザが増えると良いと思ふ。
御精讀ありがたうございました。