IaCの潜在的なセキュリティ問題をSysdigでソースから修正する

By 清水 孝郎 - SEPTEMBER 14, 2022

SHARE:

本文の内容は、2022年9月14日にEduardo Mínguezが投稿したブログ(https://sysdig.com/blog/security-infrastructure-as-code-sysdig/)を元に日本語に翻訳・再構成した内容となっております。

IaC (Infrastructure as Code) は、インフラストラクチャーを管理するための強力なメカニズムですが、このIaCがもたらす大きな力には大きな責任が伴います。もし、あなたのIaCファイルにセキュリティ上の問題(例えば、タイプミスのために誤ったパーミッションが設定されるなど)があれば、それは、セキュリティ問題のほとんどがスキャンされるか、実行時に発見されるまで、CI/CDパイプラインに沿って伝播していくことになります。一方、インフラストラクチャーに潜在するセキュリティ問題をソースで修正できるとしたらどうでしょうか?


Infrastructure as Code(インフラストラクチャー・アズ・コード)とは?

IaCは、インフラストラクチャーのビルドブロック(仮想マシン、ネットワーク、コンテナーなど)を、さまざまな技術やツールを使ってコードとして扱う方法論です。つまり、VM、コンテナ、ネットワーク、ストレージなどのインフラストラクチャーを、お気に入りのインフラストラクチャー・プロバイダーのWebインターフェースから手動で作成するのではなく、それらをコードとして定義し、選択したツール(terraform、crossplane、pulumiなど)で作成/更新/管理するのです。

これにより非常に大きなメリットを得られます。インフラストラクチャーをコードであるかのように管理でき(今はコードです)、開発のベストプラクティス(自動化、テスト、トレーサビリティ、バージョン管理など)をインフラストラクチャー資産に活用することができるのです。このトピックに関する情報は数多くありますが、このブログが良い出発点となるでしょう。

なぜInfrastructure as Code資産を保護することが、追加のセキュリティ層として重要なのでしょうか?

ほとんどのセキュリティ・ツールは、潜在的な脆弱性や問題を実行時に検出しますが、それでは遅すぎます。それらを修正するためには、手動で修正を行うか(例えば、k8sオブジェクトのパラメータを kubectl editで直接修正する)、理想的にはソースで修正が行われ、それがサプライチェーン全体に伝搬されることが必要です。これが、”Shift Security Left “と呼ばれるものです。手遅れになってから問題を解決することから、問題が起こる前に解決するやり方に移りましょう。

Red Hatの ”2022 state of Kubernetes security report“によると、回答者の57%がコンテナライフサイクルのランタイムフェーズを最も心配しているとのことです。しかし、そのような潜在的な問題をコード定義で直接発見することができれば、より良いのではないでしょうか?
Shifting security left in an application lifecycle graph

Sysdig Git Infrastructure as Code Scanningの紹介

現時点での ” CIS Kubernetes “と” Sysdig K8s Best Practices “ベンチマークに基づき、Sysdig SecureはInfrastructure as Codeマニフェストをソースからスキャンします。現在、Kubernetesワークロードを表すYAML、Kustomize、HelmまたはTerraformファイルのスキャンをサポートしており(今後のリリースに乞うご期待!)、GitHub、GitLab、BitbucketまたはAzure DevOpsでホストされるリポジトリ上のプルリクエストに直接、潜在する問題を表示し、開発ワークフローにシームレスに統合されます。詳細については、公式ドキュメントを参照してください。

コンセプトの証明として、サンプルのゲストブック アプリケーションを”Infrastructure as Code”として、小さなEKSクラスターで実際に使って見ましょう。ArgoCDでアプリケーションのライフサイクルを管理するために、GitOpsのプラクティスも適用してみましょう。
これは、GitOps と Sysdig IaC スキャンとの統合のPoCです。この PoC で使用されるバージョンは、ArgoCD 2.4.0、Sysdig Agent 12.8.0、Sysdig Charts v1.0.3 です。ノート:GitOpsについてもっと知りたいですか?GitOpsを使用してソースにセキュリティを適用する方法をご覧ください。

準備

EKSクラスター( “eksctl create cluster -n edu --region eu-central-1 --node-type m4.xlarge --nodes 2として作成)は以下のような状態になっています:

kubectl get nodes
NAME                                          STATUS   ROLES    AGE    VERSION
ip-10-0-2-210.eu-central-1.compute.internal   Ready    <none>   108s   v1.20.15-eks-99076b2
ip-10-0-3-124.eu-central-1.compute.internal   Ready    <none>   2m4s   v1.20.15-eks-99076b2

Argo CDのインストールは、公式ドキュメントの指示に従うだけで、簡単にできます:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.0/manifests/install.yaml

Argo をデプロイして、サンプルアプリケーションを作りましょう。ここでは https://github.com/argoproj/argocd-example-apps.git で公開されているゲストブック Argo CD アプリケーションのサンプルを活用し、GitHub で直接フォークを作成します:



あるいは、GitHub の cli ツールを使ってください。:
❯ cd ~/git
❯ gh repo fork https://github.com/argoproj/argocd-example-apps.git --clone
✓ Created fork e-minguez/argocd-example-apps
Cloning into 'argocd-example-apps'...
...
From github.com:argoproj/argocd-example-apps
 * [new branch]      master     -> upstream/master
✓ Cloned fork

さて、Argo CD を設定して、Web インターフェイス経由で k8s クラスタにアプリケーションをデプロイします。Argo CD のウェブインターフェースにアクセスするには、パスワードを取得し(インストール時にランダム化されます)、また外部から利用できるようにする必要があります。この例では、ポートフォワードが使用されています:

❯ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
s8ZzBlGRSnPbzmtr
❯ kubectl port-forward svc/argocd-server -n argocd 8080:443 &

次に、ウェブブラウザで http://localhost:8080 を指定して Argo CD の UI にアクセスします:


または、Kubernetesオブジェクトを直接使用します。

❯ cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-example-app
  namespace: argocd
spec:
  destination:
    namespace: my-example-app
    server: https://kubernetes.default.svc
  project: default
  source:
    path: guestbook/
    repoURL: https://github.com/e-minguez/argocd-example-apps.git
    targetRevision: HEAD
  syncPolicy:
    automated: {}
    syncOptions:
    - CreateNamespace=true
EOF

しばらくすると、Argo が git リポジトリから、全てのオブジェクトを含むアプリケーションをデプロイします。

Screenshot of Argo CD UI showing an example application successfully synced
Argo CD UI のスクリーンショット:同期に成功したアプリケーションの例

❯ kubectl get all -n my-example-app
NAME                                READY   STATUS    RESTARTS   AGE
pod/guestbook-ui-85985d774c-n7dzw   1/1     Running   0          14m
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/guestbook-ui   ClusterIP   172.20.217.82   <none>        80/TCP    14m
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/guestbook-ui   1/1     1            1           14m
NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/guestbook-ui-85985d774c   1         1         1       14m

成功!

コードとして定義されたアプリケーションは、すでにKubernetesクラスターで稼働しており、GitOpsのプラクティスを使ってデプロイも自動化されています。しかし、セキュリティ面は一切考慮していませんでした。私のアプリケーションの定義は十分に安全でしょうか?何か見落としていることはないでしょうか?何がわかるか見てみましょう。

Sysdig Secureを設定して、私たちの新しい輝くリポジトリをスキャンすることは、新しいgitリポジトリの統合を追加するのと同じくらい簡単です。


プルリクエストポリシー評価

では、実際に見てみましょう。例えば、レプリカの数を 1 から 2 に増やすなど、いくつかのコードを変更してプルリクエストを作成します:


または、cliを使用して:

❯ git switch -c my-first-pr
Switched to a new branch 'my-first-pr'
❯ sed -i -e 's/  replicas: 1/  replicas: 2/g' guestbook/guestbook-ui-deployment.yaml
❯ git add guestbook/guestbook-ui-deployment.yaml
❯ git commit -m 'Added more replicas'
[my-first-pr c67695e] Added more replicas
 1 file changed, 1 insertion(+), 1 deletion(-)
❯ git push
Enumerating objects: 7, done.
…


ほぼ即座に、Sysdig Secureはリポジトリフォルダのスキャンを実行し、潜在的な問題を通知することになります:

Screenshot of Sysdig's pull request policy evaluation in action
Sysdigのプルリクエストポリシー評価の実行中のスクリーンショット

ここでは、CIS Kubernetes V1.6ベンチマークとSysdig Kubernetesベストプラクティスに基づき、いくつかの潜在的な問題を深刻度順に見ることができます。例として、サンプルアプリケーションのデプロイファイルにある「Container with writable root file system」(書き込み可能なルートファイルシステムを持つコンテナ)が挙げられます。

これらの推奨事項はソースコードを修正することで適用できますが、Sysdig Secureに代行してもらうのはどうでしょうか?


ソースコード上の問題を自動的に修正する

helm経由でSysdig Secureエージェントをクラスターにデプロイして、KSPM機能を有効にするためのいくつかの新しいフラグを含めて、実行中のオブジェクトを検査できるようにしましょう。


❯ helm repo add sysdig https://charts.sysdig.com
❯ helm repo update
❯ export SYSDIG_ACCESS_KEY="XXX"
❯ export SAAS_REGION="eu1"
❯ export CLUSTER_NAME="mycluster"
❯ export COLLECTOR_ENDPOINT="ingest-eu1.app.sysdig.com"
❯ export API_ENDPOINT="eu1.app.sysdig.com"
❯ helm install sysdig sysdig/sysdig-deploy \
    --namespace sysdig-agent \
    --create-namespace \
    --set global.sysdig.accessKey=${SYSDIG_ACCESS_KEY} \
    --set global.sysdig.region=${SAAS_REGION} \
    --set global.clusterConfig.name=${CLUSTER_NAME} \
    --set agent.sysdig.settings.collector=${COLLECTOR_ENDPOINT} \
    --set nodeAnalyzer.nodeAnalyzer.apiEndpoint=${API_ENDPOINT} \
    --set global.kspm.deploy=true
# after a few moments
❯ kubectl get po -n sysdig-agent
NAME                                    READY   STATUS    RESTARTS   AGE
nodeanalyzer-node-analyzer-bw5t5        4/4     Running   0          9m14s
nodeanalyzer-node-analyzer-ccs8d        4/4     Running   0          9m5s
sysdig-agent-8sshw                      1/1     Running   0          5m4s
sysdig-agent-smm4c                      1/1     Running   0          9m16s
sysdig-kspmcollector-5f65cb87bb-fs78l   1/1     Running   0          9m22s

読者のために練習として、このステップは Argo CDhelm チャートを使って GitOps 方式で行うことができます。数分後、エージェントがデプロイされ、Kubernetesのステータスが新しいPosture -> “Actionable Compliance “のセクションにレポートされ、セキュリティ要件が観察できるようになります:

Screenshot of Sysdig's compliance view
Sysdigのコンプライアンスビューのスクリーンショット

”Container Image Pull”ポリシーコントロールを修正してみましょう(利用可能なポリシーコントロールの詳細なリストについては、公式ドキュメントを参照してください)。



そこには、修正案、Kubernetesパッチ、そして”Setup Pull Request”の項目が表示されています。でも、本当にプルリクエストを使って修正できるのでしょうか?


確かに! Sysdig Secureは、Kubernetesオブジェクトのソースとランタイムの状態を比較することもできるようになり、ソースから実行まで、あなたに代わって修正することもできるようになりました。

複雑な操作や、雪だるまを作るような手動修正は必要ありません。その代わり、ソースで修正しましょう。


最後に

IaCスキャン、セキュリティ、コンプライアンスの仕組みをツールボックスに追加することで、お客様の組織は、サプライチェーンのソース(セキュリティのシフトレフト)で直接、潜在的なセキュリティ問題を発見し、修正することができます。Sysdig Secureは、お客様に代わって直接修正策を作成することも可能です!

今すぐSysdig Secureの無料トライアルを開始し、ご自身の目でお確かめください。