Solaris のシステム管理 (セキュリティサービス)

特権の管理

ユーザーおよび役割の特権を管理する最も安全な方法として、権利プロファイルのコマンドに対して特権の使用を制限します。その後、権利プロファイルを役割に含めます。その役割をユーザーに割り当てます。ユーザーは、割り当てられた役割を引き受けると、特権付きコマンドをプロファイルシェルで実行できるようになります。次の手順は、特権の割り当て、特権の削除、および特権の使用のデバッグの方法を示したものです。

Procedureプロセスの特権を判断する方法

この手順は、プロセスで使用可能な特権を判断する方法です。一覧には、特定のコマンドに割り当てられている特権は含まれません。

  1. シェルのプロセスで使用可能な特権を一覧表示します。


    % ppriv pid
    $ ppriv -v pid
    
    pid

    プロセス番号です。二重ドル記号 ($$) を使用して親シェルのプロセス番号をコマンドに渡します。

    -v

    特権名の詳細な一覧表示を行います。


例 11–1 現在のシェルでの特権の判断

次の例では、ユーザーのシェルプロセスの親プロセスでの特権を一覧表示します。2 つ目の例では、特権の正式名を一覧表示します。出力の最初の文字は、次の特権セットを指しています。

E

有効な特権セットです。

I

継承可能な特権セットです。

P

許可された特権セットです。

L

制限付きの特権セットです。


% ppriv $$
1200:   -csh
flags = <none>
        E: basic
        I: basic
        P: basic
        L: all
% ppriv -v $$
1200:   -csh
flags = <none>
        E: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session
        I: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session
        P: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session
        L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time


例 11–2 引き受けることができる役割の特権の判断

役割では、管理シェルまたはプロファイルシェルが使用されます。役割に直接割り当てられている特権を一覧表示するには、役割を引き受け、役割のシェルを使用する必要があります。次の例では、役割 sysadmin に直接割り当てられている特権はありません。


% su - sysadmin
Password: <Type sysadmin password>
$ /usr/ucb/whoami
sysadmin
$ ppriv -v $$
1400:   pfksh
flags = <none>
        E: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session
        I: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session
        P: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session
        L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time

Procedureプログラムが必要とする特権を判断する方法

この手順では、コマンドまたはプロセスが必要とする特権を判断します。

始める前に

この手順は、コマンドまたはプロセスが失敗している場合に有効です。

  1. ppriv デバッグコマンドに対する引数として失敗しているコマンドを入力します。


    % ppriv -eD touch /etc/acct/yearly
    touch[11365]: missing privilege "file_dac_write" 
         (euid = 130, syscall = 224) needed at ufs_direnter_cm+0x27c
    touch: /etc/acct/yearly cannot create
  2. /etc/name_to_sysnum ファイルの syscall 番号を見つけ、失敗しているシステムコールを突き止めます。


    % grep 224 /etc/name_to_sysnum
    creat64                 224

例 11–3 特権の使用を検査するための truss コマンドの使用

truss コマンドは、通常のシェルで特権の使用をデバッグすることができます。たとえば、次のコマンドは、失敗した touch プロセスをデバッグします。


% truss -t creat touch /etc/acct/yearly
creat64("/etc/acct/yearly", 0666)            
                       Err#13 EACCES [file_dac_write]
touch: /etc/acct/yearly cannot create

拡張された /proc インタフェースで、truss 出力のエラーコードのあとに欠如している特権がレポートされます。



例 11–4 プロファイルシェルで特権の使用を検査するための ppriv コマンドの使用

ppriv コマンドは、プロファイルシェルで特権の使用をデバッグすることができます。権利プロファイルをユーザーに割り当て、割り当てた権利プロファイルに特権付きのコマンドを含める場合、そのコマンドはプロファイルシェルで入力する必要があります。特権付きのコマンドを通常のシェルで入力すると、そのコマンドは特権では実行されません。

次の例で、jdoe ユーザーは、役割 objadminを引き受けることができます。objadmin 役割には、Object Access Management 権利プロファイルが含まれます。この権利プロファイルによって、objadmin 役割は objadmin が所有しないファイルに関するアクセス権を変更することができます。

次の例で、jdoe は、useful.script ファイルに関するアクセス権を変更することができません。


jdoe% ls -l useful.script
-rw-r--r--  1 aloe  staff  2303 Apr 10 10:10 useful.script
jdoe% chown objadmin useful.script
chown: useful.script: Not owner
jdoe% ppriv -eD chown objadmin useful.script
chown[11444]: missing privilege "file_chown" 
            (euid = 130, syscall = 16) needed at ufs_setattr+0x258
chown: useful.script: Not owner

