Dockerを使用する既存のGradleプロジェクトにJavaエージェントをインストール

ここでは、サンプルのGradleプロジェクトを使用します。このサンプルプロジェクトは、 アプリケーションプラグインDockerプラグイン を使用して、JavaのWebアプリケーションを構築するものです。また、Webアプリケーションの動作を検証するJUnit 5の統合テストも実行します。テストに使用するDockerイメージにContrastを組み込む手順を行うことで、総合テスト中にContrast Assessでコードが解析されるようになります。サンプルプロジェクトは、弊社のGitHubリポジトリにあるGradleプロジェクトを参照ください。

注記

以下の手順において、パッケージングや配布に関して言及している部分はいかなる形式でも、全て組織内での使用を目的としています。ContrastをアプリケーションやDockerコンテナと一緒に組織外に配布しないでください。詳細についてはContrastのサービス利用規約を参照してください。

Dockerを使用する既存のGradleプロジェクトにJavaエージェントをインストールするには:

  1. エージェントキーを使用して、ContrastエージェントがContrastサーバと通信するための設定をします。以下のキーが必要です。

    • Contrast URL:https://app.contrastsecurity.com/Contrast、もしくはオンプレミス版かプライベートクラウドのインスタンスのURLになります。

    • 組織用APIキー

    • エージェントユーザ名

    • エージェントサービスキー

  2. Unix系のオペレーティングシステムを使用している場合は、エージェントキーの値をContrastの環境変数としてエクスポートするためのファイルを作成します。

  3. コマンドプロンプトを開き、以下のコマンドを実行します。<contrast_url><your_api_key><agent_user_name>、および<agent_user_service_key>をContrastから取得したContrast URL、APIキー、ユーザ名、およびサービスキーの値に置き換えます。

    $ tee -a ~/.contrastrc > /dev/null
    export CONTRAST__API__URL=<contrast_url>
    export CONTRAST__API__API_KEY=<your_api_key>
    export CONTRAST__API__USER_NAME=<agent_user_name>
    export CONTRAST__API__SERVICE_KEY=<agent_user_service_key>
  4. 4行すべての入力が終了したら、CTRL+Dを押して、値を$HOME/.contrastrcファイルに保存します。

  5. 現在のシェルで.contrastrcスクリプトを実行して、変数を環境にエクスポートします。

    $ . ~/.contrastrc

    注記

    Windowsを使用している場合は、環境変数の設定方法についてMicrosoftのドキュメントを参照してください。

    ヒント

    Contrast Javaエージェントの設定には、ファイル、Javaシステムプロパティ、環境変数を使用することができます。認証情報およびContrastサーバへの接続情報は、ローカルの開発環境の各プロジェクトで変更することはほぼ無いと思われますので、このような値は環境変数を使用することを推奨します。この方法は、ビルドスクリプトに認証情報を直接記述するよりも安全です。

    .contrastrcスクリプトを実行したターミナルを閉じた場合、新しいターミナルを開いたときにこのスクリプトを再度実行する必要があります。対話シェルを初期化するスクリプトに~/.contrastrcを追加すれば、ターミナルセッション間で設定が保持されます。例えば、シェルプログラムがBashの場合は、echo ~/.contrastrc` | tee -a ~/.bashrcを実行します。

  6. コマンドプロンプトを開き、以下のコマンドを実行してContrastのexamplesリポジトリをクローンします。

    $ git clone https://github.com/Contrast-Security-OSS/contrast-java-examples.git
  7. gradle-dockerディレクトリに移動するために以下のコマンドを実行します。

    $ cd contrast-java-examples/gradle-docker
  8. テストビルドを実行して、正常に機能することを確認します。

    $ ./gradlew build
    
    BUILD SUCCESSFUL in 3s
    4 actionable tasks: 3 executed, 1 up-to-date

    注記

    Windowsでは、代わりにgradlew.bat buildを実行してください。

  9. これが機能しない場合は、Java 8が正しくインストールされていることを確認してください。

    $ java -version
    java version "1.8.0_131"
    Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
  10. 何かしらの変更を行った場合は、ビルドを再度実行してください。それでも機能しない場合は、この問題の詳細を記載して問題を報告してください。

  11. ContrastのJavaエージェントに関して、依存関係のコンフィギュレーションを追加し、依存関係の定義を追加します。

    configurations {
        contrastAgent
    }
    def contrast_version = "3.6.3.8220"
    
    dependencies {
        // ... other dependencies omitted
        contrastAgent "com.contrastsecurity:contrast-agent:$<contrast_version>"
    }
  12. エージェントをプロジェクトのディレクトリにコピーするためのタスクを追加します。

    task("copyAgent", type: Copy) {
        from configurations.contrastAgent
        into "$<projectDir>/lib"
    }
    
    run.dependsOn copyAgent
    assemble.dependsOn copyAgent
  13. build.gradleapplicationブロックを変更して、アプリケーションに渡されるJVM引数に-javaagentプロパティを追加します。

    application {
      // ... rest of block omitted
      def agentBuildPath = "lib/contrast-agent-$<contrast_version>.jar"
      def agentProjectPath = Paths.get(getProjectDir().toURI()).resolve(agentBuildPath)
    
    
      applicationDefaultJvmArgs = [
              "-javaagent:$<agentProjectPath.toString()>"
      ]
    }
  14. アプリケーションを実行します。

    $ ./gradlew run

    注記

    Windowsでは、代わりにgradlew.bat runを実行してください。

  15. これで、アプリケーションにContrastが組み込まれて、起動するようになります。手動でテストを実行すると、セキュリティに関連する検出結果がすべてContrastに報告されます。CTRL+Cを押すと、アプリケーションを停止できます。

  16. gradle buildの実行時に作成されるバンドルにContrastエージェントのJARを含めるよう、配布プラグインの定義を設定します(配布プラグインは、アプリケーションプラグインの定義内に含めます。)。

    application {
    
      // ... rest of application config omitted
    
      distributions {
        main {
          contents {
            from("$<projectDir>/lib") {
                into "lib"
            }
          }
        }
      }
    }
  17. -javaagentは、アプリケーションのバンドル内のJARファイルではなく、プロジェクトディレクトリのJARファイルを指しています。正しいJARファイルを指定するには、バンドル内の正しいパスを使用するようにstartScriptsタスクの定義を追加します。

    application {
    
      // ... rest of application config omitted
    
      startScripts {
        doLast {
          def shFile = new File(getOutputDir(), project.name)
          shFile.text = shFile.text.replace(agentProjectPath.toString(), "\$APP_HOME/$<agentBuildPath>")
          def batFile = new File(getOutputDir(), "$<project.name>.bat")
          batFile.text = batFile.text.replace(agentProjectPath.toString(), "%APP_HOME%\\lib\\contrast-agent-$<contrast_version>.jar")
        }
      }
    }
    
  18. build.gradlecreateContainerタスクに以下のコマンドを追加し、Contrastの設定変数をコンテナに渡します。

    task createContainer(type: DockerCreateContainer) {
        // ... rest of the config omitted
    
        envVars = [
            CONTRAST__API__URL: System.getenv("CONTRAST__API__URL"),
            CONTRAST__API__USER_NAME: System.getenv("CONTRAST__API__USER_NAME"),
            CONTRAST__API__SERVICE_KEY: System.getenv("CONTRAST__API__SERVICE_KEY"),
            CONTRAST__API__API_KEY: System.getenv("CONTRAST__API__API_KEY"),
            CONTRAST__APPLICATION__NAME: "${project.name}-how-to"
        ]
    }
  19. ビルドを再度実行します。

    ./gradlew clean build

    注記

    Windowsでは、代わりにgradlew.bat buildを実行します。

    Dockerコンテナで、Contrastを有効にしてアプリケーションを実行できるようになりました。総合テストを実行すると、脆弱なエンドポイントが検出され、Contrastサーバに報告されます。報告された脆弱性を参照するには、Contrast UIにログインして脆弱性ページにアクセスし、アプリケーション名のgradle-docker-how-toフィルターをかけます。

ヒント

ContrastをGradleビルドとさらに統合するには、Contrast Gradleプラグインを確認してください。テスト実行でContrastが脆弱性を検出したときに、Gradleビルドを失敗させるようcontrastVerifyタスクを設定できます。