Skip to main content

Argo CDからKubernetesまで、アプリケーションを保護する

著者

JJ Ng

Pas Apicella

Kubernetes Blog

2022年10月12日

0 分で読めます

GitOpsは、アプリケーション開発パイプラインを管理し、セキュリティを確保するための一般的なフレームワークです。GitOpsを始めた多くの人が、次のような疑問を抱きます。「すべてが自動化されているとき、パイプラインをどうすれば安全に保てるのか?」

GitOpsとは、コードのコミットや変更をすべてGit経由で行い、それをトリガーとしてアプリケーションをビルドし、Kubernetesにデプロイする自動パイプラインを実行する考え方です。パイプライン内で開発チームやセキュリティチームが介在する箇所が少ないため、デプロイされるアプリケーションの脆弱性をできるだけ少なくするには、セキュリティ要件を必須にする必要があります。

このブログでは、人気ツールArgo CDを中心に、GitOpsでSnykを使ってアプリケーションセキュリティを実現する方法をご紹介します。このシナリオでは、SnykがIaCスキャンを実行し、デプロイ前にアプリケーションの安全性を確認します。安全でない場合はビルドを停止します。また、Kubernetesの異なる名前空間にデプロイされたアプリケーションを、Snykで自動的に継続監視することもできます。

Argo CDとは?

Argo CDは、リポジトリを追跡して変更や「ドリフト」を検知し、必要な変更をKubernetesクラスターの構成に適用する、宣言型のKubernetesネイティブな継続的デリバリー(CD)ツールです。

Snykと連携するためのArgo CDのセットアップ

このデモでは、Argo CDでGitOpsプロセスを開始し、Snykを使ってアプリケーションのセキュリティを確保するとともに、Kubernetesワークロードを監視します。以下の手順で進めます。

  1. Gitリポジトリをクローンする

  2. Argo CDを設定する

  3. Argo CDを使ってアプリケーションをデプロイする

  4. Snykトークン用のKubernetesシークレットオブジェクトを作成する

  5. Argo CD PreSyncリソースフックを作成する

  6. Argo CDが構成ドリフトを検知するまで待つ

  7. Kubernetesと連携する

前提条件

  1. Argo CDでSnykテストを実行し、KubernetesワークロードをSnykに自動インポートするには、BusinessまたはEnterpriseプランのSnykアカウントが必要です。Snykアカウントをお持ちでない場合は、Businessプランの無料トライアルを開始できます。

  2. KubernetesクラスターでArgo CDインスタンスが稼働していること。セットアップの詳細は、Argo CDのドキュメントをご覧ください。

  3. Kubernetesクラスターが稼働していること(EKS、AKS、GKE、Red Hat OpenShift、またはサポート対象の任意のディストリビューションなど)。

ステップ1:Gitリポジトリをクローンする

このデモでは、ソースコードをhttps://github.com/jiajunngjj/flask-polling-appで公開しているFlaskの投票アプリケーションを使用します。リポジトリをお使いの環境にクローンしてください。

žœ  git clone https://github.com/jiajunngjj/flask-polling-app.git

ステップ2:Argo CDを設定する

KubernetesクラスターをArgo CDに追加します。

žœ argocd cluster add CONTEXTNAME

このデモでは、Argo CDはKubernetesクラスター内で稼働しているため、内部K8sホスト名(kubernetes.default.svc)を使って自動的に接続されています。

Argo CDのクラスター設定ページ。https://kubernetes.default.svc のクラスター内Kubernetesクラスターが表示され、バージョン1.21と接続成功のステータスが示されています

次に、前述のリポジトリもArgo CDに追加されていることを確認します。

プロジェクトのデフォルト設定とGitHubリポジトリのURLが表示された、Argo CDの「SSHを使用してリポジトリに接続」フォーム。

リポジトリが正常に追加されると、次のように表示されます。

接続ステータスが成功と表示された2つのGitHubリポジトリと、リポジトリを接続するオプションが表示されたArgo CDのリポジトリ設定ページ。

ステップ3:Argo CDを使ってアプリケーションをデプロイする

アプリケーションをデプロイするためにKubernetesの名前空間を作成します。ここでは、argocd-demo名前空間を作成してflask-polling-appを実行します。

žœ kubectl create ns argocd-demo

Argo CDのコマンドラインを使ってアプリケーションを作成します(または、リポジトリを追加した後にArgo CD UIから作成します)。

žœ argocd app create snyk-demo  \  --repo https://github.com/jiajunngjj/flask-polling-app.git \  --path argocd \  --dest-server https://kubernetes.default.svc \  --dest-namespace argocd-demo

コマンドの内容は次のとおりです。

  • repo — ソースコード管理(SCM)リポジトリ

  • path — Kubernetesマニフェストが格納されているディレクトリ

  • dest-server — Kubernetesクラスター

  • dest-namespace — アプリケーションのデプロイ先となるKubernetesの名前空間

Argo CDでアプリケーションを作成すると、UI上で作成したアプリケーションのステータスがOutOfSyncと表示されます。

snyk-demoアプリケーションがMissingおよびOutOfSyncと表示されたArgo CD Applicationsダッシュボード
snyk-demoアプリケーションがOutOfSyncと表示され、アプリケーションツリーにpolling-appサービスとデプロイメントのリソースが表示されたArgo CDのアプリケーション詳細画面。

次に、Argo CDのsyncコマンドを実行して、アプリケーションをデプロイします。

žœ argocd app sync snyk-demo

Argo CD UIにアプリケーションが表示されます。

正常かつ同期済みのsnyk-demoアプリケーションとpolling-appのKubernetesリソースを示す、Argo CDのアプリケーション詳細ツリー