jdoeobjadmin 役割を引き受けると、ファイルに関するアクセス権が変更されます。


jdoe% su - objadmin
Password: <Type objadmin password>
$ ls -l useful.script
-rw-r--r--  1 aloe  staff  2303 Apr 10 10:10 useful.script
$ chown objadmin useful.script
$ ls -l useful.script
-rw-r--r--  1 objadmin  staff  2303 Apr 10 10:10 useful.script
$ chgrp admin useful.script
$ ls -l objadmin.script
-rw-r--r--  1 objadmin  admin  2303 Apr 10 10:11 useful.script


例 11–5 root ユーザーが所有するファイルの変更

この例では、特権エスカレーションに対する保護について説明します。詳細については、「特権エスカレーションの防止」を参照してください。ファイルは、root ユーザーが所有します。権限の弱い objadmin 役割ではファイルの所有を変更するためにはすべての特権が必要なので、処理は失敗します。


jdoe% su - objadmin
Password: <Type objadmin password>
$ cd /etc; ls -l system
-rw-r--r--  1 root  sys   1883 Oct 10 10:20 system
$ chown objadmin system
chown: system: Not owner
$ ppriv -eD chown objadmin system
chown[11481]: missing privilege "ALL" 
     (euid = 101, syscall = 16) needed at ufs_setattr+0x258
chown: system: Not owner

Procedure特権をコマンドに追加する方法

コマンドを権利プロファイルに追加するときは、特権をコマンドに追加します。特権によって権利プロファイルを含む役割は管理コマンドを実行することができるようになりますが、ほかのスーパーユーザー機能は与えられません。

始める前に

コマンドまたはプログラムは、特権を認識できる必要があります。詳細については、「プロセスが特権を取得する方法」を参照してください。

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、「RBAC の構成 (作業マップ)」を参照してください。

  2. Solaris 管理コンソールの GUI を開きます。

    手順については、「Solaris 管理コンソールで役割を引き受ける方法」を参照してください。

  3. 権利ツールを使用して、該当するプロファイルを更新します。

    含めるコマンドを選択します。含めるコマンドごとに、コマンドが必要とする特権を追加します。


    注意 – 注意 –

    権利プロファイルにコマンドを含め、含めたコマンドに特権を追加すると、コマンドは、プロファイルシェルで実行されたときに、それらの特権で実行されます。

    プロファイルの順序は重要です。プロファイルシェルで、コマンドまたはアクションは、アカウントのプロファイルリストの最初のプロファイルで指定されたセキュリティー属性で実行されます。たとえば、chgrp コマンドが特権付きの Object Access Management 権利プロファイルに含まれていて、Object Access Management が chgrp が検出される最初のプロファイルである場合、chgrp コマンドは Object Access Management プロファイルで指定された特権で実行されます。


Procedure特権をユーザーまたは役割に割り当てる方法

特定の特権を持つ何人かのユーザーを常に信頼する場合があります。システムのごく一部に影響を与える非常に限定的な特権をユーザーに割り当てることをお勧めします。特権を直接割り当てることによる影響の詳細については、「セキュリティー属性を直接割り当てる場合に考慮すべきセキュリティー事項」を参照してください。

次の手順により、ユーザー jdoe は高分解能タイマーを使用できるようになります。

  1. Primary Administrator 役割を引き受けるか、スーパーユーザーになります。

    Primary Administrator 役割には、Primary Administrator プロファイルが含まれます。役割を作成してユーザーに役割を割り当てるには、『Solaris のシステム管理 (基本編)』の第 2 章「Solaris 管理コンソールの操作 (手順)」を参照してください。

  2. 高分解能時間に影響を与える特権を、ユーザーの最初の継承可能な特権セットに追加します。


    $ usermod -K defaultpriv=basic,proc_clock_highres jdoe
    

    既存の値が defaultpriv キーワードの値で置き換えられます。このため、ユーザーが basic 特権を保持するために、値 basic を指定する必要があります。デフォルトの構成では、すべてのユーザーが基本特権を保持します。

  3. 結果として生じる user_attr エントリを確認します。


    $ grep jdoe /etc/user_attr
    jdoe::::type=normal;defaultpriv=basic,proc_clock_highres

例 11–6 システム時間を構成するための特権付き役割の作成

この例では、システム上の時間の処理を唯一のタスクとする役割を作成します。


$ /usr/sadm/bin/smrole -D nisplus:/examplehost/example.domain \
-r primaryadm -l <Type primaryadm password> \
add -- -n clockmgr \
-c "Role that sets system time" \
-F "Clock Manager" \
-s /bin/pfksh \
-u 108 \
-P <Type clockmgr password> \
-K defaultpriv=basic,proc_priocntl,sys_cpu_config,
proc_clock_highres,sys_time

