AWSエンジニアチームの山口です。
フォージビジョンでは、システム開発エンジニアチームと連携し、Amazon ECS をプラットフォームとしたコンテナで動作するアプリケーションを開発するプロジェクトを数多く対応しています。
これまではコンテイメージのセキュリティチェックにTrivyとECRイメージスキャニング、DockerfileのLinterとしてHadolintを利用し、ビルドパイプラインに組み込んでいましたが、Orca Securityの採用に合わせて Shifltleft 機能の導入を進めています。
Shiftleft (Shiftleft セキュリティ)についてはこちらの記事をご覧ください。
連携イメージ
ビルドパイプラインに組み込む際の構成イメージを説明します。 GitHubの特定ブランチへのPush(Pull Requestなど他のアクション指定も可能)をトリガーにGitHub Actionsが動作します。GitHub Actionsでは、コンテナイメージのビルドとOrca SecurityのコンテナイメージセキュリティスキャンおよびAmazon ECRへのイメージPushが実行されます。 Orca Securityのコンテナイメージセキュリティスキャン結果は、API経由でOrca Securityに送信され、スキャン結果をダッシュボードから確認できます。 パイプラインをさらにカスタマイズすることで、Orca Securityのコンテナイメージセキュリティスキャンにて問題ないことが確認された場合のみAmazon ECRへのイメージPushしたり、Orca Securityのコンテナイメージセキュリティスキャン結果がPull Requestに添付されるなどの処理も可能です。
設定手順
1. Orca Security の Shiftleft 用 API トークン発行
Orca Securityのコンソールより「Settings」に移動し「Module - Integration」を選択します。その後、「SHIFT LEFT SECURITY」の「INTEGRATE」をクリックします。
API Tokenを作成します。「Scan Type」に Container Image Scanningを設定し、「Name」、「Description」は任意の内容を入力します。
「Expiration」を今回は Never Expire を設定していますが、本番で利用する際は鍵ローテーションなど組織のセキュリティポリシーにあったAPI Tokenの有効期間を設定します。
その後、「CREATE API TOKEN」をクリックし、APIトークンを発行します。
発行されたAPIトークンは後ほど、GitHub Actionsのワークフロー内で利用するため、記録しておきます。「CONTINUE」をクリックしてIntegrationsの画面に戻ります。
2. GitHub リポジトリ の Secrets へ Github Actions で利用する Orca Security の Shift Left 用 API トークンを配置する
対象のリポジトリより「New repository secret」をクリックします。
「Name」に ORCA_SECURITY_API_TOKEN 、「Secret」には先ほど発行したAPI Tokenを入力します。入力後、「Add Secret」をクリックして保存します。
3. Orca Security に Shift Left プロジェクトを作成する
Orca Securityのコンソールより「Shift Left」>「Management」に移動し、
「CREATE NEW」をクリックします。
「Project name」と「Project key」に任意の名前とキーを入力します。
「Attached policies」より、今回は Orca Built-in - Container Image Secret Detection Policy、Orca Built-in - Container Image Best Practices Policy、Orca Built-in - Container Image Vulnerabilities Policy を選択します。その後、「SELECT」をクリックします。
最後に「CREATE」をクリックし、プロジェクトを作成します。
4. GitHub リポジトリ の Secrets へ Shift Left プロジェクトの Project Key を配置する
Orca Security の Shift Left 用 API トークンを配置と同じ手順にて、Shift Left プロジェクトの Project Key を配置します。
手順が完了すると、下記のように2つの Secrets が登録されている状態となります。
5. GitHub Actionsと連携するための AWS IAM を設定する
GitHub Actionsと連携するためのAWS IAM 設定します。設定手順は下記のブログ記事を参照ください。
6. GitHub Actions のワークフローを設定する
下記のパスに GitHub Actions のワークフローを設定する main.yml ファイルを作成します。
<ローカルリポジトリフォルダ>/.github/workflows/main.yml
main.yml ファイルの内容は下記を記載します。
name: ecr push image on: push: branches: - develop jobs: ecr-push: name: ecr-push runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - uses: actions/checkout@v3 # AWS への認証 - uses: aws-actions/configure-aws-credentials@v1 with: aws-region: "ap-northeast-1" role-to-assume: "arn:aws:iam::123456789012:role/sample-container-image" # ECR へ ログイン - uses: aws-actions/amazon-ecr-login@v1 id: login-ecr # Orca Security shiftleft コンテナスキャンを実行し、ECR へ Push - name: build and image scan by orca-cli env: REGISTRY: ${{ steps.login-ecr.outputs.registry }} REPOSITORY: "sample-container-image" IMAGE_TAG: ${{ github.sha }} ORCA_SECURITY_API_TOKEN: ${{ secrets.ORCA_SECURITY_API_TOKEN }} run: | docker build . --tag ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }} set +e apt update && apt install -y curl curl -sfL 'https://raw.GitHubusercontent.com/orcasecurity/orca-cli/main/install.sh' | bash # 今回はスキャン結果によらず exit code に 0 を返却し、処理を終了させる orca-cli --project-key "${{ secrets.PROJECT_KEY }}" --exit-code 0 image scan ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }} # ECR へのイメージ Push を行う場合は下記を追記 - name: push docker image to ECR env: REGISTRY: ${{ steps.login-ecr.outputs.registry }} REPOSITORY: "sample-container-imager" IMAGE_TAG: ${{ github.sha }} run: | docker push ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }}
[オプション] 7. Dockerfileを作成する
本手順は Orca Security Shiftleft 検証用にサンプルのコンテナイメージを用意する場合に実行してください。すでにスキャン対象とするコンテナイメージ用のDockerfileがある場合はスキップしてください。
Dockerfile ファイルの内容は下記を記載します。下記のサンプルはDockerfileの記述方法に関するアラートが検出される内容としています。
FROM ubuntu:latest COPY . . RUN chmod +x ./healthcheck.sh ENTRYPOINT [ "./healthcheck.sh" ]
※ ENTRYPOINTとして記述している healthcheck.sh の設置を忘れないように注意ください
動作確認
1. GitHubリポジトリの develop ブランチへ Push する
本手順で設定した GitHub Actions は develop ブランチへの Push をトリガーに作動します。
$ git add . $ git commit -m "test orca security shiftleft" $ git push -u origin develop
develop ブランチへの Push が成功すると、GitHub Actions が実行されます。
GitHub Actions の実行結果を確認すると Orca Security のスキャン結果が確認できます。
2. Orca Security の Shiftleft プロジェクトでスキャン実行結果を確認する
Orca Security のコンソールより、該当の Shiftleft プロジェクトへ移動します。
GitHub Actionsにてビルドされたコンテナイメージのスキャン履歴が表示されます。最新の結果が表示されている行をクリックします。
スキャン結果のサマリと一覧が表示されます。「Issue Details」には Dockerfile の記述内容に関する問題、「Vulnerabilities」はコンテナイメージに潜在する脆弱性、「Packages」にてコンテナイメージにインストールされているパッケージに一覧がそれぞれ表示されます。
各スキャン結果の詳細を確認する場合には、表示されている一覧より項目をクリックします。下記の例は「Issue Details」より、Critical として検出されたスキャン結果の詳細を表示しています。「Recommendation」に表示されている内容をもとに Dockerfile の改善を行うことで Critical として検出された問題を解消し、より安全なコンテナイメージの作成が可能となります。
3. Dockerfile を修正し、再度 GitHub Actions を実行する
Dockerfile ファイルの内容は下記のように編集します。
FROM ubuntu:latest COPY . . RUN chmod +x ./healthcheck.sh ARG GROUP_ID=5001 ARG USER_ID=5001 ARG USER_NAME="execuser" RUN groupadd -g "${GROUP_ID}" "${USER_NAME}" && \ useradd -l -u "${USER_ID}" -m "${USER_NAME}" -g "${USER_NAME}" USER execuser ENTRYPOINT [ "./healthcheck.sh" ]
編集後、 develop ブランチへの Push します。
$ git add . $ git commit -m "fixed critical issues." $ git push -u origin develop
Orca Security のコンソールより、該当の Shiftleft プロジェクトを再度確認します。最新のスキャン結果においてCritical として検出された項目がゼロになったため「Status」が Passed と表示されていることが確認できます。
まとめ
以上がGitHub Actions で Orca Security Shiftleft をビルドパイプラインに組み込む手順とその確認方法となります。Orca Securityでは、コンテナイメージのほか、Infrastructure as Code や ソースコードに対する Shiftleft セキュリティも提供されていますので、開発プロセスの中に組み込んでさらに活用していきたいと思います。
関連記事