Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
コンテンツコンテンツ
セキュリティ強化ガイド
  1. 前書き
  2. 1 セキュリティと機密保持
  3. 2 コモンクライテリア (Common Criteria)
  4. I 認証
    1. 3 PAM を利用した認証
    2. 4 NIS の使用
    3. 5 YaST を利用した認証クライアントの設定
    4. 6 389 LDAP ディレクトリサービス
    5. 7 Kerberos を利用したネットワーク認証
    6. 8 Active Directory サポート
    7. 9 FreeRADIUS サーバの構築
  5. II ローカルセキュリティ
    1. 10 物理的なセキュリティ
    2. 11 seccheck を利用した自動的なセキュリティチェック
    3. 12 ソフトウエア管理
    4. 13 ファイルの管理
    5. 14 パーティションやファイルの暗号化
    6. 15 cryptctl を利用したアプリケーション向けのストレージ暗号化
    7. 16 ユーザ管理
    8. 17 Spectre/Meltdown チェッカー
    9. 18 YaST を利用したセキュリティの設定
    10. 19 PolKit による認可制御
    11. 20 Linux でのアクセス制御リスト
    12. 21 証明書ストア
    13. 22 AIDE を利用した侵入検知
  6. III ネットワークセキュリティ
    1. 23 X Window System と X 認証
    2. 24 SSH: 機密を保持するネットワーク操作
    3. 25 マスカレードとファイアウオール
    4. 26 VPN サーバの設定
    5. 27 X Window System で動作する PKI マネージャ XCA による管理
  7. IV AppArmor による権限の制限
    1. 28 AppArmor の紹介
    2. 29 入門
    3. 30 プログラムに対する予防接種
    4. 31 プロファイルのコンポーネントと文法
    5. 32 AppArmor のプロファイルリポジトリ
    6. 33 YaST を利用したプロファイルの構築と管理
    7. 34 コマンドラインからのプロファイル構築
    8. 35 チェンジハット機能による Web アプリケーションのプロファイル作成
    9. 36 pam_apparmor によるユーザの制限
    10. 37 プロファイルを作成したアプリケーションの管理
    11. 38 サポート
    12. 39 AppArmor 用語集
  8. V SELinux
    1. 40 SELinux の設定
  9. VI Linux 監査フレームワーク
    1. 41 Linux 監査システムの概要
    2. 42 Linux 監査フレームワークの設定
    3. 43 監査ルールセットの紹介
    4. 44 その他の情報源
  10. A GNU ライセンス
ナビゲーション
適用先 openSUSE Leap 15.2

35 チェンジハット機能による Web アプリケーションのプロファイル作成

AppArmor® のプロファイルは本来、個別のプログラムやプロセスに対するセキュリティポリシーを表わすものです。つまり、実行可能なプログラムに対してプロファイルを割り当てることになります。ところが、プログラムの一部では他の部分とは異なるアクセス許可が必要となることもあります。このような場合は、 チェンジハット の機能を利用して、メインのプログラムに対して適用されているものとは異なるセキュリティコンテキストを適用するように設定します。このような 異なるセキュリティコンテキスト のことを、 ハットサブプロファイル などと呼び、 これを変更する行為を チェンジハット と呼びます。

チェンジハット機能は、 AppArmor のプロファイルの中からプログラムに対して ハット を変更する機能を提供します。これにより、プロセスごとの制限よりもずっと精密なセキュリティを設定することができます。また、この機能はそれぞれのアプリケーションが チェンジハット対応 として作られている必要があります。これはアプリケーションの実行時、特定のタイミングで AppArmor のモジュールに要求を送信して、ドメインを切り替える処理のことを指します。チェンジハット対応のアプリケーションの例としては、 Apache Web サーバなどがあります。

1 つのプロファイルに対しては、任意の数のサブプロファイルを作成することができますが、 2 段階までしか対応していないことに注意する必要があります。つまり、サブプロファイルから更に子となるプロファイルを作成することはできません。また、サブプロファイルは個別のプロファイルとして作成する必要があります。サブプロファイルの名前は、元々のプロファイルの名前の末尾に ^ を付け、その後ろにサブプロファイルそのものの名前を指定します。

