コンテナを使用してNode.jsエージェントをインストール
Node.jsエージェントのコンテナへのインストールは、基本的に標準のインストール手順と同じですが、インストールがコンテナ内で行われる点と、ベストプラクティスに従い環境変数を使用してContrastの認証情報を設定する必要がある点が異なります。
Node.jsエージェントをコンテナにインストールする場合、環境変数を使用するのが最も安全な方法です。コンテナはQAや本番システムから移行されることが多いため、コンテナ定義に認証情報をハードコーディングしないことをお勧めします。
インストールを行う前に
本項では、Dockerを例として、コンテナ化されたアプリケーションにNode.jsエージェントをインストールするための一般的な手順について説明します。
コンテナや関連ソフトウェアの仕組みを基本的に理解している必要があります。実際の手順は、ご利用の環境に合わせて調整してください。
エージェントをインストール
以下のいずれかの方法で、Nodejsエージェントをインストールします。
アプリケーションの開発時にエージェントを追加 (推奨)
この方法の場合、アプリケーションの
package.json
でエージェントを取り込みます。次のコマンドを使用して、パイプラインやコンテナイメージにエージェントを追加します。
npm install @contrast/agent
Dockerfileにエージェントを追加
アプリケーションのイメージを別々に管理したい場合(Contrastエージェントを使用する場合と使用しない場合)は、コンテナのビルド時にエージェントを追加します。
次のコマンドを使用して、既存のDockerfile、またはアプリケーションのイメージをベースイメージとして使用する新規のDockerfileにエージェントを追加します。
npm install @contrast/agent
エージェントを設定
Node.jsエージェントをDockerなどのコンテナにデプロイしたアプリケーションで設定する場合は、以下の手順に従ってください(そうでない場合は、通常のNode.jsエージェントの設定を参照してください)。Node.jエージェントの設定には、設定した値が有効になる優先順位があります。
環境変数を使用して、アプリケーション固有の設定値を指定します。これらは、Dockerfile内でENV命令を定義するか、Docker runコマンドの実行時に
-e
オプションで指定することができます。アプリケーション固有の値を設定するためによく使用される環境変数の一覧をご覧ください。また、Contrastエージェント設定エディタで変数の一覧を参照することもできます。例えば、次のコマンドを使用して、コンテナを構築することができます。
docker build -t my-app-image
そして、コンテナの実行時には次のコマンドを使用します。
docker run -p 3000:3000 --name my-app-instance \ -e "CONTRAST__API__URL=your-ts-url" \ -e "CONTRAST__API__API_KEY=your-api-key" \ -e "CONTRAST__API__SERVICE_KEY=your-service-key" \ -e "CONTRAST__API__USER_NAME=your-user-name" \ my-app-image
クラウドプロバイダの使用時に環境変数を設定するプロセスでは、一般的には、シークレットマネージャを使用し、それらのシークレットの値を環境変数にリンクすることになります。
実行して確認
Node.jsエージェントのリライタ(現在、バージョン4.x以降のエージェントで利用可能)を使用する場合は、
RUN
命令を追加してcontrast-transpile
実行ファイルを呼び出すコマンドを指定します。そして、アプリケーションのエントリポイントを指定します。RUN npx -p @contrast/agent --no contrast-transpile index.js
npxコマンドがContrast Securityからのものであり、サプライチェーン攻撃を試みる悪意のある人物からではないことを確認するために、
-p @contrast/agent --no
オプションを使用することが重要です。-p
は、--package
の省略形で、@contrast/agent
パッケージにのみコマンドを使用するようnpxに指定します。--no
は、 非推奨となった--no-install
オプションの新しいオプション名で、 コマンドのバイナリが見つからない場合にnpmからインストールを行わないようnpxに指定します。npxコマンドを実行する前に、Contrastエージェントとnpxバイナリが正常にインストールされていることを想定しています。
アプリケーションを起動する際に、Contrastエージェントを先にロードしておく必要があります。通常は、これはDockerfileのCMD文で行いますが、
package.json
に定義したnpmスクリプトも使用できます。例えば、通常アプリケーションを次のように起動する場合:
CMD [“node”, “app”]
次のコマンドを使用すると、Contrastを有効にしてアプリケーションを実行できます。
CMD [“node”, “--import”, “@contrast/agent”, “app”]
エージェントが起動すると、YAML設定ファイルに記述されたエージェントの認証キーを使用してContrastサーバに接続します。
ヒント
エージェントの認証情報を保護するために、Docker secretを利用して、デプロイ時に環境変数として渡すこともできます。例:
docker run -e CONTRAST__API_ -e CONTRAST__API__API_KEY=<value> -e CONTRAST__API__SERVICE_KEY=<value> -e CONTRAST__API__USER_NAME=<value> -e CONTRAST__SERVER__ENVIRONMENT=<value> image_with_contrast
コンテナのログのアクティビティをチェックして、Contrastが実行されていることを確認します。
例えば、ログアクティビティは以下のようになります。
@contrast/agent 2.16.8-------------------------------------- 2020-07-20T19:05:14.407Z INFO contrast-service: BUILD {"progname": "Contrast Service", "version": "2.8.1", "buildTime": ""} 2020-07-20T19:05:14.407Z INFO Building timer for orphan request cleanup {"progname": "Contrast Service", "cleanupMs": 5000} 2020-07-20T19:05:14.408Z INFO Building timer for orphan app cleanup {"progname": "Contrast Service", "time": 5000} 2020-07-20T19:05:14.450Z INFO Creating New Application Server {"progname": "Contrast Service", "uuid": "96299b72-f867-4354-b9c9-1eb23511cb8a", "serverName": "bc1bd6e5cd3a", "clientId": "1", "pid": 1} 2020-07-20T19:05:14.450Z WARN Failed to initialize secure client, falling back to insecure client {"progname": "Contrast Service"} 2020-07-20T19:05:15.473Z INFO setting new server features for context{"progname": "Contrast Service", "uuid": "96299b72-f867-4354-b9c9-1eb23511cb8a", "serverName": "bc1bd6e5cd3a"} 2020-07-20T19:05:15.474Z ERROR Error setting up CEF syslog {"progname": "Contrast Service", "err": "open /juice-shop/security.log: permission denied"} 2020-07-20T19:05:15.475Z INFO starting event scanner {"progname": "Contrast Service", "report": {}} 2020-07-20T19:05:15.486Z INFO Creating new application {"progname": "Contrast Service", "uuid": "96299b72-f867-4354-b9c9-1eb23511cb8a", "serverName": "bc1bd6e5cd3a", "appName": "juiceshop-guide", "language": "Node", "clientId": "1", "pid": 1} 2020-07-20T19:05:15.486Z INFO AppCreate: creating and initializing new application {"progname": "Contrast Service", "uuid": "96299b72-f867-4354-b9c9-1eb23511cb8a", "server_name": "bc1bd6e5cd3a", "app_name": "juiceshop-guide", "app_lang": "Node", "client_id": "1", "pid": 1} 2020-07-20T19:05:15.921Z INFO setting new application settings {"progname": "Contrast Service", "uuid": "96299b72-f867-4354-b9c9-1eb23511cb8a", "serverName": "bc1bd6e5cd3a", "appName": "juiceshop-guide", "language": "Node"} 2020-07-20T19:05:15.922Z INFO Setting session id on app context: {"progname": "Contrast Service", "uuid": "96299b72-f867-4354-b9c9-1eb23511cb8a", "clientid": "1", "appname": "juiceshop-guide", "applang": "Node", "apppath": "/juice-shop/package.json", "sessionid": "cd0b271e66974162bf5fcca8b32e37b1"} Entering main at /juice-shop/appinfo: All dependencies in ./package.json are satisfied (OK)...
注記
また、Dockerイメージの作成時にエージェントをインストールしたり、distrolessのNode.jsコンテナを使用してコンテナにインストールすることも可能です。
関連項目
Contrastサポートポータル:KubernetesでのNode.jsエージェント
Contrastサポートポータル:AWS FargateとContrastエージェント