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

印刷ビューの終了

更新: 2016 年 11 月
 
 

拡張特権を使用したリソースのロックダウン

拡張特権ポリシーは、アプリケーションに対する攻撃が成功した場合のシステムへの攻撃者のアクセスを制限します。拡張ポリシールールは、特権割り当ての影響の範囲を、ルール内のリソースだけに制限します。拡張ポリシールールを記述するには、特権を中括弧で囲み、その後にコロンと関連付けられたリソースを記述します。詳細は、ユーザーまたは役割の特権の拡張を参照してください。構文の例については、ppriv(1) および privileges(5) のマニュアルページを参照してください。

管理者と通常のユーザーはいずれも、拡張特権を使用してリソースをロックダウンできます。管理者はユーザー、ポート、およびアプリケーションに対する拡張特権ルールを作成できます。通常のユーザーはコマンド行を使用するか、または ppriv -r コマンドを使用するスクリプトを作成して、アプリケーションによるユーザー指定ディレクトリ外部のファイルへの書き込みを防止できます。

ポートに拡張特権ポリシーを適用する方法

Network Time Protocol (NTP) のサービスは、udp トラフィックに対して特権ポート 123 を使用します。このサービスを実行するには特権が必要です。この例の手順では、ほかのポートを保護し、このポートに割り当てられている特権を取得した悪意のあるユーザーがアクセスできないように、サービスマニフェストを変更します。

始める前に

root 役割になる必要があります。詳細は、割り当てられている管理権利の使用を参照してください。

  1. ポートのデフォルトのサービスマニフェストエントリを参照します。

    次の /lib/svc/manifest/network/ntp.xml start メソッドエントリでは、net_privaddrproc_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 にしかバインドできず、ほかのどの特権ポートにもバインドできません。

    ハッカーがこのサービスを悪用してほかのプロセスを開始できる可能性がある場合、そのプロセスも同様に制限されます。

  2. start メソッドと restart メソッドを変更して、net_privaddr 特権をこのポートのみに制限します。
    # svccfg -s ntp editprop -a
    1. 文字列 net_privaddr を検索します。
    2. net_privaddr が含まれているエントリのコメントを解除します。
    3. 両方のエントリで net_privaddr{net_privaddr}:123/udp に置き換えます。

      拡張特権ポリシーにより、指定されている特権と未指定の基本特権を除くすべての特権がこのサービスから削除されます。このため、80 を超える悪用される可能性がある特権が、8 個未満に減少します。

  3. 拡張特権ポリシーを使用するため、サービスを再起動します。
    # svcadm restart ntp
  4. サービスが拡張特権を使用していることを確認します。
    # 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 サービスをロックダウンする方法

インストール時に、MySQL データベースは保護されていないポート上で root のフル特権で実行されるように構成されます。このタスクでは、権利プロファイルで MySQL サービスに拡張特権ポリシーを割り当てます。権利プロファイルがサービスの exec メソッドになったあとで、MySQL は保護されているポート上で、MySQL 以外のプロセスによるデータベースアクセスを制限した状態でユーザー mysql として実行されます。

始める前に

初期ユーザーはパッケージをインストールできます。残りのステップは root 役割が実行する必要があります。詳細は、割り当てられている管理権利の使用を参照してください。

  1. MySQL パッケージをインストールします。
    # pkg search basename:mysql
    ...
    basename ... pkg:/database/mysql-51@version
    # pfexec pkg install mysql-51

    注 - MySQL データベースの新しいバージョンにアップグレードした場合は、5.1 および 51 ではなく新しいバージョン番号を使用するようにすべての手順を変更してください。
  2. MySQL サービスの状態と FMRI を表示します。
    # svcs mysql
    STATE          STIME    FMRI
    disabled       May_15   svc:/application/database/mysql:version_51
  3. サービスの実行メソッドを変更する権利プロファイルを作成します。

    このサービスのサービスマニフェストは、実行メソッドがシェルスクリプトラッパー /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 特権は、デフォルトですべてのプロセスに付与されている基本特権です。書き込み可能パスを明示的に列挙することで、書き込みアクセスがそれらのパスだけに制限されます。この制約は、指定されている実行可能ファイルとその子プロセスに適用されます。

  4. MySQL のデフォルトポートを特権ポートにします。
    # 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 へのバインディングでは、通常はこの権限は不要です。

  5. 権利プロファイルを MySQL サービスに割り当て、サービスに対してそれを使用するように指示します。
    # 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
  6. サービスを有効にします。

    このサービスを一意に指定するには、FMRI の最後のコンポーネント mysql:version_51 で十分です。

    # svcadm enable mysql:version_51
  7. (オプション) MySQL Service 権利プロファイルに指定されている権利を使用してサービスが実行されていることを確認します。
    # 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

特定の特権を Apache HTTP サーバー に割り当てる方法

この手順では、必要な特権のみを Web サーバーデーモンに割り当てることで、その Web サーバーデーモンをロックダウンします。Web サーバーはポート 80 だけにバインドでき、また webservd デーモンが所有するファイルだけに書き込むことができます。root として実行される apache22 サービスプロセスはありません。

始める前に

root 役割になる必要があります。詳細は、割り当てられている管理権利の使用を参照してください。

  1. Web サーバー権利プロファイルを作成します。
    # 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
  2. (オプション) Apach2 で SSL カーネルプロキシを使用する場合、webservd 拡張ポリシーに SSL ポートを追加する必要があります。
    # 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 サーバーを構成する方法に説明されています。

  3. apache22 SMF 起動メソッドに権利プロファイルを追加します。
    # 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 プロファイルが使用されます。

  4. apache22 サービスを有効にします。
    # svcadm enable apache22
  5. Web サーバーが機能していることを確認します。

    ブラウザを開き、Firefox の URL フィールドに localhost と入力します。

次のステップ

特権が正しく適用されていることを確認するため、Apache HTTP サーバー が使用している特権を判断する方法に進みます。

Apache HTTP サーバー が使用している特権を判断する方法

このタスクでは、Apache2 権利プロファイルのデバッグバージョンを作成して、Web サーバーが使用している特権を判断します。

始める前に

特定の特権を Apache HTTP サーバー に割り当てる方法を完了しています。apache22 サービスが無効になっています。root に含まれています。

  1. 別のコマンドを呼び出すため、Apache2 プロファイルをクローニングします。

    コマンドのデバッグは、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) のマニュアルページを参照してください。

  2. クローニングしたプロファイルを webservd アカウントに割り当てます。
    # usermod -K profiles+=Apache-debug webservd
  3. webservd 識別情報に切り替えます。
    # su - webservd
  4. (オプション) この識別情報を検証します。
    # id   
    uid=80(webservd) gid=80(webservd)
  5. プロファイルシェルで、Web サービスをデバッグモードで起動します。

    SMF を直接使用しないでください。Apache-debug 権利プロファイルのコマンドを使用します。

    $ pfbash
    # ppriv -De /usr/apache2/2.2/bin/apachectl start
  6. root 役割で、最初の http デーモンの特権を調べます。
    # 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