-K 行は、表示の都合上、折り返して記載されています。

役割がローカルに作成される場合、その役割に対する user_attr エントリは次のようになります。


clockmgr:::Role that sets system time:
type=role;defaultpriv=basic,proc_priocntl,sys_cpu_config,
proc_clock_highres,sys_time

Procedureユーザーまたは役割の特権を制限する方法

基本セットを削減するか、制限セットを削減することにより、ユーザーまたは役割が使用可能な特権を制限することができます。このような制限は意図しない面に影響を与える可能性があるため、この方法でユーザーの特権を制限するにはそれ相応の理由が必要です。


注意 – 注意 –

ユーザーに対して基本セットまたは制限セットが変更されたユーザーの機能を入念にテストしてください。


  1. ユーザーの基本セットおよび制限セットの特権を判断します。

    手順については、「プロセスの特権を判断する方法」を参照してください。

  2. (省略可能) 基本セットから特権の 1 つを削除します。


    $ usermod -K defaultpriv=basic,!priv-name username
    

    proc_session 特権を削除することにより、ユーザーは現在のセッション外のプロセスを検査できなくなります。file_link_any 特権を削除することにより、ユーザーは所有していないファイルへのハードリンクを作成できなくなります。


    注意 – 注意 –

    proc_fork 特権または proc_exec 特権は削除しないでください。これらの特権がないと、ユーザーはシステムを使用することができません。実際のところ、これらの 2 つの特権は、ほかのプロセスに対してfork() または exec() すべきでないデーモンからそれ相応の理由がある場合にのみ削除されます。


  3. (省略可能) 制限セットから特権の 1 つを削除します。


    $ usermod -K limitpriv=all,!priv-name username
    
  4. username の機能をテストします。

    username としてログインし、username がシステム上で実行する必要のあるタスクを実行してみます。


例 11–7 ユーザーの制限セットからの特権の削除

次の例では、jdoe の最初のログインから開始されるすべてのセッションで sys_linkdir 特権を使用できないようにします。すなわち、ユーザーは、su コマンドを実行したあとでも、ディレクトリへのハードリンクを作成することやディレクトリへのリンクを解除することができません。


$ usermod -K limitpriv=all,!sys_linkdir jdoe
$ grep jdoe /etc/user_attr
jdoe::::type=normal;defaultpriv=basic;limitpriv=all,!sys_linkdir


例 11–8 ユーザーの基本セットからの特権の削除

次の例では、jdoe の最初のログインから開始されるすべてのセッションで proc_session 特権を使用できないようにします。すなわち、ユーザーは、su コマンドを実行したあとでも、ユーザーのセッション外のいずれのプロセスも検査できません。


$ usermod -K defaultpriv=basic,!proc_session jdoe

$ grep jdoe /etc/user_attr
jdoe::::type=normal;defaultpriv=basic,!proc_session;limitpriv=all

Procedure特権付きのコマンドを含むシェルスクリプトの実行方法


注 –

継承された特権を持つコマンドを実行するシェルスクリプトを作成するときは、割り当てる特権付きのコマンドを該当する権利プロファイルに含める必要があります。


  1. 1 行目は、スクリプトを /bin/pfsh またはほかのプロファイルシェルで開始します。


    #!/bin/pfsh
    # Copyright (c) 2009 by Sun Microsystems, Inc.
  2. スクリプトのコマンドが必要とする特権を判断します。


    % ppriv -eD script-full-path
    
  3. Solaris 管理コンソールの GUI を開きます。

    手順については、「Solaris 管理コンソールで役割を引き受ける方法」を参照してください。Primary Administrator など、権利プロファイルを作成することができる役割を選択します。

  4. 権利ツールを使用して、該当するプロファイルを作成または更新します。

    スクリプトを選択し、実行に特権が必要なシェルスクリプトのコマンドをそれぞれ権利プロファイルに含めます。含めるコマンドごとに、コマンドが必要とする特権を追加します。


    注意 – 注意 –

    権利プロファイルの順序は重要です。プロファイルシェルは、プロファイルリストのコマンドの最初のインスタンスを実行します。たとえば、chgrp コマンドが Object Access Management 権利プロファイルに含まれていて、Object Access Management が chgrp が検出される最初のプロファイルである場合、chgrp コマンドは Object Access Management プロファイルで指定された特権で実行されます。


  5. 権利プロファイルを役割に追加し、その役割をユーザーに割り当てます。

    ユーザーは、プロファイルを実行するために、その役割を引き受け、役割のプロファイルシェルでスクリプトを実行します。