開発環境向けの配布コンテナのCI/CDに「DevSecOps」の考え方を取り入れた話

ブレインパッドの自社開発プロダクトチームの新卒2年目のメンバーが、自社プロダクトの開発フローを改善した取り組みをブログにしました。
CI/CDで利用している「CircleCI」のワークフロー機能を使って改善を行い、「DevSecOps」の考え方を取り入れたことや、リリースエンジニアリングの視点をもとに整理した内容や利用したツールについても紹介しています。

f:id:brainpad-inc:20210422162159j:plain

こんにちは。プロダクト開発部、新卒2年目の城田です。

ブレインパッドの自社開発プロダクトチームでは、CI/CD (継続的インテグレーション/継続的デリバリー)でCircleCIを主に利用しています。


今回は「CircleCI」というプラットフォームのワークフロー機能を使って、コンテナのビルドとデプロイ部分の改善を行い、「DevSecOps」の考え方を取り入れてみたので、本ブログでその内容について紹介します。また、リリースエンジニアリングの観点で整理した項目や取り組んだこと、その際に使用ツールについても簡単にご紹介します!

「DevSecOps」とは

まず「DevOps」という言葉は、IT関係の仕事に従事する方なら聞き覚えのある方も多いのではないでしょうか?

「DevOps」とは、開発チームと運用チームが連携し、ソフトウェアの開発・リリースプロセスをより柔軟に実行する開発手法です。

これにより、開発サイクルを迅速かつ頻繁に回せるようになることが期待できます。

しかし、いくら開発サイクルが迅速になってもその分セキュリティ面が疎かになり、リリース直前で大幅な手戻りが発生していてはあまり意味がありません。

そこで、開発と運用の観点にセキュリティの観点も組み込んで、開発サイクルを回せるようにしたのが「DevSecOps」の考え方です。

「DevSecOps」については、当社の運営するDX Media「DOORS」に詳しく紹介されていますので興味のある方はぜひご一読ください!

改善したワークフロー内容

「DevSecOps」の考え方を取り入れるために改善したワークフローの改善前と改善後の状況を以下の図に示します。

f:id:bp-writer:20210407141806p:plain
ワークフローの改善前と改善後

リリースエンジニアリングの観点での整理

ここでは、Google 社が発表している書籍「Site Reliability Engineering」の8章で定義されているリリースエンジニアリングに関する4つの哲学に従って今回の改善前、改善後の状況を整理していきます。

項目 改善前 改善後
セルフサービスモデル(Self-Service Model) 開発者はapplicationを作成すれば良し 変わらず、Testが入った分、暗黙知をコード化
高速化(High Velocity) Image Buildのみ Testを通過分、処理時間は延びたがSecureなものを提供という意味では高速化
密封ビルド(Hermetic Builds) docker commandのみ OSSのコマンドの依存度が増えたが、単独でビルドは可能
ポリシーと手順の強制(Enforcement of Policies and Procedures) TestやSecurityへの観点は個人任せ TestやSecurityの観点を一様に適用する形

取り組んだ内容や利用したツールの紹介

リリースエンジニアリング視点で整理した改善項目を実現するために、以下のツールを利用しました。

CircleCI例(ymlファイル)

- run:
    name: lint dockerfile
    command: hadolint <image name:tag>:${CIRCLE_BUILD_NUM}

- run:
    name: test docker image
    environment:
      GOSS_FILES_STRATEGY: cp   # circleci では設定する必要がある
    command: |
      cp <path to goss yaml>/goss.yaml .
      dgoss run -e ENV_VAR="123" <image name:tag>:${CIRCLE_BUILD_NUM} /bin/sh

- run:
    name: image scan trivy
    command: trivy --exit-code 1 <image name:tag>:${CIRCLE_BUILD_NUM}

- run:
    name: image scan dockle
    command: dockle -c 1 <image name:tag>:${CIRCLE_BUILD_NUM}

改善点の比較

項目 改善前 改善後
Building,Packaging Dockerfile で実行 .dockerignore を追加してビルド速度を高速化
Branching masterのみからcontainer作成 同じ
Testing Dockerfile なし hadolint でテスト
Testing Container なし dgoss でテスト
Testing Scan なし trivy,dockle でテスト
Deployment docker push 同じ

これにより、コンテナのビルドとデプロイ部分におけるワークフローにセキュリティに関するチェックが追加され、「DevSecOps」の考え方を取り入れることができました。

参考ページ


今回は以上になります!

今後も継続してプロダクト開発の事例を発信していこうと思います!

最後になりますがブレインパッドではエンジニア採用を積極的に行っております。

ご興味のある方は是非ご応募お待ちしております!

https://www.brainpad.co.jp/recruit/