Trusted Solaris 開発ガイド

第 1 章 API とセキュリティポリシーの紹介

Trusted Solaris 7 には、他社のアプリケーションから送られるセキュリティ関連情報に対するアクセスや処理を行うアプリケーションプログラミングインタフェース (API) が装備されています。この章では、API 機能の概要を述べ、Trusted Solaris 7 のセキュリティポリシーについて紹介します。

オペレーティングシステムの基本機能

Trusted Solaris 7 は SolarisTM 7 に基づいており、次に示す Solaris 7 の機能に加えて拡張されたセキュリティ機能が装備されています。

データオブジェクト

アプリケーションは、この節で説明するいろいろなオブジェクトで使用されるデータを処理するために、Solaris 7 API と Trusted Solaris 7 API を使用します。Trusted Solaris 7 は、アプリケーションがこれらのオブジェクトに対して実行するセキュリティ関連のオペレーションに制約を加えます。これにより、セキュリティポリシーが実装されます。アプリケーションに対する Trusted Solaris 7 セキュリティポリシーの適用については、「セキュリティポリシー」で説明しています。

ファイルシステムオブジェクト

ファイルシステムオブジェクトは、ファイルシステム内にあり、ファイルシステムのセキュリティポリシーに従って読み取り、書き込み、検索、および実行が行われます。ファイルシステムオブジェクトの種類を次に示します。

X11 ウィンドウオブジェクト

X ウィンドウシステムのオブジェクトは、特殊なファイルシステムインタフェースを介してデータの入出力を処理します。これらの特殊ファイル内のデータは、ファイルシステムオブジェクト内のデータと同じ方法ではアクセスできません。これは、ファイルシステムオブジェクト内のデータは、ファイルシステムのセキュリティポリシーによって保護されており、一方、X ウィンドウサーバーオブジェクトと X ウィンドウシステムオブジェクトは、X ウィンドウシステムセキュリティポリシーによって保護されているためです。

プロセスオブジェクト

プロセスは、別のプロセスや軽量プロセス (個別にスケジュールされた実行スレッド) 内のデータにアクセスできます。プロセス対プロセス通信にはすべて、プロセス、ネットワーク、プロセス間通信 (IPC) のいずれかのセキュリティポリシーによって保護されます。通信に特殊ファイルが含まれる場合は、ファイルシステムのセキュリティポリシーによってそのファイルは保護されます。

IPC オブジェクト

プロセス間通信 (IPC) オブジェクトの種類を次に示します。

ネットワーク通信の終端

ネットワーク通信の終端には、ソケットとトランスポートレイヤーインタフェース (TLI) の終端があります。

STREAMS オブジェクト

STREAMS オブジェクトは、ネットワーク用ソフトウェアの基礎となるもので、ネットワークセキュリティポリシーによって保護されます。STREAMS が保持するセキュリティ属性情報は、IPC とネットワーク用 API を介してアクセスします。IPC とネットワー用 API については、本書で詳細に説明しています。「トラステッド streams」では、ある Stream のセキュリティ属性情報に直接アクセスするためのインタフェースの一覧を示していますが、これらのインタフェースの概要やコード例は本書では扱っていません。

アプリケーションプログラミングインタフェース (API)

Trusted Solaris 7 API は、次に示すセキュリティ機能に対するアクセスを可能にします。この章では、これらの機能の概要を説明します。詳細は、本書の第 2 章以降を参照してください。

特権

特権をプロセスに設定すると、そのプロセスは、システムセキュリティポリシーによって禁止されている処理を実行できるようになります。Solaris 7 では、実効ユーザー ID: 0 (スーパーユーザー) によるプロセスには、システムセキュリティポリシーは適用されません。しかし、0 以外のユーザー ID によるプロセスは処理が限定されます。Trusted Solaris 7 では、スーパーユーザーは存在しません。どのようなユーザー ID のプロセスに対しても、特定のセキュリティ関連の権限が定義された、さまざまな特権を割り当てることができます。特権および特権によってプロセスが実行できる処理の一覧は、priv_desc(4) を参照してください。