サブプロファイルは親のプロファイル内に含まれていてもかまいませんし、個別のファイルとして存在していてもかまいません。特に多数のハットを必要とするようなサイトであれば、後者のほうがお勧めです。これにより、ハット単位でポリシーキャッシュ機能が働くため、サブプロファイル側の変更を行った場合に処理を減らすことができるためです。逆にすべてのハットが親のプロファイル内に含まれている場合、親プロファイル全体を再コンパイルしなければならなくなります。

ハットとして使用する予定の外部サブプロファイルがある場合、そのサブプロファイルの冒頭には hat もしくは ^ 文字で始まらなければなりません。

下記の 2 つのサブプロファイルは、いずれもハットとして使用 できない ものです:

/foo//bar { }

"\n \n"

profile /foo//bar { }

逆に、下記の 2 つはいずれもハットとして扱われます:

^/foo//bar { }

"\n \n"

hat /foo//bar { } # (vim では、この書式はハイライト表示されません)

なお、ハットを使用する場合のセキュリティは、完全なプロファイルを使用する場合に比べると、比較的弱くなることに注意してください。プログラム内に特定の種類のバグが存在した場合、攻撃者はプロファイル内に含まれるハットに退避することができてしまいます。これは、ハットのセキュリティがプロセス側で保持される機密鍵のみによって成り立っているためで、ハット側内のコードからは鍵に対するアクセスを許可してはならないことによるものです。そのためチェンジハット機能は、プロセス内に含まれるメモリに対して直接的にアクセスする手段のない、インタプリタ型の言語 (Perl, PHP, Java など) で作成されたアプリケーションサーバに対して、最も便利な仕組みとなっています。

本章の以下の項目では、 Apache でのチェンジハット機能の使用方法について説明しています。この Apache では mod_perl および mod_php を利用して、 Web サーバコンポーネントを動作させているものとします。同様のアプローチで、 Apache における mod_apparmor と同様 (詳しくは 35.1.2項 「Location ディレクティブと Directory ディレクティブ」 で説明しています) に、その他のアプリケーションサーバでもチェンジハット機能を利用することができます。

ヒント
ヒント: さらなる情報

更に詳しい情報をご希望の場合は、 change_hat のマニュアルページをお読みください。

35.1 mod_apparmor を利用するための Apache の設定

AppArmor には、 Apache Web サーバ 向けの mod_apparmor (apache2-mod-apparmor パッケージ) が提供されています。このモジュールを使用することで、 Apache Web サーバをチェンジハット対応にすることができます。 Apache Web サーバと共にインストールしてください。

Apache がチェンジハット対応になることで、受信したそれぞれの URI に対して、下記のような AppArmor セキュリティプロファイルが存在していないかどうかを調べます。

  • URI 固有のハット。例: ^www_app_name/templates/classic/images/bar_left.gif

  • DEFAULT_URI

  • HANDLING_UNTRUSTED_INPUT

注記
注記: Apache の設定について

apache2-mod-apparmor をインストールしたあとは、モジュールを有効化してから、下記のように実行して Apache を再起動します:

tux > a2enmod apparmor && sudo systemctl reload apache2

Apache は純粋なテキスト形式の設定ファイルにディレクティブを配置することで、設定を行うことができます。メインとなる設定ファイルは /etc/apache2/httpd.conf です。 Apache を独自にコンパイルして使用している場合は、コンパイル時の設定にあわせてファイルを選択してください。ディレクティブは Apache の動作を変更するためのもので、設定ファイル内の任意の場所に配置することができます。メインの設定ファイルを変更したあとは、 sudo systemctl reload apache2 を実行することで、変更点を反映させることができます。

35.1.1 仮想ホストのディレクティブ

<VirtualHost> と </VirtualHost> のディレクティブを利用して、特定の仮想ホストにのみ適用されるディレクティブの範囲を指定します。 Apache における仮想ホストの設定方法について、詳しくは http://httpd.apache.org/docs/2.4/ja/mod/core.html#virtualhost をお読みください。

チェンジハット機能固有の設定キーワードは AADefaultHatName です。これは AAHatName に似た設定で、 AADefaultHatName My_Funky_Default_Hat のように指定します。

これを設定することで、仮想ホストやその他の Apache サーバディレクティブに対して、使用すべき既定のハットを設定することができます。もちろん仮想ホストごとに異なる既定のハットを設定することもできます。この設定は AAHatName で上書きすることができます。逆に言えば、該当する AAHatName や URI でのハットに当てはまるものが存在しない場合の、既定のハットとなります。 AADefaultHatName でのハット指定が存在しない場合は、 DEFAULT_URI ハット (存在すれば) を使用するようになります。

