目次

高度な設定と機能

エージェントの設定

アプリケーションを保護するために、Agent Instrumentはアプリケーションにフックします。初期設定では、保護設定が有効か無効かに関係なくフックが挿入されます。フックを無効または有効にするオプションの設定があり、初期設定では無効になっています。

トレンドマイクロのテクニカルサポートによる指示がない限り、これらの設定を初期設定値から変更しないでください。

設定キー 環境変数 Description
agent_enabled TREND_AP_AGENT_ENABLED エージェントを有効または無効にします。可能な値はtrueまたはfalseです。初期設定値:true
plugins_enabled TREND_AP_PLUGINS_ENABLED リストされたプラグインを既存のプラグインのリストで有効にします。
plugins_disabled TREND_AP_PLUGINS_DISABLED リストされたプラグインを無効にして、フックが実行されないようにします。たとえば、「sqli」のように指定します。

PHPエージェントには、PHP include 式で Illegal File Access セキュリティコントロールを無効にするプラグインが含まれています。include式は、指定されたファイルにアクセスし、ロードして評価します。ファイルにアクセスすると、 Illegal File Access セキュリティ制御が適用されます。一部のPHPアプリケーションでは、多数のファイルが含まれる場合があり、多くのセキュリティチェックが実行され、要求に待ち時間が追加されます。includeが攻撃経路でない場合は、include式に対して Illegal File Access セキュリティ制御を無効にできます。プラグイン名は次のとおりです。 file_io_include

ネットワークプロキシと接続

エージェントは、プロキシを介してルーティングされる Application Security バックエンドへの送信接続をサポートします。この設定は、データセンターからのオンプレミスなど、エージェントからの接続を送信プロキシ経由でトンネリングする必要がある場合に使用できます。

設定キー 環境変数 Description
http_proxy_host TREND_AP_HTTP_PROXY_HOST エージェントが接続に使用するプロキシホスト名またはIPアドレス。
http_proxy_port TREND_AP_HTTP_PROXY_PORT エージェントの接続に使用するプロキシポート。初期設定値は3128です。
http_proxy_user TREND_AP_HTTP_PROXY_USER プロキシユーザ名(認証が必要な場合)。
http_proxy_password TREND_AP_HTTP_PROXY_PASSWORD プロキシパスワード(認証が必要な場合)。
Ready_Timeout TREND_AP_READY_TIMEOUT 要求を受け入れるまでにエージェントが待機する時間(秒)。初期設定値は0です。
Transaction_finish_timeout TREND_AP_TRANSACTION_FINISH_TIMEOUT トランザクション処理の完了をエージェントが待機する時間(秒)。初期設定値は0です。
hello_url TREND_AP_HELLO_URL エージェントが接続して設定を取得し、セキュリティイベントをアップデートして送信するエンドポイントです。初期設定では、エージェントはus-1リージョンのサーバに接続します。us-1リージョンのアカウントの場合、このキーを設定する必要はありません。他のリージョンのアカウントの場合、hello_urlをリージョンのエージェントURLに設定する必要があります。マルチリージョン対応のエージェントがリリースされることにも注意してください。これらのエージェントの場合、hello_urlを設定する必要はなく、エージェントは接続先のリージョンを自動的に検出できます。マルチリージョン対応のエージェントのバージョンなど、詳細については「 Configuration for Multi-Regions 」を参照してください。

Application Security は、 X-Forwarded-For ヘッダへのアクセスもサポートしています。このヘッダには、要求が通過したプロキシチェーン内のIPアドレスのリストが含まれます。(下記の「注意」を参照してください)。ヘッダのIPリストで使用するIPアドレスを選択するには、 x_forwarded_for_lb_count 設定キーを使用します。このキーは、リストの 最後 からカウントします。

設定キー 環境変数 Description
x_forwarded_for_lb_count TREND_AP_X_FORWARDED_FOR_LB_COUNT X-Forwarded-Forリストで使用するIPをリストの最後の項目からカウントします。初期設定値は1です。

キーの値を 1に設定する場合は、リストの最後のIPアドレスを指定します。次のサンプルリストでは、112.114.120.50です。

キーの値を 2に設定する場合は、リストの最後から2番目のIPアドレスを指定することになります。次のサンプルリストでは、112.114.120.49です。

X-Forwarded-For: 82.101.97.108, 112.114.120.49, 112.114.120.50

値が指定されていない場合、初期設定値は1です(Platform as a Service [PaaS] 環境の一般的なケースを処理するため)。

プロキシが1つの設定では、単一のプロキシが実際のクライアントのIPアドレスを `X-Forwarded-For` ヘッダに追加します。
X-Forwarded-For: real_client_IP
2プロキシ構成の場合、最初のプロキシのIPがヘッダのリストの最後に表示されます。
X-Forwarded-For: real_client_IP, first_proxy_IP

