ブログ
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です。
- Open Policy Agent/Gatekeeper(以下OPA/Gatekeeper)
https://kubernetes.io/blog/2019/08/06/opa-gatekeeper-policy-and-governance-for-kubernetes/ - Kyverno
https://kyverno.io/docs/introduction/
各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環境が実現できますのでご興味あればお試しください。またセキュリティについてのご相談は本サイトのお問い合わせフォームからよろしくお願いいたします。
担当者紹介
- 担当者名
- 川杉
- コメント
- 3年ほど前からSysdigを中心にコンテナ・Kubernetes領域で仕事をしています。社内でコンテナ技術の啓蒙活動も積極的に行っています。
- 保有資格
- Certified Kubernetes Administrator
Certified Kubernetes Security Specialist