私は現在FreeBSD 11.2を使用しています(すぐに12にアップグレードされる可能性があります)。コンパクトで完全に特権のあるDNSサーバーが必要です(照会またはキャッシュなし、ドメイン10個未満、1時間あたりのクエリ10個未満、履歴の変更がほとんどありません)。
おそらくセキュリティで有名ですが、小さく見え、必要な機能を実行することをTinyDNS
選択します。djbdns
pf
セキュリティの一部は、IP /ポートフィルタと非常に低い速度、速度制限器(この目的で使用されている)があるにもかかわらずインターネットにさらされることです。しかし、この理由から、私は明らかな脆弱性を避けるためにデーモンを設定する方法に特別な注意を払いたいと思います。私は、必要なユーザーとグループ、起動/停止スクリプト、脱獄/ルート化、攻撃者が悪用する可能性のある主要な不要なアクセス/機能の最小化/無効化/拒否などの作業について話しています。
(私が言及すべきことできるTinydnsは「通常の」テストシステムにインストールされ、必要なファイルが.conf
生成されるため、これは純粋に安全な方法で実行する方法です。欠けています。)
私はchrooted / jailedを実行するためのソフトウェアを設定したり、適切なセキュリティ慣行のためにchrooted / jailedパッケージをレビューした経験がありません。たとえ私が特定のDNSサーバーパッケージを選んだのは明らかです。設定を簡素化するため。
その.conf
ファイルを無視すると、TinyDNSがサービスとして正しく実行されるように設定し、「デーモンにとっては重要ではありませんが、攻撃者に役立つ他のアイテム」へのアクセスを理想的に最小化する「レシピ」はどのように見えますか?
ベストアンサー1
かなり長いので、最後まで読むのがとても面倒な方のためにとても短いバージョンをご紹介します。
echo "testjail { }" >> /etc/jail.conf
mkdir -p /usr/local/jails/testjail
bsdinstall jail /usr/local/jails/testjail
service jail start testjail
pkg -j testjail install -y nginx
sysrc -j testjail "nginx_enable"=YES
service -j testjail nginx start
私は一般的に「広すぎる」質問を考慮し、人々が直接参照することを提案します。FreeBSDマニュアル。しかし、私自身は、その部分がやや不都合なく書かれ、混乱していることを知っていました。すべてがありますが、ビューよりはるかに簡単です!コマンドをリストするのではなく、概念に集中してほしいです。あなたは読書を楽しむことができます刑務所 - 価値は高いが仮想化は悪い
代わりに、私が個人的にやってきたことと苦しんだ障害を控えめに説明しようとします。私の失敗はあなたのものではないかもしれませんが、私もあなたと同じ状況にあったので、私の旅が役に立つことを願っています。 FreeBSD全体についてもっと知るほど、刑務所に閉じ込められる方が簡単になります。
刑務所とは何ですか?
多くの説明は刑務所の重要な部分をあいまいにします。カーネルが何をしているのかを理解するのにたくさん役立ちます。コードを「実行」して、PID(プロセスID)とUID(ユーザーID)を追跡します。多くのUnixユーザーにとって、これは常識です。 FreeBSDカーネルには後でJID(Jail ID)という概念が追加されました。その後、カーネルはプロセスを刑務所に分けることができます。これが本質的に意味するのは、FreeBSDカーネルがオーバーヘッドなしでシステムを「仮想化」できることです。それでもコアは1つだけですが、複数のシステムを持つことができます。これがこの概念を理解する鍵です。
刑務所なしで通常のボックスを実行する場合。その後、すべてのプロセスはJID 0に属します。刑務所を使い始めると、私たちはそれを「刑務所のホスト」と呼びます。
これを念頭に置いて、私の次のステップは、FreeBSDが実際にどのように機能するかについての関連性を理解することでした。 Linuxの背景知識があれば、Linuxが「ただ」カーネルであることをご存知でしょう。システムの設定は、ディストリビューション(Ubuntu、Debian、Slackwareなど)が提供するユーザースペースです。 FreeBSDはカーネルモードとユーザーモードの組み合わせです。完全なオペレーティングシステム(OS)です。
とてもおおよそのまとめです第12章FreeBSD起動プロセス例:
あなたはおそらくFreeBSDがどれほどモジュラーであるかを知っているでしょう、そしてrcシステムを次のものに置き換えることができます。オープンRCしかし、単純化のために、今はこれを無視しています。
その後、刑務所を起動(起動)すると、カーネルは新しいJID(たとえば1)に初期化されます。ここのすべては刑務所1に制限されています。 initがアクセスする必要があるコンテンツは、chrootの後のファイルシステムになければなりません。仕事をシンプルに保ちたいならいっぱいユーザー領域。しかし、私たちは刑務所をホストシステムから分離したいので全コピーユーザーエリアにあります!
これらが互いにどのように関連しているかという重要性は、過小評価することはできません。すべてを理解したら、刑務所が多くのFreeBSDツールで直接サポートされていることがわかります。ps -J
「しかし」、bsdinstall
「そして」freebsd-update
のような単純な言葉ではありませんpkg
! FreeBSDシステムを維持することがあなたにとって第二の天性であれば、刑務所はあなたに公園の散歩になります!
しかし、私たちのほとんどは熱烈への道の真ん中にあり、それを「正しく」実行するためにいくつかの概念を置いて賭ける必要があるかもしれません。
丘
私は本当に好き丘。これは、物事がどこにあるべきかについて明確で一貫した視点を提供します。残念なことに、当局は刑務所の基本的な位置について何ら決定を下さなかった。これをさまざまな場所を使用するさまざまなチュートリアルと組み合わせて、「基本的なインストール」と「テンプレート」のさまざまな用語を混在させると、状況は非常に速く混乱する可能性があります。
このマニュアルではこれについて議論せず、単に言及するだけです/here/is/the/jail
。最後の例では、/home/j
とを使用します/home/j/mroot
。私はユーザーディレクトリとユーザーディレクトリのみを維持することを好みます/home
。単にこのような略語の表記法を使用することは私の本のj
大きな禁忌です。
最も一般的で「正しい」立場は、/usr/local/jails
ZFSを使用している人々の強力な競争相手です。/jails
この場所に私は刑務所のルートを置きます。それが私が言った方法です。これから刑務所はここに位置するでしょう。
初めて始めたとき、私はこれが非常に混乱していることがわかりました。私にそれをどこにでも置くことができる自由を与えることは結果を理解していないので私をより不安にさせます。
これらの混乱を加えるために、多くのチュートリアルでは「basejail」、「skeletonディレクトリ」、「テンプレート」を使用しています。これは、刑務所が正確に何であるかについての混乱を加重し、多くの管理者と混同します。
ファイルシステム
私たちは実際にどのファイルシステムを使用しているのか気にしません。 UFSまたはZFSにすることができます。刑務所ではchrootディレクトリのみが必要です。
UFSを使用する際に注意すべき重要な点は、スライスがどのように配置されるかです。初心者はこれまで考えないことが多いです。 chrootを収容するのに十分なスペースがあるスライスは何ですか?だから私は特に/home
この目的のために使用するのが嫌いです。たぶん、この目的のためにスライスを作成するか、どこかにディレクトリを作成し、十分なスペースがあるかどうかを判断できます。
ZFSを使用している場合、問題は実際には同じです。 ZFSの構造のためmkdir
。しかし、最初は心配する必要はありません。 ZFSを使用して "mkdir"を実行する方がより適切かもしれません。これにより、作業が簡単になり、ZFSなしで続行できます。
次の問題は、多くのチュートリアルが新しい刑務所を作成するためにコピーする準備が整った完全なストックシステム「basejail」として機能することです。いくつかのチュートリアルでは、コピーの代わりにZFSレプリケーションを実行するように指示します。長時間にわたってデフォルトの刑務所を更新し、自然にスナップショットを作成します。ただし、レプリカのあるスナップショットは削除できないことがわかります。したがって、実際の使用ではzfsの送受信を好みます。
私の考えでは、チュートリアルではZFSを付録としてのみ扱うべきだと思います。 ZFS自体は巨大なテーマなので、そのように扱う必要があります。刑務所とZFSに慣れたら、好きなように組み合わせることで利点を得ることができます。そうしないと、損傷したときに修理する能力がなくても、非常に脆弱な塔を建設することになります。
脂肪/厚さvsスリム
FreeBSDマニュアル「完全な」刑務所と「サービス」刑務所について話してください。他のほとんどの場所では、「太い」(太った/いっぱいの)刑務所と「乾いた」刑務所という用語を使用しています。 Thick JailとThin Jailはどちらも「完全に」仮想化されたFreeBSDシステムであり、FreeBSDのマニュアルではこれを「完全」Jailと呼びます。しかし、「サービス」刑務所はさらに見つけるのが難しいです。
厚い刑務所は完全なオペレーティングシステムのコピーです。しかし、脂肪はどのくらいですか? base/lib32/ports を含む FreeBSD 11.2 の重量は 1.4G ですが、刑務所の場合、「base」だけでも比較的小さい 512M を維持できます (Windows 10 の C:\Windows 比較では 20G と比較して)。
Thin Jailは、「フル」Jailのディスク使用量を最小限に抑える技術です。使用して空のファイルシステム(ループバックファイルシステムサブツリー)読み取り専用ファイルシステムとよく配置されたいくつかのシンボリックリンクをマウントして、読み取り/書き込み部分を有効にしてディスク使用量を減らします。残念ながら、私は手に何の数も持っていません。ディスク構造が解放されたら、刑務所を起動してファイルシステムをマウントするときにmount.fstab
ファイルシステムに簡単に追加できます。jail.conf
これを行う方法についてのアイデアがあります。FreeBSDの難しい道。これにより、第三者のユーティリティなしで刑務所を処理する方法を学び、最終的に要点を知ることができました。タイトルにもかかわらず、これは実際に最も簡単な方法です。しかし、彼らは一つの過ちを犯しました。 zfs cloneを実行しないでください。zfsの送受信は実行する必要があります。純粋な刑務所、簡単な方法。どちらも少し古い作品からインスピレーションを得たかもしれません。nullfsを持つ複数のFreeBSD Jail。もう一つの貴重なソースFreeBSD シーン刑務所。最後に更新されたリソースでは、VNET(これについてはもう一度説明します!)を設定する方法についても説明します。vnetとZFSを含むFreeBSD Jail
上記の作業はしばしばPrison-liteと呼ばれますが、他の場所でも実行できます。方法。すべての道はローマを通っているので、地元でどのように実装するかを決定することはあなた次第です。
このすべてが私たちを'仕える'という探しにくい刑務所に導く。ほとんどの収容状況で1つの特定のサービスしか運営していない刑務所。これをサポートする薄い層のみを持つ実際のアプリケーションです。することはできますが、これについて多くの作業を見たことはありません。
一般的なコンテンツはjail.conf
次のとおりです。
exec.start = "/bin/sh /etc/rc"; # Start command
exec.stop = "/bin/sh /etc/rc.shutdown"; # Stop command
これにより、rcシステムが起動/停止されたときに刑務所で実行されます。非常に単純な実行可能ファイルがある場合は、それを指すだけです。したがって、質問は:私のサービスがアクセスする必要があるオペレーティングシステムは何ですか?どの共有ライブラリが必要で、スクリプトを実行しますか?
私が知る限り、あなたのためにこれをすることができる仕事はありません。したがって、完全な刑務所で始まり、特定のサービスに不要なコンテンツを削除します。多くのコマンドラインユーティリティ(たとえばtop
、、ps
および)tail
は通常デーモンで使用されないため、安全に削除できます。ただし、刑務所内で直接デバッグする場合は見逃すことがあります。デーモンを直接起動するなら、exec.start
それは必要ありませんrc.subr
。
このパスに沿ってサービスが継続して動作している間にオペレーティングシステムから削除できる量(攻撃面を減らすために)を決定するために連続殺人を開始する場合は、次の点に注意してください。ナノBSD。これは、必要に応じてインストールを調整するのに役立ちます。
だから – 絶対に可能です。しかし、私が知る限り、公共事業はない。ほとんどの人は厚い刑務所または薄い刑務所を選択し、そこで指定されたサービスを運営します。
依存性地獄
刑務所の減量を行うときは、すべてが正しいことを確認するために非常に注意してください。そうでなければ、すべてが崩壊します。システムを更新するときは、他のすべての部分を更新する必要があることに注意してください。開始する基地刑務所またはソース。テンプレートと本当の刑務所。移動する車輪が多く、管理が難しくなります。できますが、努力と報酬を比較評価する必要があります。ディスク容量は非常に安いので、努力する価値があるためにはかなりのサービスが必要です。
その場合は、オペレーティングシステム全体を含む単純なFat Jailを使用することをお勧めします。
ZFSに満足している場合は、ぜひお試しください。しかし、そうでない場合は、単純なディレクトリからchrootすることをお勧めします。刑務所で働くのが快適になったら、クリームの追加を始めることができます。
重要なのは、刑務所自体を1つのシステムとして考えることです。今日のシステムを正しくメンテナンスしている場合は、すでにシステムを使用している習慣があり、freebsd-update fetch install
カーネルとユーザースペースの両方を更新していることがわかります。
ミックスに刑務所を追加するときは、刑務所も更新することを覚えておいてください。
freebsd-update -b /usr/local/jails/testjail install
アップグレードする場合は、刑務所も覚えておいてください。
freebsd-update -b /usr/local/jails/testjail --currently-running 10.3-RELEASE -r 11.0-RELEASE upgrade
パッケージを新鮮に保つように
pkg upgrade
pkg -j testjail upgrade
こんにちは!私は刑務所にサービスを入れたいです!
いいね!すべての注意事項を念頭に置いて、完全に一般的なシステムで簡単な方法でこれを行います。 TinyDNSは悪い例なのでインストールしてみましょう。nginx
- ジェーン刑務所構成の作成
/etc/jail.conf
- 起動時に刑務所を開始することを許可する
- 刑務所名「testjail」を追加しました。
- "testjail" chrootディレクトリを追加
- chrootにOSをインストールする(デフォルトのみ選択。/
lib32
選択解除ports
) - 刑務所を始める
nginx
刑務所にパッケージを追加します。- 起動時にnginxを起動するように刑務所に指示する
- 今nginxを始めましょう!
完璧!
1番と2番は、刑務所に行く準備をする目的でのみ使用されます。それぞれの新しい刑務所には3〜6個があります。 1回提供量あたり7~9個。
cat <<'EOF'>/etc/jail.conf
# Global settings applied to all jails.
host.hostname = "${name}.jail";
ip4 = inherit;
ip6 = inherit;
path = "/usr/local/jails/${name}";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
# Specific seetings can be applied for each jail:
'EOF'
sysrc "jail_enable"=YES
echo "testjail { }" >> /etc/jail.conf
mkdir -p /usr/local/jails/testjail
bsdinstall jail /usr/local/jails/testjail
service jail start testjail
pkg -j testjail install -y nginx
sysrc -j testjail "nginx_enable"=YES
service -j testjail nginx start
これが私が刑務所と簡単な行政をする「正しい」方法と呼ぶことです。さまざまなバリエーションがあります。最後の行はで置き換えることができますservice jail restart testjail
。これで、刑務所に閉じ込められたnginxインスタンスからWebを閲覧できます。
一部のFreeBSDのデフォルト設定は刑務所には適していません。したがって、次の設定も考慮してください。
sysrc -j testjail sendmail_enable="NONE"
sysrc -j testjail sendmail_submit_enable="NO"
sysrc -j testjail sendmail_outbound_enable="NO"
sysrc -j testjail sendmail_msp_queue_enable="NO"
刑務所を取り除く
刑務所の削除:
- 刑務所を防ぐ
- 「/etc/jail.conf」から刑務所の名前を削除します。
- ファイルを削除できるようにフラグをリセットしてください。
- ファイルの削除
service jail stop testjail
sed -i '' '/^testjail {/ d' /etc/jail.conf
chflags -R noschg /usr/local/jails/testjail
rm -rf /usr/local/jails/testjail
上記は、パートIIIの刑務所管理ツールなしで既存のツールを使用して刑務所を管理することが難しくないことを示しています。
こんにちは!私はTinyDNSを刑務所に入れたいだけです!
あなたは「正常に」TinyDNSをインストールできると書いたので、私はあなたに任せます。注意を払っている他の人であれば、これが次のように簡単になると推測することもできます。
pkg -j testjail install djbdns
しかし、パッケージを作った人が/usr/local/etc/rc.d
。代替サービス管理を使用することを選択できます。家庭教師またはそれを追加する簡単なトリック/etc/rc.local。またはボーナスポイントを得るためにrcスクリプトを作成し、私たち全員が楽しむのに貢献してください!
これにより、実際に知っておくべき2つの具体的な刑務所命令を紹介します。ギリングス実行中の刑務所を一覧表示し、プログラムの実行刑務所で何かを行うことができます。
root@test:~ # jls
JID IP Address Hostname Path
3 testjail.jail /usr/local/jails/testjail
コマンドラインをルートにインポートするには、単にルートシェルを実行するだけです(tcshということを覚えておいてください)。
root@test:~ # jexec testjail /bin/tcsh
root@testjail:/ # tinydns
tinydns: fatal: $IP not set
root@testjail:/ # exit
exit
root@test:~ #
このシェルで作業するとき、すべてが刑務所/chrootにあります。
彼らはあなたに何も言わない!
私はこれまでのほとんどのチュートリアルで説明した内容から抜け出しません。ファイルシステムで多くの時間を無駄にした後、興味深い部分をスキップします。最近では、ネットワークにアクセスできないコンピュータはあまり楽しくありません。上記の例では、ネットワークスタックをホストと共有しています。これは、刑務所と同じポートを使用して刑務所のホストで何も実行できないことを意味します。私の例では、Webサーバーのポート80です。
一方、最近ではファイアウォールを設定するのはとても簡単です。すべてのポートをローカルポートとして扱うだけです。 IPv6を使用すると、すべてが簡単になります。しかし、私たちのほとんど(すべて?)はまだIPv4と戦う必要があります。 IPv4は単純ですが、必要なアドレスがない可能性があるため、一種のNATを使用する必要があります。
ネットワーキングについて実際に知りたい場合は、仮想ネットワークインターフェイスがあります。インターネット。成熟した年度ただし、これを使用するには、VIMAGEをサポートするカーネルをコンパイルする必要があります。これは通常のカーネルで有効になります。フリーBSD 12.0以来。
VNETを使用すると、ファイアウォールを実行できる素晴らしい仮想インターフェイスが提供されます。~へ刑務所。
刑務所のホストの統合ファイアウォールが出てきて、私が望むものに十分なので、現在VNETを使用していません。これにより、刑務所内外の交通を制御することができます。これにより、刑務所から物を取り出すのが難しくなります。
刑務所のホストは、いくつかのアウトバウンドトラフィック(http/ftp/namesolution)を許可することがよくあります。ただし、刑務所のすべてのトラフィックに対して双方向と刑務所の間で許可されるポートを明示的に指定します。
秘密は、トラフィックを別のインターフェイスに切り替えることです。ローカルループバックインターフェースlo0
は良い選択です。ただし、ルールをより効果的に分離するには、新しいインターフェイス名に複製することをお勧めしますlo1
。刑務所のホストのIPアドレスを使用して設定し、事前入力できますifconfig
。ただし、刑務所サブシステムは自動的にこれらすべてを処理するため、これは必要ありません。
この目的のために、私たちは/etc/jail.conf
次のようになります。
# Global settings applied to all jails.
host.hostname = "${name}.jail";
interface = "lo1";
path = "/usr/local/jails/${name}";
mount.fstab = "/usr/local/jails/${name}.fstab";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
# Specific seetings can be applied for each jail:
testjail { ip4.addr = 172.17.2.1; }
ip4/6 = inherit;
に変更された方法に注意してくださいinterface="lo1"
。また、mount.fstab
これがnullfsマウントを追加した方法ですが、今はもう議論しません。次に、テスト刑務所に使用する内部IPを追加しました。
次に、以下を追加してlo1
複製します/etc/rc.conf
。
sysrc "cloned_interfaces"="lo1"
これを行うには、再起動する必要があります。再起動せずに今すぐ試すには、インターフェイスを直接作成する必要があります。
ifconfig lo1 create
ifconfig lo1 up
cloned_interfaces="lo1"
これはの設定と同じ効果があります/etc/rc.conf
。刑務所の開始時に自動的に処理されるため、IPアドレスのエイリアスを作成する必要はありません。
しかし、交通量はどこにも行かないので、これは退屈です。
トラフィックを引き続き実行するには、ファイアウォールを設定していくつかのNATを開始する必要があります。私が選んだ毒はパフ。あなたのルールセットは/etc/pf.conf
http用刑務所IPに外部的にNATするには:
rdr pass inet proto tcp from any to (em0) port http -> 172.17.2.1 port http
多くのサービスは、それ自体が接続できないと開始されません。そのため、これに対するルールも追加しました。
pass on lo1 proto tcp from 172.17.2.1 to 172.17.2.1 port http
NAT ルールは、外部の人に接続する場合にのみ必要です。複数の刑務所を持ち始めると、通常、ある刑務所が別の刑務所に接続できるようになります。
pass on lo1 proto tcp from 172.17.2.1 to 172.17.2.2 port 8180
この単純なファイアウォール設定により、刑務所と外部の世界の間で非常に優れたネットワーク分離を実現できます。
一般化する
私の経験に基づいて刑務所の使い方を学ぶには、次のパスに従うことをお勧めします。
- 基本的なカーネル機能について - プロセスとは何ですか?
- chrootについて学ぶ
- 起動プロセスの理解
- 太った刑務所を作る
- 刑務所で働いています。使用/更新
- 彼を理解する
- 弱い刑務所を建設する
- 複数の刑務所で働く
- ネットワーキングについて学ぶ
- ネットワーク設定
- ZFSについて学ぶ
これが私のレシピです。あなたが期待していたものとまったく一致しない可能性があります:-)
提供されたツールで難しい作業を処理したくない場合は、一部のサードパーティ製ツールを確認してください。
これらすべてから、問題はかなり広く好まれる設定に大きく依存していることがわかります。たとえば、うまく機能するパッケージの領収書を示しているようですが、他のnginx
質問が必要な場合があります。
- TinyDNSを保護する方法は?
- 権限のないユーザーとしてtinydnsを実行する方法は?
- rcスクリプトの書き方
しかし、刑務所の部分は除外します。