Go to main content
Oracle® Solaris 11.3 でのユーザーとプロセスのセキュリティー保護

印刷ビューの終了

更新: 2016 年 11 月
 
 

権限の詳細

このセクションでは、特権の実装、使用、および割り当てについて詳しく説明します。

特権の実装方法

各プロセスには、プロセスが特定の特権を使用できるかどうかを判断する 4 つの特権セットがあります。カーネルは、特権「有効セット」を自動的に計算します。初期の特権「継承可能セット」は変更できます。特権を使用するように作成されているプログラムは、そのプログラムで使用する特権の「許可されたセット」を減らすことができます。特権「制限セット」は縮小できます。

  • 有効特権セット (E) – 現在有効である特権の集合です。プロセスは、許可されたセット内の特権を有効セットに追加できます。プロセスは、E から特権を削除することもできます。

  • 許可された特権セット (P) – 使用できる特権の集合です。プログラムは、継承または割り当てを通して特権を使用できます。実行プロファイルは、プログラムに特権を割り当てる方法の 1 つです。setuid コマンドは、root が持つすべての特権をプログラムに割り当てます。許可されたセットから特権を削除することはできますが、追加することはできません。P から削除された特権は、E からも自動的に削除されます。

    特権を認識するプログラムは、そのプログラムがまったく使用することのない特権をそのプログラムの許可されたセットから削除します。この方法では、不要な特権がそのプログラムや悪質なプロセスによって悪用されることが防止されます。特権を認識するプログラムの詳細は、Oracle Solaris 11 セキュリティーサービス開発ガイド の 第 2 章, 特権付きアプリケーションの開発を参照してください。

  • 継承可能な特権セット (I) – exec への呼び出しでプロセスが継承できる特権の集合です。exec への呼び出しのあと、継承された特権は許可されたセットと有効セット内に配置されるため、setuid プログラムという特殊なケースを除き、これらのセットが等しくなります。

    setuid プログラムの場合は、exec への呼び出しのあと、継承可能セットがまず制限セットによって制限されます。続いて、継承された特権のセット (I) から制限セット (L) が除かれたものが、そのプロセスの P と E に割り当てられます。

  • 制限特権セット (L) – プロセスとその子プロセスでどの特権が利用できるかを示す上限を定義する集合です。デフォルトでは、制限セットはすべての特権です。プロセスは制限セットを縮小することはできますが、制限セットを拡張することはできません。L は I の制限に使用されます。このため、L は exec の時点で P と E を制限します。

    特権が割り当てられたプログラムを含むプロファイルがユーザーに割り当てられている場合、通常そのユーザーはそのプログラムを実行できます。未変更のシステムでは、プログラムの割り当て済み特権はユーザーの制限セットの範囲内です。プログラムに割り当てられている特権は、ユーザーの許可されたセットの一部になります。特権を割り当てられたプログラムを実行するには、ユーザーはプロファイルシェルからそのプログラムを実行する必要があります。

カーネルは、基本特権セットを認識します。変更されていないシステムの場合、各ユーザーの初期の継承可能セットはログイン時の基本セットと同じです。基本セットを変更することはできませんが、ユーザーが基本セットからどの特権を継承するかは変更できます。

未変更のシステムでは、ログイン時のユーザーの特権セットは次のようになります。

E (Effective): basic
I (Inheritable): basic
P (Permitted): basic
L (Limit): all

ログイン時には各ユーザーの基本セットは、それぞれの継承可能セット、許可されたセット、および有効セットに含まれます。ユーザーの制限セットは、ゾーン (大域または非大域) のデフォルトの制限セットと同等です。

追加の特権をユーザー、正確にはユーザーのログインプロセスに直接割り当てるか、権利プロファイルを介して複数のユーザーに間接的に割り当てるか、またはユーザーに対して特権付きコマンドを割り当てることで間接的に割り当てることができます。また、ユーザーの基本セットから特権を削除できます。手順と例については、Oracle Solaris での権利の割り当てを参照してください。

特権の使用法

