2012/11/20

OS X 10.8.2 で、同梱されている bind を使う方法

我が家ではホームネットワーク用のネームサーバを稼働させています。主な目的は、ホームネットワーク内機器用A/PTRの提供と、Internet用のキャッシュサーバです。

今まではFreeBSD上のbindを使っていましたが、今回OS X 10.8.2付属のbindへ切り替えることにしました。

OS X 10.8.2付属のbindは9.8.3-P1です。これはBIND Vulnerability Matrixなどでも確認出来るように、脆弱性が発見されているバージョンであり、Internetへ情報提供するために用いるのは避けたほうが良いでしょう。

namedコマンドは/usr/sbinへ格納されており、設定ファイルは/etc/named.confを参照するようにbuildされています。予め準備されている/etc/named.confへは、directoryディレクティブとして/var/namedが指定されており、各種情報ファイルはこのディレクトリへ格納するようになっています。

このnamed.confでは/etc/rndc.keyをincludeするよう設定されているため、named起動前に/etc/rndc.keyを生成しなければなりません。また、2012/11/20現在root serverのzoneファイルが最新ではないため、Internet用名前解決サーバとしても利用する場合には、/var/named/named.caを更新すると良いでしょう。

これらの手順は「Mac OS X で DNS サーバを構築する」でまとめてくださっており参考になります。具体的には次のコマンドでこれらの作業を行うことが可能です。

$ sudo rndc-confgen -a
$ sudo curl -o /var/named/named.ca ftp://ftp.rs.internic.net/domain/named.root

OS起動時、bindを自動起動するためには、launchdへ登録を行います。予め/System/Library/LaunchDaemons/org.isc.named.plistへ設定ファイルが用意されているため、それを使うと便利です。但し、Disabledディレクティブがtrueに設定されているため、launchctlのloadコマンドへ-wオプションを指定する必要があります。

$ sudo launchctl load -w /System/Library/LaunchDaemons/org.isc.named.plist

なお以前のMac OS X 10.5以前と異なり、-wオプションを付加しても、plistファイル内のDisabledディレクティブ値は変更されません(man 1 launchctl参照)。

さて、namedは比較的攻撃を受けやすいプロセスであり、何らかの保護環境下で動作させることが望ましいとされています。FreeBSDのbindは、chroot環境で実行する手段が用意されていましたが、OS Xでは、sandbox下で実行する手段が用意されています。OS Xのsandboxはプロセスがアクセス可能なリソースを制限する手法です。

namedをsandbox配下で実行させるには、/System/Library/LaunchDaemons/org.isc.named.plist内にある、下段のコメントを外します。具体的には、以下を取り囲んでいる<!--と-->を取り除きます。

<!--
                /usr/bin/sandbox-exec
                -f
                /usr/share/sandbox/named.sb
-->

但し、ここでprofileとして指定されている/usr/share/sandbox/named.sbファイルは、実際のnamedの動作を踏まえてない為、正しくnamedを実行させることができません。この為、このファイルを以下に差し替えましょう。
;;
;; named - sandbox profile
;; Copyright (c) 2006-2007 Apple Inc. All Rights reserved.
;;
;; WARNING: The sandbox rules in this file currently constitute
;; Apple System Private Interface and are subject to change at any time and
;; without notice. The contents of this file are also auto-generated and not
;; user editable; it may be overwritten at any time.
;;
(version 1)
(debug deny)
(import "bsd.sb")
(deny default)
(allow process*)
(deny signal)
(allow sysctl-read)
(allow network*)
;; Allow named-specific files
(allow file-write* file-read-data file-read-metadata
(regex "^(/private)?/var/run/named/named\\.pid$"
"^(/private)?/var/run/named/session\\.key$"
"^(/private)?/var/run/named$"
"^(/private)?/var/named$"
"^(/private)?/var/named/tmp-"
"^/Library/Logs/named\\.log$"))
(allow file-read-data file-read-metadata
(regex "^(/private)?/etc/rndc\\.key$"
"^(/private)?/etc/resolv\\.conf$"
"^(/private)?/etc/named\\.conf$"
"^(/private)?/var/named/"))
(allow file-read-data file-ioctl
(literal "/dev/random"))
view raw named.sb hosted with ❤ by GitHub


これによりnamedをsandbox環境下で動作させることができるようになります。named.confなどを変更している場合には、sandbox-simplifyなどを使い、適宜リソースを調整すると分かりやすいと思います。

0 件のコメント:

コメントを投稿