全くどのハットも設定されていない場合は、 プロセスである Apache のハットが適用されます。

35.1.2 Location ディレクティブと Directory ディレクティブ

設定ファイル内の Location および Directory のディレクティブの中でハット名を指定することで、 Apache が URI やディレクトリを処理する際、指定したセキュリティプロファイルを適用するようになります。 Apache における Location および Directory ディレクティブの使い方について、詳しくは http://httpd.apache.org/docs/2.4/ja/sections.html をお読みください。

下記に示す Location ディレクティブでは、指定した場所に対して、 mod_apparmor が特定のハットを使用するように指定しています:

<Location /foo/>
  AAHatName MY_HAT_NAME
</Location>

上記のように設定することで、 /foo/ で始まる URI ( /foo/ , /foo/bar , /foo/cgi/path/blah_blah/blah など) にアクセスが行われた際、 MY_HAT_NAME というハットを使用するようになります。

Directory ディレクティブも上記と同様ですが、こちらのディレクティブはファイルシステム内のディレクトリを指定する点が異なることに注意してください:

<Directory "/srv/www/www.example.org/docs">
  # 末尾にスラッシュが無いことに注意
  AAHatName example.org
</Directory>

35.2 チェンジハット対応のアプリケーションの管理

前の章では mod_apparmor に関する情報と、特定の Web アプリケーションのセキュリティを向上させる方法について学んできました。この章では、 Web アプリケーションに対してハットを作成するための現実的な例と、 AppArmor のチェンジハット機能の使用方法について説明しています。なお、本章では AppArmor のコマンドラインツールを利用して説明を行っていますが、これは YaST の AppArmor モジュールではすべての機能を提供しているわけではないためのものです。

35.2.1 AppArmor のコマンドラインツールによる方法

