Trusted Solaris 7 には、他社のアプリケーションから送られるセキュリティ関連情報に対するアクセスや処理を行うアプリケーションプログラミングインタフェース (API) が装備されています。この章では、API 機能の概要を述べ、Trusted Solaris 7 のセキュリティポリシーについて紹介します。
Trusted Solaris 7 は SolarisTM 7 に基づいており、次に示す Solaris 7 の機能に加えて拡張されたセキュリティ機能が装備されています。
ANSI C 言語仕様
アプリケーションプログラミングインタフェース (API)
『SPARC Architecture Manual Version 8』に示された、アプリケーションバイナリインタフェース (ABI) および System V Release 4 ABI
実行可能ファイルの形式
a.out
Executable and Linking Format (ELF)
インタプリタ処理されるファイル
デバイスプログラミングインタフェース
デバイスドライバインタフェース (DDI)
デバイスカーネルインタフェース (DKI)
ファイルシステムとファイルシステムオブジェクト
ユーザー管理コマンドとシステム管理コマンド
共通デスクトップ環境 (Common Desktop Environment、CDE) 仕様
Trusted Solaris 7 の X ウィンドウシステムは、Solaris 7 の X11R5 ベースのウィンドウシステムに基づいており、一般にこのウィンドウシステムと互換性がある
Motif と OPEN LOOK インタフェースツールキット (OLIT)
Level 1、2、3 の国際化。Trusted Solaris 7 では C ロケールと日本語版ロケールが提供されます。
Solaris 7 の Pluggable Authentication Module (PAM) 機能
/usr/lib/security/pam_rw.so と呼ばれる新しい共有オブジェクトをインストールすることによって、パスワード生成アルゴリズムを交換できます。ファイルは rwxr-xr-x root sys のアクセス権を持ち ADMIN_LOW でなければなりません。この機能は randomword(3) のマニュアルページの中に記述されている構文と意味に従わなければなりません。
アプリケーションは、この節で説明するいろいろなオブジェクトで使用されるデータを処理するために、Solaris 7 API と Trusted Solaris 7 API を使用します。Trusted Solaris 7 は、アプリケーションがこれらのオブジェクトに対して実行するセキュリティ関連のオペレーションに制約を加えます。これにより、セキュリティポリシーが実装されます。アプリケーションに対する Trusted Solaris 7 セキュリティポリシーの適用については、「セキュリティポリシー」で説明しています。
ファイルシステムオブジェクトは、ファイルシステム内にあり、ファイルシステムのセキュリティポリシーに従って読み取り、書き込み、検索、および実行が行われます。ファイルシステムオブジェクトの種類を次に示します。
ディレクトリ
通常のデータファイル
実行可能ファイル
シンボリックリンク
マップされたメモリー
デバイスオブジェクト - プリンタ、ワークステーション、テープ装置、フロッピーディスクドライブなどのデバイスドライバ用のキャラクタ型およびブロック型デバイス特殊ファイル
X ウィンドウシステムのオブジェクトは、特殊なファイルシステムインタフェースを介してデータの入出力を処理します。これらの特殊ファイル内のデータは、ファイルシステムオブジェクト内のデータと同じ方法ではアクセスできません。これは、ファイルシステムオブジェクト内のデータは、ファイルシステムのセキュリティポリシーによって保護されており、一方、X ウィンドウサーバーオブジェクトと X ウィンドウシステムオブジェクトは、X ウィンドウシステムセキュリティポリシーによって保護されているためです。
プロセスは、別のプロセスや軽量プロセス (個別にスケジュールされた実行スレッド) 内のデータにアクセスできます。プロセス対プロセス通信にはすべて、プロセス、ネットワーク、プロセス間通信 (IPC) のいずれかのセキュリティポリシーによって保護されます。通信に特殊ファイルが含まれる場合は、ファイルシステムのセキュリティポリシーによってそのファイルは保護されます。
プロセス間通信 (IPC) オブジェクトの種類を次に示します。
名前なしパイプ
名前付きパイプ (FIFO)
マップされたメモリー
System V IPC オブジェクト (メッセージ待ち行列、セマフォ、共有メモリー)
仮想端末デバイス (PTY)
シグナル
プロセスのトレース
ネットワーク通信の終端には、ソケットとトランスポートレイヤーインタフェース (TLI) の終端があります。
ポートにバインドされた INET ドメインソケット
ファイルにバインドされた UNIX ドメインソケット Rendezvous
ポートにバインドされた INET ドメイン TLI
ファイルバインドされた UNIX ドメイン TLI
ポートにバインドされた遠隔手続き呼び出し (RPC)
STREAMS オブジェクトは、ネットワーク用ソフトウェアの基礎となるもので、ネットワークセキュリティポリシーによって保護されます。STREAMS が保持するセキュリティ属性情報は、IPC とネットワーク用 API を介してアクセスします。IPC とネットワー用 API については、本書で詳細に説明しています。「トラステッド streams」では、ある Stream のセキュリティ属性情報に直接アクセスするためのインタフェースの一覧を示していますが、これらのインタフェースの概要やコード例は本書では扱っていません。
Trusted Solaris 7 API は、次に示すセキュリティ機能に対するアクセスを可能にします。この章では、これらの機能の概要を説明します。詳細は、本書の第 2 章以降を参照してください。
ユーザーデータベースとプロファイルデータベースのセキュリティ情報
システムセキュリティ構成の設定
セキュリティ属性情報
ファイルシステムのセキュリティ属性とフラグ
プロセスのセキュリティ属性フラグ
ネットワークのセキュリティ属性
X11 ウィンドウシステムのセキュリティ属性
プロセス対オブジェクト通信
CMW ラベルの使用によりセキュリティ保護されたプロセス間通信
CMW ラベルとファイルシステムセキュリティ属性によってセキュリティ保護されたファイルシステム通信
CMW ラベル、マルチレベルポート、マルチレベルマップ (RPC のみ)、ネットワークセキュリティ属性の使用によりセキュリティ保護されたネットワーク通信
CMW ラベルとウィンドウセキュリティ属性によってセキュリティ保護された X11 ウィンドウシステム間のデータ転送
ラベルビルダー - アプリケーション用のグラフィカルユーザーインタフェースの作成を可能にする API で、エンドユーザーからの入力をもとに、システム上で有効なラベルを作成する
特権をプロセスに設定すると、そのプロセスは、システムセキュリティポリシーによって禁止されている処理を実行できるようになります。Solaris 7 では、実効ユーザー ID: 0 (スーパーユーザー) によるプロセスには、システムセキュリティポリシーは適用されません。しかし、0 以外のユーザー ID によるプロセスは処理が限定されます。Trusted Solaris 7 では、スーパーユーザーは存在しません。どのようなユーザー ID のプロセスに対しても、特定のセキュリティ関連の権限が定義された、さまざまな特権を割り当てることができます。特権および特権によってプロセスが実行できる処理の一覧は、priv_desc(4) を参照してください。
ほとんどのアプリケーションは、セキュリティ関連の権限を実行する必要がないため、特権を使用しません。特権を使用するアプリケーションは、トラステッドコンピューティングベース (Trusted Computing Base、TCB) を使用するアプリケーション (以下、TCB アプリケーション) と呼ばれます。TCB アプリケーションでは、情報が不正に利用されることがないようにコーディングに注意する必要があります。どのような場合に特権が必要になるかの目安は、「セキュリティポリシー」を参照してください。次に示す特権プログラムのコーディングについての情報とガイドラインは、第 3 章「特権」を参照してください。
ファイルとプロセスの特権セットの取得と設定を行う
プロセス特権セット (有効特権セット、許可特権セット、および継承可能特権セット) を設定する
特権 ID を数値型と ASCII 型間で変換する
特権 ID の特権テキストを取得する
あるユーザーによって実行されたプロセスは、承認が必要な処理を実行する前に、そのユーザーの承認を調べます。処理に特権が必要な場合 (通常は必要) は、プロセスが特権を宣言する前に承認が検査されます。承認は、管理者の権限によって割り当てられ、auth_desc(4) に記述されたユーザー処理に対するユーザーアクセスを制御します。次の処理を行うプログラミングインタフェースの詳細は、第 4 章「ユーザー承認のチェック」を参照してください。
ユーザーの承認を検査する
承認セットを処理する
承認 ID を数値型と ASCII 型間で変換する
承認 ID の承認テキストを取得する
CMW ラベルは、データの格付けへのアクセスの制御と、データの格付けの管理を行います。すべてのプロセスとオブジェクトには、2 つのラベル部からなる CMW ラベルがあります。 1 つは、必須アクセス制御 (MAC) が判断のために使用する機密ラベルで、もう 1 つはデータの実際の機密性を識別するための情報ラベルです。
Trusted Solaris 7 では、情報ラベルは機能しません。情報ラベルは、互換性のためだけに CMW ラベルに表示されます。情報ラベルを返す関数の大部分は、デフォルトで情報ラベルを ADMIN_LOW にリセットし、情報ラベルを使用することはありません。
次の処理を行うプログラミングインタフェースの詳細は、第 5 章「ラベル」を参照してください。
ファイルラベルとプロセスラベルの取得と設定を行う
ファイルシステムのラベル範囲を取得する
ラベルを初期化する
2 つのレベル間の高い方の下限または低い方の上限を特定する
「優位」と「同等」の関係によってレベルを比較する
バイナリの情報ラベルを結合する
バイナリのラベル型のチェックと設定を行う
バイナリと ASCII 間、またはバイナリと 16 進間でラベルを変換する
機密ラベルが有効であり、システムまたはユーザーの認可範囲であることをチェックする
label_encodings(4) ファイルから情報を取得する。このファイルはシステム管理者が設定および管理し、システムのラベル定義を含んでいます
ユーザーがワークスペースからアプリケーションを起動するとき、プロセスに対しそのユーザーのセッション認可上限が設定されます。この認可上限を、プロセス認可上限と言います。プロセス認可上限は、プロセスに対し、オブジェクトの CMW ラベルの変更やデータ書き込みの上限を設定します。次の処理を行うプログラミングインタフェースの詳細は、第 7 章「プロセス認可上限」を参照してください。
プロセス認可上限の取得と設定を行う
バイナリの認可上限を初期化する
2 つのレベル間の高い方の下限または低い方の上限を特定する
「優位」と「同等」の関係によってレベルを比較する
バイナリのラベル型のチェックと設定を行う
バイナリと ASCII 間、またはバイナリと 16 進の間で認可上限を変換する
認可上限が有効であることをチェックする
マルチレベルディレクトリ (MLD) では、複数の機密ラベルで動作可能な 1 つのプログラムが、共通のディレクトリを使用して、プロセスが現在動作している機密ラベルのファイルにアクセスできます。1 つの MLD には複数のシングルレベルディレクトリ (SLD) があり、各 SLD はこの SLD の機密ラベルを持つファイルを格納します。1 つの MLD 内では、同じ名前のファイルを複数の SLD に格納できます。このファイルのインスタンスには、それぞれの格納先の SLD の機密ラベルに適したデータが含まれています。これを、ディレクトリとファイルの多重インスタンス化と言います。次の処理を行うプログラミングインタフェースの詳細は、第 8 章「マルチレベルディレクトリ」を参照してください。
シングルレベルディレクトリまたはマルチレベルディレクトリの名前を取得する
シングルレベルディレクトリまたはマルチレベルディレクトリの属性情報を取得する
システムコール内で、シングルレベルディレクトリまたはマルチレベルディレクトリの名前を使用する
他社のアプリケーションを使用する場合、異常ユーザーアクションを監視する監査記録を生成して、システムの不審な利用や異常な動作を検出することができます。他社のアプリケーションの監査について詳細は、第 9 章「アプリケーション監査」を参照してください。
ユーザーデータベースとプロファイルデータベースには、アプリケーションがアクセスできるユーザー、役割、プロファイルの情報が含まれます。次の処理を行うプログラミングインタフェースの詳細は、第 10 章「ユーザーとプロファイルのデータベースエントリへのアクセス」を参照してください。
tsoluser データベース内のユーザーエントリと役割エントリにアクセスする
tsolprof データベース内のプロファイルエントリにアクセスする
Trusted Solaris 7 は、アクセスチェック、所有権チェック、IPC とネットワークの終端オブジェクトに対する情報ラベルの浮上の機能を持つ、ラベル付きプロセス間通信 (IPC) をサポートしています。また、ネットワーク終端オブジェクトに対するセキュリティ属性情報の転送もサポートしています。
ラベル付き終端間通信では、次に示すように、シングルレベル接続、マルチレベル接続、多重インスタンス化された接続が可能です。
シングルレベルのポート接続 - 特権を持たない 2 つのプロセスが同じ機密ラベルで通信する。
マルチレベルのポート接続 - 1 台の特権を持つサーバーが、異なる機密ラベルで動作するひとつ以上の特権を持たないクライアントと通信する。
多重インスタンス化されたポート接続 (UNIX アドレスファミリのみ) - 1 つのマルチレベルディレクトリ (MLD) 内の複数のシングルレベルディレクトリ (SLD) にある同名の複数のファイルを使用した、シングルレベルの接続。多重インスタンス化されたポート接続は、複数の独立した並列バインドを作成します。
詳細は、第 11 章「プロセス間通信」、第 12 章「System V のプロセス間通信」、第 13 章「トラステッドセキュリティ情報交換ライブラリ」、および第 14 章「遠隔手続き呼び出し」を参照してください。
トラステッド (信頼性の高い) 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 章「プログラミングインタフェースの概要」を参照してください。
アプリケーションに、情報ラベルを設定または表示させる
システムに対し、情報ラベルの浮上を有効に設定する
System V IPC オブジェクトに対し、情報ラベルの設定を有効にする (システム上でラベルの浮上が有効に指定されている場合のみ)。
特権を持つアプリケーションをテストする特権デバッグを有効にする。特権デバッグを有効にすると、アプリケーションに必要な特権の一部が欠如している場合でもアプリケーションは成功し、欠如している特権が情報としてコマンド行とファイルに出力されます。特権デバッグを有効にする方法と使用方法の詳細は、『Trusted Solaris 管理の手順』または 「特権デバッグ」を参照してください。
exec(2) を呼び出す前に、情報ラベルを ADMIN_LOW にリセットする
特権を持つプロセスによって機密ラベルが昇格されたファイルの名前を隠す
セキュリティ属性は、ファイルシステム、プロセス、データパケット、通信の終端、X ウィンドウシステムオブジェクトのセキュリティ情報を定義します。
ファイルシステムは、次に示す Solaris 7 と Trusted Solaris 7 のセキュリティ属性を、第 2 章「プログラミングインタフェースの概要」で説明しているプログラミングインタフェースによってアクセス可能なセキュリティ属性セットとして格納します。ファイル特権にアクセスする方法は、第 3 章「特権」を参照してください。
Solaris 7 |
Trusted Solaris 7 |
アクセス制御リスト (ACL) |
CMW ラベル |
任意アクセス制御 (DAC) のアクセス権ビット |
ファイルシステムのラベル範囲 |
ファイルのユーザー ID |
強制特権セットと許容特権セット |
ファイルのグループ ID |
監査の事前選択属性 |
|
属性フラグ |
|
マルチレベルディレクトリの接頭辞 |
ユーザープロセスは、ユーザープロセスを開始したユーザーまたは役割、および開始されたワークスペースから、以下に示す Solaris 7 と Trusted Solaris 7 のセキュリティ属性を受け取ります。
第 7 章「プロセス認可上限」では、プロセス認可上限にアクセスする方法を説明します。
第 5 章「ラベル」では、プロセスのラベルにアクセスする方法を説明します。
第 2 章「プログラミングインタフェースの概要」では、プロセス属性フラグにアクセスする方法を説明します。
第 3 章「特権」では、プロセス特権セットにアクセスする方法を説明します。
プロセス 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 ウィンドウシステムのセキュリティ属性にアクセスする方法は、第 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 章「ラベル」を参照してください。次に概要を示します。
優位 - label_encodings(4) ファイルで定義されているように、格付け階層で高い位置または同じ位置にある
同等 - 階層で同じ位置にある
比較結果は、プロセス認可上限とオブジェクトの機密ラベル間の関係も、優位または同等のいずれかで示します。アクセス操作がオブジェクトの CMW ラベルを変更する場合は、認可上限は機密ラベル部を変更できる最高のレベルに設定します。アクセス操作が上位書き込み (「書き込みアクセス」の項を参照) の場合は、認可上限はプロセスが書き込める最高のレベルに設定します。
Trusted Solaris 7 は、次に示すような、特権を持たないプロセスと、そのプロセスがアクセスするオブジェクト間における必須アクセス制御に基づいた読み取りと書き込み操作をサポートします。オブジェクトに対するこれらの操作の適用の詳細は、「ポリシーの運用」を参照してください。
Trusted Solaris 7 の必須読み取りアクセスの定義には、同位読み取りと下位読み取りがあります。
同位読み取り - 特権のないプロセスは、プロセスの機密ラベルがオブジェクトの機密ラベルと同等の場合にのみ、オブジェクトから読み取りできる
下位読み取り - 特権のないプロセスは、プロセスの機密ラベルがオブジェクトの機密ラベルよりも優位で、かつ、これらのラベルが同等でない場合にのみ、低い機密ラベルのオブジェクトから読み取りできる
Trusted Solaris 7 の必須書き込みアクセスの定義には、同位書き込みと上位書き込みがあります。
同位書き込み - 特権のないプロセスは、プロセスの機密ラベルがオブジェクトの機密ラベルと同等の場合にのみ、オブジェクトに書き込める
上位書き込み - 特権のないプロセスは、オブジェクトの機密ラベルがプロセスの機密ラベルよりも優位で、かつ、これらのラベルが同等でない場合にのみ、高い機密ラベルのオブジェクトに書き込める
アプリケーションが特権なしで実行できるかどうかを調べるには、どの処理がどの特権をいつ必要とするかを知る必要があります。次に、アプリケーションに必要な特権を決定するガイドラインを示します。
特別な処理を実行することがなく、システムの必須アクセス権、任意アクセス権、および所有権制御の範囲内で動作するアプリケーションは特権を必要としません。
オブジェクトに対する読み取り、書き込み、実行、検索の権利が必要なアプリケーション処理は、プロセスに任意アクセス権または必須アクセス権がない場合には特権が必要です。プロセスにアクセス権または必要な特権がない場合、外部変数 errno が EACCES または ESRCH に設定されます。このエラーを修正するために必要な特権は、マニュアルページの EACCES エラーまたは ESRCH エラーに示されています。
アプリケーション処理が修正しようとしているオブジェクトが、そのオブジェクトを所有するプロセスからしか修正できないとき、修正を行うプロセスがそのオブジェクトを所有していない場合には特権が必要です。プロセスがそのオブジェクトを所有していないか、あるいはプロセスに適切な特権がない場合、外部変数 errno が EPERM に設定されます。このエラーを修正するための特権は、マニュアルページの「機能説明」の節と EPERM エラーのページに示されています。
アプリケーション処理の中には、常に (任意アクセス権と必須アクセス権が与えられている場合でも) 特権を必要とするものがあります。この例として、実効可能ファイルに対する特権の設定や、ほかのデバイスへのコンソール出力のリダイレクトがあります。プロセスにこのような処理に対する特権がない場合、外部変数 errno が EPERM に設定されます。このエラーを修正するための特権は、マニュアルページの「機能説明」の節と EPERM エラーのページに示されています。
特権の詳細を述べたマニュアルページの出力方法については、付録 A 「プログラマーズリファレンス」を参照してください。
管理アプリケーションは、管理用の機密ラベル ADMIN_HIGH または ADMIN_LOW で動作します。ADMIN_HIGH では、管理アプリケーションは、任意アクセス権のあるすべてのオブジェクトに対し下位読み取りができます。また、ADMIN_LOW では、任意アクセス権のあるすべてのオブジェクトに対し、上位書き込みができます。管理者は、通常、下位読み取り操作を実行する場合は、アプリケーションを ADMIN_HIGH で起動し、上位書き込み操作を実行する場合は、同じアプリケーションを ADMIN_LOW で起動します。これらの場合、アプリケーションに任意アクセス権があるかぎり、特権は必要ありません。
ラベルを ADMIN_HIGH や ADMIN_LOW に初期化する方法は、第 6 章「ラベルのコード例」の 「バイナリラベルの初期化と型のチェック」を参照してください。
ユーザーは、通常、アプリケーションを一定の機密ラベルで起動し、同じ機密ラベルのオブジェクトにアクセスします。別の機密ラベルでデータを保持する場合は、通常、ワークスペースの機密ラベルを変更して、この新しい機密ラベルでアプリケーションを起動します。この場合、アプリケーションに任意アクセス権があれば、特権は必要ありません。
ユーザーアプリケーションが、アプリケーションが動作している機密ラベルとは異なる機密ラベルのオブジェクトにアクセスするように設計されている場合で、必須アクセスが拒否された場合は、そのアプリケーションには特権が必要な場合があります。
必須アクセス制御の適用の回避またはプロセスやオブジェクトの機密ラベルの変更を行う特権を使用する上でのガイドラインは、第 5 章「ラベル」の 「ラベルのガイドライン」を参照してください。
UNIX では、すべての入出力はファイルインタフェースを介して行われるため、ファイルシステムのセキュリティポリシーは、Trusted Solaris 7 全体に適用されます。
ここでは、ファイルシステムのセキュリティポリシーの次の点について説明します。
プロセスと目的のオブジェクトが含まれているパス名の間の、必須アクセスチェックと任意アクセスチェック
プロセスと目的のオブジェクト間の、必須アクセスチェックと任意アクセスチェック
プロセス間通信 (IPC) のセキュリティポリシーについては、アクセスするプロセスとアクセスされるプロセス間の必須の読み取りアクセスおよび書き込みアクセスのチェックについて説明します。一部の IPC 機構と X ウィンドウシステムオブジェクトはファイルを使用しているので、この節で説明するファイルシステムのセキュリティポリシーがそれらの操作にも適用されます。IPC 機構によっては、下位読み取りと上位書き込みのセキュリティポリシーを持つものがあります。また、制限の強い同位読み取りと同位書き込みポリシーを持つ IPC 機構もあります。X ウィンドウシステムは、同位書き込みと下位読み取りポリシーを持ちます。特定のセキュリティポリシー情報については、次に示す章を参照してください。
第 11 章「プロセス間通信」では、同じホスト上のプロセス間通信とネットワークを介したプロセス間通信のセキュリティポリシーについて説明します。
第 15 章「トラステッド X ウィンドウシステム」では、X11 ウィンドウのプロパティとリソースデータに対するアクセスのセキュリティポリシーについて説明します。
この節では、次に示すファイルオブジェクトに対する必須アクセスチェックと任意アクセスチェックについて説明します。
ディレクトリ - 通常のディレクトリとマルチレベルディレクトリ
ファイル - 通常のファイル、実行可能ファイル、デバイス特殊ファイル、シンボリックリンク
プロセスの所有者には、目的のオブジェクトが含まれているパス内のすべてのディレクトリに対する任意検索 (実行) 権がなければなりません。目的のオブジェクトに到達すると、アクセス操作は次のように実行できます。
ファイルからの読み取りまたはディレクトリ内容の表示 - プロセスに、オブジェクトのパス内のすべてのディレクトリに対する任意検索 (実行) アクセスと、オブジェクトに対する任意読み取りアクセスがある場合、任意読み取りを実行できます。
ファイルに対する書き込み、ファイルまたはディレクトリの作成、ファイルまたはディレクトリの削除 - プロセスに、オブジェクトのパス内のすべてのディレクトリに対する任意検索 (実行)アクセスと、オブジェクトに対する任意書き込みアクセスがある場合、任意書き込みを実行できます。
実行可能ファイル - プロセスに、ファイルのパス内のすべてのディレクトリに対する任意検索 (実行) アクセスと、ファイルに対する任意実行アクセスがある場合、任意実行を実行できます。
任意アクセス制御 (DAC) チェックが済むと、目的のファイルが含まれているパス内のすべてのディレクトリについて、必須検索アクセスが必要となります。ディレクトリに対する必須検索アクセスは、プロセスの機密ラベルがパス内のすべてのディレクトリの機密ラベルより優位な場合に与えられます。目的のファイルに到達すると、アクセス操作は次のように実行されます。
ファイルからの読み取り、ファイルの実行、ディレクトリ内容の一覧、ファイルのセキュリティ属性の表示、セキュリティ属性フラグの表示 - プロセスにパス内のすべてのディレクトリに対する必須検索アクセスがあり、プロセスの機密ラベルが目的のオブジェクトの機密ラベルより優位な場合は、必須読み取りを実行できます。目的のオブジェクトがデバイス専用ファイルの場合、プロセスの機密ラベルはデバイスの機密ラベルと同等でなければなりません。
ファイルへの書き込み、セキュリティ属性の変更、ファイルセキュリティ属性フラグの変更、ファイルの削除 - プロセスにパス内のすべてのディレクトリに対する任意検索アクセスと必須検索アクセスがあり、ファイルの機密ラベルがプロセスの機密ラベルより優位な場合は、必須書き込みを実行できます。目的のオブジェクトがデバイス専用ファイルの場合、プロセスの機密ラベルはデバイスの機密ラベルと同等でなければなりません。
ファイルまたはディレクトリの作成 - 作成アクセスは同位書き込みです。プロセスがファイル、ディレクトリ、シンボリックリンクを作成する場合、プロセスの機密ラベルはファイルまたはディレクトリの機密ラベルと同等でなければなりません。
ファイルシステムオブジェクトに対する任意または必須のアクセスチェックが失敗した場合、プロセスは、セキュリティポリシーの適用を回避する特権を表明できます。また、現行のラベル、またはユーザーに対してその処理を許容すべきでない場合は、エラーを出すことができます。
任意アクセスは、次のように有効になります。
目的のファイルシステムオブジェクトが含まれるパス内のすべてのディレクトリに対する検索アクセスは、プロセスが file_dac_search 特権を表明する場合に有効になります。
目的のオブジェクトに対する読み取りアクセスは、プロセスが file_dac_read 特権を表明する場合に有効になります。
目的のオブジェクトに対する書き込みアクセスは、プロセスが file_dac_write 特権を表明する場合に有効になります。
目的のオブジェクトに対する実行アクセスは、プロセスが file_dac_execute 特権を表明する場合に有効になります。
必須アクセスは、次のように有効になります。
目的のファイルシステムオブジェクトに含まれるパス内のすべてのディレクトリに対する検索アクセスは、プロセスが file_mac_search 特権を表明する場合に有効になります。
目的のオブジェクトに対する実行アクセスを含む読み取りアクセスは、プロセスが file_mac_read 特権を表明する場合に有効になります。
目的のオブジェクトに対する書き込みアクセスは、プロセスが file_mac_write 特権を表明する場合に有効になります。
目的のオブジェクトに対する作成アクセスは、プロセスが file_mac_write 特権を表明する場合に有効になります。
必須アクセスチェックと任意アクセスチェックは、ファイルシステムオブジェクトが開かれるときにパス名に対して実行されます。ほかのシステムコールでそのファイル記述子が使用される場合、それ以上アクセスチェックは行われません。ただし、次の場合を除きます。
ファイルが書き込みのために開かれ、その後記述子が読み取りのために fstat(2) システムコールで使用される。この場合、読み取りに対してアクセスチェックが行われ、アクセスが拒否される場合には特権が必要になる場合があります。
ファイルが読み取りのために開かれ、その後記述子が書き込みのために fchmod(2) システムコールで使用される。この場合、書き込みアクセスに対してアクセスチェックが行われ、アクセスが拒否される場合には特権が必要になる場合があります。
この節の例は、読み取り、書き込み、検索、実行操作のため、プロセスがファイルシステムオブジェクトにアクセスする場合に考慮すべき事項を示しています。
この例では、プロセスが、読み取りと書き込みで /export/home/heartyann/somefile にアクセスし、実行で /export/home/heartyann/filetoexec にアクセスすることを想定します。両方のファイルとも Confidential で保護されています。プロセスの機密ラベルは Secret で、プロセス認可上限は Top Secret です。Confidential は Secret よりも低く、Secret は Top Secret よりも低いラベルです。
次の図に示すように、パス /export/home の機密ラベルは ADMIN_LOW で、heartyann ディレクトリと somefile の機密ラベルは Confidential です。
このプロセスは、somefile と somefile のパス内のディレクトリの所有権は持っていません。
/export に対する任意アクセス権によって、所有者とグループには読み取り、書き込み、検索の権限が与えられ、その他のユーザーには読み取りと検索の権限が与えられます。
/export/home に対する任意アクセス権によって、所有者には読み取り、書き込み、検索の権限が与えられ、グループとその他のユーザーには読み取りと検索の権限が与えられます。
/export/home/heartyann に対する任意アクセス権によって、所有者とグループには読み取り、書き込み、検索の権限が与えられ、その他のユーザーには読み取りと検索の権限が与えられます。
somefile に対する任意アクセス権によって、所有者には読み取りと書き込みの権限が与えられ、グループとその他のユーザーには読み取り権だけが与えられます。
filetoexec に対する任意アクセス権によって、所有者には読み取り、書き込み、実行の権限が与えられ、グループとその他のユーザーには読み取りと実行の権限が与えられます。
プロセスが必須または任意のアクセスチェックに失敗した場合は、プログラムはエラーを表明するか、適切な特権を表明する必要があります。
アクセス制御の適用を回避するため特権を使用する場合の機密ラベルの処理の詳細は、第 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);
open(2) システムコールに対する必須アクセスチェック - プロセスは /export/home/heartyann に対する必須検索アクセスと、somefile に対する必須読み取りアクセスを必要とします。このプロセスは Secret で動作しているので、両方の必須アクセスチェックの条件を満たしています。
open(2) システムコールに対する任意アクセスチェック - プロセスは /export/home/heartyann に対する任意検索アクセスと、somefile に対する任意読み取りアクセスを必要とします。このディレクトリパスと somefile 上のその他ユーザーに対するアクセス権ビットは、必要な任意の検索権と読み取り権を与えます。
read(2) システムコールに対する必須アクセスチェック - 必須アクセスチェックは、somefile が開かれたときに実行されます。ほかにはアクセスチェックは行われません。
read(2) システムコールに対する任意アクセスチェック - 任意アクセスチェックは、somefile が開かれたときに実行されます。ほかにはアクセスチェックは行われません。
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);
open(2) システムコールに対する必須アクセスチェック - プロセスは /export/home/heartyann に対する必須検索アクセスと、somefile に対する必須書き込みアクセスを必要とします。Secret で動作中のプロセスは必須検索のアクセスチェックの条件を満たしますが、必須書き込みのアクセスチェックの条件は満たしていません。必須書き込みアクセスが有効になるためには、somefile の機密ラベルはプロセスの機密ラベルより優位でなければなりませんが、実際には優位ではありません。つまり、Confidential は Secret より優位ではありません。プロセスは、file_mac_write 特権を表明してこの制限を無効にすることも、エラーを表明することもできます。
open(2) システムコールに対する任意アクセスチェック - プロセスは /export/home/heartyann に対する任意検索アクセスと、somefile に対する任意書き込みアクセスを必要とします。このディレクトリパスと somefile 上のその他ユーザーに対するアクセス権ビットは、任意検索アクセスを与えますが、任意書き込みのアクセスチェックの条件をパスしません。プロセスは、file_dac_write 特権を表明してこの制限を無効にすることも、エラーを表明することもできます。
write(2) システムコールに対する必須アクセスチェック - 必須アクセスチェックは、somefile が開かれているときに行われます。ほかのアクセスチェックは行われません。
write(2) システムコールに対する任意アクセスチェック - 任意アクセスチェックは、somefile が開かれているときに行われます。ほかのアクセスチェックは行われません。
Secret プロセスは、Confidential の /export/home/heartyann シングルレベルディレクトリ内の実行可能ファイルを実行します。
retval = execv(file, argv); }
execv(2) システムコールに対する必須アクセスチェック - プロセスは、/export/home/heartyann に対する必須検索アクセスと、file に対する必須読み取りアクセスを必要とします。ファイルに対する必須読み取りアクセスが必要なのは、ファイルを実行するためです。Secret で動作中のプロセスは、これら両方の必須アクセスチェックの条件を満たします。
execv(2) システムコールに対する任意アクセスチェック - プロセスは、/export/home/heartyann に対する任意検索アクセスと、file に対する任意実行アクセスを必要とします。このディレクトリパスと file のアクセス権ビットは、file に対する任意の検索アクセスと実行アクセスを与えます。