ほとんどのアプリケーションは、次のどれかの方法で動作するため、アクセス制御を回避するときに特権は使用しません。
1 人または複数のユーザーによって 1 つの機密ラベルで起動され、オブジェクト内のデータにその同じ機密ラベルでアクセスする
1 人または複数のユーザーによって 1 つの機密ラベルで起動され、オブジェクト内のデータに別の機密ラベルでアクセスする。しかし、「セキュリティポリシー」で説明されているように、必須アクセスの操作がシステムセキュリティポリシーにより許容される
1 人または複数のユーザーによって複数の異なる機密ラベルで起動され、オブジェクト内のデータにマルチレベルディレクトリを介して同じ機密ラベルでアクセスする。マルチレベルディレクトリについては第 8 章「マルチレベルディレクトリ」で説明しています。
アプリケーションがそのプロセスの機密ラベルとは異なる機密ラベルでデータにアクセスし、そのアクセスが拒否される場合、プロセスは特権を必要とします。特権によりアプリケーションは、file_mac_read、file_dac_read、 file_mac_write、file_dac_write、file_mac_search、または file_dac_search を使用して必須または任意のアクセス制御の適用を回避したり、proc_setsl を使用して必須アクセスが与えられるようにプロセスの機密ラベルを変更したり、あるいは file_upgrade_sl、file_downgrade_sl を使用してデータの機密ラベルを昇格または降格することができます。どのような方法でアクセスするにせよ、アクセスされるデータの格付けに害を及ぼすことがないように、この節に示されたガイドラインを守ってアプリケーションを設計する必要があります。
特権を使用して必須アクセス制限が適用されないようにする場合、アプリケーションは、データを読み取るレベルよりも低い機密ラベルでデータを書き込むことができません。また、プログラムエラーによるデータの降格を行うことがないようにアプリケーションを設計してください。
アプリケーションがそれ自体の機密ラベルまたは別のオブジェクトの機密ラベルを変更する場合、次のガイドラインに従ってください。
可能なかぎり、機密ラベルを昇格する
機密ラベルを昇格するプログラムは、機密ラベルを降格するプログラムよりも安全です。これは、アプリケーションエラーが情報漏れを引き起こしたとしても、データは降格されるのではなく昇格されるためです。データの昇格はデータ格付けを必要以上に高いものにしますが、セキュリティは守られます。特権を使用して機密ラベルを降格することもできますが、これらの特権は十分な注意を払って使用してください。
プロセスの機密ラベルの変更は必ず一度に留める。プロセスの機密ラベルの変更を行うと、データが異なるレベル間で誤って転送される危険性が高まります。プロセスの機密ラベルに対するあらゆる変更は、プロセスのアドレス空間の情報を昇格または降格します。
ファイルやプロセスの機密ラベルを変更する場合、機密データがほかのプロセスに使用されないように、ファイル記述子をすべてクローズする
プロセスの機密ラベルを変更する代わりに、新しいプロセスを fork() により起動し、フォークされた子プロセスの機密ラベルを変更することによって、子プロセスが、親プロセスのデータとは異なるレベルで作業できるようになります。子プロセスは、親プロセスに対して情報を返すか、あるいは別のプロセスに情報を送る必要があります。
変更された機密レベルで子プロセスが返す情報には、必要不可欠な情報だけが含まれるようにします。たとえば、処理が成功したか失敗したかを表示しても、実際のデータは表示しないようにします。特定の情報を渡すことにより、処理に使用されるデータを守り、1 つのレベルのデータが別のレベルのデータと混ざることのないようにします。