Trusted Solaris 開発ガイド

付録 A プログラマーズリファレンス

この付録では、次の項目に関する参照情報を挙げます。

マニュアルページ

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 コマンドを使用してアクセスします。

次の最初の 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 マニュアルページの全体的なセキュリティポリシー情報がまとめられています。特定のマニュアルページのインタフェースに固有のセキュリティ情報は、「機能説明」セクション、EPERMEACCESESRCH の「エラー」セクション、そして最後の「Trusted Solaris 変更の概要」セクションに挙げられています。

ライブラリルーチンのマニュアルページにセキュリティ情報がなく、そのルーチンに内部で使用しているシステムコールがある場合、内部のシステムコールのマニュアルページを調べてください。内部のシステムコールは、その上に構築されるすべてのライブラリルーチンに対しセキュリティポリシーを運用します。

ある 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/tsolrtld ファイルに特権を持つアプリケーションのライブラリのディレクトリパス名をリストすることができますが、ライブラリを既存のトラステッドディレクトリの 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 サーバー 

開発、テスト、およびデバッグ

開発、テスト、およびデバッグは、メインシステム上のセキュリティポリシーにソフトウェアのバグや未完成のコードで害を与えないように、独立した開発システムで行うことをお勧めします。

特権デバッグ

特権デバッグモードについては、『Trusted Solaris 管理の手順』で説明しています。ここでは、特権デバッグを有効にする手順と、特権デバッグモードで runpd(1M) を使用してアプリケーションをテストする手順の概要を述べます。

  1. 特権デバッグモードは、必要な特権を持たないアプリケーションの実行を成功させ、どの特権が欠如しているかを示します。

  2. /etc/system ファイルで、tsol_privs_debug 変数を 1 に設定します。このファイルは ADMIN_LOW で、所有者はスーパーユーザー (root) です。

  3. /etc/syslog.conf ファイルで、kern.debug 行すなわち local0.debug 行のコメントを解除します。このファイルは ADMIN_LOW で、所有者は sys です。

  4. /var/log/privdebug.log ファイルが存在していなければ作成します。このファイルは ADMIN_HIGH で、所有者はスーパーユーザー (root) です。

  5. システムをリブートします。

  6. プロファイル内の runpd(1M) を使用して、管理役割を取得します。

  7. 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)
  8. /var/log/privdebug.log ファイル内の特権番号を解釈します。特権番号は、語句の特権の後に現れます。プロセス 822 には、file_mac_searchfile_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

スクリプトを使用して実行可能ファイルに強制された特権と許容された特権を設定する場合、次の点に注意してください。


注 -

プログラムは、必ず実行時に使用するすべてのラベルでテストしてください。


アプリケーションのリリース

テストとデバッグが完了したアプリケーションは、アプリケーション統合のためにシステム管理者に提出します。アプリケーションは、CDE アクションまたはソフトウェアパッケージとして提出できます。アプリケーションが特権を使用する場合、システム管理者またはシステム管理者に代わる人物は CDE アクションまたはソフトウェアに提供されるアプリケーションソースコードとセキュリティ情報を評価し、特権の使用によってシステムセキュリティが侵害されないかを検証します。

アプリケーションが使用する新しい監査イベント、監査クラス、または X ウィンドウシステムのプロパティを、システム管理者に報告し、適切なファイルに格納してもらいます。詳細は、第 9 章「アプリケーション監査」第 15 章「トラステッド X ウィンドウシステム」を参照してください。

CDE アクションの作成

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)

ソフトウェアインストールデータベースからエントリを削除する 

パッケージを作成するには、次のファイルを設定します。

pkgmk(1) は、pkginfo(4)prototype(4) を使用して、ソフトウェアパッケージを構築します。オプションのスクリプトは、インストールのカスタマイズとパッケージの削除を行います。

MAC セキュリティ属性

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]

内容

既存のパッケージの編集

既存のパッケージの検索と編集を行うには、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) コマンドの役割、生成されるディレクトリ構造またはパッケージを示します。

図 A-1 新しいパッケージの追加

Graphic

必須ファイルの作成

  1. マニュアルページを使用して、pkginfo(4) ファイルを作成します。

  2. マニュアルページを使用して、prototype(4) ファイルを作成します。

    pkgproto(1) コマンドを使用して、prototype(4) ファイルテンプレートを生成します。

オプションのファイルとスクリプトの作成

  1. マニュアルページを使用して、tsolinfo(4) ファイルを作成します。

    pkgmk(1) コマンドが tsolinfo ファイルを検索できるように、tsolinfo がプロトタイプファイルにリストされていることを確認します。

  2. 必要に応じ、オプションのパッケージ情報ファイルを作成します。

  3. 必要に応じ、オプションのパッケージ化スクリプトを作成します。

パッケージの作成

  1. pkgmk(1) コマンドを実行します。

  2. パッケージを記憶メディアに保存します。

  3. インストールのため、記憶メディアをシステム管理者に渡します。

プロトタイプファイル

プロトタイプファイルは、任意のエディタで作成できます。パッケージ構成要素ごとに、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