キーワードで検索

今日を知り、明日を変えるシステム運用メディア

KubernetesのコードをMinikube・Checkovでセキュリティチェックする方法

KubernetesのコードをMinikube・Checkovでセキュリティチェックする方法

Kubernetes(クバネティス:K8s)は、デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したりするための、オープンソースのシステムです。

Kubernetesの構成ファイル(YAML)は、過剰な権限の付与や機密情報の平文記載、不適切なネットワーク設定、Podセキュリティ設定の欠如など、さまざまなセキュリティ上の問題が潜んでいる可能性があります。

本記事では、ローカル環境のMinikubeを活用してKubernetesコードをデプロイし、そのコードをCheckovでセキュリティチェックする方法をご紹介します。

Checkovは、IaC(Infrastructure as Code)のセキュリティツールであり、脆弱性やベストプラクティス違反を自動的に検出します。この記事を通じて、Kubernetes構成をセキュアに保つための基本的なチェック方法と改善例を学びましょう。

事前準備

Checkovを使ったKubernetesコードのセキュリティチェックを始める前に、以下のツールがセットアップされていることを確認してください。

Minikubeのセットアップ

Kubernetesクラスターをローカル環境に起動します。

minikube start

Checkovのインストール

Checkovを以下のpipコマンドでインストールします。

pip install checkov

詳しいセットアップ手順については、Minikubeの使い方とCheckovの導入ガイドの記事をご参照ください。

Checkovとは?

Checkovは、IaC(Infrastructure as Code)のセキュリティチェックを自動化するオープンソースツールです。

KubernetesのYAMLファイルをはじめ、Terraform、CloudFormationなどの構成ファイルの脆弱性を検出し、ベストプラクティスに従った構成をサポートします。Kubernetesにおいては、特権モードの有効化やリソース制限の未設定など、設定ミスが原因となるセキュリティリスクを簡単に発見可能です。

Checkovの詳細な導入手順や設定方法については下記記事をご覧ください。

CheckovでKubernetesコードをチェックするメリット

Checkovを使うことで、Kubernetesコードのセキュリティを強化できます。
ここでは代表的なメリットを挙げます。

脆弱性を発見

Kubernetesの構成ファイルに潜むセキュリティ上の問題を自動的に検出します。
例えば下記項目が挙げられます。

  • 特権モードが有効(privileged: true)のコンテナが存在していないか。
  • リソース制限(CPUやメモリ)が適切に設定されているか。
  • 不必要に許可されたRBAC設定がないか。

これらのチェックにより、設定ミスが原因で発生するセキュリティリスクを早期に発見できます。

セキュリティ基準に基づく詳細なフィードバック

Checkovは、CIS Kubernetesベンチマークや業界標準のセキュリティ基準を使用して、構成の適合性を検証します。

  • 問題箇所の指摘
    • どこが問題なのか」「何を修正すべきか」が明確にわかります。
  • 詳細なガイドライン
    • 各脆弱性についての推奨設定が提供され、修正の参考にできます。

未然に本番環境での問題を防止

AMLファイルを本番環境にデプロイする前に、リスクを事前に発見することで、クラウド環境での障害やセキュリティ侵害を防ぐことができます。

Checkovを活用すれば、Kubernetesコードがセキュリティ基準を満たし、信頼性の高い構成になっていることを保証できます。

Checkovはセキュリティチェックだけでなく、開発プロセス全体の効率向上にも繋がります。

サンプルコードの作成

Checkovでセキュリティチェックを行うため、Kubernetes用のサンプルYAMLファイルを作成します。今回は、脆弱性のあるPodを記述します。以下のコードをOpsToday-insecure-pod.yamlという名前で作成します。

  • OpsToday-insecure-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: insecure-pod
spec:
  containers:
  – name: vulnerable-container
    image: nginx
    securityContext:
      privileged: true

このコードには、privileged: true(特権モードの有効化)というセキュリティリスクが含まれています。

Checkovでセキュリティチェックする手順 700

サンプルコードが作成できたら、Checkovを使ってKubernetesコードのセキュリティチェックを行う手順を説明します。

1.Checkovを実行するディレクトリに移動

サンプルコードが保存されているディレクトリに移動します。

cd /サンプルコード保存フォルダ

2.Checkovコマンドを実行

Checkovコマンドを使用して、YAMLファイルをスキャンします。このコマンドを実行することで、Kubernetesコードに潜むセキュリティリスクや設定ミスを特定できます。以下のコマンドでOpsToday-insecure-pod.yamlをチェックします。

checkov -f OpsToday-insecure-pod.yaml

実行画面

3.出力結果の説明

