Trusted Solaris 管理の手順

MLD を使った作業

マルチレベルディレクトリのことを「MLD」と呼び、シングルレベルディレクトリのことを「SLD」と呼びます。マニュアル『Trusted Solaris ユーザーズガイド』で説明しているように、1 つの MLD 内にある異なるラベルを持つディレクトリおよびファイルは、異なるラベルを持つ複数の SLD の内部へと自動的かつ透過的に分けられます。この場合、通常の使用では、これら複数の SLD の存在は隠されたままになります。

MLD は、異なるラベルで動作する複数のアプリケーションから、あたかも同じ 1 つのディレクトリに対して書き込みができるようにするためのものです。複数のアプリケーションによって頻繁に利用されるディレクトリとして /tmp がありますが、上記の理由から、デフォルトのシステムでは /tmp は MLD として実装されています。アプリケーションは、自分自身が /tmp 内にファイルを書き込む際に、/tmp が MLD であることを意識する必要はありません。実際には、アプリケーションは、自分自身が動作している機密ラベルを持つ /tmp ディレクトリ下の SLD にファイルを書き込みます。ホームディレクトリを MLD にすると、任意のアカウントは、自分のホームディレクトリ内に、異なる機密ラベルを持つ複数のファイルやフォルダを作成できるようになります。この場合、ユーザーアカウントや役割アカウントは、自分のホームディレクトリが MLD であることを意識する必要はありません。MLD であるホームディレクトリに移動した場合、実際には現在のワークスペースと同じ機密ラベルを持つ SLD に移動していることになります。

たとえば、roseanne というユーザーのために新しいアカウントを設定する際、ユーザーマネージャがホームディレクトリ /export/home/roseanne を MLD として作成したとします。この場合、ユーザー roseanne が、コマンド行から「cd ‾」を入力して自分のホームディレクトリに移動すると、roseanne はホームディレクトリ内にある SLD へと自動的かつ透過的に移行します。この SLD は、roseanne の現在のプロセスと同じ機密ラベルを持つものです。このため、NEED_TO_KNOW ワークスペースのラベルを持っていれば、 NEED_TO_KNOW 機密ラベルを持つ SLD へと移動していることになります。

以下の節では、MLD を使って作業する方法、MLD に含まれている任意の SLD に直接アクセスするために、MLD 全体を参照する方法などを説明します。

MLD 接頭辞 (MLD 装飾名)

MLD 接頭辞は MLD「装飾名」とも呼ばれます。MLD 名が MLD 接頭辞を含む場合、その MLD 名のことを単に「装飾名」と呼びます。MLD 装飾名は、SLD が格納されているトップレベルディレクトリに直接アクセスする場合に使われます。デフォルトのシステムでは、MLD 接頭辞は「.MLD.」になります。たとえば、MLD として実装されている /tmp の装飾名は「/.MLD.tmp」になります。

修飾名を使わずに MLD にアクセスした場合、同じ機密ラベルの適切な SLD に移動します。修飾名を使って MLD にアクセスした場合、MLD のトップレベルに移動します。MLD のトップレベルからは、MAC と DAC の制限内で、MLD に含まれているすべての SLD を見ることができます。

SLD の作成

ユーザーが新しい機密ラベルで初めて MLD にアクセスするたびに、現在のプロセスと同じ機密ラベルを持つ新しい SLD が 1 つ作成されます。

新規ユーザーの初回ログインで作成される最初の SLD の持つ機密ラベルは、そのユーザーの持つ最下位機密ラベルと同じになります。たとえば、ユーザー roseanne の持つ最下位機密ラベルは PUBLIC なので、roseanne が初めてログインした場合に作成される最初の SLD の持つ機密ラベルは PUBLIC になります。

SLD の命名規則

SLD の名前には必ず「.SLD.」という接頭辞が付けられます。SLD 接頭辞は、MLD 接頭辞とは異なり変更できません。1 つの MLD 内部で新しい SLD が作成されるたびに、その SLD の名前として順序番号が与えられます。たとえば、1 つの MLD 内部で最初に作成された SLD に与えられる番号は 0 (SLD 名は「.SLD.0」)、2 番目に作成された SLD に与えられる番号は 1 (SLD 名は「.SLD.1」)のようになります。

