拡張特権ポリシーは、アプリケーションに対する攻撃が成功した場合のシステムへの攻撃者のアクセスを制限します。拡張ポリシールールは、特権割り当ての影響の範囲を、ルール内のリソースだけに制限します。拡張ポリシールールを記述するには、特権を中括弧で囲み、その後にコロンと関連付けられたリソースを記述します。詳細は、ユーザーまたは役割の特権の拡張を参照してください。構文の例については、ppriv(1) および privileges(5) のマニュアルページを参照してください。
管理者と通常のユーザーはいずれも、拡張特権を使用してリソースをロックダウンできます。管理者はユーザー、ポート、およびアプリケーションに対する拡張特権ルールを作成できます。通常のユーザーはコマンド行を使用するか、または ppriv -r コマンドを使用するスクリプトを作成して、アプリケーションによるユーザー指定ディレクトリ外部のファイルへの書き込みを防止できます。
ポートから侵入する悪意のあるユーザーが使用できるアクセスを制限する – ポートに拡張特権ポリシーを適用する方法
非 root デーモンとしてデータベースを実行する – MySQL サービスをロックダウンする方法
非 root デーモンとして Apache Web サーバーを実行する – 特定の特権を Apache HTTP サーバー に割り当てる方法
Apache Web サーバーが特権を使用して実行されていることを確認する – Apache HTTP サーバー が使用している特権を判断する方法
Firefox がシステムのディレクトリに書き込まないようにする – 使用例 38
アプリケーションをシステムの特定のディレクトリに制限する – 使用例 39
Network Time Protocol (NTP) のサービスは、udp トラフィックに対して特権ポート 123 を使用します。このサービスを実行するには特権が必要です。この例の手順では、ほかのポートを保護し、このポートに割り当てられている特権を取得した悪意のあるユーザーがアクセスできないように、サービスマニフェストを変更します。
始める前に
root 役割になる必要があります。詳細は、割り当てられている管理権利の使用を参照してください。
次の /lib/svc/manifest/network/ntp.xml start メソッドエントリでは、net_privaddr、proc_lock_memory、および sys_time 特権をほかのプロセスで使用できます。
privileges='basic,!file_link_any,!proc_info,!proc_session,net_privaddr, proc_lock_memory,sys_time'
!file_link_any,!proc_info,!proc_session に指定されている削除された特権が原因で、サービスは、その他のプロセスに対するシグナル送信または監視と、ファイル名を変更する方法としてのハードリンクの作成を実行できません。つまり、このサービスによって起動されたプロセスは NTP のポート 123 にしかバインドできず、ほかのどの特権ポートにもバインドできません。
ハッカーがこのサービスを悪用してほかのプロセスを開始できる可能性がある場合、そのプロセスも同様に制限されます。
# svccfg -s ntp editprop -a
拡張特権ポリシーにより、指定されている特権と未指定の基本特権を除くすべての特権がこのサービスから削除されます。このため、80 を超える悪用される可能性がある特権が、8 個未満に減少します。
# svcadm restart ntp
# svcprop -s ntp | grep privileges
start/privileges astring basic,!file_link_any,!proc_info,!proc_session,
{net_privaddr}:123/udp,proc_lock_memory,sys_time
restart/privileges astring basic,!file_link_any,!proc_info,!proc_session,
{net_privaddr}:123/udp,proc_lock_memory,sys_time
インストール時に、MySQL データベースは保護されていないポート上で root のフル特権で実行されるように構成されます。このタスクでは、権利プロファイルで MySQL サービスに拡張特権ポリシーを割り当てます。権利プロファイルがサービスの exec メソッドになったあとで、MySQL は保護されているポート上で、MySQL 以外のプロセスによるデータベースアクセスを制限した状態でユーザー mysql として実行されます。
始める前に
初期ユーザーはパッケージをインストールできます。残りのステップは root 役割が実行する必要があります。詳細は、割り当てられている管理権利の使用を参照してください。
# pkg search basename:mysql ... basename ... pkg:/database/mysql-51@version # pfexec pkg install mysql-51
# svcs mysql STATE STIME FMRI disabled May_15 svc:/application/database/mysql:version_51
このサービスのサービスマニフェストは、実行メソッドがシェルスクリプトラッパー /lib/svc/method/mysql_51 であることを指定します。
# svcprop -s mysql | grep manifest
... astring /lib/svc/manifest/application/database/mysql_51.xml
# grep exec= /lib/svc/manifest/application/database/mysql_51.xml
exec='/lib/svc/method/mysql_51 start'
exec='/lib/svc/method/mysql_51 stop'
プロファイル内のコマンドには /lib/svc/method/mysql_51 ラッパーを使用します。
$ su -
Password: xxxxxxxx
# profiles -p "MySQL Service"
MySQL Service> set desc="Locking down the MySQL Service"
MySQL Service> add cmd=/lib/svc/method/mysql_51
MySQL Service:mysql_51> set privs=basic
MySQL Service:mysql_51> add privs={net_privaddr}:3306/tcp
MySQL Service:mysql_51> add privs={file_write}:/var/mysql/5.1/data/*
MySQL Service:mysql_51> add privs={file_write}:/tmp/mysql.sock
MySQL Service:mysql_51> add privs={file_write}:/var/tmp/ib*
MySQL Service:mysql_51> end
MySQL Service> set uid=mysql
MySQL Service> set gid=mysql
MySQL Service> exit
file_write 特権は、デフォルトですべてのプロセスに付与されている基本特権です。書き込み可能パスを明示的に列挙することで、書き込みアクセスがそれらのパスだけに制限されます。この制約は、指定されている実行可能ファイルとその子プロセスに適用されます。
# ipadm set-prop -p extra_priv_ports+=3306 tcp
# ipadm show-prop -p extra_priv_ports tcp
PROTO PROPERTY PERM CURRENT PERSISTENT DEFAULT POSSIBLE
tcp extra_priv_ports rw 2049,4045, 3306 2049,4045 1-65535
3306
特権ポートにバインドするには net_privaddr 特権が必要です。MySQL の場合、デフォルトポート番号 3306 へのバインディングでは、通常はこの権限は不要です。
# svccfg -s mysql:version_51 ...version_51> setprop method_context/profile="MySQL Service" ...version_51> setprop method_context/use_profile=true ...version_51> refresh ...version_51> exit
このサービスを一意に指定するには、FMRI の最後のコンポーネント mysql:version_51 で十分です。
# svcadm enable mysql:version_51
# ppriv $(pgrep mysql)
103697: /usr/mysql/5.1/bin/mysqld --basedir=/usr/mysql/5.1
--datadir=/var/mysql/5.1/data
flags = PRIV_XPOLICY
Extended policies:
{net_privaddr}:3306/tcp
{file_write}:/var/mysql/5.1/data/*
{file_write}:/tmp/mysql.sock
{file_write}:/var/tmp/ib*
E: basic,!file_write
I: basic,!file_write
P: basic,!file_write
L: all
103609: /bin/sh /usr/mysql/5.1/bin/mysqld_safe --user=mysql
--datadir=/var/mysql/5.1/data
flags = PRIV_XPOLICY
Extended policies:
{net_privaddr}:3306/tcp
{file_write}:/var/mysql/5.1/data/*
{file_write}:/tmp/mysql.sock
{file_write}:/var/tmp/ib*
E: basic,!file_write
I: basic,!file_write
P: basic,!file_write
L: all
この手順では、必要な特権のみを Web サーバーデーモンに割り当てることで、その Web サーバーデーモンをロックダウンします。Web サーバーはポート 80 だけにバインドでき、また webservd デーモンが所有するファイルだけに書き込むことができます。root として実行される apache22 サービスプロセスはありません。
始める前に
root 役割になる必要があります。詳細は、割り当てられている管理権利の使用を参照してください。
# profiles -p "Apache2"
profiles:Apache2> set desc="Apache HTTP サーバー Extended Privilege"
profiles:Apache2> add cmd=/lib/svc/method/http-apache22
profiles:Apache2:http-apache22> add privs={net_privaddr}:80/tcp
...http-apache22> add privs={zone}:/system/volatile/apache2
...http-apache22> add privs={zone}:/var/apache2/2.2/logs/*
...http-apache22> add privs={zone}:/var/user
...http-apache22> add privs={file_write}:/var/user/webserv*
...http-apache22> add privs={file_write}:/tmp/*
...http-apache22> add privs={file_write}:/system/volatile/apache*
...http-apache22> add privs={file_write}:/proc/*
...http-apache22> add privs=basic,proc_priocntl
...http-apache22> set uid=webservd
...http-apache22> set gid=webservd
...http-apache22> end
---Apache2> exit
# profiles -p "Apache2"
profiles:Apache2> add privs={net_privaddr}:443/tcp
profiles:Apache2> add privs={net_privaddr}:8443/tcp
profiles:Apache2:http-apache22> end
SSL カーネルプロキシの手順については、Oracle Solaris 11.3 でのネットワークのセキュリティー保護 の SSL カーネルプロキシ を使用するように Apache 2.2 Web サーバーを構成する方法に説明されています。
# svccfg -s apache22 svc:/network/http:Apache2> listprop start/exec start/exec astring "/lib/svc/method/http-apache22 start" ... svc:/network/http:Apache2> setprop start/profile="Apache2" svc:/network/http:Apache2> setprop start/use_profile=true svc:/network/http:Apache2> refresh svc:/network/http:Apache2> exit
apache22 サービスが有効化されると、Apache2 プロファイルが使用されます。
# svcadm enable apache22
ブラウザを開き、Firefox の URL フィールドに localhost と入力します。
次のステップ
特権が正しく適用されていることを確認するため、Apache HTTP サーバー が使用している特権を判断する方法に進みます。
このタスクでは、Apache2 権利プロファイルのデバッグバージョンを作成して、Web サーバーが使用している特権を判断します。
始める前に
特定の特権を Apache HTTP サーバー に割り当てる方法を完了しています。apache22 サービスが無効になっています。root に含まれています。
コマンドのデバッグは、SMF サービスのデバッグよりも単純です。apachectl コマンドは、Apache サービスを対話式に起動します。
# profiles -p "Apache2" profiles:Apache2> set name="Apache-debug" profiles:Apache-debug> sel <Tab><Tab> profiles:Apache-debug:http-apache22> set id=/usr/apache2/2.2/bin/apachectl profiles:Apache-debug:apachectl> end profiles:Apache-debug> exit
詳細は、apachectl(8) のマニュアルページを参照してください。
# usermod -K profiles+=Apache-debug webservd
# su - webservd
# id uid=80(webservd) gid=80(webservd)
SMF を直接使用しないでください。Apache-debug 権利プロファイルのコマンドを使用します。
$ pfbash # ppriv -De /usr/apache2/2.2/bin/apachectl start
# ppriv $(pgrep httpd|head -1)
2999: httpd
flags = PRIV_DEBUG|PRIV_XPOLICY|PRIV_EXEC
5 Extended policies:
6 {net_privaddr}:80/tcp
7 {zone}:/system/volatile/apache2
8 {zone}:/var/apache2/2.2/logs/*
9 {zone}:/var/user
10 {file_write}:/var/user/webserv*
11 {file_write}:/tmp/*
12 {file_write}:/system/volatile/apache*
13 {file_write}:/proc/*
14 E: basic,!file_write,!proc_info,proc_priocntl
15 I: basic,!file_write,!proc_info,proc_priocntl
16 P: basic,!file_write,!proc_info,proc_priocntl
17 L: all