ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
マニュアルページセクション 5: 標準、環境、マクロ Oracle Solaris 11.1 Information Library (日本語) |
- プロセスの特権モデル
Oracle Solaris ソフトウェアには、プロセスのアクションをきめ細かく制御できるようにするための特権セットが実装されています。特定の特権の所有により、プロセスは、特定の一連の制限された操作を実行できるようになります。
開発者は、Oracle Solaris オペレーティングシステム内の主に特権に基づくセキュリティーモデルを変更することによって、プロセスをすべての特権 (スーパーユーザー) や特権なし (0 以外の UID) ではなく、実際に必要な特権操作に制限する機会が得られます。さらに、以前は制限されていなかった一連の操作にも特権が必要になりました。これらの特権は「基本」特権と呼ばれ、すべてのプロセスにデフォルトで付与されます。
まとめると、「基本」特権を除く定義されているすべての特権が、従来は root ユーザーに関連付けられた特権セットを構成します。「基本」特権は、以前、特権の設定されていないプロセスに与えられた「特権」です。
定義されている特権は次のとおりです:
プロセスが、イベントの信頼できる配信をイベントエンドポイントにリクエストできるようにします。
プロセスが、ユーザーによって大量に生成される可能性のあるイベントをテンプレートのクリティカルイベント設定期間内に含めることができるようにします。
プロセスがプロセス契約テンプレートのサービス FMRI 値を設定できるようにします。
プロセスが、プロセスの実効ユーザー ID 以外のユーザーによって作成され、所有されている契約によって生成された契約イベントを監視できるようにします。
プロセスが、プロセスの実効ユーザー ID 以外のユーザーによって作成され、所有されている契約に属する契約イベントエンドポイントを開けるようにします。
プロセスが CPU ごとのハードウェアパフォーマンスカウンタにアクセスできるようにします。
DTrace のカーネルレベルのトレースを許可します。
DTrace のプロセスレベルのトレースを許可します。プロセスレベルのトレースのプローブを、ユーザーがアクセス権を持っているプロセス内に配置し、有効にできるようにします。
DTrace のユーザーレベルのトレースを許可します。ユーザーがアクセス権を持っているプロセスを検査するために、システムコールおよびプロファイル DTrace プロバイダの使用を許可します。
プロセスがファイルの所有者ユーザー ID を変更できるようにします。プロセスが、ファイルのグループ ID をプロセスの実効グループ ID 以外のグループ ID か、またはプロセスのいずれかの補助グループ ID に変更できるようにします。
プロセスが自身のファイルを渡せるようにします。この特権を持つプロセスは、{_POSIX_CHOWN_RESTRICTED} が有効でないかのように動作します。
プロセスが、通常であればプロセスの実行権を禁止するアクセス権ビットまたは ACL を持つ実行可能ファイルを実行できるようにします。
プロセスが、通常であればプロセスの読み取り権を禁止するアクセス権ビットまたは ACL を持つファイルまたはディレクトリを読み取れるようにします。
プロセスが、通常であればプロセスの検索権を許可しないアクセス権ビットまたは ACL を持つディレクトリを検索できるようにします。
プロセスが、プロセスの書き込み権を許可しないアクセス権ビットまたは ACL を持つファイルまたはディレクトリを書き込めるようにします。0 の実効 UID が存在しない場合に UID 0 によって所有されているファイルを書き込むには、すべての特権が必要です。
プロセスが、ファイルまたはディレクトリの機密ラベルを既存の機密ラベルより優位でない機密ラベルに設定できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが immutable、nounlink または appendonly ファイル属性を設定できるようにします。
プロセスが、プロセスの実効 UID とは異なる UID によって所有されているファイルへのハードリンクを作成できるようにします。
ファイルの所有者でないプロセスが、そのファイルのアクセスや変更時間を変更できるようにします。ディレクトリの所有者でないプロセスが、そのディレクトリのアクセスや変更時間を変更できるようにします。ファイルまたはディレクトリの所有者でないプロセスが、「実行後にテキストイメージを保存する」(スティッキー) ビットが設定された親ディレクトリを持つファイルまたはディレクトリの削除または名前変更を行うことができるようにします。ファイルの所有者でないプロセスが、そのファイル上に namefs をマウントできるようにします。ファイルまたはディレクトリの所有者でないプロセスが、そのファイルまたはディレクトリのアクセス権ビットまたは ACL を変更できるようにします。
プロセスが、プロセスの読み取り権を許可するアクセス権または ACL を持つファイルまたはディレクトリを読み取れるようにします。
プロセスが、セットユーザー ID およびセットグループ ID ビットをクリアせずにファイルの所有権を変更したり、ファイルに書き込んだりできるようにします。プロセスが、プロセスの実効グループでも、プロセスのいずれかの補助グループでもないグループに属しているファイルまたはディレクトリにセットグループ ID ビットを設定できるようにします。プロセスが、PRIV_FILE_OWNER が存在する場合に、別の所有権を持つファイルにセットユーザー ID ビットを設定できるようにします。追加の制限は、setuid 0 のファイルを作成または変更する場合に適用されます。
プロセスが、ファイルまたはディレクトリの機密ラベルを既存の機密ラベルより優位な機密ラベルに設定できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、プロセスの書き込み権を許可するアクセス権または ACL を持つファイルまたはディレクトリを書き込めるようにします。
プロセスがグラフィックスデバイスへの特権付き ioctl を作成できるようにします。通常、この特権を持つ必要があるのは xserver プロセスだけです。この特権を持つプロセスは、特権付きグラフィックスデバイスマッピングも実行できます。
プロセスが、グラフィックスデバイスから特権付きマッピングを実行できるようにします。
プロセスが、通常であればプロセスの読み取り権を許可しないアクセス権ビットを持つ System V IPC メッセージキュー、セマフォーセット、または共有メモリーセグメントを読み取れるようにします。
プロセスが、通常であればプロセスの書き込み権を許可しないアクセス権ビットを持つ System V IPC メッセージキュー、セマフォーセット、または共有メモリーセグメントを書き込めるようにします。
System V IPC メッセージキュー、セマフォーセット、または共有メモリーセグメントの所有者でないプロセスが、メッセージキュー、セマフォーセット、または共有メモリーセグメントを削除したり、その所有権を変更したり、そのアクセス権ビットを変更したりできるようにします。
プロセスが TCP、UDP、SDP、または SCTP ネットワークエンドポイントを開けるようにします。
プロセスが、プロセスのゾーンのマルチレベルポート (MLP) として構成されているポートにバインドできるようにします。この特権は、共有アドレスとゾーン固有のアドレスの両方の MLP に適用されます。MLP ポートの構成については、Trusted Extensions のマニュアルページの tnzonecfg(4) を参照してください。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが ICMP パケットを送受信できるようにします。
プロセスが、setpflags(2) を使用して NET_MAC_AWARE プロセスフラグを設定できるようにします。また、この特権により、プロセスは setsockopt(3SOCKET) を使用して SO_MAC_EXEMPT ソケットオプションも設定できるようになります。NET_MAC_AWARE プロセスフラグと SO_MAC_EXEMPT ソケットオプションはどちらも、ローカルプロセスのラベルがピアのデフォルトラベルより優位な場合や、ローカルプロセスが大域ゾーンで実行されている場合に、ローカルプロセスがラベルの付いていないピアと通信できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、ネットワークトラフィックの受信やトラフィックの送信のみが禁止されているデバイスを開けるようにします。
プロセスが特権ポート番号にバインドできるようにします。特権ポート番号は 1 - 1023 (従来の UNIX 特権ポート) であり、さらに NFS や SMB での使用のために予約されているポートを除き、これらのポートは「udp/tcp_extra_priv_ports」とマークされています。
プロセスがネットワークレイヤーに直接アクセスできるようにします。
プロセスが監査レコードを生成できるようにします。プロセスが独自の監査事前選択情報を取得できるようにします。
プロセスが自身のルートディレクトリを変更できるようにします。
プロセスが高精度タイマーを使用できるようにします。
プロセスが exec(2) を呼び出せるようにします。
プロセスが、シグナルを送信できるプロセス以外のプロセスのステータスを検査できるようにします。検査できないプロセスは /proc に表示できないため、存在していないように見えます。
プロセスが物理メモリー内のページをロックできるようにします。
プロセスが、所有権には関係なく、ほかのプロセスにシグナルを送信したり、ほかのプロセスにあるプロセスの状態を検査して変更したりできるようにします。別のプロセスを変更する場合は、追加の制限が適用されます: 接続しているプロセスの実効特権セットは、ターゲットプロセスの実効セット、許可セット、および継承可能セットのスーパーセットである必要があります。制限セットは、ターゲットの制限セットのスーパーセットである必要があります。ターゲットプロセスでいずれかの UID が 0 に設定されている場合は、実効 UID が 0 でないかぎり、すべての特権が表明されている必要があります。プロセスが CPU に任意のプロセスをバインドできるようにします。
プロセスが、自身の優先順位を現在のレベルを超えて引き上げることができるようにします。プロセスが、自身のスケジューリングクラスを任意のスケジューリングクラス (RT クラスを含む) に変更できるようにします。
プロセスが、シグナルまたはトレースプロセスをセッションの外部に送信できるようにします。
UID 0 ですべての特権が表明されている必要がある場合、プロセスが自身の UID を自由に設定できるようにします。
プロセスが、呼び出し元プロセスに新しいタスク ID を割り当てることができるようにします。
プロセスがシグナルをトレースしたり、ほかのゾーン内のプロセスに送信したりできるようにします。zones(5) を参照してください。
プロセスが、acct(2) によるアカウンティングを有効または無効にしたり、管理したりできるようにします。
プロセスが、ノードおよびドメイン名の設定や、coreadm(1M) および nscd(1M) 設定の指定などのシステム管理タスクを実行できるようにします。
プロセスが (カーネル) 監査デーモンを起動できるようにします。プロセスが監査状態 (監査ユーザー ID、監査端末 ID、監査セッション ID、監査事前選択マスク) を表示したり、設定したりできるようにします。プロセスが監査を無効にしたり、有効にしたりできるようにします。プロセスが監査パラメータ (キャッシュとキューのサイズ、イベントからクラスへのマッピング、およびポリシーオプション) を構成できるようにします。
プロセスがさまざまなシステム構成タスクを実行できるようにします。ファイルシステム固有の管理手順 (ファイルシステム構成 ioctl、割り当て制限の呼び出し、スナップショットの作成と削除、PCFS ブートセクターの操作など) を許可します。
プロセスがデバイス特殊ファイルを作成できるようにします。プロセスが、許可されたアクセスをチェックするために、カーネルの drv_priv(9F) 関数を呼び出すカーネルモジュールを正常に呼び出せるようにします。プロセスが、実際のコンソールデバイスを直接開けるようにします。プロセスが、排他的に開かれていたデバイスを開けるようにします。
プロセスがシステムのデータリンクインタフェースを構成できるようにします。
プロセスがシステムの IP インタフェースと経路を構成できるようにします。プロセスが TCP/IP パラメータを構成できるようにします。プロセスが、アンカーされた STREAMS モジュールを一致する zoneid とともに pop できるようにします。
プロセスが System V IPC メッセージキューバッファーのサイズを大きくすることができるようにします。
プロセスがディレクトリのリンクを解除したり、リンクしたりできるようにします。
プロセスが、通常であれば制限されるファイルシステム (つまり、namefs を除くほとんどのファイルシステム) をマウントしたり、マウント解除したりできるようにします。プロセスがスワップデバイスを追加したり、削除したりできるようにします。
プロセスが、PRIV_SYS_IP_CONFIG、PRIV_SYS_DL_CONFIG、および PRIV_SYS_PPP_CONFIG で許可されるすべての操作に加えて、次の操作を実行できるようにします: rpcmod STREAMS モジュールの使用、モジュールのスタックの先頭以外の場所にある STREAMS モジュールの挿入および削除。
プロセスが NFS サービスを行うことができるようにします: NFS カーネルスレッドの起動、NFS ロック処理の実行、NFS で予約されたポート (ポート 2049 (nfs) およびポート 4045 (lockd)) へのバインド。
プロセスが pppd(1M) pppd(1M) で PPP インスタンスを作成、構成、および破棄したり、sppptun(1M)sppptun(1M) で PPPoE の plumb を制御したりできるようにします。この特権は、排他的な IP スタックインスタンスゾーンにデフォルトで付与されます。
プロセスがプロセッサセットにプロセスをバインドできるようにします。
プロセスが、この段落で概要が説明されている次の操作に加えて、プロセッサセットにプロセスを PRIV_SYS_RES_BIND としてバインドできるようにします。プロセスがプロセッサセットを作成および削除したり、プロセッサセットに CPU を割り当てたり、PSET_NOESCAPE プロパティーをオーバーライドしたりできるようにします。プロセスが、p_online(2) を使用してシステム内の CPU の動作ステータスを変更できるようにします。プロセスがファイルシステムの割り当て制限を構成できるようにします。プロセスがリソースプールを構成したり、プールにプロセスをバインドしたりできるようにします。
プロセスが、setrlimit(2) および setrctl(2) を使用して、自身に課せられたリソース制限を超えることができるようにします。
プロセスがファイルシステムを共有したり、共有解除したりできるようにします。
プロセスが NetBIOS または SMB サービスを行うことができるようにします: SMB カーネルスレッドの起動、NetBIOS または SMB で予約されたポート (ポート 137、138、139 (NetBIOS)、および 445 (SMB)) へのバインド。
プロセスが、許可されたアクセスをチェックするために、カーネルの suser() 関数を呼び出すサードパーティー製のロード可能なモジュールを正常に呼び出せるようにします。この特権は、サードパーティー製のロード可能なモジュールの互換性のためにのみ存在し、Oracle Solaris では使用されません。
プロセスが、次のうちのいずれかの適切なシステムコールを使用してシステム時間を操作できるようにします: stime(2)、adjtime(2)、ntp_adjtime(2)。
プロセスが、プロセスの機密ラベルと同等か、またはより優位なラベルを外部の文字列形式との間で変換できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが仮想化環境を管理できるようにします。
プロセスがカラーマップの制限をオーバーライドできるようにします。
プロセスがカラーマップをインストールまたは削除できるようにします。
プロセスが、ほかのプロセスによって割り当てられたカラーマップセルエントリを取得できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、X サーバーによって永続的に保持されているリソースを構成または破棄できるようにします。
プロセスがスクリーンセーバーのタイムアウト値を設定するために SetScreenSaver を使用できるようにします。
プロセスが表示アクセス制御リストを変更するために ChangeHosts を使用できるようにします。
プロセスが GrabServer を使用できるようにします。
プロセスが、ウィンドウ、ピクセルマップ、カラーマップ、プロパティー、カーソル、フォント、またはグラフィックコンテキストのリソースを保持できる SetCloseDownMode リクエストを使用できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、所有していない (別のユーザー ID を持つ) ウィンドウリソースから読み取れるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、所有していない (別のユーザー ID を持つ) ウィンドウリソースに書き込んだり、このようなウィンドウリソースを作成したりできるようにします。新しく作成されるウィンドウのプロパティーは、そのウィンドウのユーザー ID を使用して作成されます。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスがウィンドウ入力デバイスに対する操作を実行できるようにします。
プロセスがキーボードやポインタの制御を取得したり、設定したりできるようにします。
プロセスがポインタボタンやキーのマッピングを変更できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスがダイレクトグラフィックスアクセス (DGA) X プロトコルの拡張機能を使用できるようにします。フレームバッファーへの直接のプロセスアクセスは引き続き必要です。このため、プロセスがフレームバッファーへのアクセスを許可する MAC および DAC 特権を持っているか、またはそのプロセスにフレームバッファーが割り当てられている必要があります。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、ウィンドウリソースの機密ラベルを既存の機密ラベルより優位でない機密ラベルに設定できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスがフォントパスを設定できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、プロセスの機密ラベルと等しくない機密ラベルを持つウィンドウリソースから読み取れるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、プロセスの機密ラベルと等しくない機密ラベルを持つウィンドウリソースを作成できるようにします。新しく作成されるウィンドウのプロパティーは、そのウィンドウの機密ラベルを使用して作成されます。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、選択確認ダイアログボックスの介入なしでウィンドウ間のデータ移動をリクエストできるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
プロセスが、ウィンドウリソースの機密ラベルを既存の機密ラベルより優位な機密ラベルに設定できるようにします。
この特権は、システムが Trusted Extensions で構成されている場合にのみ解釈されます。
上のに示された特権のうち、PRIV_FILE_LINK_ANY、PRIV_FILE_READ、PRIV_FILE_WRITE、PRIV_PROC_INFO、PRIV_PROC_SESSION、PRIV_NET_ACCESS、PRIV_PROC_FORK、PRIV_PROC_EXEC の各特権が「基本」特権と見なされます。これらは、特権の設定されていないプロセスから常に使用可能であった特権です。デフォルトでは、プロセスには引き続き基本特権が割り当てられます。
setuid root exec を成功させる (つまり、0 の実効 UID と追加の特権を取得する) には、プロセスの制限セット (次を参照) 内に PRIV_PROC_SETID、PRIV_PROC_AUDIT、PRIV_SYS_RESOURCE の各特権が存在する必要があります。
Oracle Solaris での特権の実装では、プロセス資格が次の 4 つの特権セットで拡張されています:
exec で継承される特権。
プロセスのための最大の特権セット。
現在有効な特権。
プロセスおよびその子孫が取得できる特権の上限。L への変更は、次回の exec で有効になります。
I、P、E の各セットは通常、特権の設定されていないプロセスの基本的な特権セットと同じです。制限セットは通常、完全な特権セットです。
各プロセスには、PA (特権を認識する) と NPA (PA 以外) の値を取ることができる特権認識状態 (PAS) があります。PAS は、古いスーパーユーザーモデルとの完全な互換性と、実効 UID の完全な無視のどちらかを選択できるようにするための移行メカニズムです。
説明を簡単にするために、「監視された実効セット」(oE) および「監視された許可セット」(oP) の概念と、実装セット iE および iP を導入します。
プロセスは、setppriv(2) によって実効セット、許可セット、制限特権セットを操作するか、または setpflags(2) を使用することによって、特権を認識するようになります。いずれの場合も、特権を認識するようになるプロセスでは oE および oP は不変です。特権を認識するようになるプロセスでは、次の割り当てが実行されます:
iE = oE iP = oP
プロセスが特権を認識する場合、UID の変更の下で oE および oP は不変です。プロセスが特権を認識しない場合、oE および oP は次のように監視されます:
oE = euid == 0 ? L : iE oP = (euid == 0 || ruid == 0 || suid == 0) ? L : iP
特権を認識しないプロセスに 0 の実効 UID が割り当てられている場合、そのプロセスは、その制限セット (特権の上限) に含まれている特権を行使できます。特権を認識しないプロセスにいずれかの UID 0 が割り当てられている場合は、潜在的に L 内のすべての特権を行使できることを示します。
setpflags() を使用すると、特権を認識しない状態にプロセスを戻すことができます。カーネルは、exec(2) で、常にこれを試みます。この操作は、次の条件が満たされた場合にのみ許可されます:
いずれかの UID が 0 に等しい場合は、P が L に等しいことが必要です。
実効 UID が 0 に等しい場合は、E が L に等しいことが必要です。
プロセスが特権の認識を放棄した場合は、次の割り当てが実行されます:
if (euid == 0) iE = L & I if (any uid == 0) iP = L & I
0 の UID を持っていないときに取得された特権は、制限セットで制限された、プロセスの継承可能セットです。
プロセスの (監視された) 実効特権セット内の特権によってのみ、プロセスは制限された操作の実行を許可されます。プロセスは、いずれかの特権操作関数を使用して特権セットに特権を追加したり、特権セットから特権を削除したりすることができます。特権は、常に削除できます。実効セットや継承可能セットに追加できるのは、許可セットにある特権だけです。制限セットは拡張できません。継承可能セットは、許可セットより大きくすることができます。
プロセスが exec(2) を実行すると、カーネルは次の特権セットの変更を行う前に、まず特権の認識を放棄しようとします:
E' = P' = I' = L & I L is unchanged
プロセスが自身の特権を操作していない場合は、E、P、および I がすでに同一であるため、特権セットは実質的に同じままになります。
制限セットは、exec の実行時に適用されます。
特権を認識しないアプリケーションを下位互換性がある方法で実行するには、特権を認識するアプリケーションが、特権を認識しないアプリケーションを I=basic で起動するようにしてください。
ほとんどの特権の場合は、その特権が存在しなければ単に失敗するだけです。場合によっては、特権が存在しないためにシステムコールが異なった動作をすることがあります。その他の場合として、特権を削除すると、強制的に setuid ルートアプリケーションの重大な誤動作が引き起こされることがあります。このタイプの特権は「安全ではない」と見なされます。プロセスの制限セットに、いずれかの安全ではない特権が含まれていない場合、システムは setuid ルートアプリケーションの setuid ビットに従いません。実効ユーザー ID を変更することも、特権を増やすこともなく、setuid ルートアプリケーションの実行が続行されます。次の安全ではない特権が識別されています: PRIV_PROC_SETID、PRIV_SYS_RESOURCE、および PRIV_PROC_AUDIT。
特定の状況では、1 つの特権によってプロセスが、そのプロセスに明示的には付与されていなかった 1 つ以上の追加の特権を取得する可能性があります。特権のこのようなエスカレーションを回避するために、セキュリティーポリシーには、これらの追加の特権に対する明示的なアクセス権が必要になります。
エスカレーションの一般的な例として、「生の」インタフェースによるシステムリソースの変更を許可するメカニズムがあります。たとえば、/dev/kmem によるカーネルデータ構造の変更や、/dev/dsk/* によるファイルの変更があります。エスカレーションはまた、プロセスが、制御プロセスより多くの特権を使用してプロセスを制御する場合にも発生します。この特殊な場合として、UID 0 によって所有されているオブジェクトの操作または作成や、setuid(2) を使用して UID 0 を取得しようとすることがあります。UID 0 はすべてのシステム構成ファイルを所有するだけでなく、通常のファイル保護メカニズムでは UID 0 を持つプロセスがシステム構成を変更できるため、UID 0 には特別な扱いが必要です。適切なファイル変更を使用すると、0 の実効 UID で実行されている特定のプロセスがすべての特権を取得できます。
プロセスが UID 0 を取得する可能性のある状況では、セキュリティーポリシーに追加の特権 (最大の場合、完全な特権セット) が必要です。システムファイルの保護のための追加のメカニズムが使用できる場合には、このような制限を緩和または解消できる可能性があります。Oracle Solaris の現在のリリースには、このようなメカニズムはありません。
UID 0 プロセスの使用は、できるだけ制限するようにしてください。別の UID の下で実行されていて、しかも必要な特権を持つプログラムに置き換えるようにしてください。
サブプロセスを exec で実行する必要がないデーモンの場合は、その許可セットと制限セットから PRIV_PROC_EXEC 特権を削除するようにしてください。
ユーザーに特権が割り当てられる場合、システム管理者はそのユーザーに、意図したより多くの権限を与える可能性があります。管理者は、保護手段が必要かどうかを考慮するべきです。たとえば、ユーザーに PRIV_PROC_LOCK_MEMORY 特権が与えられる場合、そのユーザーがすべてのメモリーをロックしないようにするために、管理者は project.max-locked-memory リソース制御も設定することを考慮するべきです。
構成ファイル内またはコマンド行に特権が一覧表示されているときに、拡張ポリシーの構文を使用できる場合があります。拡張ポリシーとは、特権セットを中括弧で囲み、そのあとにコロンとオブジェクトを続けたものです。拡張ポリシーによって、指定されたオブジェクトに対してその特権の一覧を使用する機能が追加されます。現在は、ネットワークポート、UID、およびファイルオブジェクトのための拡張ポリシーがサポートされています。
たとえば、
/var/core の下にあるファイルへのアクセス時に特権 file_dac_read を使用できるようにします。
プロセスが TCP ポート 80 および 443 にネットワークエンドポイントをバインドできるようにします。
プロセスが UID を UID 80 から 100 まで (80 と 100 を含む) に変更できるようにします。
プロセスが UID をユーザー名「casper」の UID に変更できるようにします。
拡張ポリシーに一覧表示されている特権セットは、そのポリシーの特権セットにゾーン内で使用可能なすべての特権が含まれていないかぎり、その拡張ポリシーがインストールされたときに継承可能セットから削除され、その結果、許可セットと実効セットから削除されます。たとえば、{zone}:/etc/shadow という形式の拡張ポリシーをインストールした場合は、どの特権も削除されません。これに対して、拡張ポリシーの形式が {file_dac_read}:/etc/shadow である場合は、PRIV_FILE_DAC_READ 特権が削除されます。
拡張ポリシーは、実効セットに特権が存在しない場合にのみ有効になります。
{all}:/some/file などの拡張ポリシーを指定することは可能ですが、システムは引き続き、setuid ビットの追加など、一部のアプリケーションを制限します。
拡張ポリシーに一覧表示されているすべての特権は、プロセスがそのポリシーをインストールするときに、そのプロセス内で有効である必要があります。たとえば、ポリシーをインストールするために ppriv(1) が使用される場合は、その実効セットにすべての特権が一覧表示されている必要があります。ppriv のオブジェクトであるプロセスには、このような制限は適用されません。ただし、その制限セットによって拡張ポリシー内のすべての特権がオーバーライドされます。
一部のコンテキストでは、拡張ポリシーの構文の一部をエスケープする必要があります。たとえば、exec_attr(4) では、コロン (:) をバックスラッシュ (\) でエスケープする必要があります。また、コンテキストによっては、ファイル名にある一部の文字もバックスラッシュでのエスケープが必要になる可能性があります。
拡張ポリシーは、ファイルシステム内のすべてのレイヤーで評価されます。lofs(7FS) ファイルシステムの場合、指定されたポリシーでは、そのポリシーが lofs ファイルシステムと基礎となるファイルシステムの両方を指定する必要があるという点を考慮に入れる必要があります。
次の一覧には、オブジェクトとそれに関連する特権のタイプが含まれています。
|
1 services(4) で定義された数値
2 指定されたパス名で始まるすべてのファイル名に一致する
システムコールがアクセス権のエラーで失敗した場合は、その問題の原因がただちに明らかになるとは限りません。このような問題をデバッグするには、特権のデバッグと呼ばれるツールを使用できます。あるプロセスに対して特権のデバッグが有効になっている場合、カーネルは、存在しない特権をそのプロセスの制御端末に報告します。(プロセスに対するデバッグは、ppriv(1) の -D オプションを使用して有効にします。)さらに、管理者は次を使用して system(4) の変数 priv_debug を設定することにより、システム規模の特権のデバッグを有効にすることができます:
set priv_debug = 1
実行中のシステムでは、mdb(1) を使用すると、この変数を変更できます。
ユーザーまたは役割に特権を割り当てたり、ユーザーまたは役割への特権を変更したりするには、それぞれ、usermod(1M) または rolemod(1M) を使用します。システム上でサポートされている特権を列挙するには ppriv(1) を、プログラムにどの特権が必要かを確認するには truss(1) を使用します。
mdb(1)、ppriv(1)、add_drv(1M)、ifconfig(1M)、lockd(1M)、nfsd(1M)、pppd(1M)、rem_drv(1M)、smbd(1M)、sppptun(1M)、update_drv(1M)、Intro(2)、access(2)、acct(2)、acl(2)、adjtime(2)、chmod(2)、chown(2)、chroot(2)、creat(2)、exec(2)、fcntl(2)、fork(2)、fpathconf(2)、getacct(2)、getpflags(2)、getppriv(2)、getsid(2)、kill(2)、link(2)、memcntl(2)、mknod(2)、mount(2)、msgctl(2)、nice(2)、ntp_adjtime(2)、open(2)、p_online(2)、priocntl(2)、priocntlset(2)、processor_bind(2)、pset_bind(2)、pset_create(2)、readlink(2)、resolvepath(2)、rmdir(2)、semctl(2), setegid(2)、seteuid(2)、setgid(2)、setgroups(2)、setpflags(2)、setppriv(2)、setrctl(2)、setregid(2)、setreuid(2)、setrlimit(2)、settaskid(2)、setuid(2)、shmctl(2)、shmget(2)、shmop(2)、sigsend(2)、stat(2)、statvfs(2)、stime(2)、swapctl(2)、sysinfo(2)、uadmin(2)、ulimit(2)、umount(2)、unlink(2)、utime(2)、utimes(2)、bind(3SOCKET)、door_ucred(3C)、priv_addset(3C)、priv_set(3C)、priv_getbyname(3C)、priv_getbynum(3C)、priv_set_to_str(3C)、priv_str_to_set(3C)、socket(3SOCKET), t_bind(3NSL)、timer_create(3C)、ucred_get(3C)、exec_attr(4)、proc(4), services(4)、system(4)、user_attr(4), lofs(7FS)ddi_cred(9F)、drv_priv(9F)、priv_getbyname(9F)、priv_policy(9F)、priv_policy_choice(9F)、priv_policy_only(9F)
『Oracle Solaris 11.1 の管理: セキュリティーサービス』
プロセスからいずれかの基本特権を削除することは、そのプロセスを標準に準拠しない状態のままにするだけでなく、予期しないアプリケーション障害を引き起こす可能性があるため、その潜在的な副作用を完全に理解した上でのみ行うようにしてください。