エントリー

※注意:このエントリーは、旧日記「みおだいあり~」からデータを移管したものです。

[FreeBSD] セキュリティのおはなし (2)

BSD系のOSが、かなり昔にLinuxよりもセキュリティが高いとか言われていた所以に、「セキュリティレベル」という機構が、BSD系OSには存在しています。

この「セキュリティレベル」ですが、簡単に言えばカーネルレベルでガチガチに安全を確保していく、4.4BSD由来の機構です。

いまでは、Linux界隈にも、SE Linuxや、Tomoyo LinuxなどのセキュアOSがあって、それらがLinuxカーネルにマージされており、カーネルレベルでのセキュリティを敷くことができますが、今回はそういったLinuxのセキュアOSが登場する約10年弱前のBSD界隈でのお話です。

で、BSDの「セキュリティレベル」って何?ってことですが、man(FreeBSDシステム管理者マニュアル)には次のように書かれています。

この「セキュリティレベル」ですが、マシンが危険な状態に晒されている分だけ(たとえば、公開サーバマシンなど)、レベルを引き上げる毎に、とんでもない威力を発揮してくれます。

セキュリティレベルの引き上げ方は、非常に簡易です。FreeBSDの場合、次のように行うだけです。

 

YURI /# sysinstall
1) Configure (Do post-install configuration of FreeBSD) を選択 (ENTERキー)
2) Security (Configure system security options) を選択 (ENTERキー)
3) [ ] Securelevel (Configure securelevels for the system) を選択 (SPACEキー)
4) 「Disabled」、「Secure」、「Highly Secure」、「Network Secure」の中から、
  任意のセキュリティレベルを選択 (ENTERキー)
YURI /# reboot

この操作を行っておくと、sysinstall によって、「/etc/rc.conf」に次のような記述が追加されています。

YURI /# cat /etc/rc.conf | grep "securelevel"
kern_securelevel_enable="YES"
kern_securelevel="1"

kern_securelevel という項目がありますが、ここで設定された数値が現在設定中の「セキュリティレベル」です。

なお、現在、マシンで有効になっているセキュリティレベルは、次のコマンドを打つことで確認できます。

YURI /# sysctl kern.securelevel
kern.securelevel: 1

sysctl を使うことによって、動的にセキュリティレベルを引き上げることもできます。

BSDカーネルは、全部で5種類のセキュリティレベルで実行することができます。各セキュリティレベルの詳細は以下の通り:


     -1    Permanently insecure mode - always run the system in insecure mode.
	   This is the default initial value.
     0	   Insecure mode - immutable and append-only flags may be turned off.
	   All devices may be read or written subject to their permissions.
     1	   Secure mode - the system immutable and system append-only flags may
	   not be turned off; disks for mounted file systems, /dev/mem and
	   /dev/kmem may not be opened for writing; /dev/io (if your platform
	   has it) may not be opened at all; kernel modules (see kld(4)) may
	   not be loaded or unloaded.
     2	   Highly secure mode - same as secure mode, plus disks may not be
	   opened for writing (except by mount(2)) whether mounted or not.
	   This level precludes tampering with file systems by unmounting
	   them, but also inhibits running newfs(8) while the system is multi-
	   user.
	   In addition, kernel time changes are restricted to less than or
	   equal to one second.  Attempts to change the time by more than this
	   will log the message ``Time adjustment clamped to +1 second''.
     3	   Network secure mode - same as highly secure mode, plus IP packet
	   filter rules (see ipfw(8), ipfirewall(4) and pfctl(8)) cannot be
	   changed and dummynet(4) or pf(4) configuration cannot be adjusted.

FreeBSDでは、「セキュリティレベル」の初期値は「-1」になっています。カーネルレベルでのセキュリティを敷く場合は、「1」から「3」の値を設定することになります。

FreeBSDシステムセキュリティレベル「1」では、マウントされたシステム、/dev/mem/dev/kmem が、書き込み不可能状態になり、これはつまりXを起動できない状態になります。また、前回のおはなしで紹介した「schg」や「sappnd」などの特殊な「ファイルフラグ」を外すことがroot権限であっても出来なくなります。更に、カーネルモジュールのロード/アンロードも禁止されます。

FreeBSDシステムセキュリティレベル「2」では、「1」に加えて、マウントされているかされていないかに関係なく、ディスクへの書き込みの為のオープンが不可能になり、常に読み取り専用になります。つまり、ディスクのマウントを外して不正にファイルシステムを改竄するという手口を防ぐことが出来ます。更に、マルチユーザーモード時のroot権限によるnewfsコマンドの実行を禁止します。それに加えて、カーネルの時刻の変更を、1000ミリ秒以下に制限されます。1000ミリ秒以上のカーネル時刻変更が試みられた場合は、それの変更をプラス1000ミリ秒に固定して、またその試みがカーネルログに記録されます。

FreeBSDシステムセキュリティレベル「3」では、「2」に加えて、IPパケットのフィルタリングルールの変更をroot権限であっても一切禁止します。また、pf(4) 設定などの調整も制限されます。

この「セキュリティレベル」機構ですが、気を付けなければならない点があります。

それは、セキュリティレベルを引き上げることはすぐに出来るけれども、セキュリティレベルを引き下げることはそう簡単には出来ない(もしクラッカーにマシンを乗っ取られたとしても、クラッカーには絶対にセキュリティレベルを引き下げることは出来ない)という点です。

一旦、セキュリティレベルを「1」以上に引き上げてしまえば、たとえroot権限であっても、マルチユーザーモードに於いてセキュリティレベルを下げることは不可能になる為、schg などのファイルフラグが非常に効果を発揮し、万一、外部からroot権限を乗っ取られてしまっても、設定ファイルをいじられることを完全に不可能にすることが出来ます。また、セキュリティレベルを「2」以上に設定することで、root権限ですらファイルシステムに手を加えることが一切不可能になるため、非常にセキュアな環境を作ることが出来ます。

ですが、セキュリティレベルを「1」以上に設定すると、Xを起動することが出来なくなってしまうので、デスクトップ用途でFreeBSDを使用している場合は、間違ってもセキュリティレベルを引き上げてはいけません(恥ずかしながら、私はFreeBSD5.4を使っている時分に、これで嵌りました)。

また、セキュリティレベルの引き下げ方法ですが、マルチユーザーモードではroot権限であっても下げることが出来なくなります。つまり、root権限で「/etc/rc.conf」に記述している securelevel の数字を下げて reboot しても、root権限で「sysctl -w kern.securelevel=0」と打っても、セキュリティレベルは下がりません。つまり、これはFreeBSD鯖をクラックされた際にクラッカーにセキュリティレベルをいじられないような仕組みになっています。

なので、セキュリティレベルを引き下げたいときには、サーバマシンに直接つながれたモニタとキーボードを使って、シングルユーザーモードでFreeBSDを立ち上げ、スーパーユーザーで「sysctl -w kern.securelevel=0」と打ち、また「/etc/rc.conf」内のセキュリティレベルの数値を下げて「reboot」を打ちこんでやることで、再起動後からはそのセキュリティレベルでFreeBSDシステムが稼働します。

 

#####コメント#####

本日のツッコミ
たこ (2009年10月26日(Mon) 00:22)
勉強になります。
Linuxも同じようにすればかなり安全なのに…。

ページ移動

コメント

  • コメントはまだありません。

コメント登録

  • コメントを入力してください。
登録フォーム
名前 *
URL
コメント *
閲覧制限 *
【スパム対策】 2 × 2 × 2 = ? (半角数字で)

ユーティリティ

user profile

calendar

102024/1112
S M T W T F S
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

tag cloud