特権は Oracle Solaris に組み込まれています。このセクションでは、Oracle Solaris がデバイス、リソース管理、およびレガシーアプリケーションで特権をどのように使用するかを説明します。

プロセスが特権を取得する方法

プロセスが特権を継承するか、またはプロセスに特権を割り当てることができます。プロセスは、その親から特権を継承します。ログイン時に、ユーザーの初期継承可能特権セットによって、そのユーザーのプロセスで使用できる特権が決まります。ユーザーの当初のログインの子プロセスはすべて、このセットを継承します。

また、プログラム、ユーザー、役割、および特定のリソースに特権を直接割りてることもできます。プログラムで特権が必要な場合は、権利プロファイル内でそのプログラムの実行可能ファイルに特権を割り当てます。そのプログラムの実行を許可されたユーザーまたは役割には、そのプログラムが入ったプロファイルを割り当てます。ログイン時、あるいはプロファイルシェルが開かれている場合、プログラムの実行可能ファイルがプロファイルシェルで入力されると、そのプログラムは特権を使用して実行されます。たとえば、Object Access Management プロファイルが含まれる役割は、file_chown 特権を使用して chmod コマンドを実行できるため、その役割が所有していないファイルの所有権を変更できます。

付加的な特権が直接割り当てられたプログラムを役割またはユーザーが実行する場合、割り当てられているその特権は役割またはユーザーの継承可能セットに追加されます。特権が割り当てられたプログラムの子プロセスは、親プロセスの特権を継承します。子プロセスが親プロセスよりも多くの特権を必要とする場合には、子プロセスに直接それらの特権を割り当てる必要があります。

特権を使用するように作成されているプログラムは、特権を認識すると呼ばれます。特権を認識するプログラムは、プログラム実行中の特権の使用を有効または無効にできます。本番環境で使用するためには、プログラムに対し、そのプログラムが有効または無効にする特権を割り当てる必要があります。特権を認識するプログラムを使用可能にする前に、そのプログラムに必要な特権だけを実行可能ファイルに割り当てます。続いて管理者はこのプログラムのテストを行い、タスクが正常に行われるか確認します。また、プログラムが特権を悪用しないかも確認します。

特権を認識するコードの例については、Oracle Solaris 11 セキュリティーサービス開発ガイド の 第 2 章, 特権付きアプリケーションの開発を参照してください。特権を必要とするプログラムに特権を割り当てるには、使用例 34および使用例 46を参照してください。

特権とデバイス

スーパーユーザーモデルではファイルアクセス権によってのみ保護されるシステムインタフェースを、権利モデルでは特権によって保護します。特権を使用したシステムでは、インタフェースを保護するほどの強さはファイルアクセス権にありません。proc_owner などの特権は、ファイルアクセス権をオーバーライドした上でファイルシステムへのフルアクセス権を取得する可能性があります。

このため、Oracle Solaris では、デバイスを開くにはデバイスディレクトリの所有権では不十分です。たとえば、グループ sys のメンバーには、/dev/ip デバイスを開くことが自動的には許可されなくなります。/dev/ip のファイルアクセス権は 0666 ですが、デバイスを開くには net_rawaccess 特権も必要です。

デバイスポリシーは特権によって制御されるため、デバイスを開くためのアクセス権を付与する際の柔軟性が高くなります。特権要件は、デバイスポリシーに合わせて構成することも、ドライバ本体に合わせて構成することもできます。デバイスドライバのインストール、追加、または更新時に、特権要件を構成できます。

詳細は、add_drv(1M)devfsadm(1M)getdevpolicy(1M)、および update_drv(1M) のマニュアルページを参照してください。

特権およびリソース管理

Oracle Solaris では、project.max-locked-memory および zone.max-locked-memory リソース制御を使用して、PRIV_PROC_LOCK_MEMORY 特権が割り当てられているプロセスのメモリー消費を制限できます。プロセスはこの特権を使うことで、物理メモリー内のページをロックできます。