Checkovが生成する出力結果には、検出された問題の詳細が含まれます。たとえば、以下のような情報が出力されます。

Check: CKV_K8S_37: “Minimize the admission of containers with capabilities assigned” FAILED for resource: Pod.default.insecure-pod File: /OpsToday-insecure-pod.yaml:1-10 Guide:https://docs.prismacloud.io/en/enterprise-edition/policy-reference/kubernetes-policies/kubernetes-policy-index/bc-k8s-34

CKV_K8S_37は、Kubernetesにおける特権や能力(capabilities)を最小限に抑えるためのセキュリティポリシーを検証するチェックです。出力結果を確認することで、問題の内容とその修正方法を具体的に把握できます。

今回のように、特権モードが有効になっているコンテナ(privileged: true)が検出された場合は、それを無効化する必要があります。

※Guide: 修正の参考情報が記載されたドキュメントのリンクです。リンク先には、CKV_K8S_37に関連するセキュリティポリシーや改善方法が記載されています。

チェック結果の改善例

Checkovのチェック結果で指摘された問題を修正し、Kubernetesコードを安全な状態に改善する方法を解説します。

ここでは、指摘内容の改善前後のコードを比較し、再度Checkovを使って修正結果を確認する手順を説明します。

改善前後のコード比較

まずは改善前のコードを見ていきましょう。privileged: trueが設定されており、特権モードが有効になっている問題のあるコード例です。この設定では、コンテナがホストシステムに対して特権的な操作を実行できる状態になっています。

改善前のOpsToday-insecure-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: insecure-pod
spec:
  containers:
  – name: vulnerable-container
    image: nginx
    securityContext:
      privileged: true #特権モード有効

コンテナがホストのリソース(デバイス、カーネルモジュールなど)にアクセス可能で、攻撃者による不正な利用が懸念されます。次に改善後のコードを見ていきます。以下は、問題を解消するために修正したコード例です。特権モードを無効化し、追加のセキュリティ設定を加えることで、セキュリティリスクを大幅に低減します。

修正後のOpsToday-insecure-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  containers:
  – name: secure-container
    image: nginx
    securityContext:
      privileged: false
      runAsNonRoot: true
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        – ALL

主な修正内容の詳細はこちらです。

  • privileged: false: 特権モードを無効化。
  • runAsNonRoot: true: 非rootユーザーでコンテナを実行し、ホストへの不正なアクセスを制限。
  • allowPrivilegeEscalation: false: 権限昇格を防止。
  • capabilities.drop: – ALL: すべての特権(capabilities)を削除し、コンテナが必要以上の操作を実行できないように設定。

再チェック

修正したYAMLファイル(OpsToday-insecure-pod.yaml)をCheckovで再度検査して、問題が解消されていることを確認します。期待される結果としては、修正が適切であれば、「CKV_K8S_37」の項目がPASSED(合格)と表示されます。

checkov実行:

checkov -f OpsToday-insecure-pod.yaml

実行結果がこちらです。

「CKV_K8S_37」がPASSED(合格)と表示されました。この結果により、セキュリティ上の問題が解消されたことが確認できます。

クラスターの停止とリソースのクリーンアップ

Minikubeを利用した後は、クラスターを停止し、不要なリソースを削除することでローカル環境を整えてましょう。後片付けを行うことで、ストレージやリソースを効率的に管理できます。

1.Minikubeクラスターを停止

Minikubeで起動したクラスターを停止するには、以下のコマンドを実行します。

minikube stop

2.クラスターの削除(必要に応じて)

クラスター自体が不要になった場合は、以下のコマンドで完全に削除できます。

minikube delete

3.再利用しないイメージの削除

Minikubeでは、使用したDockerイメージがキャッシュされます。不要なイメージを削除するには、以下のコマンドを使用します。

minikube ssh — docker system prune -a

4.ローカルの確認

最後に、以下のコマンドでリソースが正しく解放されていることを確認します。

minikube status

まとめ

MinikubeとCheckovを活用することで、Kubernetes構成ファイルのセキュリティチェックを効率的かつ簡単に行うことができます。本記事では、Checkovの基本的な使い方やセキュリティリスクの検出から改善方法までを解説しました。

privileged: true の問題を特定し、修正する具体例を通じて、Kubernetesのセキュリティについて体系的に学べたのではないでしょうか。

Checkovを使用し、コードの品質向上とセキュリティリスクの軽減を目指しましょう。

現在クラウドエンジニアとして勤務。AWS(SAP、DOP)とAzure(AZ-305)の資格を保有しており、ネットワークやセキュリティに関する業務を主に行っています。

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録