ほとんどのアプリケーションは、セキュリティ関連の権限を実行する必要がないため、特権を使用しません。特権を使用するアプリケーションは、トラステッドコンピューティングベース (Trusted Computing Base、TCB) を使用するアプリケーション (以下、TCB アプリケーション) と呼ばれます。TCB アプリケーションでは、情報が不正に利用されることがないようにコーディングに注意する必要があります。どのような場合に特権が必要になるかの目安は、「セキュリティポリシー」を参照してください。次に示す特権プログラムのコーディングについての情報とガイドラインは、第 3 章「特権」を参照してください。

ユーザーの承認

あるユーザーによって実行されたプロセスは、承認が必要な処理を実行する前に、そのユーザーの承認を調べます。処理に特権が必要な場合 (通常は必要) は、プロセスが特権を宣言する前に承認が検査されます。承認は、管理者の権限によって割り当てられ、auth_desc(4) に記述されたユーザー処理に対するユーザーアクセスを制御します。次の処理を行うプログラミングインタフェースの詳細は、第 4 章「ユーザー承認のチェック」を参照してください。

CMW ラベル

CMW ラベルは、データの格付けへのアクセスの制御と、データの格付けの管理を行います。すべてのプロセスとオブジェクトには、2 つのラベル部からなる CMW ラベルがあります。 1 つは、必須アクセス制御 (MAC) が判断のために使用する機密ラベルで、もう 1 つはデータの実際の機密性を識別するための情報ラベルです。


注 -

Trusted Solaris 7 では、情報ラベルは機能しません。情報ラベルは、互換性のためだけに CMW ラベルに表示されます。情報ラベルを返す関数の大部分は、デフォルトで情報ラベルを ADMIN_LOW にリセットし、情報ラベルを使用することはありません。


次の処理を行うプログラミングインタフェースの詳細は、第 5 章「ラベル」を参照してください。

プロセス認可上限

ユーザーがワークスペースからアプリケーションを起動するとき、プロセスに対しそのユーザーのセッション認可上限が設定されます。この認可上限を、プロセス認可上限と言います。プロセス認可上限は、プロセスに対し、オブジェクトの CMW ラベルの変更やデータ書き込みの上限を設定します。次の処理を行うプログラミングインタフェースの詳細は、第 7 章「プロセス認可上限」を参照してください。

マルチレベルディレクトリ

マルチレベルディレクトリ (MLD) では、複数の機密ラベルで動作可能な 1 つのプログラムが、共通のディレクトリを使用して、プロセスが現在動作している機密ラベルのファイルにアクセスできます。1 つの MLD には複数のシングルレベルディレクトリ (SLD) があり、各 SLD はこの SLD の機密ラベルを持つファイルを格納します。1 つの MLD 内では、同じ名前のファイルを複数の SLD に格納できます。このファイルのインスタンスには、それぞれの格納先の SLD の機密ラベルに適したデータが含まれています。これを、ディレクトリとファイルの多重インスタンス化と言います。次の処理を行うプログラミングインタフェースの詳細は、第 8 章「マルチレベルディレクトリ」を参照してください。

アプリケーション監査

他社のアプリケーションを使用する場合、異常ユーザーアクションを監視する監査記録を生成して、システムの不審な利用や異常な動作を検出することができます。他社のアプリケーションの監査について詳細は、第 9 章「アプリケーション監査」を参照してください。

ユーザーデータベースとプロファイルデータベースのアクセス

ユーザーデータベースとプロファイルデータベースには、アプリケーションがアクセスできるユーザー、役割、プロファイルの情報が含まれます。次の処理を行うプログラミングインタフェースの詳細は、第 10 章「ユーザーとプロファイルのデータベースエントリへのアクセス」を参照してください。

プロセス間通信

Trusted Solaris 7 は、アクセスチェック、所有権チェック、IPC とネットワークの終端オブジェクトに対する情報ラベルの浮上の機能を持つ、ラベル付きプロセス間通信 (IPC) をサポートしています。また、ネットワーク終端オブジェクトに対するセキュリティ属性情報の転送もサポートしています。

ラベル付き終端間通信では、次に示すように、シングルレベル接続、マルチレベル接続、多重インスタンス化された接続が可能です。

詳細は、第 11 章「プロセス間通信」第 12 章「System V のプロセス間通信」第 13 章「トラステッドセキュリティ情報交換ライブラリ」、および第 14 章「遠隔手続き呼び出し」を参照してください。

トラステッド X ウィンドウシステム