PRIV_PROC_LOCK_MEMORY 特権を権利プロファイルに割り当てると、この特権を持つプロセスに、すべてのメモリーをロックする権限を与えることになります。安全対策として、この特権ユーザーがすべてのメモリーをロックできないように、リソース制御を設定してください。特権付きプロセスが非大域ゾーン内で実行される場合には、zone.max-locked-memory リソース制御を設定します。特権付きプロセスがシステム上で実行される場合には、プロジェクトを作成し、project.max-locked-memory リソース制御を設定します。これらのリソース制御の詳細は、Oracle Solaris 11.3 でのリソースの管理 の 第 6 章, リソース制御についておよびOracle Solaris ゾーン構成リソース の 第 1 章, 非大域ゾーンの構成を参照してください。

レガシーアプリケーションと特権の使用

レガシーアプリケーションに対応するために、特権の実装はスーパーユーザーモデルと権利モデルの両方で動作します。カーネルは、プログラムが特権で動作するように設計されていること示す PRIV_AWARE フラグを自動的に追跡します。特権を認識しない子プロセスについて検討してください。親プロセスから継承された特権はどれも、子の許可されたセットおよび有効なセットで使用可能です。子プロセスで UID が 0に設定されていると、その子プロセスが完全なスーパーユーザー権利を持たない場合があります。プロセスの有効なセットおよび許可されたセットは、子の制限セットの特権に限定されます。このように、特権を認識するプロセスの制限セットによって、特権を認識しない子プロセス root 特権が制限されます。

特権の使用のデバッグ

Oracle Solaris には、特権のエラーを修正するツールが用意されています。ppriv コマンドと truss コマンドを使用して、デバッグ結果を出力できます。この例は、ppriv(1) のマニュアルページを参照してください。例については、権利に関するトラブルシューティングを参照してください。また、dtrace コマンドを使用することもできます。詳細は、dtrace(1M) のマニュアルページとOracle Solaris 11.3 DTrace (Dynamic Tracing) Guideを参照してください。

特権の割り当て

特権」という用語は従来、権利の強化を意味します。Oracle Solaris システムの各プロセスは何らかの権利を使用して実行されるため、特権を削除することでプロセスの権利を減らすことができます。このリリースでは、拡張特権ポリシーを使用することで、特定のリソースにデフォルトで付与されている特権を除くほとんどの特権を削除できます。

ユーザーおよびプロセスへの特権の割り当て

セキュリティー管理者として、特権の割り当てを担当します。既存の権利プロファイルでは、プロファイル内のコマンドに特権がすでに割り当てられています。権利プロファイルを役割またはユーザーに割り当てます。

特権はまた、ユーザー、役割、または権利プロファイルに直接割り当てることもできます。セッションで特権を適切に使用すると信頼できるユーザーには、特権を直接割り当てることができます。直接の割り当てが適するものとしては、影響の少ない特権 (proc_clock_highres など) が挙げられます。直接の割り当てに適しない候補としては、file_dac_write などの、影響が広範囲に及ぶ特権があります。詳細は、権利の割り当てにおけるセキュリティーに関する考慮事項を参照してください。

ユーザー、役割、またはプロセスに対する特権が拒否されることもあります。ユーザーまたは役割の初期継承可能セットまたは制限セットから特権を削除する場合は、注意が必要です。

ユーザーまたは役割の特権の拡張

ユーザーや役割には、継承可能な特権セットがあります。制限セットには初めにすべての特権が設定されるため、このセットは削減のみ可能です。ユーザー、役割、およびプロセスの初期継承可能セットは、その継承可能セットにない特権を割り当てることで拡張できます。

    使用可能な特権を 3 つの方法で拡張できます。

  • 初期継承可能セットには含まれていないが制限セットに含まれている特権は、ユーザーと役割に割り当てることができます。この割り当ては、権利プロファイルの特権付きコマンドを使用して間接的に行うか、または直接行うことができます。

  • 継承可能セットに含まれていない特権は、スクリプトまたはアプリケーションへの特権の追加などのように、プロセスに明示的に割り当てることができます。

  • 継承可能セットに含まれていないが制限セットに含まれている特権は、ネットワークポート、UID、またはファイルオブジェクトに明示的に割り当てることができます。このような特権の使用は拡張特権ポリシーと呼ばれ、使用可能な特権を制限する手段でもあります。詳細は、拡張特権ポリシーを使用した特権使用の制限を参照してください。