PUBLIC ワークスペースで作業している場合に、ユーザー roseanne がコマンド行から pwd コマンドを実行するか、またはファイルマネージャを使って自分のホームディレクトリのフォルダを見た場合、roseanne には現在のディレクトリ名は /export/home/roseanne としか見えません。一見、roseanne は自分のホームディレクトリで作業しているように見えますが、実際には roseanne は機密ラベル PUBLIC を持つ SLD (その名前は /export/home/.MLD.roseanne/.SLD.0) 内で作業しているのです。

SLD 名に含まれる番号は、そのディレクトリの持つ機密ラベルとは関係がありません。たとえば、どんな機密ラベルを持つユーザーのために作成されたとしても、最初に作成される SLD の名前は /export/home/.MLD.roseanne/.SLD.0 になります。

MLD は個々の SLD の持つラベルを記録しています。このため、同一 MLD に対して特定の機密ラベルでのアクセスが複数回実行された場合、2 回目以降のアクセスでは、アクセスを行なったユーザーは正しい機密ラベルを持つ SLD に自動的に移動されることになります。

たとえば、機密ラベル PUBLIC で作成された最初の SLD (名前は「.SLD.0」) があるとします。次回、ユーザー roseanne が機密ラベル PUBLIC で作業中に自分のホームディレクトリに移動した場合、roseanne は意識せぬままに実際には機密ラベル PUBLIC を持つ SLD に移動し、その後、彼女の作成したファイルはすべてディレクトリ「.SLD.0」内に保存されることになります。これらの仕組みは、ユーザーが接頭辞を使って MLD や SLD を直接参照しない限り、ユーザーの目からは見えません (「MLD 接頭辞と SLD 接頭辞の例」を参照のこと)。

MLD 作成に関する制限とその効果

MLD は、MLD でないディレクトリの内部にのみ作成できます。このような制限があるため、デフォルトのシステムでは、通常のユーザーは次の理由から MLD を作成することができません。

通常のユーザーが MLD を作成するためには、管理者役割がまず、MLD ではなく、通常のユーザーが書き込みできる新しいディレクトリを作成する必要があります。

たとえば、あるサイトの管理者役割が /shark/doc とう名前のディレクトリを作成し、このディレクトリをすべての開発者が単一の機密レベルでマウント可能および書き込み可能に設定しておけば、設計仕様書やプロジェクト単位の文書などを誰もがアクセス可能な場所に保管することができます。このようにすれば、開発グループの誰もがこのディレクトリ内に新しいディレクトリを作成できますし、既存ディレクトリをMLDに変更できます。詳細は、「MLD の作成、変更、削除、MLD 内でのその他の操作」を参照してください。

MLD 接頭辞と SLD 接頭辞の例

次の例では、.MLD. 接頭辞を使って、NEED TO KNOW ENG ラベルにおける MLD の /tmp ディレクトリの内容一覧を表示しています。MLD 内にある 2 つの SLD は、そのラベルが NEED_TO_KNOW ラベルよりも優位であるため表示されていません。つまり、ls は 現在のラベル以下の SLD を表示します。


trustworthy% 	ls /.MLD.tmp/.*
 /.MLD.tmp/.SLD.0
bt+_errlog.26629 
dtbcache_:0 bt+_errlog.26630 
ps_data
/.MLD.tmp/.SLD.4
bt+errlog.631
mpa000_M mailBAAa000K4
ps_data mpa000.E
sel_mgr.err 

次の例では、getlabel(1) コマンドを使って、自分のラベルよりも優位な 2 つの SLD の名前を表示しています。しかし、getlabel.SLD.1.SLD.2 のラベルよりも優位でないため、これらの SLD には「Not Owner」というエラーが表示され、ラベルの名前は表示されません。


trustworthy% ls /.MLD.tmp/.*
 /.MLD.tmp/.SLD.0