トラステッド (信頼性の高い) X ウィンドウシステム (Version 11) サーバーは、ログイン時に起動し、プロセス間通信 (IPC) のトラステッドパスを使用してワークステーションのウィンドウシステムを処理します。ウィンドウ、プロパティ、セレクション、TooltalkTM セッションは、個別のオブジェクトとして、多重インスタンス化された複数の機密ラベルで作成されます。Motif ウィジェット、Xt イントリンシクス、Xlib、CDE インタフェースを使用して作成されるアプリケーションは、X11 プロトコルによって規定されるセキュリティポリシー制約の範囲で動作します。

付録 B 「Trusted Solaris 7 インタフェースリファレンス」 では、X11 トラステッド IPC パスを作成する開発者を対象に、拡張機能について説明しています。第 15 章「トラステッド X ウィンドウシステム」では、セキュリティ属性情報にアクセスするプログラミングインタフェースや、X ウィンドウシステムで表示するための指定幅と指定フォントのリストを使用して、バイナリのラベルと認可上限を ASCII へ変換するプログラミングインタフェースについて説明します。

アプリケーションユーザーインタフェース

分散型の Trusted Solaris 7 オペレーティングシステムは、ユーザーインタフェースとして共通デスクトップ環境 (CDE) 1.1.1 ウィンドウシステムを使用しています。新しいアプリケーションのユーザーインタフェースには、CDE API、Motif ウィジェット 1.2、Xt イントリンシクス、または Xlib を使用してください。Trusted Solaris 7 は、XViewTM と Open Look Interface Toolkit (OLIT) に基づいた OpenWindowsTM アプリケーションをサポートしています。そのため、ユーザーインタフェースとして OLIT を使用したアプリケーションであれば、トラステッドアプリケーション以外でも Trusted Solaris 7 上で動作します。

ラベルビルダー

Trusted Solaris 7 には、アプリケーションに一般的なラベル作成用のユーザーインタフェースを加えるための、Motif ベースのプログラミングインタフェースが装備されています。このラベル作成用のインタフェースを使用すると、有効な CMW ラベル、機密ラベル、情報ラベル、または認可上限を対話形式で作成できます。このプログラミングインタフェースの詳細は、第 16 章「ラベルビルダー」を参照してください。

システムセキュリティ構成の設定

サイトで特定のセキュリティ属性を操作するシステム管理者は、/etc/security ファイル内のシステム変数を設定してシステムを構成します。次の処理を行うために、Trusted Solaris 7 のシステムセキュリティ変数にアクセスするプログラミングインタフェースの詳細は、第 2 章「プログラミングインタフェースの概要」を参照してください。

セキュリティ属性

セキュリティ属性は、ファイルシステム、プロセス、データパケット、通信の終端、X ウィンドウシステムオブジェクトのセキュリティ情報を定義します。

ファイルシステムのセキュリティ属性とフラグ

ファイルシステムは、次に示す Solaris 7 と Trusted Solaris 7 のセキュリティ属性を、第 2 章「プログラミングインタフェースの概要」で説明しているプログラミングインタフェースによってアクセス可能なセキュリティ属性セットとして格納します。ファイル特権にアクセスする方法は、第 3 章「特権」を参照してください。

Solaris 7 

Trusted Solaris 7 

アクセス制御リスト (ACL) 

CMW ラベル 

任意アクセス制御 (DAC) のアクセス権ビット 

ファイルシステムのラベル範囲 

ファイルのユーザー ID 

強制特権セットと許容特権セット 

ファイルのグループ ID 

監査の事前選択属性 

 

属性フラグ 

 

マルチレベルディレクトリの接頭辞 

プロセスのセキュリティ属性とフラグ

ユーザープロセスは、ユーザープロセスを開始したユーザーまたは役割、および開始されたワークスペースから、以下に示す Solaris 7 と Trusted Solaris 7 のセキュリティ属性を受け取ります。

プロセス ID 

プロセス認可上限 

実ユーザー ID と実効ユーザー ID 

CMW ラベル 

実グループ ID と実効グループ ID 

プロセス属性フラグ 

補助グループリスト 

プロセス特権セット 

ユーザー監査 ID 

 

監査セッション ID 

 

umask (プロセスによって作成されるファイルのアクセス権ビットを定義する) 

