この章では、ご使用のシステムでの特権の管理と使用の手順について説明します。この章の内容は次のとおりです。
特権の概要については、「特権 (概要)」を参照してください。参照情報については、第 12 章特権 (参照)を参照してください。
次の作業マップは、特権を管理および使用するための作業マップです。
作業 |
説明 |
参照先 |
---|---|---|
サイトで特権を使用します |
特権の使用の割り当て、削除、追加、デバッグを含みます。 | |
コマンド実行時に特権を使用します |
割り当てられた特権の使用を含みます。 |
次の作業マップでは、特権の表示、特権の割り当て、および特権コマンドを含むスクリプトの実行の手順を示します。
作業 |
説明 |
参照先 |
---|---|---|
プロセスに含まれる特権を判断します |
プロセスに対する、有効な特権、継承可能な特権、許可された特権、および制限付きの特権のセットを一覧表示します。 | |
プロセスから漏れている特権を判断します |
失敗したプロセスが必要とする特権を一覧表示します。 | |
特権をコマンドに追加します |
特権を権利プロファイルのコマンドに追加します。ユーザーまたは役割を権利プロファイルに割り当てることができます。ユーザーは、プロファイルシェルで割り当てられた特権でコマンドを実行できるようになります。 | |
特権をユーザーに割り当てます |
ユーザーまたは役割の継承可能な一連の特権を拡張します。この手順は、十分注意して実行してください。 | |
ユーザーの特権を制限します |
ユーザーの特権の基本セットを制限します。この手順は、十分注意して実行してください。 | |
特権付きのシェルスクリプトを実行します |
特権をシェルスクリプトおよびシェルスクリプトのコマンドに追加します。その後、プロファイルシェルのスクリプトを実行します。 |
ユーザーおよび役割の特権を管理する最も安全な方法として、権利プロファイルのコマンドに対して特権の使用を制限します。その後、権利プロファイルを役割に含めます。その役割をユーザーに割り当てます。ユーザーは、割り当てられた役割を引き受けると、特権付きコマンドをプロファイルシェルで実行できるようになります。次の手順は、特権の割り当て、特権の削除、および特権の使用のデバッグの方法を示したものです。
この手順は、プロセスで使用可能な特権を判断する方法です。一覧には、特定のコマンドに割り当てられている特権は含まれません。
% ppriv pid $ ppriv -v pid |
プロセス番号です。二重ドル記号 ($$) を使用して親シェルのプロセス番号をコマンドに渡します。
特権名の詳細な一覧表示を行います。
次の例では、ユーザーのシェルプロセスの親プロセスでの特権を一覧表示します。2 つ目の例では、特権の正式名を一覧表示します。出力の最初の文字は、次の特権セットを指しています。
有効な特権セットです。
継承可能な特権セットです。
許可された特権セットです。
制限付きの特権セットです。
% 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 |
役割では、管理シェルまたはプロファイルシェルが使用されます。役割に直接割り当てられている特権を一覧表示するには、役割を引き受け、役割のシェルを使用する必要があります。次の例では、役割 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 |
この手順では、コマンドまたはプロセスが必要とする特権を判断します。
この手順は、コマンドまたはプロセスが失敗している場合に有効です。
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 |
/etc/name_to_sysnum ファイルの syscall 番号を見つけ、失敗しているシステムコールを突き止めます。
% grep 224 /etc/name_to_sysnum creat64 224 |
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 出力のエラーコードのあとに欠如している特権がレポートされます。
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 |
jdoe が objadmin 役割を引き受けると、ファイルに関するアクセス権が変更されます。
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 |
この例では、特権エスカレーションに対する保護について説明します。詳細については、「特権エスカレーションの防止」を参照してください。ファイルは、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 |
コマンドを権利プロファイルに追加するときは、特権をコマンドに追加します。特権によって権利プロファイルを含む役割は管理コマンドを実行することができるようになりますが、ほかのスーパーユーザー機能は与えられません。
コマンドまたはプログラムは、特権を認識できる必要があります。詳細については、「プロセスが特権を取得する方法」を参照してください。
スーパーユーザーになるか、同等の役割を引き受けます。
役割には、認証と特権コマンドが含まれます。役割の詳細については、「RBAC の構成 (作業マップ)」を参照してください。
Solaris 管理コンソールの GUI を開きます。
手順については、「Solaris 管理コンソールで役割を引き受ける方法」を参照してください。
権利ツールを使用して、該当するプロファイルを更新します。
含めるコマンドを選択します。含めるコマンドごとに、コマンドが必要とする特権を追加します。
権利プロファイルにコマンドを含め、含めたコマンドに特権を追加すると、コマンドは、プロファイルシェルで実行されたときに、それらの特権で実行されます。
プロファイルの順序は重要です。プロファイルシェルで、コマンドまたはアクションは、アカウントのプロファイルリストの最初のプロファイルで指定されたセキュリティー属性で実行されます。たとえば、chgrp コマンドが特権付きの Object Access Management 権利プロファイルに含まれていて、Object Access Management が chgrp が検出される最初のプロファイルである場合、chgrp コマンドは Object Access Management プロファイルで指定された特権で実行されます。
特定の特権を持つ何人かのユーザーを常に信頼する場合があります。システムのごく一部に影響を与える非常に限定的な特権をユーザーに割り当てることをお勧めします。特権を直接割り当てることによる影響の詳細については、「セキュリティー属性を直接割り当てる場合に考慮すべきセキュリティー事項」を参照してください。
次の手順により、ユーザー jdoe は高分解能タイマーを使用できるようになります。
Primary Administrator 役割を引き受けるか、スーパーユーザーになります。
Primary Administrator 役割には、Primary Administrator プロファイルが含まれます。役割を作成してユーザーに役割を割り当てるには、『Solaris のシステム管理 (基本編)』の第 2 章「Solaris 管理コンソールの操作 (手順)」を参照してください。
高分解能時間に影響を与える特権を、ユーザーの最初の継承可能な特権セットに追加します。
$ usermod -K defaultpriv=basic,proc_clock_highres jdoe |
既存の値が defaultpriv キーワードの値で置き換えられます。このため、ユーザーが basic 特権を保持するために、値 basic を指定する必要があります。デフォルトの構成では、すべてのユーザーが基本特権を保持します。
結果として生じる user_attr エントリを確認します。
$ grep jdoe /etc/user_attr jdoe::::type=normal;defaultpriv=basic,proc_clock_highres |
この例では、システム上の時間の処理を唯一のタスクとする役割を作成します。
$ /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 |
基本セットを削減するか、制限セットを削減することにより、ユーザーまたは役割が使用可能な特権を制限することができます。このような制限は意図しない面に影響を与える可能性があるため、この方法でユーザーの特権を制限するにはそれ相応の理由が必要です。
ユーザーに対して基本セットまたは制限セットが変更されたユーザーの機能を入念にテストしてください。
基本セットがデフォルトより少ないと、ユーザーはシステムを使用できない可能性があります。
制限セットがすべての特権より少ないと、実効 UID=0 で実行する必要があるプロセスが失敗する可能性があります。
ユーザーの基本セットおよび制限セットの特権を判断します。
手順については、「プロセスの特権を判断する方法」を参照してください。
$ usermod -K defaultpriv=basic,!priv-name username |
proc_session 特権を削除することにより、ユーザーは現在のセッション外のプロセスを検査できなくなります。file_link_any 特権を削除することにより、ユーザーは所有していないファイルへのハードリンクを作成できなくなります。
proc_fork 特権または proc_exec 特権は削除しないでください。これらの特権がないと、ユーザーはシステムを使用することができません。実際のところ、これらの 2 つの特権は、ほかのプロセスに対してfork() または exec() すべきでないデーモンからそれ相応の理由がある場合にのみ削除されます。
(省略可能) 制限セットから特権の 1 つを削除します。
$ usermod -K limitpriv=all,!priv-name username |
username の機能をテストします。
username としてログインし、username がシステム上で実行する必要のあるタスクを実行してみます。
次の例では、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 |
次の例では、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 |
継承された特権を持つコマンドを実行するシェルスクリプトを作成するときは、割り当てる特権付きのコマンドを該当する権利プロファイルに含める必要があります。
1 行目は、スクリプトを /bin/pfsh またはほかのプロファイルシェルで開始します。
#!/bin/pfsh # Copyright (c) 2009 by Sun Microsystems, Inc. |
スクリプトのコマンドが必要とする特権を判断します。
% ppriv -eD script-full-path |
Solaris 管理コンソールの GUI を開きます。
手順については、「Solaris 管理コンソールで役割を引き受ける方法」を参照してください。Primary Administrator など、権利プロファイルを作成することができる役割を選択します。
権利ツールを使用して、該当するプロファイルを作成または更新します。
スクリプトを選択し、実行に特権が必要なシェルスクリプトのコマンドをそれぞれ権利プロファイルに含めます。含めるコマンドごとに、コマンドが必要とする特権を追加します。
権利プロファイルの順序は重要です。プロファイルシェルは、プロファイルリストのコマンドの最初のインスタンスを実行します。たとえば、chgrp コマンドが Object Access Management 権利プロファイルに含まれていて、Object Access Management が chgrp が検出される最初のプロファイルである場合、chgrp コマンドは Object Access Management プロファイルで指定された特権で実行されます。
権利プロファイルを役割に追加し、その役割をユーザーに割り当てます。
ユーザーは、プロファイルを実行するために、その役割を引き受け、役割のプロファイルシェルでスクリプトを実行します。
次の作業マップでは、割り当てられた特権を使用する手順を示します。
作業 |
説明 |
参照先 |
---|---|---|
任意のシェルでユーザーとしての特権を表示します |
直接割り当てられた特権を示します。プロセスのすべてはこれらの特権で実行されます。 | |
特権で実行できるコマンドを判断します |
権利プロファイルで特権が実行可能プログラムに割り当てられているとき、その実行可能プログラムはプロファイルシェルで入力する必要があります。 | |
役割が特権で実行できるコマンドを判断します |
役割が特権で実行できるコマンドを判断する役割を引き受けます。 |
ユーザーに特権が直接割り当てられるとき、その特権はすべてのシェルで有効になります。ユーザーに特権が直接割り当てられないとき、ユーザーはプロファイルシェルを開く必要があります。たとえば、特権が割り当てられているコマンドがユーザーの権利プロファイルのリスト内の権利プロファイルに含まれるとき、ユーザーはプロファイルシェルでコマンドを実行する必要があります。
次の手順は、特権が直接割り当てられたかどうかを判断する方法です。
直接割り当てられた特権を不適切に使用すると、無意識のうちにセキュリティーを侵害する可能性があります。詳細については、「セキュリティー属性を直接割り当てる場合に考慮すべきセキュリティー事項」を参照してください。
プロセスが使用可能な特権を一覧表示します。
手順については、「プロセスの特権を判断する方法」を参照してください。
任意のシェルでアクションを起動し、コマンドを実行します。
有効なセットに一覧表示されている特権は、セッション全体を通して有効です。基本セットに加えて特権を直接割り当てた場合、その特権は有効なセットに一覧表示されます。
直接特権が割り当てられた場合、基本セットにはデフォルトの基本セットより多くの特権が含まれます。この例では、ユーザーは常時 proc_clock_highres 特権にアクセスできます。
% /usr/ucb/whoami jdoe % ppriv -v $$ 1800: pfksh flags = <none> E: file_link_any,…,proc_clock_highres,proc_session I: file_link_any,…,proc_clock_highres,proc_session P: file_link_any,…,proc_clock_highres,proc_session L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time % ppriv -vl proc_clock_highres Allows a process to use high resolution timers. |
役割では、管理シェルまたはプロファイルシェルが使用されます。役割を引き受けるユーザーは、役割のシェルを使用して、役割に直接割り当てられている特権を一覧表示することができます。次の例では、役割 realtime に日時のプログラムを処理する特権が直接割り当てられます。
% su - realtime Password: <Type realtime password> $ /usr/ucb/whoami realtime $ ppriv -v $$ 1600: pfksh flags = <none> E: file_link_any,…,proc_clock_highres,proc_session,sys_time I: file_link_any,…,proc_clock_highres,proc_session,sys_time P: file_link_any,…,proc_clock_highres,proc_session,sys_time L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time |
ユーザーに直接特権が割り当てられていないとき、ユーザーは権利プロファイルによって特権付きコマンドにアクセスすることができます。権利プロファイルのコマンドは、プロファイルシェルで実行する必要があります。
Solaris 管理コンソールに対して認証を行うユーザーまたは役割は、solaris.admin.usermgr.read
承認を得る必要があります。Basic Solaris User 権利プロファイルには、この承認が含まれます。
割り当てられている権利プロファイルを判断します。
$ /usr/sadm/bin/smuser list -- -n username -l |
Authenticating as user: admin … Please enter a string value for: password :: … User name: username User ID (UID): 130 Primary group: staff Secondary groups: Comment: object mgt jobs Login Shell: /bin/sh Home dir server: system Home directory: /export/home/username AutoHome setup: True Mail server: system Rights: Object Access Management Assigned Roles: |
「Rights:」で始まる行を探します。
「Rights」行には、直接割り当てた権利プロファイルの名前が一覧表示されます。
exec_attr データベースの権利プロファイルの名前を見つけます。
$ cd /etc/security $ grep "Object Access Management" exec_attr Object Access Management:solaris:cmd:::/usr/bin/chgrp:privs=file_chown Object Access Management:solaris:cmd:::/usr/bin/chown:privs=file_chown Object Access Management:suser:cmd:::/usr/bin/chgrp:euid=0 Object Access Management:suser:cmd:::/usr/bin/chmod:euid=0 … |
特権が追加されたコマンドは、solaris ポリシーエントリの最後に一覧表示されます。
プロファイルシェルで、特権を必要とするコマンドを入力します。
コマンドを通常のシェルで入力すると、そのコマンドは特権で実行されず、失敗します。
% pfsh $ |
次の例で、ユーザー jdoe は、通常のシェルからはファイルに関するグループアクセス権を変更できません。しかし、jdoe は、プロファイルシェルでコマンドを入力すると、グループアクセス権を変更できます。
% whoami jdoe % ls -l useful.script -rwxr-xr-- 1 nodoe eng 262 Apr 2 10:52 useful.script chgrp staff useful.script chgrp: useful.script: Not owner % pfksh $ /usr/ucb/whoami jdoe $ chgrp staff useful.script $ chown jdoe useful.script $ ls -l useful.script -rwxr-xr-- 1 jdoe staff 262 Apr 2 10:53 useful.script |
役割は、特権が割り当てられたコマンドを含む権利プロファイルによって、特権付きコマンドにアクセスすることができます。特権付きコマンドに対するアクセス権をユーザーに与える最も安全な方法は、役割をコマンドに割り当てることです。ユーザーは、役割を引き受けると、その役割の権利プロファイルに含まれるすべての特権付きコマンドを実行することができます。
Solaris 管理コンソールに対して認証を行うユーザーまたは役割は、solaris.admin.usermgr.read
承認を得る必要があります。Basic Solaris User 権利プロファイルには、この承認が含まれます。
引き受けることができる役割を判断します。
$ /usr/sadm/bin/smuser list -- -n username -l Authenticating as user: primadmin … User name: username User ID (UID): 110 Primary group: staff Secondary groups: Comment: Has admin roles Login Shell: /bin/sh … Rights: Assigned Roles: primadmin, admin |
「Assigned Roles:」で始まる行を探します 。
「Assigned Roles」行には、引き受けることができる役割が一覧表示されます。
役割の 1 つに含まれる権利プロファイルを判断します。
$ /usr/sadm/bin/smuser list -- -n admin -l Authenticating as user: primadmin … User name: admin User ID (UID): 101 Primary group: sysadmin Secondary groups: Comment: system administrator Login Shell: /bin/pfksh … Rights: System Administrator Assigned Roles: |
「Rights:」行で役割の権利プロファイルの名前を探します。
prof_attr データベースの権利プロファイルを見つけます。
System Administrator プロファイルはプロファイルの集合なので、System Administrator プロファイルのプロファイルを一覧表示する必要があります。
$ cd /etc/security $ grep "System Administrator" prof_attr System Administrator:::Can perform most non-security administrative tasks:profiles=Audit Review,Printer Management,Cron Management, Device Management,File System Management,Mail Management,Maintenance and Repair,Media Backup,Media Restore,Name Service Management,Network Management,Object Access Management,Process Management,Software Installation,User Management,All;help=RtSysAdmin.html |
権利プロファイルごとに、exec_attr データベースの権利プロファイルを見つけます。
たとえば、Network Management プロファイルは、System Administrator プロファイルの補助プロファイルです。Network Management プロファイルには、多数の特権付きコマンドが含まれます。
$ cd /etc/security $ grep "Network Management" exec_attr Network Management:solaris:cmd:::/usr/sbin/ifconfig:privs=sys_net_config Network Management:solaris:cmd:::/usr/sbin/route:privs=sys_net_config … |
コマンドおよびそれらに割り当てられた特権は、solaris ポリシーエントリの最後の 2 つのフィールドです。役割のプロファイルシェルで、これらのコマンドを実行することができます。
ユーザーが役割を引き受けると、シェルはプロファイルシェルになります。したがって、コマンドは、コマンドに割り当てられた特権で実行されます。次の例で、admin 役割は、 useful.script ファイルに関する権利を変更することができます。
% whoami jdoe % ls -l useful.script -rwxr-xr-- 1 elsee eng 262 Apr 2 10:52 useful.script chgrp admin useful.script chgrp: useful.script: Not owner % su - admin Password: <Type admin password> $ /usr/ucb/whoami admin $ chgrp admin useful.script $ chown admin useful.script $ ls -l useful.script -rwxr-xr-- 1 admin admin 262 Apr 2 10:53 useful.script |