bt+_errlog.26629      
dtbcache_:0 bt+_errlog.26630      
ps_data  /.MLD.tmp/.SLD.4 bt+errlog.631         
mpa000_M mailBAAa000K4         
ps_data mpa000.E              
sel_mgr.err 
trustworthy% getlabel /.MLD.tmp/.*
.SLD.0 PUBLIC [PUBLIC]
.SLD.1 Not owner
.SLD.2 Not owner
.SLD.4 PUBLIC [NEED TO KNOW ENG]

MLD の作成、変更、削除、MLD 内でのその他の操作

新しい MLD を作成したり、既存のディレクトリを MLD に変更したりするには、次の条件が必要です。

新しい MLD を作成するには、次の方法を使うことができます。

任意のディレクトリを MLD に変更する方法については、次の節を参照してください。

MLD の操作に関係するコマンドやオプションの一覧を表 2-6 に示します。各コマンドやオプションの詳細については、それぞれのマニュアルページを参照してください。

表 2-6 MLD の操作に関係するコマンド

MLD 関係のコマンドとオプション 

説明 

adornfc dirname

adornfc(1) を参照のこと

ディレクトリのパス名を装飾された最終コンポーネントとともに表示します。[このコマンドは、MLD 接頭辞を持つパス名、その最終コンポーネントが MLD であるかどうか、その最終コンポーネントがディレクトリであるかどうかだけを表示するものであり、何の変更も行いません。] 

getfattrflag -m dirname

getfattrflag(1) を参照のこと

ディレクトリが MLD であるかどうかを表示します。 

getmldadorn filesystem_name

getmldadorn(1) を参照のこと

ファイルシステムの持つ MLD 接頭辞を表示します。 

getsldname filesystem_name

または 

getsldname-ssensitivity_label filesystem_name

getsldname(1) を参照のこと

ファイルシステムの持つ SLD 名を表示します。現在のプロセスの持つラベルに対応する SLD 名を表示します。 

ファイルシステム内にある指定の機密ラベルを持つ SLD 名を表示します。 

mldpwd

mldpwd(1) を参照のこと

現在作業中のディレクトリのパス名を表示します。そのディレクトリが MLD であれば MLD 接頭辞が、SLD であれば SLD 名が表示されます。 

mldrealpath dirname

mldrealpath(1) を参照のこと

指定のディレクトリのパス名を表示します。そのディレクトリが MLD であれば MLD 接頭辞が、SLD であれば SLD 名が表示されます。 

rm(1)-RMMLD_dirname

rmdir(1) を参照のこと

指定の MLD 内にあるすべての SLD のうち、DAC および MAC アクセス権を持つものを再帰的に削除します。 

mkdir -Mdirname

または 

mkdir .mld_prefix.dirname

mkdir(1) を参照のこと

新しい MLD を作成します。 

setfattrflag --m existing_dirname

setfattrflag(1) を参照のこと

既存のディレクトリを MLD に変更します。 

上記のコマンドを使って、MLD、SLD、プロセスの持つ機密ラベルの関係を見てみましょう。図 2-2 に、ラベル CLASSIFIED を持つワークスペース上で pwd(1)plabel(1)mldpwd(1) コマンドを実行した場合の出力を示します。この例では、ユーザーのホームディレクトリ (/export/home/roseanne) は MLD であり、.SLD.2 は機密ラベル CLASSIFIED で作成された SLD です。図 2-2 において、通常のユーザーコマンドの pwd ではユーザーのホームディレクトリ名が表示されるだけですが、mldpwd コマンドを使うと、ユーザーが実際には .MLD.roseanne ディレクトリ内の .SLD.2 にいることが表示されます。「.SLD.2」という名前は SLD 番号 2 を持つため、この CLASSIFIED ラベルを持つ SLD は、3 番目に作成された SLD であることが分かります。

図 2-2 ホームディレクトリ内に作成された 3 番目の SLD の SLD 名

Graphic

図 2-3 に、機密ラベル TOP SECRET を持つ端末上で pwdplabelmldpwd コマンドを実行した場合の出力を示します。「.SLD.3」という名前は SLD 番号 3 を持つため、この TOP SECRET ラベルを持つ SLD は、4 番目に作成された SLD であることが分かります。