終端間通信のセキュリティ属性

トラステッドセキュリティ情報交換 (Trusted Security Infomation eXchange、TSIX) ライブラリによって、データパケットと通信の終端に関する Trusted Solaris 7 セキュリティ属性にアクセスすることができます。TSIX は、Berkeley ソケットに基づいており、トランスポートレイヤーインタフェース (TLI) をサポートしています。第 13 章「トラステッドセキュリティ情報交換ライブラリ」では、データパケットと通信の終端のセキュリティ属性にアクセスする方法を説明します。

実効ユーザー ID 

機密ラベル 

実効グループ ID 

情報ラベル 

プロセス ID 

プロセス認可上限 

ネットワークセッション ID 

有効な特権セット 

補助グループ ID 

プロセス属性フラグ 

監査 ID 

 

監査情報 

 

トラステッド X ウィンドウシステムのセキュリティ属性

トラステッド (信頼性の高い) X ウィンドウシステムには、次に示すセキュリティ属性があります。X ウィンドウシステムのセキュリティ属性にアクセスする方法は、第 15 章「トラステッド X ウィンドウシステム」を参照してください。

ウィンドウサーバーの所有者 ID 

機密ラベル 

ユーザー ID 

情報ラベル 

グループ ID 

入力情報ラベル 

プロセス ID 

X ウィンドウサーバーの認可上限 

セッション ID 

X ウィンドウサーバーの最下位ラベル 

監査 ID 

トラステッドパスウィンドウ 

インターネットアドレス 

 

トラステッドパスフラグは、そのウィンドウがトラステッドパスにあるウィンドウであることを示します。トラステッドパスウィンドウは、スクリーンストライプやログインウィンドウのような最上位のウィンドウであり、信頼できないプログラムからのアクセスを防ぐようにシステムを保護します。

セキュリティポリシー

Trusted Solaris 7 上で機密情報の保護、管理、配布がどのように行われるべきかを規定する規則と実用上のガイドラインを「セキュリティポリシー」と言います。Trusted Solaris 7 アプリケーションは、Solaris 7 アプリケーションとは異なり、必須アクセス制御 (MAC) を必要とし、スーパーユーザーにすべての権限が与えられているわけではありません。一方、Solaris 7 アプリケーションが必要なのは任意アクセス制御 (DAC) だけであり、スーパーユーザーにすべての権限が与えられています。

Trusted Solaris 7 は、プロセスに特権を持たせることにより、必須アクセス制御に基づいた読み取り、書き込み、検索の制限、および任意アクセス制御に基づいた読み取り、書き込み、実行、検索の制限を、特権を持つプロセスに対して無効にすることができます。また、特権を設定することで、通常スーパーユーザーのみが実行できるセキュリティ関連の特殊な処理を実行することもできます。

任意アクセスポリシー

Trusted Solaris 7 は、ユーザー、グループ、その他などのアクセス権ビットを使用した任意アクセス制御に基づいた読み取り、書き込み、実行、検索の許可、およびアクセス制御リスト (ACL) をサポートしています。任意アクセス制御とアクセス制御リストによるアクセス制御は Solaris 7 の機能の一部であり、このマニュアルでは詳細については説明していません。アクセス制御リストをファイルシステムのセキュリティ属性として取得する方法は第 2 章「プログラミングインタフェースの概要」を、また任意アクセス制御ポリシーの概要は 「任意アクセス」を参照してください。

必須アクセスポリシー

Trusted Solaris 7 は、必須検索、読み取り、および書き込み操作をサポートしています。プロセスの機密ラベルと認可上限を、そのプロセスがアクセスしようとしているオブジェクトの機密ラベルと比較することにより、MAC が実施されます。オブジェクトに課された MAC ポリシーと比較の結果により、アクセスが認められるか拒否されるかが決定します。

比較の結果、一方が他方に対し優位であるか同等であるかが示され、プロセスの機密ラベルとオブジェクトの機密ラベルの関係が明らかになります。優位と同等の関係の詳細は、第 5 章「ラベル」を参照してください。次に概要を示します。