セキュリティイベントタグ

エージェントによって生成されたセキュリティイベントにコンテキスト情報やメタデータを追加したい場合があります。たとえば、アプリケーションのグループまたは Lambda 関数が一連のセキュリティプロパティを共有する場合、セキュリティイベントを生成したアプリケーションを特定できます。そのためには、エージェントの設定を使用して、ダッシュボードに表示されるイベントの詳細に含まれるキーと値のペアの「タグ」を設定します。

設定キー 環境変数 Description
タグ TREND_AP_TAGS カンマ区切りのキーと値のペアのリストです。例:tags = "tag1 = value1、tag2 = value2"

Fail Closed動作

失敗時のAgentの初期設定の動作は、Fail Openです。Fail Openの初期設定の動作では、要求の処理に失敗した場合、Agentはアプリケーションによる要求の処理を続行します。要求に対してセキュリティ処理を実行できない場合、エージェントはアプリケーションの要求処理に影響を与えないように開いて失敗します。たとえば、Agentが初期化されておらず、セキュリティアルゴリズムを実行する準備ができていない場合、初期設定では、Agentはアプリケーションによる要求の処理を続行します。

ただし、要求を処理し続けるのではなく、要求に対してセキュリティアルゴリズムを実行できない場合は、Agentから報告される方が望ましい場合もあります。Agentがまだ初期化されておらず、準備ができていない状態でアプリケーションが要求を受信した場合、Fail Closedモードでの実行時にAgentErrorが生成され、基本的に要求の処理は停止しますが、アプリケーションは必要に応じてAgentErrorを検出して回復処理を実行できます。

Fail Closed動作を有効にするには、エージェント設定で次の設定を行う必要があります。

設定キー 環境変数 Description
fail_closed TREND_AP_FAIL_CLOSED trueまたはfalse。初期設定値はfalseです。trueに設定されている場合、要求に対してセキュリティアルゴリズムを実行できないとAgentエラーが発生します。

アプリケーションでエージェントからエラーを取得するには、AgentErrorをキャッチする必要があります。

JavaエージェントでAgentErrorエラーを検出する

Javaエージェントのコンテキストでは、AgentErrorクラスはパッケージcom.trend.app_protectにあります。

Java Agentの場合、AgentError Javaクラスをインポートするには、Agentのjarファイルがアプリケーションのクラスパスにある必要があります。

AgentErrorは、エージェントの初期化時にFail Closedが有効になっている場合に発生する可能性があります。AgentErrorは、アプリケーションの初期段階で検出する必要があります。たとえば、Tomcatで構築されたJavaアプリケーションの場合、Agentエラーを処理するカスタムのValveを実装することで実現できます。

package com.sample.failclosed;

import com.trend.app_protect.AgentError;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
import javax.servlet.ServletException;
import java.io.IOException;


public class AgentHandlerValve extends ValveBase {
    @Override
    public void invoke(Request request, Response response) throws IOException, ServletException {
        Valve next = getNext();
        if (null == next) {
            return;
        }
        try {
            next.invoke(request, response);
        } catch (AgentError e) {
            // Add application specific error handling  when the AgentError is raised
            // For example it could be to get the headers and body
            // from the request and complete a fallback action
            // Or perhaps redirect to a given destination
            ...
        }
    }
}

PythonエージェントでAgentErrorエラーを検出する

Pythonエージェントのコンテキストでは、AgentErrorクラスはtrend_app_protect.exceptionsパッケージにあります。

設定オプションfail_closedが有効な場合、 エージェントの初期化時にAgentErrorが発生することがあります。AgentErrorは、アプリケーションの初期段階で検出する必要があります。たとえば、次のとおりです。

from flask import Flask
from trend_app_protect.exceptions import AgentError
from werkzeug.wsgi import LimitedStream

def fail_closed_middleware(original_app):

    def wsgi_app(environ, start_response):
        stream = LimitedStream(environ["wsgi.input"],
                               int(environ.get("CONTENT_LENGTH") or 0))
        environ["wsgi.input"] = stream

        try:
            return original_app(environ, start_response)
        except AgentError as e:
            stream.exhaust()
            start_response(str(403), [])
            return([repr(e).encode("utf-8")])

    return wsgi_app

def create_app(name = __name__):
    app = Flask(name)

    ... # Add application initilization code here

    app.wsgi_app = fail_closed_middleware(app.wsgi_app)

    return app

if __name__ == '__main__':
    create_app(__name__).run()

この設定は、Fail Closed機能をサポートしていないエージェントのバージョンには影響しません。Fail Closedは現在、次のエージェントでサポートされています。

エージェントプラットフォーム エージェントのバージョン
Javaエージェント 4.3.5以降
Pythonエージェント 4.6.2以降