図 2-3 ホームディレクトリ内に作成された 4 番目の SLD の SLD 名

Graphic

ディレクトリが MLD であるかどうかを調べるには

    一般ユーザーとして -m オプションのgetfattrflag(1) コマンドで引数にディレクトリ名を指定します (MLD 接頭辞は付けません)。


    trusted% getfattrflag -m olddir
    olddir: is a multilevel directory
    

ファイルマネージャを使って MLD を作成するには

  1. 「ファイル」メニューから「新規フォルダ」を選択します。

  2. 新しいディレクトリ名を入力します。

  3. 「ここをクリックすると、このフォルダが MLD になります。」というボタンをクリックします。

コマンド行から MLD を作成するには

    mkdir(1) コマンドで、引数に MLD 接頭辞付きのディレクトリ名を指定します。


    trusted% mkdir .MLD.newdir
    

または

    mkdir コマンドで、-M オプションの後にディレクトリ名を指定します (MLD 接頭辞は付けません)。


    trusted% mkdir -M newdir
    

または、既存のディレクトリを MLD に変更する場合には、

    setfattrflag(1) コマンドで、-m オプションの後に既存のディレクトリ名を指定します。


    trusted% setfattrflag -m oldir
    

MLDを特定するには

MLD を特定するには、次のような方法があります。

    コマンド行から file(1B) コマンドを使います。


    trustworthy% file /export/home/roseanne
    /export/home/roseanne:multi-level directory

    コマンド行から mldrealpath(1) コマンドを使います。


    trustworthy%mldrealpath /export/home/roseanne 
    /export/home/.MLD.roseanne
    

    getfattrflag(1) コマンドで、-m オプションの後に既存のディレクトリ名を指定します。


    $ getfattrflag -m /tmp
    /tmp: is a multilevel directory
    

SLD を特定するには

    コマンド行から、getsidname(1) コマンドを使い、MLD 名を指定します。


    trustworthy% getsldname /home/roseanne
    .SLD.2
    

    MLD 内にいる場合は、mldpwd(1) コマンドを使います。


    trustworthy% pwd 
    /home/roseanne
    trustworthy% 
    mldpwd
    /home/roseanne/.SLD.2 
    

MLD 全体の内容を表示するには

    ls(1) -R コマンドの引数に MLD 接頭辞を指定し、ディレクトリの内容を再帰的に表示させます。


    $ ls -R /export/home/.MLD.admin/.SLD*
    

    上記のコマンドの結果何が表示されるかは、現在のプロセスの持つラベルにより異なります。MLD 全体の内容を参照することは、tar を使ってそのディレクトリをバックアップテープにコピーする場合に便利です。

MLD を削除するには


注 -

MLD を削除可能にするには、そのMLD 内にあるすべての SLD と、その SLD の内容をすべて削除しておく必要があります。


  1. 自分の認可上限内で最上位のラベルを持つワークスペースを立ち上げます。

  2. すべての SLD およびその内容で自分のアカウントの機密ラベル範囲にあるものを削除するには、次のいずれかを実行します。

    1. ファイルマネージャ で、テキスト入力フィールドに MLD の装飾名を入力し、「ファイル (File)」メニューから「行先指定 (Go To)」を選択します。

    2. 「表示 (View)」メニューから「隠しオブジェクトも表示」を選択します。

      MLD 内のすべての SLD をドラッグしてごみ箱に移動するか、すべての SLD を選択した後、「選択」メニューから「ごみ箱に捨てる」を選択します。

      次の図に、ファイルマネージャで、MLD 装飾名 (/.MLD.tmp,) を指定して /tmp ディレクトリの内容を表示させた状態を示します。「表示 (View)」メニューから「隠しオブジェクトも表示」を選択しているので、すべての SLD (.SLD.1.SLD.2、など) が表示されています。

      Graphic
  3. コマンド行で、rm(1) コマンドを -RMf オプション付きで実行すると、MLD、およびそれが含む SLD、その SLD の内容のすべてを削除できます。


    $ rm -RMf MLD_dirname