Sysdig

SCSK株式会社

ブログ

HOME Developer Square ブログ 【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編②~

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編②~

SCSK技術者によるブログ!
第12回担当の川杉です。前回好評だったポリシーエンジンの続編です。今回はKyvernoについてご紹介します。
それでは、参りましょう!

「Sysdigでできない部分はどうしたらいいですか?」

第4回の技術者ブログ(https://www.scsk.jp/sp/sysdig/blog/cat/scsksysdig.html)で上記の問いに、足りない要素は他のセキュリティソリューションで補うことも大事だとご説明しました。
おさらいとなりますが、〇〇を禁止する、といったルールを強制する機能はSysdigでは提供されていないため他の対策が必要になります(こういった要件の中にはFalcoルールを自作することで対応可能なものもありますが、本来の用途とは異なります)。Kubernetes(以下k8s)環境でこういった要件が生じた場合はポリシーエンジンと呼ばれるOSSの実装がおススメです。
例:特定のラベルが付与されていないPodのデプロイを禁止したい、デプロイできるコンテナイメージを制限したい など。。。

ポリシーエンジンの違いについて

ポリシーエンジンについての説明は今回省きます。ポリシーエンジンがどういうものか知りたい方は第4回の技術者ブログ(https://www.scsk.jp/sp/sysdig/blog/cat/scsksysdig.html)をご一読ください。 下記が代表的なポリシーエンジンOSSです。

各OSSには以下のような違いがあります。

OPA/Gatekeeper Kyverno
利用言語 Rego YAML
学習コスト
(Rego言語を学ぶ必要がある)

(YAMLのため直感的に作成可能)
ポリシーの種類 2種類 5種類
ポリシーの適用方法 ConstraintTemplateとConstraintをデプロイする必要がある ClusterPolicyのデプロイのみ
利用可能な環境 Kubernetes以外の環境(LinuxやDockerなど)でも利用可能 Kubernetesのみ

Kyvernoが後発ということもあり、使いやすさにも気を配って開発されている印象です。
また、ポリシーエンジンを活用してk8s以外の環境も一元的に管理したい場合はOPAを採用する必要があります。
さらに詳細な違いについて知りたい方は様々な方が違いについてのブログを執筆しているので是非調べてみてください。
前回OPA/Gatekeeperの実装方法についてご紹介しましたので、今回はKyvernoを実装してどのようなことができるのか見ていきましょう。

事前準備

それでは早速検証の準備から始めていきましょう。
今回の検証で事前に用意するものは以下の通りです。

  • k8s Cluster
    • k8s環境であればなんでもいいです
    • 今回私はOpenshift環境を利用します。その他の環境をご利用の方は環境に応じてkubectlコマンドに置き換えてご検証ください。
  • Helmインストール
    • Kyvernoの導入はHelm経由で実施します。Helmの導入をお願いします。

まずは実装

KyvernoをOpenshift環境へデプロイします。

手順1. Helmレポジトリの追加、更新します。

$helm repo add kyverno https://kyverno.github.io/kyverno/
"kyverno" has been added to your repositories

$helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "kyverno" chart repository
Update Complete. ?Happy Helming!?

手順2. ネームスペースを作成し、Kyvernoをデプロイします。

$kubectl create namespace kyverno
namespace/kyverno created

$helm install kyverno-policies kyverno/kyverno -n kyverno
NAME: kyverno-policies
LAST DEPLOYED: Fri Sep 20 10:56:17 2024
NAMESPACE: kyverno
STATUS: deployed
REVISION: 1
NOTES:
Chart version: 3.2.6
Kyverno version: v1.12.5
 
Thank you for installing kyverno! Your release is named kyverno-policies.
 
The following components have been installed in your cluster:
- CRDs
- Admission controller
- Reports controller
- Cleanup controller
- Background controller
 
 
??  WARNING: Setting the admission controller replica count below 2 means Kyverno is not running in high availability mode.
 
? Note: There is a trade-off when deciding which approach to take regarding Namespace exclusions. Please see the documentation at https://kyverno.io/docs/installation/#security-vs-operability to understand the risks.

手順3.kyvernoコンテナの起動を確認します。

$oc get pods -n kyverno
NAME                                                                     READY   STATUS      RESTARTS   AGE
kyverno-admission-controller-86f85566b7-mw272             1/1     Running     0          11m
kyverno-background-controller-9968fbbb5-tfmgc              1/1     Running         0          11m
kyverno-cleanup-admission-reports-28780500-2s58r           0/1     Completed   0          8m22s
kyverno-cleanup-cluster-admission-reports-28780500-k47rz   0/1     Completed   0          8m22s
kyverno-cleanup-cluster-ephemeral-reports-28780500-8vhm7   0/1     Completed   0          8m22s
kyverno-cleanup-controller-7bc58cdcfd-nvjrj                1/1     Running     0          11m
kyverno-cleanup-ephemeral-reports-28780500-9d55n           0/1     Completed   0          8m22s
kyverno-cleanup-update-requests-28780500-5tg55             0/1     Completed   0          8m22s
kyverno-reports-controller-5cb49c99b-gj625                 1/1     Running     0          11m

これで実装完了です。

いざ検証

はじめに必要なオブジェクトをご紹介します。

  • cluster Policy
    • k8sリソースを評価するポリシーを定義します。このオブジェクトはYAMLで記述します。

OPA Gatekeeperと異なり、ルール強制のためにデプロイが必要なオブジェクトは一つだけです。 今回もChat GPTに頼んでCluster Policyのyamlファイルを作成してもらおうと思います。 それでは実際に試してみましょう。 まずはChat GPTにマニュフェストの作成を頼みます。

今回のデモでは特定のラベルが付与されていないpodのデプロイを禁止するルールを強制します。

結果、下記のようなyamlを作ってもらいました。

cluster-policy.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-app-label
spec:
  validationFailureAction: enforce  # このオプションにより、違反時にリソースの作成が拒否されます
  background: false  # リソース作成時にのみポリシーを適用
  rules:
  - name: check-app-label
    match:
      resources:
        kinds:
        - Pod  # Podリソースに適用
    validate:
      message: "Pod must have the label 'app: test'."
      pattern:
        metadata:
          labels:
            app: test  # 必須のラベル

では早速デプロイしてみましょう。
まずはyamlのデプロイから、

$oc apply -f cluster-policy.yaml
Warning: Validation failure actions enforce/audit are deprecated, use Enforce/Audit instead.
clusterpolicy.kyverno.io/require-app-label created

Chat GPTに作ってもらったyamlで問題なくデプロイできました。 オブジェクトも作成できたところで実施に試してみましょう。

適当なpodをデプロイしてみます。
$oc run nginx --image=nginx
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
Error from server: admission webhook "validate.kyverno.svc-fail" denied the request:
 
resource Pod/default/nginx was blocked due to the following policies
 
require-app-label:
  check-app-label: 'validation error: Pod must have the label ''app: test''. rule
    check-app-label failed at path /metadata/labels/app/'
設定した通り、app: testのラベルがないためデプロイできません。

同じコンテナをapp: testラベルを付与して

$oc run nginx --image=nginx --labels="app=test"
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/nginx created
 
$oc get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          15s

app: testラベルを付与すると想定通りpodがデプロイできました。

最後に

今回はKyvernoの紹介でした。ポリシーエンジンツールを有効利用することで、今までできそうでできなかったようなセキュリティルールを作ることができます。ポリシーエンジンとSysdigを組み合わせることでよりセキュアなk8s環境が実現できますのでご興味あればお試しください。またセキュリティについてのご相談は本サイトのお問い合わせフォームからよろしくお願いいたします。

担当者紹介

SCSK 川杉
担当者名
川杉
コメント
3年ほど前からSysdigを中心にコンテナ・Kubernetes領域で仕事をしています。社内でコンテナ技術の啓蒙活動も積極的に行っています。
保有資格
Certified Kubernetes Administrator
Certified Kubernetes Security Specialist

SCSK技術者ブログ

【 SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた(Monitor編)

【 SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた(Monitor編)

【SCSK技術者によるブログ】Falco初学者講座 - condition編

【SCSK技術者によるブログ】Falco初学者講座 - condition編

【SCSK技術者によるブログ】Sysdig Sageを使ってみた

【SCSK技術者によるブログ】Sysdig Sageを使ってみた

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編②~

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編②~

【SCSK技術者によるブログ】Sysdigをセキュアに使おう~IP Allowlist編~

【SCSK技術者によるブログ】Sysdigをセキュアに使おう~IP Allowlist編~

【SCSK技術者によるブログ】Node ExporterをSysdig Monitorに連携してみた

【SCSK技術者によるブログ】Node ExporterをSysdig Monitorに連携してみた

【SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた

【SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた

【SCSK技術者によるブログ】CNAPPの理解とSysdigのカバレッジ

【SCSK技術者によるブログ】CNAPPの理解とSysdigのカバレッジ

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~マルウェア検知編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~マルウェア検知編~

【SCSK技術者によるブログ】Sysdigのライセンス体系

【SCSK技術者によるブログ】Sysdigのライセンス体系

【SCSK技術者によるブログ】Sysdig とMicrosoft Entra ID間でSAML認証設定を試してみた

【SCSK技術者によるブログ】Sysdig とMicrosoft Entra ID間でSAML認証設定を試してみた

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編~

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~AWSサインインなりすまし検知編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~AWSサインインなりすまし検知編~

【SCSK技術者によるブログ】Sysdig SecureのRisks機能を試してみた

【SCSK技術者によるブログ】Sysdig SecureのRisks機能を試してみた

【SCSK技術者によるブログ】Sysdigの防御機能Kill Processを試してみた

【SCSK技術者によるブログ】Sysdigの防御機能Kill Processを試してみた

ページトップへ