Chapter 3. Linux と Unix のセキュリティ機能

 

慎重さがあなたを保ち、英知が守ってくれる

 旧約聖書 箴言 2 章 11 節
Table of Contents
3.1. プロセス
3.1.1. プロセスの属性
3.1.2. POSIX ケイパビリティ
3.1.3. プロセスの生成とその操作
3.2. ファイル
3.2.1. ファイルシステム・オブジェクトの属性
3.2.2. 作成日時の初期値
3.2.3. アクセス制御属性の変更
3.2.4. アクセス制御属性を使用する
3.2.5. ファイルシステムの階層
3.3. System V IPC
3.4. ソケットとネットワーク接続
3.5. シグナル
3.6. Quota と リソースの制限
3.7. ダイナミックリンク・ライブラリ
3.8. Audit(監査)
3.9. PAM
3.10. Unix ライクなシステムに固有なセキュリティ拡張機能

Linux や Unix のセキュリティ機能のガイドラインについて論じる前に、 プログラマの立場から、その機能が何であるかを知っておいてもよいと思います。 このセクションでは、Unix ライクなシステムのほとんどで広く使われている これらの機能をざっと説明します。 しかし Unix ライクなシステム間にはかなりばらつきがあり、システムすべて がここで述べる機能を持っているわけではないことに注意してください。 この章では、拡張機能のいくつかと Linux に固有の機能についても注目して行き ます。Linux のディストリビューション間の違いは、セキュリティに関する プログラミングという点から見ると、ほとんど無いといってもよいと思います。 それは、基本的には同じカーネルと C ライブラリ(GPL ベースのライセンスは、 技術革新を速やかに普及させます)。 また、それぞれの Unix の実装間にはセキュリティ関連での違いがいくつか ありますが、ここで説明することがすべてをカバーしているわけではありません。 この章では、たとえば強制アクセス制御(mandatory access control (MAC)) の実装のように、まだ Unix ライクなシステムの多くが実装していないものに ついては議論しません。 これから説明する機能が何であるか既に知っているなら、このセクションを飛ばして も結構です。

プログラミングガイドは、Linux や Unix でのセキュリティ関連の一部を軽くなぞる だけで、重要な情報は飛ばしてしまうケースが多く見られます。 とりわけ「どのように使うか」ということは大まかには論じますが、利用の際に関り が出てくるセキュリティの属性については誤魔化しています。 それとは逆に、man には個々の関数について、詳細な情報が多量にあります。しかし man は個々の関数をどのように利用するのか、という細かい説明でもって、 セキュリティの問題を隠してしまっている場合があります。 このセクションでは、そのギャップを埋めるように心がけます。Linux でプログラマ がよく利用しそうなセキュリティの仕組みについて概要を説明しますが、特に セキュリティによって生じるやっかい事に焦点を当てます。 このセクションは、普通のプログラミング・ガイドよりもさらに突っ込んだ内容に なっていて、セキュリティ関連の事柄に焦点を絞り、さらに詳しい情報が得られる ように参考文献をあげておきます。

まず基本的なところから。 Linux や Unix は 2 つの部分から構成されています。それはカーネルと「ユーザ 空間」です。 プログラムのほとんどは、ユーザ空間(カーネル上の)で動作しています。 Linux は「カーネル・モジュール」という概念をサポートしていて、動的かつ簡単に コードをカーネルに追加できるようになっています。しかし依然としてカーネル は基本的な部分を内部に抱えています。 他のシステムの中には(たとえば HURD のような)、「マイクロカーネル」ベース のシステムもあります。そのシステムは、機能をより限定した小さなカーネルと 従来はカーネルで実装していた低レベルの機能を「ユーザ」プログラムとして実装 しています。

Unix ライクなシステムには、大幅に改修を行って、米国国防省が要求している MAC(B1 レベル以上)の強固なセキュリティに特別対応しているものがあります。 この版のドキュメントでは、これらのシステムやその課題は扱いません。 そのうち範囲を広げて行きたいと思っています。 さらに詳細な情報のいくつかは、他のところで利用できます。たとえば、SGI の 「Trusted IRIX/B」について詳しいのは、NSA の Final Evaluation Reports (FERs) です。

ユーザがログインすると、そのユーザ名はユーザが属している uid(ユーザ ID) や gid(グループ ID)を表す整数値に割り当てられます。 uid が 0 のユーザは特別な権限(役割)を持っていて、「root」と言われてきました。 Unix ライクなシステム(Unix も含む)のほとんどでは、root はセキュリティチェック のほとんどを受けることなく、システムを管理を行う場合に使用されてきました。 Unix システムの中には、gid が 0 のユーザも特別扱いになっていて、グループ レベルでリソースに対して無制限のアクセス権を持っているものもあります [Gay 2000, 228]。 この事は他のシステム(Linux のような)では当てはまりませんが、そのような システムであってもグループ 0 は、基本的にすべての権利を持っています。 というのも、システム関連の特別なファイルは、グループ 0 が所有しているケース が多いからです。 セキュリティの点から見て唯一「対象」となるもの、それがプロセスです (いろいろなことを実行している正体がプロセスなのです)。 プロセスはさまざまなデータにアクセスできます。ファイルシステム(FSO)であったり、 System V のプロセス間通信(IPC)であったり、ネットワーク・ポートであったり します。 プロセスはシグナルを設定できます。 その他セキュリティ関連のトピックとしては、quota や limit、ライブラリ、監査、 PAM があります。 この後、サブセクションで詳しく見ていきます。