アプリがargocd-demo Kubernetes名前空間へのデプロイを開始したことも確認できます。

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 33spolling-app-6f5978849c-tqpd2 1/1 Running 0 33s

ステップ4:Snykトークン用のKubernetesシークレットオブジェクトを作成する

アプリケーションがArgo CDに正常に追加されたら、Argo CDパイプラインにSnyk IaCテストを組み込みます。Snyk AppからSnykトークンを取得し、argocd-demo名前空間にシークレットオブジェクトを作成します。

➜ kubectl create secret generic snyk-token \ --from-literal=token=<XXXX-XXXXXX-XXXXXXXX> \ -n argocd-demo

ステップ5:Argo CD PreSyncリソースフックを作成する

次の内容を記述したsnyk-scan.yamlファイルを、デプロイ用YAMLファイルと同じディレクトリ(argocd)に作成します。

apiVersion: batch/v1
kind: Job
metadata:
  name: snyk-iac-scan
  annotations:
    argocd.argoproj.io/hook: PreSync
spec:
  ttlSecondsAfterFinished: 600
  template:
    spec:
      containers:
      - name: snyk-cli
        image: snyk/snyk-cli:npm
        command: ["/bin/sh","-c"]
        args:
          - git clone https://github.com/jiajunngjj/flask-polling-app.git;
            snyk auth $SNYK_TOKEN;
            snyk iac test flask-polling-app/argocd/polling-app.yaml || true;
        env:
          - name: SNYK_TOKEN
            valueFrom:
              secretKeyRef:
                name: snyk-token
                key: token
      restartPolicy: Never
  backoffLimit: 0

構成ドリフトの検知をトリガーするためにpolling-app.yamlを編集します(この例では、レプリカ数を「1」に変更します)。

---
apiVersion: v1
kind: Service
metadata:
  name: polling-app
spec:
  ports:
  - name: 8080-tcp
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: polling-app
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: polling-app
spec:
  replicas: 1
  selector:
  matchLabels:
    app: polling-app
  template:
    metadata:
      labels:
        app: polling-app
    spec:
      containers:
      - image: jiajunngjj/polling-app
        name: polling-app
        ports:
        - containerPort: 8080
      restartPolicy: "Always"

Gitコマンドを実行して、ファイルをリポジトリに送信します。

➜ git add argocd/snyk-scan.yaml argocd/polling-app.yaml➜ git commit -m "added snyk-scan.yaml and edited polling-app.yaml"➜ git push

ステップ6:Argo CDが構成ドリフトを検知するまで待つ

Argo CDが構成ドリフトを検知すると、望ましい新しい状態にするために同期を開始します。アプリケーションのデプロイ前にSnyk IaCスキャンが実行されることを確認できます。

Argo CDのアプリケーション詳細ツリー。正常に同期されたsnyk-demoアプリケーションが表示され、snyk-iac-scanジョブが赤く強調表示されています。

snyk-iac-scanがポッドとして実行されていることも確認できます。

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 16msnyk-iac-scan-9x8gz 0/1 Completed 0 2m32s

最後に、Argo CD UIでsnyk-iac-scanジョブを確認できます。

snyk-iac-scanジョブのArgo CDログには、Snyk Infrastructure as Codeのテストが完了し、重大度の低い問題が5件検出されたことが表示されています。

ステップ7:Kubernetesと連携する

SnykをKubernetesと連携すると、稼働中のワークロードをインポートしてテストし、関連するイメージの脆弱性や、ワークロードのセキュリティを低下させる可能性のある構成を特定できます。インポート後もSnykがワークロードを継続的に監視し、新しいイメージのデプロイやワークロード構成の変更に応じて、セキュリティ上の問題を特定し、優先順位付けします。

自動インポートを設定すれば、Snyk Controllerを通じてすべて自動で行われるため、デプロイ用YAMLファイルを更新する必要はありません(詳しくはSnykのドキュメントをご覧ください)。Snykは以下のワークロードをサポートしています。

  • Deployments

  • ReplicaSets

  • DaemonSets

  • StatefulSets

  • Jobs

  • CronJobs

  • ReplicationControllers

  • Pods

ほかのSnykブログ記事では、複数のSnyk Kubernetesクラスターを単一のクラスターにインストールする方法や、Pulumiを使ってSnykとKubernetesの連携を自動化する方法をご紹介しています。

Argo CDがアプリケーションをデプロイすると、SnykのKubernetes連携により、手動操作なしでワークロードのスキャン結果がプラットフォームにインポートされます。

Kubernetesワークロードとセキュリティ問題の件数を一覧表示するSnyk Projectsダッシュボード。赤い楕円でpolling-appプロジェクトが強調されている。
Pythonベースイメージのアップグレードに関する詳細と推奨事項を表示する、Kubernetesのポーリングアプリ用Snykプロジェクトダッシュボード。

まとめ

このデモでは、Argo CDのリソースフックを使い、構成の変更が検知されるたびにSnyk IaCスキャンを実行します。このように、Snykで脆弱性を検知し、検知された脆弱性が定義済みの深刻度しきい値に達した場合にワークフローを停止することで、GitOpsワークフローにセキュリティ要件を組み込めます。これにより、脆弱なコードが本番環境に到達するのを防ぎます。

詳しくはこちら

Argo CDでSnyk IaCテストを設定し、Kubernetes上のワークロードを監視する方法を確認したところで、ソフトウェア開発ライフサイクルをさらに安全にするための情報を、以下のリソースでご覧ください。

ソースコードの段階からインフラを保護

Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。