特権を必要とする管理タスクにのみその特権を割り当てることは、ユーザーまたは役割の特権をもっとも的確に拡張する方法です。コマンドまたはスクリプトとその必要な特権が含まれている権利プロファイルを作成します。次に、ユーザーまたは役割にその権利プロファイルを割り当てます。このように割り当てることで、ユーザーまたは役割はその特権付きコマンドを実行できます。このようにしないと、ユーザーはその特権を使用できません。

ユーザーまたは役割の初期継承可能特権セットの拡張は、特権を割り当てる方法として適切とは言えません。継承可能セット内の特権はすべて、許可されたセットと有効セット内に存在します。シェル内でユーザーまたは役割が入力するコマンドはすべて、直接割り当てられた特権を使用できます。詳細は、権利の割り当てにおけるセキュリティーに関する考慮事項を参照してください。

不必要に特権が使用可能である状況を減らすには、拡張特権をネットワークポート、UID、およびファイルオブジェクトに割り当てることができます。このように割り当てることで、拡張特権割り当てに含まれない特権が有効セットから削除されます。詳細は、拡張特権ポリシーを使用した特権使用の制限を参照してください。

ユーザーまたは役割の特権の制限

信頼できないユーザーの権利を制限するため、特権と権利プロファイルを信頼できないユーザーに適用することもできます。特権を削除することで、ユーザーと役割による特定のタスク実行を不可能にできます。特権は、初期継承可能セットから削除することも、制限セットから削除することもできます。デフォルトセットよりも小さい初期継承可能セットまたは制限セットを配布する場合は、あらかじめ特権の削除を慎重にテストすることが望まれます。たとえば、初期継承可能セットから特権を削除したためにユーザーがログインできなくなる可能性があります。制限セットから特権を削除すると、削除した特権を必要とする古い setuid root プログラムが失敗する可能性があります。特権の削除の例については、使用例 24および使用例 45を参照してください。

ユーザー ID、ポート、またはファイルオブジェクトに対して使用可能な特権を制限するには、拡張特権ポリシーを使用した特権使用の制限を参照してください。

スクリプトへの特権の割り当て

スクリプトは、コマンドと同様に実行可能ファイルです。このため、コマンドに特権を追加する場合と同じ方法で、権利プロファイルでスクリプトに特権を追加できます。権利プロファイルが割り当てられたユーザーまたは役割がプロファイルシェルでスクリプトを実行すると、スクリプトは、それらの追加された特権で実行されます。スクリプトに特権が必要なコマンドが含まれている場合は、特権が追加されたコマンドも、割り当てられた権利プロファイルに含まれている必要があります。例については、アプリケーションおよびスクリプトへの権利の割り当てを参照してください。

拡張特権ポリシーを使用した特権使用の制限

拡張特権ポリシーは、基本特権および明示的に付与した特権を除き、ポート、ユーザー ID、またはファイルオブジェクトへのアクセスを制限できます。少ない数の特権では、システムを攻撃する目的でリソースを容易に使用することはできません。実際に、ユーザーは所有するファイルとディレクトリを、悪意のあるプロセスによるアクセスから保護できます。拡張特権ポリシーの例については、アプリケーション、スクリプトおよびリソースの特定の権利への制限を参照してください。

特権エスカレーションとユーザー権利

Oracle Solaris では、管理者がセキュリティーを構成するとき、高い柔軟性が提供されます。 このソフトウェアがインストールされていると、特権エスカレーションが防止されます。特権エスカレーションは、意図していたよりも多くの管理権利がユーザーまたはプロセスに与えられたときに発生します。この場合「特権」とはカーネル特権だけではなく、すべての権利を意味します。特権エスカレーションとカーネル特権を参照してください。