比較結果は、プロセス認可上限とオブジェクトの機密ラベル間の関係も、優位または同等のいずれかで示します。アクセス操作がオブジェクトの CMW ラベルを変更する場合は、認可上限は機密ラベル部を変更できる最高のレベルに設定します。アクセス操作が上位書き込み (「書き込みアクセス」の項を参照) の場合は、認可上限はプロセスが書き込める最高のレベルに設定します。

Trusted Solaris 7 は、次に示すような、特権を持たないプロセスと、そのプロセスがアクセスするオブジェクト間における必須アクセス制御に基づいた読み取りと書き込み操作をサポートします。オブジェクトに対するこれらの操作の適用の詳細は、「ポリシーの運用」を参照してください。

読み取りアクセス

Trusted Solaris 7 の必須読み取りアクセスの定義には、同位読み取りと下位読み取りがあります。

書き込みアクセス

Trusted Solaris 7 の必須書き込みアクセスの定義には、同位書き込みと上位書き込みがあります。

特権を使用する場合

アプリケーションが特権なしで実行できるかどうかを調べるには、どの処理がどの特権をいつ必要とするかを知る必要があります。次に、アプリケーションに必要な特権を決定するガイドラインを示します。

特権の詳細を述べたマニュアルページの出力方法については、付録 A 「プログラマーズリファレンス」を参照してください。

管理アプリケーションとユーザーアプリケーション

管理アプリケーションは、管理用の機密ラベル ADMIN_HIGH または ADMIN_LOW で動作します。ADMIN_HIGH では、管理アプリケーションは、任意アクセス権のあるすべてのオブジェクトに対し下位読み取りができます。また、ADMIN_LOW では、任意アクセス権のあるすべてのオブジェクトに対し、上位書き込みができます。管理者は、通常、下位読み取り操作を実行する場合は、アプリケーションを ADMIN_HIGH で起動し、上位書き込み操作を実行する場合は、同じアプリケーションを ADMIN_LOW で起動します。これらの場合、アプリケーションに任意アクセス権があるかぎり、特権は必要ありません。

ラベルを ADMIN_HIGHADMIN_LOW に初期化する方法は、第 6 章「ラベルのコード例」「バイナリラベルの初期化と型のチェック」を参照してください。

ユーザーは、通常、アプリケーションを一定の機密ラベルで起動し、同じ機密ラベルのオブジェクトにアクセスします。別の機密ラベルでデータを保持する場合は、通常、ワークスペースの機密ラベルを変更して、この新しい機密ラベルでアプリケーションを起動します。この場合、アプリケーションに任意アクセス権があれば、特権は必要ありません。

ユーザーアプリケーションが、アプリケーションが動作している機密ラベルとは異なる機密ラベルのオブジェクトにアクセスするように設計されている場合で、必須アクセスが拒否された場合は、そのアプリケーションには特権が必要な場合があります。

必須アクセス制御の適用の回避またはプロセスやオブジェクトの機密ラベルの変更を行う特権を使用する上でのガイドラインは、第 5 章「ラベル」「ラベルのガイドライン」を参照してください。

ポリシーの運用

UNIX では、すべての入出力はファイルインタフェースを介して行われるため、ファイルシステムのセキュリティポリシーは、Trusted Solaris 7 全体に適用されます。

ここでは、ファイルシステムのセキュリティポリシーの次の点について説明します。

プロセス間通信 (IPC) のセキュリティポリシーについては、アクセスするプロセスとアクセスされるプロセス間の必須の読み取りアクセスおよび書き込みアクセスのチェックについて説明します。一部の IPC 機構と X ウィンドウシステムオブジェクトはファイルを使用しているので、この節で説明するファイルシステムのセキュリティポリシーがそれらの操作にも適用されます。IPC 機構によっては、下位読み取りと上位書き込みのセキュリティポリシーを持つものがあります。また、制限の強い同位読み取りと同位書き込みポリシーを持つ IPC 機構もあります。X ウィンドウシステムは、同位書き込みと下位読み取りポリシーを持ちます。特定のセキュリティポリシー情報については、次に示す章を参照してください。

ファイルシステムのセキュリティポリシー

この節では、次に示すファイルオブジェクトに対する必須アクセスチェックと任意アクセスチェックについて説明します。

任意アクセス

プロセスの所有者には、目的のオブジェクトが含まれているパス内のすべてのディレクトリに対する任意検索 (実行) 権がなければなりません。目的のオブジェクトに到達すると、アクセス操作は次のように実行できます。

