Argo CDからKubernetesまで、アプリケーションを保護する
JJ Ng
Pas Apicella
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ワークロードを監視します。以下の手順で進めます。
前提条件
Argo CDでSnykテストを実行し、KubernetesワークロードをSnykに自動インポートするには、BusinessまたはEnterpriseプランのSnykアカウントが必要です。Snykアカウントをお持ちでない場合は、Businessプランの無料トライアルを開始できます。
KubernetesクラスターでArgo CDインスタンスが稼働していること。セットアップの詳細は、Argo CDのドキュメントをご覧ください。
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に追加されていることを確認します。

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

ステップ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と表示されます。


次に、Argo CDのsyncコマンドを実行して、アプリケーションをデプロイします。
argocd app sync snyk-demo
Argo CD UIにアプリケーションが表示されます。

アプリがargocd-demo Kubernetes名前空間へのデプロイを開始したことも確認できます。
ステップ4:Snykトークン用のKubernetesシークレットオブジェクトを作成する
アプリケーションがArgo CDに正常に追加されたら、Argo CDパイプラインにSnyk IaCテストを組み込みます。Snyk AppからSnykトークンを取得し、argocd-demo名前空間にシークレットオブジェクトを作成します。
ステップ5:Argo CD PreSyncリソースフックを作成する
次の内容を記述したsnyk-scan.yamlファイルを、デプロイ用YAMLファイルと同じディレクトリ(argocd)に作成します。
構成ドリフトの検知をトリガーするためにpolling-app.yamlを編集します(この例では、レプリカ数を「1」に変更します)。
Gitコマンドを実行して、ファイルをリポジトリに送信します。
ステップ6:Argo CDが構成ドリフトを検知するまで待つ
Argo CDが構成ドリフトを検知すると、望ましい新しい状態にするために同期を開始します。アプリケーションのデプロイ前にSnyk IaCスキャンが実行されることを確認できます。

snyk-iac-scanがポッドとして実行されていることも確認できます。
最後に、Argo CD UIでsnyk-iac-scanジョブを確認できます。

ステップ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連携により、手動操作なしでワークロードのスキャン結果がプラットフォームにインポートされます。


まとめ
このデモでは、Argo CDのリソースフックを使い、構成の変更が検知されるたびにSnyk IaCスキャンを実行します。このように、Snykで脆弱性を検知し、検知された脆弱性が定義済みの深刻度しきい値に達した場合にワークフローを停止することで、GitOpsワークフローにセキュリティ要件を組み込めます。これにより、脆弱なコードが本番環境に到達するのを防ぎます。
詳しくはこちら
Argo CDでSnyk IaCテストを設定し、Kubernetes上のワークロードを監視する方法を確認したところで、ソフトウェア開発ライフサイクルをさらに安全にするための情報を、以下のリソースでご覧ください。
ソースコードの段階からインフラを保護
Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。