Oracle Solaris ソフトウェアには、root 役割にのみ割り当てられる権利が含まれています。ほかのセキュリティー保護が存在する状態で、root 役割用に設計された属性を管理者がほかのアカウントに割り当てる可能性がありますが、このような割り当ては慎重に行う必要があります。

    次に示す権利プロファイルと一連の承認により、root 以外のアカウントの特権がエスカレートされる可能性があります。

  • Media Restore 権利プロファイル – このプロファイルはほかのどの権利プロファイルにも含まれていません。Media Restore はルートファイルシステム全体へのアクセスを提供するため、これを使用することで特権のエスカレーションが可能です。故意に改ざんされたファイルや交換したメディアを復元できます。デフォルトでは、root 役割にはこの権利プロファイルが含まれています。

  • solaris.*.assign 承認 – これらの承認はどの権利プロファイルにも割り当てられていません。solaris.*.assign 承認を持つアカウントは、そのアカウント自体に割り当てられていない権利をほかのユーザーに割り当てることができます。たとえば、solaris.profile.assign 承認を持つ役割は、その役割自体に割り当てられていない権利プロファイルをほかのアカウントに割り当てることができます。デフォルトでは、solaris.*.assign 承認を持つのは root 役割だけです。

    solaris.*.assign 承認ではなく solaris.*.delegate 承認を割り当てます。solaris.*.delegate 承認を使用すると、委託者は、その委託者が所有する権利のみをほかのアカウントに割り当てることができます。たとえば、solaris.profile.delegate 承認が割り当てられた役割は、その役割自体に割り当てられている権利プロファイルをほかのユーザーや役割に割り当てることができます。

カーネル特権のエスカレーションの防止については、特権エスカレーションとカーネル特権を参照してください。

特権エスカレーションとカーネル特権

カーネルにより特権エスカレーションが防止されます。プロセスが必要な特権以外の特権を取得することを防ぐために、無防備なシステム変更に特権の完全セットがあるかどうかが確認されます。たとえば、root (UID=0) が所有するファイルまたはプロセスは、特権の完全セットを備えたプロセスによってのみ変更できます。root アカウントは、特権がなくても root が所有するファイルを変更することができます。しかし、root ユーザー以外は、root が所有するファイルを変更するにはすべての特権が必要です。

同様に、デバイスへのアクセスを提供する操作には、有効なセットのすべての特権が必要です。

    特に file_chown_self および proc_owner は、特権エスカレーションが生じやすい特権です。

  • file_chown_self は、プロセスがそのファイルを渡せるようにする特権です。proc_owner は、プロセス自身が所有しないプロセスを調査できるようにする特権です。

    file_chown_self 特権は、rstchown システム変数によって制限されます。rstchown 変数が 0 に設定されると、file_chown_self 特権は、システムイメージの全ユーザーの初期継承可能セットから削除されます。rstchown システム変数の詳細は、chown(1) のマニュアルページを参照してください。

    file_chown_self 特権は、特定のコマンド、権利プロファイルに配置されているコマンド、および役割または信頼できるユーザーに割り当てられているプロファイルにもっとも安全に割り当てることができます。

  • proc_owner 特権は、プロセス UID を 0 にするには十分ではありません。任意の UID のプロセスを UID=0 にするには、すべての特権が必要です。proc_owner 特権はシステム上のすべてのファイルに無制限の読み取りアクセス権を与えるので、この特権の特定コマンドへの割り当て、プロファイルに配置されているコマンドへの割り当て、および役割に割り当てられているプロファイルへの割り当てはもっとも安全に行います。


Caution

注意  -  file_chown_self 特権または proc_owner 特権がユーザーの初期継承可能セットに含まれるように、ユーザーのアカウントを構成できます。ただし、このような強力な特権をユーザーや役割の継承可能セットに配置するには、セキュリティー上の相応の理由がなければなりません。


デバイスでの特権エスカレーションを防止する方法については、特権とデバイスを参照してください。一般的な説明については、privileges(5) のマニュアルページを参照してださい。