必須アクセス

任意アクセス制御 (DAC) チェックが済むと、目的のファイルが含まれているパス内のすべてのディレクトリについて、必須検索アクセスが必要となります。ディレクトリに対する必須検索アクセスは、プロセスの機密ラベルがパス内のすべてのディレクトリの機密ラベルより優位な場合に与えられます。目的のファイルに到達すると、アクセス操作は次のように実行されます。

ファイルシステムのアクセス特権

ファイルシステムオブジェクトに対する任意または必須のアクセスチェックが失敗した場合、プロセスは、セキュリティポリシーの適用を回避する特権を表明できます。また、現行のラベル、またはユーザーに対してその処理を許容すべきでない場合は、エラーを出すことができます。

任意アクセスは、次のように有効になります。

必須アクセスは、次のように有効になります。

アクセスチェックが実行される場合

必須アクセスチェックと任意アクセスチェックは、ファイルシステムオブジェクトが開かれるときにパス名に対して実行されます。ほかのシステムコールでそのファイル記述子が使用される場合、それ以上アクセスチェックは行われません。ただし、次の場合を除きます。

ファイルシステムポリシーの例

この節の例は、読み取り、書き込み、検索、実行操作のため、プロセスがファイルシステムオブジェクトにアクセスする場合に考慮すべき事項を示しています。

この例では、プロセスが、読み取りと書き込みで /export/home/heartyann/somefile にアクセスし、実行で /export/home/heartyann/filetoexec にアクセスすることを想定します。両方のファイルとも Confidential で保護されています。プロセスの機密ラベルは Secret で、プロセス認可上限は Top Secret です。Confidential は Secret よりも低く、Secret は Top Secret よりも低いラベルです。

機密ラベル

次の図に示すように、パス /export/home の機密ラベルは ADMIN_LOW で、heartyann ディレクトリと somefile の機密ラベルは Confidential です。

図 1-1 ファイルシステムオブジェクトのアクセス

Graphic

プロセスが必須または任意のアクセスチェックに失敗した場合は、プログラムはエラーを表明するか、適切な特権を表明する必要があります。

アクセス制御の適用を回避するため特権を使用する場合の機密ラベルの処理の詳細は、第 5 章「ラベル」「ラベルのガイドライン」を参照してください。

ファイルを開く

Secret プロセスは、読み取りのために somefile を開いて読み取り操作を実行し、このファイルを閉じます。Confidential の /export/home/heartyann シングルレベルディレクトリ内の somefile がアクセスされるように、完全な装飾パス名が使用されます。

完全な装飾パス名は、マルチレベルディレクトリの装飾方法を使用し、どのシングルレベルディレクトリが必要か正確に指定します。代わりに通常のパス名が使用されると、プロセスが Secret で動作しているため Secret のシングルレベルディレクトリがアクセスされます。

完全な装飾パス名の詳細は、「装飾名」を参照してください。マルチレベルとシングルレベルのディレクトリを処理するインタフェースの詳細は、第 8 章「マルチレベルディレクトリ」で説明します。次の例では、わかりやすさのために使われている完全装飾パス名がハードコードされていますが、この方法は第 8 章「マルチレベルディレクトリ」では使いません。

#include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>

 main()
 {
 	int			filedes, retval;
 	ssize_t			size;
 	char			readbuf[1024];
 	char			*buffer = "Write to File.";
 	char			*file = "/export/home/.MLD.heartyann/.SLD.1/filetoexec";
 	char			*argv[10] = {"filetoexec"};

 	filedes = open("/export/home/.MLD.heartyann/.SLD.1/somefile", O_RDONLY);
 	size = read(filedes, readbuf, 29);
 	retval = close(filedes);

ファイルへの書き込み

Secret プロセスは、Confidential の /export/home/heartyann シングルレベルディレクトリ内での書き込みのために somefile を開き、書き込み操作を実行し、このファイルを閉じます。

filedes = open("/export/home/.MLD.heartyann/.SLD.1/somefile", O_WRONLY);
 size = write(filedes, buffer, 14);
 retval = close(filedes);

ファイルの実行

Secret プロセスは、Confidential の /export/home/heartyann シングルレベルディレクトリ内の実行可能ファイルを実行します。

	retval = execv(file, argv);
 }