本章では、例として Adminer ( http://www.adminer.org/ja/ ) と呼ばれる Web アプリケーションのセキュリティを向上させます。これは PHP で書かれた完全機能の SQL データベース管理ツールで、たった 1 つの PHP ファイルだけで作られています。 Adminer を動作させるには、まず Apache Web サーバと PHP のほか、 PHP の Apache モジュールと PHP に対応したデータベースドライバを用意する必要があります。今回は MariaDB を利用することにします。必要なパッケージをインストールするには、下記のように入力して実行します:

zypper in apache2 apache2-mod_apparmor apache2-mod_php5 php5 php5-mysql

Adminer を動作させるための Web 環境の構築は、下記のようにして行います:

手順 35.1: Web サーバ環境の設定
  1. まずは Apache 向けの apparmorphp5 のモジュールを有効化します。有効化を行うには、下記のように実行します:

    tux > a2enmod apparmor php5

    あとは Apache を再起動します:

    tux > sudo systemctl restart apache2
  2. MariaDB が動作していることを確認します。動作しているかどうかが分からない場合は、下記を実行して再起動します:

    tux > sudo systemctl restart mariadb
  3. http://www.adminer.org から Adminer をダウンロードして、 /srv/www/htdocs/adminer/ にコピーしたあと、ファイル名を adminer.php に変更します。スクリプトのフルパスは /srv/www/htdocs/adminer/adminer.php であることになります。

  4. Web ブラウザを起動して URI 欄に http://localhost/adminer/adminer.php と入力し、 Adminer の動作確認を行います。 Adminer をリモートのサーバにインストールしている場合は、 localhost の部分をサーバのホスト名に置き換えてください。

    Adminer のログインページ
    図 35.1: Adminer のログインページ
    ヒント
    ヒント

    Adminer のログインページの表示時に何らかの問題が発生した場合は、まず /var/log/apache2/error.log にある Apache のエラーログファイルをご覧になることをお勧めします。 Web ページにアクセスできない理由として考えられる理由としては、既に Apache が AppArmor の制御下にあり、適用されているプロファイルが Adminer を動作させるには厳しすぎることも考えられます。この場合は、 aa-status を実行して確認を行い、必要であれば下記を実行し、 Apache を一時的に不平モードに設定してください:

    root # sudo aa-complain usr.sbin.httpd2-prefork

Adminer を動作させるための Web 環境が整ったら、次に Apache の mod_apparmor を設定します。これにより、 AppArmor が Adminer に対するアクセスを検知して、固有の ハット に対する変更を行うことができるようになります。

手順 35.2: mod_apparmor の設定
  1. Apache には、 /etc/apache2//etc/apache2/conf.d/ という設定ファイルのディレクトリが存在しています。どちらのディレクトリ内でもかまいませんので、テキストエディタを利用してファイルを作成してください。この例では、 vim エディタを利用して設定ファイル /etc/apache2/conf.d/apparmor.conf を作成することにします。

    tux > sudo vim /etc/apache2/conf.d/apparmor.conf
  2. テキストエディタ内で、下記のとおり入力します。

    <Directory /srv/www/htdocs/adminer>
      AAHatName adminer
    </Directory>

    上記の設定を追加することで、 Apache に対して /adminer のディレクトリ (およびそれ以下のサブディレクトリやファイル) 宛のアクセスがあった際、 AppArmor 側でチェンジハットを行うことを指示します。このディレクトリ内には、既に adminer.php があるはずです。

  3. ファイルを保存して、テキストエディタを終了します。あとは下記のように実行して Apache を再起動します:

    tux > sudo systemctl restart apache2

これで Apache に対する Adminer の設定が完了し、 Adminer の実行時には ハット を変更することができるようになります。あとは AppArmor の設定で、 Adminer 向けのハットを作成することになります。この時点までに AppArmor のプロファイルを作成していない場合は、以下の手順を実施する前に作成しておいてください。 Apache のメインバイナリは /usr/sbin/httpd2-prefork ですから、対応するプロファイルは /etc/apparmor.d/usr.sbin.httpd2-prefork というファイル名で存在しているはずです。

手順 35.3: Adminer 向けのハットの作成
  1. テキストエディタを利用して、 /etc/apparmor.d/usr.sbin.httpd2-prefork というファイル名のファイルを開いて (存在していない場合は作成して) ください。ファイルの内容は下記のようになっているはずです:

    #include <tunables/global>
    
    /usr/sbin/httpd2-prefork {
      #include <abstractions/apache2-common>
      #include <abstractions/base>
      #include <abstractions/php5>
    
      capability kill,
      capability setgid,
      capability setuid,
    
      /etc/apache2/** r,
      /run/httpd.pid rw,
      /usr/lib{,32,64}/apache2*/** mr,
      /var/log/apache2/** rw,
    
      ^DEFAULT_URI {
        #include <abstractions/apache2-common>
        /var/log/apache2/** rw,
      }
    
      ^HANDLING_UNTRUSTED_INPUT {
        #include <abstractions/apache2-common>
        /var/log/apache2/** w,
      }
    }
  2. 末尾の閉じ中括弧 ( } ) の前に、下記のような行を挿入します:

    ^adminer flags=(complain) {
    }

    ここでは、ハット名の後ろに (complain) を指定していることに注意してください。これにより、 AppArmor での adminer ハットを不平モードに設定することになります。これは、この時点では Adminer のアクセス要件がわかっていないため、それを調べるための設定です。

  3. ファイルを保存して AppArmor を再起動し、 Apache を再起動します。

    tux > sudo systemctl reload apparmor apache2
  4. 続いて adminer ハットが正しく不平モードになっていることを確認します。

    tux > sudo aa-status
    apparmor module is loaded.
    39 profiles are loaded.
    37 profiles are in enforce mode.
    [...]
       /usr/sbin/httpd2-prefork
       /usr/sbin/httpd2-prefork//DEFAULT_URI
       /usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT
    [...]
    2 profiles are in complain mode.
       /usr/bin/getopt
       /usr/sbin/httpd2-prefork//adminer
    [...]

    上記のとおり、 httpd2-prefork//adminer が不平モードになっていることがわかります。

あとは adminer ハットに対して、必要なアクセス権限を見つけ出していく作業になります。この時点では adminer ハットは不平モードに設定されているため、ログ内にポリシーへの違反が記録されているものの、実際の拒否は発動されていません。そのため、 Web ブラウザから adminer.php の機能を一通り試して、必要な権限を収集していってください。収集が終わったら、 aa-logprof を実行することで、ハットのプロファイルの作成支援を行います。

手順 35.4: adminer ハット向けのルールの生成
  1. Adminer を Web ブラウザで開きます。ローカルにインストールした場合は、 URI は http://localhost/adminer/adminer.php になるはずです。

  2. まずは使用するデータベースエンジン (ここでは MariaDB) を選択し、既存のデータベースにユーザ名とパスワードを入力してログインします。なお、データベース名については、ログイン後に指定することもできますので、指定する必要はありません。あとは Adminer の機能を一通り試してください。新しいデータベースを作成したり、新しいテーブルを作成したり、ユーザ権限を設定したりなどです。

  3. ひととおり Adminer のユーザインターフェイスをテストしたら、コンソールに戻って収集したログの調査を行います。

    tux > sudo aa-logprof
    Reading log entries from /var/log/audit/audit.log.
    Updating AppArmor profiles in /etc/apparmor.d.
    Complain-mode changes:
    
    Profile:  /usr/sbin/httpd2-prefork^adminer
    Path:     /dev/urandom
    Mode:     r
    Severity: 3
    
      1 - #include <abstractions/apache2-common>
    [...]
     [8 - /dev/urandom]
    
    [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts

    aa-logprof のメッセージによると、下記のとおり adminer のハットが正しく認識されていることが分かります:

    Profile:  /usr/sbin/httpd2-prefork^adminer

    aa-logprof は、検出されたそれぞれの AppArmor イベントから、適切なルールを選択するよう依頼します。使用したいルールを指定したあと Allow を選択します。 aa-genprofaa-logprof の使用方法について、詳しくは 34.7.3.8項 「aa-genprof: プロファイルの生成」 をお読みください。

    ヒント
    ヒント

    aa-logprof では通常、特定のイベントに対して複数のルール候補を提示して選択を求めます。場合によっては 抽象 と呼ばれる、特定の目的向けのルールセットをまとめた仕組みを提案することもあります。このような場合は、直接のルールではなく抽象を選択したほうが便利な場合があります:

     1 - #include <abstractions/php5>
     [2 - /var/lib/php5/sess_3jdmii9cacj1e3jnahbtopajl7p064ai242]

    上記の例では、 1 を押して A を押すことで、抽象の取り込みを設定することができます。

  4. 最後に、下記のとおり保存を行うかどうかを尋ねられます。

    The following local profiles were changed. Would you like to save them?
     [1 - /usr/sbin/httpd2-prefork]
    
     (S)ave Changes / [(V)iew Changes] / Abo(r)t

    S を押して変更を保存してください。

  5. 変更が終わったら、 aa-enforce を実行してプロファイルを強制モードに設定します:

    tux > sudo aa-enforce usr.sbin.httpd2-prefork

    aa-status で状態を確認します:

    tux > sudo aa-status
    apparmor module is loaded.
    39 profiles are loaded.
    38 profiles are in enforce mode.
    [...]
       /usr/sbin/httpd2-prefork
       /usr/sbin/httpd2-prefork//DEFAULT_URI
       /usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT
       /usr/sbin/httpd2-prefork//adminer
    [...]

    上記のとおり、 //adminer のハットが complain (不平) から enforce (強制) モードに切り替えられています。

  6. あとは再度 Adminer を Web ブラウザで開いて動作を確認してください。何らかの問題を見つけた場合は、不平モードに戻して手順を繰り返し、 aa-logprof でプロファイルを更新してください。

注記
注記: ハットと親プロファイルの関係性について

^adminer プロファイルは、親プロファイルである usr.sbin.httpd2-prefork の中で動作するプロセスから見た場合にのみ利用することができます。

35.2.2 YaST によるハットと項目の追加方法

既存のプロファイルを管理 (手順に関する詳細は 33.2項 「プロファイルの編集」 を参照) を使用するか、もしくは 手作業でプロファイルを追加 (手順に関する詳細は 33.1項 「プロファイルの手動追加」 を参照) を使用することで、 AppArmor のプロファイル内にハット (サブプロファイル) を追加することができます。 AppArmor プロファイルダイアログ ウインドウ内でチェンジハットのサブプロファイルを追加するには、下記のようにして行います。

AppArmor プロファイルダイアログ
  1. AppArmor プロファイルダイアログ のウインドウ内で、 項目の追加 を押し、 ハット を選択します。 追加するハット名 のダイアログが表示されます:

    ハット名の入力
  2. AppArmor プロファイルに追加したいハットの名前を入力します。名前はアクセス時の URI を指定します。

  3. ハットの作成 を押します。すると AppArmor プロファイルダイアログ 画面に戻ります。

  4. 新しいハットを追加したら、 完了 を押して閉じます。

このページを印刷