この付録では、次の項目に関する参照情報を挙げます。
Trusted Solaris 7 リリースは、Solaris 7 のマニュアルページと Trusted Solaris 7 固有のマニュアルページをインストールします。Solaris 7 のマニュアルページは、Trusted Solaris 7 に関連するセキュリティ関係の情報を含むように適宜変更されます。マニュアルページを要求すると、変換されたページが存在する場合、特に変更前の Solaris 7 マニュアルページを要求しないかぎり、変更されたマニュアルページが表示されます。
変更された Solaris 7 マニュアルページと Trusted Solaris 7 固有のマニュアルページはすべて、拡張子 tsol を持ち ‾/man/man*tsol にインストールされます。これらのマニュアルページは、man コマンドを使用してアクセスします。
Solaris 7 マニュアルページを表示するには、オプション -s を指定して man コマンドを実行します。
Trusted Solaris 7 マニュアルページの特定のセクションを表示するには、-stsol を使用します。
次の最初の man コマンドは、fork(2) の Solaris 7 マニュアルページを表示します。2 番目と 3 番目のコマンドは、Trusted Solaris 7 マニュアルページを表示します。
man -s2 fork
man fork
man -s2tsol fork
次の最初の man コマンドは、getfsattr(2TSOL) を表示します。2 番目のコマンドは、getfsattr(1MTSOL) を表示します。
man -s2tsol getfsattr
man getfsattr
次の man コマンドは、同じ名前を持つマニュアルページが入ったすべてのセクションを表示します。
man -l <マニュアルページ名>
次の最初の man コマンドは、Trusted Solaris 7 マニュアルページセクションに対する intro マニュアルページを表示します。2 番目の man コマンドは、Solaris 7 セクションに対する intro マニュアルページを表示します。
man -s<マニュアルページのセクション名>tsol intro
man -s<マニュアルページのセクション名> intro
intro マニュアルページには、Trusted Solaris 7 マニュアルページの全体的なセキュリティポリシー情報がまとめられています。特定のマニュアルページのインタフェースに固有のセキュリティ情報は、「機能説明」セクション、EPERM、EACCES、ESRCH の「エラー」セクション、そして最後の「Trusted Solaris 変更の概要」セクションに挙げられています。
ライブラリルーチンのマニュアルページにセキュリティ情報がなく、そのルーチンに内部で使用しているシステムコールがある場合、内部のシステムコールのマニュアルページを調べてください。内部のシステムコールは、その上に構築されるすべてのライブラリルーチンに対しセキュリティポリシーを運用します。
ライブラリルーチンとシステムコールが fopen(3S) と open(2) のような似た名前を持つ場合、ポリシー情報は、システムコールのマニュアルページだけに示されています。
システムコールに基づくルーチンのライブラリルーチンマニュアルページでは、「参照」セクションから、ポリシー情報が入ったシステムコールのマニュアルページに相互参照ができます。
ある Solaris 7 インタフェースに Trusted Solaris 7 マニュアルページが存在しない場合、そのインタフェースは Trusted Solaris 7 用に変更されていないか、または変更されているけれど Trusted Solaris 7 ではそのインタフェースを使用する際に注意するべきセキュリティ関連の動作がないかのどちらかです。
特権が必要なあらゆるアプリケーションで使用するためには、共有ライブラリはトラステッドである必要があります。Trusted Solaris では、特権を持つアプリケーションと共有ライブラリの動的なリンクは制限されています。これは、特権を持つアプリケーションが非トラステッドライブラリを使用することを防ぐためです。特権を持つアプリケーションが非トラステッドライブラリへのリンクを試みると、「エラー : **** ライブラリを読み込むことができません。」などのエラーが表示され、失敗します。
この節以降では、トラステッドライブラリに動的にリンクするため特権を持つアプリケーションをどのように設定するかを理解するために、開発者が知る必要のある事柄を次の点を含めて説明します。
トラステッドライブラリのデフォルトのディレクトリ位置
標準でないトラステッドライブラリディレクトリのパス名の指定方法
デフォルトのトラステッド共有ライブラリは、表 A-1 に示すディレクトリに格納されています。
表 A-1 トラステッド共有ライブラリのデフォルトディレクトリ
トラステッド C 関数ライブラリ |
X Server に対するトラステッド拡張機能 |
---|---|
/usr/lib |
/usr/openwin/lib |
/etc/lib |
/usr/dt/lib |
表 A-1 に示したディレクトリは、必須アクセス制御と任意アクセス制御によって、承認のない変更が行われないように保護されます。
特権を持つプログラムは、表 A-1 に示されたデフォルトに対応する LD_LIBRARY_PATH ディレクトリのサブセットと、セキュリティ管理者が rtld ファイルに挙げたディレクトリだけを検索します (rtld ファイルについては、「他社またはサイトで作成したアプリケーションが使用する共有ライブラリ」を参照)。そのため、トラステッドライブラリに対し標準以外の位置を指定する必要がある場合、開発者は、プログラムの LD_LIBRARY_PATH 環境変数に、rtld ファイルに指定されたアプリケーションのトラステッドディレクトリを含める必要があります。
他社またはサイトで作成したアプリケーションにサイトのセキュリティ管理者から特権が付与される場合、トラステッドアプリケーションが使用している共有ライブラリは、可能なかぎり表 A-1 に示すデフォルトのトラステッド共有ライブラリのどれかに移動しなければなりません。セキュリティ管理者は /etc/security/tsol の rtld ファイルに特権を持つアプリケーションのライブラリのディレクトリパス名をリストすることができますが、ライブラリを既存のトラステッドディレクトリの 1 つに移動できない場合にだけそのように処理してください。プログラムの実行時には、rtld にリストされたライブラリはすべて LD_LIBRARY_PATH 変数に指定されている必要があります。
特権が付与されているアプリケーションはすべて、トラステッドになります。特権を付与するセキュリティ管理者は、特権を使用するトラステッドプログラムが実際に信頼 (トラスト) できるかを確認する必要があります。rtld にリストされたアプリケーションのライブラリはどれもトラステッドになるため、指定されたディレクトリはデフォルトのライブラリディレクトリと同じレベルの保護を必要とします。セキュリティ管理者は、rtld にリストされたトラステッドライブラリディレクトリの MAC と DAC アクセス権およびそれらの内容が、デフォルトのトラステッドディレクトリライブラリのディレクトリおよびそれらの内容と同じであることを確認する必要があります。
オブジェクトファイルのリンカーと rtld ファイルの詳細は、ld(1) のマニュアルページを参照してください。
サイト外で作成された特権を持つ Java プログラムを移植する場合、セキュリティ管理者は、Java ライブラリのパス (たとえば /usr/java/lib) を使用して /etc/security/tsol/rtld を更新する必要があります。また、rtld に指定されたパス名が、アプリケーションの LD_LIBRARY_PATH 変数設定にも加えられていることを確認する必要があります。
開発者が特権を持つ Java アプリケーションをサイトで作成する場合には、サイトのセキュリティ管理者はその Java アプリケーションが使用するライブラリをトラステッドディレクトリの 1 つに移動し、そのライブラリが実行時に動的にリンクできるように設定できます。
ほとんどの Trusted Solaris 7 ヘッダーファイルは、/usr/include/tsol に入っており、/usr/include/sys/tsol のヘッダーをインクルードしています。しかし、一部のヘッダーファイルは、Solaris 7 から変更されているため次に示すディレクトリに入っています。
ヘッダーファイル名 |
インタフェース区分 |
/usr/dt/include/label_clipping.h |
X11 ウィンドウのラベル変換 |
/usr/dt/include/Dt/ModLabel.h |
ラベルビルダー |
/usr/openwin/include/tsol/Xtsol.h |
X ウィンドウシステム |
/usr/dt/include/Dt/label_clipping.h |
フォントリストを使用したラベルクリッピング |
/usr/include/rpc/rpc.h |
遠隔手続き呼び出し (RPC) |
/usr/include/sys/ipc/ipc/h |
プロセス間通信 (IPC) |
/usr/include/sys/msg.h |
System V メッセージ待ち行列 |
/usr/include/sys/sem.h |
System V セマフォセット |
/usr/include/sys/shm.h |
System V 共有メモリー領域 |
/usr/include/sys/tsol/stream.h |
トラステッド streams |
/usr/include/bsm/auditwrite.h |
監査 |
Trusted Solaris インタフェースおよびデータ構造名の多くは、次に示す短い省略名を使用しています。これらの省略名の意味を知ることは、その名前が示すインタフェースや構造体の目的を理解する上で参考になります。
attr |
attribute (属性) |
auth |
authorization (承認) |
b |
binary (バイナリ) |
c または cl |
CMW Label (CMW ラベル) |
clear |
clearance (認可上限) |
cmw |
CMW label (CMW ラベル) |
ent |
entry (エントリ) |
f |
file (ファイル) |
fs |
file system (ファイルシステム) |
h |
hexadecimal (16 進) |
i または il |
information Label (情報ラベル) |
iil |
input information label (入力情報ラベル) |
im |
information Label markings (情報ラベルのマーク付け) |
l |
level (レベル)、label (ラベル)、または symbolic link (シンボリックリンク) |
lbuild |
label builder (ラベルビルダー) |
mld |
multilevel directory (マルチレベルディレクトリ) |
p |
process (プロセス) |
priv |
privilege (特権) |
prof |
profile (プロファイル) |
prop |
properties (プロパティ) |
r |
reentrant (再入可能) |
res |
resource (資源) |
s |
string (文字列) |
sec |
security (セキュリティ) |
sl |
sensitivity Label (機密ラベル) |
sld |
single-level directory (シングルレベルディレクトリ) |
t6 または TSIX |
Trusted Security Information Exchange (トラステッドセキュリティ情報交換) |
tp |
Trusted Path (トラステッドパス) |
tsol |
Trusted Solaris |
xtsol |
Trusted X11 サーバー |
開発、テスト、およびデバッグは、メインシステム上のセキュリティポリシーにソフトウェアのバグや未完成のコードで害を与えないように、独立した開発システムで行うことをお勧めします。
余分なデバッグコード (特に、マニュアルにない機能やセキュリティチェックを回避する不法な手段) を削除します。
インストール前にシステム管理者がセキュリティ問題を検査できるように、アプリケーションのデータ操作を簡単にします。
すべてのプログラミングインタフェースのコードが正しく実行されるかどうかをテストします。呼び出しに失敗すると、予測しない結果を招くことがあります。予測しないエラー状況が発生した場合には、必ずアプリケーションを終了させなければなりません。
実行予定のすべての機密ラベルと役割を使用してアプリケーションを実行し、すべての機能をテストします。
プログラムが役割ではなく一般ユーザーによって実行される場合、ユーザー認可範囲の実行予定のラベルで一般ユーザーとしてコマンド行からプログラムを起動します。
プログラムが役割によって実行される場合、実行予定の管理ラベル (ADMIN_HIGH または ADMIN_LOW) で管理役割から、あるいはユーザー認可範囲の実行予定ラベルでユーザー役割から、コマンド行で起動します。
アプリケーションに必要な特権がすべてあるか、アプリケーションが試行すべきでない特権作業を試行していないかを知るために、特権デバッグモードですべての機能をテストします。
特権ブラケットを理解し、設定を行います。
特権の使用によるセキュリティ上の影響を理解し、アプリケーションが特権を使用することによりシステムセキュリティを侵害しないことを確認します。
特権アプリケーションを検査するために、SUNWSpro debugger/dbx/dbxtool を実施する場合、初めにデバッガを始動させ、後でデバッガを実行中のプロセスに渡さなければなりません。コマンド名を引数としてデバッガを始動させることはできません。
特権デバッグモードについては、『Trusted Solaris 管理の手順』で説明しています。ここでは、特権デバッグを有効にする手順と、特権デバッグモードで runpd(1M) を使用してアプリケーションをテストする手順の概要を述べます。
特権デバッグモードは、必要な特権を持たないアプリケーションの実行を成功させ、どの特権が欠如しているかを示します。
/etc/system ファイルで、tsol_privs_debug 変数を 1 に設定します。このファイルは ADMIN_LOW で、所有者はスーパーユーザー (root) です。
/etc/syslog.conf ファイルで、kern.debug 行すなわち local0.debug 行のコメントを解除します。このファイルは ADMIN_LOW で、所有者は sys です。
/var/log/privdebug.log ファイルが存在していなければ作成します。このファイルは ADMIN_HIGH で、所有者はスーパーユーザー (root) です。
システムをリブートします。
プロファイル内の runpd(1M) を使用して、管理役割を取得します。
runpd(1M) コマンドを使用して、実行可能ファイルを起動し、欠如している特権がないか確認します。次のコマンド行は、Zelda の Confidential ホームディレクトリ内の実行可能ファイルを起動します。欠如している特権に関する情報が、コマンド行に表示されるとともに /var/log/privdebug.log ファイルに記録されます。
phoenix# runpd /export/home/.MLD.Zelda/.SLD.2/executable runpd terminated with a status of 1 process runpd pid 822 lacking privilege file_mac_search to perform special method upon resource VNODE (Jan 29 12:45) process runpd pid 822 lacking privilege file_mac_read to perform read method upon resource VNODE (Jan 29 12:45) |
/var/log/privdebug.log ファイル内の特権番号を解釈します。特権番号は、語句の特権の後に現れます。プロセス 822 には、file_mac_search と file_mac_read に対応する特権番号 11 と 10 が欠如しています。
Jan 29 12:45:39 phoenix unix DEBUG: runpd pid 822 lacking privilege 11 to 5 79 Jan 29 12:45:39 phoenix unix DEBUG: runpd pid 822 lacking privilege 10 to 2 79 |
組織内のほかのユーザーに配布して使用させるための特権を持つスクリプトを作成する方法は、『Trusted Solaris 管理の手順』で説明しています。この節では、setfpriv(1) を使用するスクリプトを作成し、アプリケーション開発時にアプリケーションのテストとデバッグを行う実行可能ファイルに強制された特権と許容された特権を割り当てる方法の概要を述べます。
まず、作業対象のユーザーまたは役割に、setfpriv(1) コマンドを持つプロファイルとそれに対する file_setpriv 特権が必要です。このコマンドと特権は、デフォルトシステムのオブジェクト特権管理プロファイルに入っています。任意のシェルからスクリプトを実行し、スクリプトによって起動されたコマンドをそのプロファイルシェルで実行してプロファイル特権を継承させるには、次の例に示すようにスクリプトの先頭で pfsh(1M) を起動します。
この例は、executable (実行可能ファイル) に強制された特権と許容された特権を割り当てます。-s -f オプションは、executable に強制された特権を設定します。-a オプションは、executable に許容された特権を設定します。このスクリプトは、file_setpriv 特権がコマンドによって継承されないかぎり、「executable: not owner (executable : 所有者ではありません)」というエラーを出力して終了します。
#/bin/pfsh setfpriv -s -f ipc_mac_write,ipc_upgrade_il,proc_setsl,sys_trans_label -a ipc_mac_write,ipc_upgrade_il,proc_setsl,sys_trans_label executable
スクリプトを使用して実行可能ファイルに強制された特権と許容された特権を設定する場合、次の点に注意してください。
スクリプトに指定された許容セットから特権を削除する場合、強制セットからもその特権を削除する必要があります。許容セットからだけ特権を削除すると、スクリプトの実行時に「executable: Invalid argument (executable : 引数が正しくありません)」というエラーが出力されます。
プログラムが特権を継承する場合、継承される特権を持つプロファイルシェルでコマンド行からプログラムを起動します。
実行可能ファイルの許容セットには、継承される特権が必要です。
プログラムが特権を継承するだけの場合、実行可能ファイルの強制セットは空でなければなりません。
いつ継承されたかによって特権の強制時にプログラムが異なるアクションを実行する場合、特権を強制セットと許容セットに設定してプログラムを起動し、続いて特権を許容セットに設定して継承される特権を持つプロファイルシェルから再度プログラムを起動してください。
プログラムは、必ず実行時に使用するすべてのラベルでテストしてください。
テストとデバッグが完了したアプリケーションは、アプリケーション統合のためにシステム管理者に提出します。アプリケーションは、CDE アクションまたはソフトウェアパッケージとして提出できます。アプリケーションが特権を使用する場合、システム管理者またはシステム管理者に代わる人物は CDE アクションまたはソフトウェアに提供されるアプリケーションソースコードとセキュリティ情報を評価し、特権の使用によってシステムセキュリティが侵害されないかを検証します。
アプリケーションが使用する新しい監査イベント、監査クラス、または X ウィンドウシステムのプロパティを、システム管理者に報告し、適切なファイルに格納してもらいます。詳細は、第 9 章「アプリケーション監査」と第 15 章「トラステッド X ウィンドウシステム」を参照してください。
CDE アクションは、ユーザーまたは役割によってワークスペースから起動され、そのユーザーまたは役割のプロファイルにより CDE アクションに割り当てられている特権を継承します。CDE アクションは、アプリケーションの実行やデータファイルを開くなどのデスクトップ作業を自動化するアプリケーションマクロやプログラミングインタフェースのように動作する命令セットです。Trusted Solaris 7 では、アプリケーションはワークスペースから CDE アクションとして開始されます。CDE アクションの作成方法の詳細は、『Solaris 共通デスクトップ環境 上級ユーザ及びシステム管理者ガイド』(805-5136-10) を参照してください。このマニュアルは、Sun の SunSoft で作成しています。
CDE アクションを作成する場合、f.exec ではなく必ず f.action を作成してください。f.exec は、プログラムをすべての特権を持つスーパーユーザーとして実行します。
システム管理者は、CDE アクションを適切なプロファイルに入れ、継承可能な特権があればその CDE アクションに割り当てます。CDE アクションに対応した実行可能ファイルは、プログラムが特権を継承する場合、許容された特権を必要とします。強制された特権は、必要な場合と不要な場合があります。開発者は、プログラムが継承可能な特権、強制された特権、および許容された特権を使用する場合はそれらをリストし、アプリケーションを実行するラベルを指定し、必要となる実効ユーザー ID と実効グループ ID を指定する必要があります。システム管理者は、実行可能ファイルに対して強制された特権と許容された特権を割り当て、プロファイル内の CDE アクションに対して継承可能な特権、ラベル範囲、実効ユーザー ID と実効グループ ID を割り当てます。
System V Release 4 のアプリケーションバイナリインタフェース (ABI) は、システム管理者により統合されるソフトウェアパッケージを作成する「ソフトウェアのパッケージ化」と呼ばれるソフトウェア配布モデルを指定します。ABI モデルを使用して配布されるソフトウェアはすべて、あらゆる ABI 準拠システムへのインストールが保証されています。
ソフトウェアパッケージを作成する場合、パッケージのインストール手続きに使用するオプションの tsolinfo(4) ファイル (以下を参照) にセキュリティ属性情報を指定します。このファイルがオプションなのは、パッケージのインストールの際、デフォルトのセキュリティ属性が割り当てられるのは、セキュリティ属性情報がパッケージに提供されていないときだからです。
パッケージは、パッケージオブジェクトと制御ファイルから構成されます。パッケージオブジェクトはインストールされるファイルであり、制御ファイルは、パッケージがインストールされるかどうか、インストールされる場合にはいつ、どこで、どのように行われるかを制御するファイルです。システム上のインストール済みパッケージについての情報は、/var/sadm/install/contents 内のソフトウェアインストールデータベースに格納されています。
次に、ABI 準拠のソフトウェアパッケージの作成とインストールを行う Solaris 7 コマンドを示します。
pkginfo(1) |
ソフトウェアパッケージ情報を表示する |
pkgparam(1) |
パッケージのパラメータ値を表示する |
pkgask(1M) |
要求スクリプトを作成する |
installf(1M) |
ソフトウェアインストールデータベースにエントリを追加する |
removef(1M) |
ソフトウェアインストールデータベースからエントリを削除する |
パッケージを作成するには、次のファイルを設定します。
必要に応じたオプションの情報ファイル
オプションの必須アクセス制御 (MAC) セキュリティ属性ファイル、tsolinfo(4)
必要に応じたオプションのパッケージ化スクリプト
pkgmk(1) は、pkginfo(4) と prototype(4) を使用して、ソフトウェアパッケージを構築します。オプションのスクリプトは、インストールのカスタマイズとパッケージの削除を行います。
tsolinfo(4) ファイルは、特殊なセキュリティ属性を必要とするパッケージオブジェクトに対応したエントリを含みます。対応する tsolinfo エントリがパッケージオブジェクトに含まれない場合には、パッケージの最終的なインストール先であるファイルシステムのデフォルトのセキュリティ属性セットが割り当てられます。このファイルは、次のフォーマットで、パッケージオブジェクトごとに 1 つ以上のエントリを含むことができます。フォーマット内のフィールドは、各エントリごとに必要です。
attribute_name object_name attribute_value
次に、使用できる属性名、それらの意味、および指定方法を示します。
属性名 |
内容 |
属性値 |
---|---|---|
forced_privs |
パッケージオブジェクトは強制された特権 |
コンマで区切られた特権リスト |
allowed_privs |
パッケージオブジェクトは許容された特権 |
コンマで区切られた特権リスト |
public |
パッケージオブジェクトは public |
属性値なし |
mld |
パッケージオブジェクトはマルチレベルディレクトリ |
属性値なし |
次の例、tsolinfo(4) ファイルエントリは、sendmail(1M) パッケージオブジェクトのセキュリティ属性を指定します。
属性名 |
パッケージオブジェクト名 |
属性値 |
mld |
var/spool.mail |
|
mld |
var/mail |
|
mld |
var/tmp |
|
allowed_privs |
usr/lib/sendmail |
all |
forced_privs |
usr/lib/sendmail |
file_mac_write、 file_nofloat |
label |
etc/security/tsol |
admin_high[admin_high] |
var/spool/mail、var/mail、var/tmp パッケージオブジェクトは、マルチレベルディレクトリです。MLD 属性には、属性値はありません。
usr/lib/sendmail オブジェクトの許容された特権セットには、すべてのシステム特権が存在します。
usr/lib/sendmail オブジェクトの強制セットには、コンマで区切られた特権リストが存在します。
etc/security/tsol ファイルは CMW ラベルを含み、最初に情報ラベル部 ADMIN_HIGH が指定され、次に機密ラベル部 ADMIN_HIGH が角括弧で囲まれて指定されています。
既存のパッケージの検索と編集を行うには、grep(1) コマンドを使用してそのソフトウェアインストールデータベースを検索します。返される情報は、パッケージ名を含みます。
machine_name% cat /var/sadm/install/contents | grep /usr/lib/object
パッケージ名を取得すると、そのパッケージのパッケージ定義を検索し、tsolinfo(4) ファイルを編集できます。tsolinfo ファイルが存在しない場合には、ファイルを 1 つ作成します。tsolinfo ファイルを作成する場合、それを prototype ファイルに加え、pkgmk(1) コマンドが tsolinfo ファイルを見つけることができるようにします。
新しいパッケージを追加するには、パッケージの作成の詳細が述べられた Solaris 7 の『Application Packaging Developer's Guide』 (英語版) を参照してください。この節では、内容と手順の概要を述べます。
次に、新しいソフトウェアパッケージを作成する Solaris 7 コマンドを示します。
pkginfo(1) |
ソフトウェアパッケージ情報を表示する |
pkgparam(1) |
パッケージのパラメータ値を表示する |
pkgmk(1) |
ソフトウェアパッケージを作成する |
pkgproto(1) |
pkgmk(1) に対する入力用のプロトタイプファイルを生成する |
pkgtrans(1) |
パッケージの転送または変換、あるいはその両方を行う |
次の図は、作成すべきファイル、pkgmk(1) コマンドの役割、生成されるディレクトリ構造またはパッケージを示します。
マニュアルページを使用して、pkginfo(4) ファイルを作成します。
マニュアルページを使用して、prototype(4) ファイルを作成します。
pkgproto(1) コマンドを使用して、prototype(4) ファイルテンプレートを生成します。
マニュアルページを使用して、tsolinfo(4) ファイルを作成します。
pkgmk(1) コマンドが tsolinfo ファイルを検索できるように、tsolinfo がプロトタイプファイルにリストされていることを確認します。
必要に応じ、オプションのパッケージ情報ファイルを作成します。
必要に応じ、オプションのパッケージ化スクリプトを作成します。
プロトタイプファイルは、任意のエディタで作成できます。パッケージ構成要素ごとに、1 つのエントリが必要です。次に、tsolinfo ファイルのエントリを含むプロトタイプファイル例を示します。tsolinfo ファイルの前の文字 i は、このファイルが情報ファイルであることを示します。文字 f は、標準の実行可能ファイルまたはデータファイルを示します。詳細は、prototype(4) のマニュアルページを参照してください。
# Package "prototype" file for the bbp device driver. # Bidirectional Parallel Port Driver for SBus Printer Card. # i pkginfo i request i copyright i postinstall i tsolinfo f none bbp.kmod 0444 root sys f none bbp_make_node 0555 root sys f none bbp_remove_node 0555 root sys