KubernetesネイティブなポリシーエンジンKyverno
Kubernetesがプラットフォームとして高く評価されている理由の一つに、宣言的な発想でシステムが自律的に運用されていくスタイルがあると言えるだろう。しかし仮想マシンの上でモノリシックなアプリケーションを運用するスタイルではなく、APIを主体にしたサービスが連携して稼働するシステムでは、セキュリティについても新しい発想が必要だ。今回はKubernetesのAdmission Controllerとして実装されるポリシーエンジンKyvernoを紹介したい。
Kyvernoは、2020年12月にCNCFのサンドボックスプロジェクトとしてホストされることになったソフトウェアだ。これまでの汎用的に使えるセキュリティソフトウェアとは異なり、最初からKubernetesネイティブの実装となっていることが特徴だ。Kyvernoがサンドボックスプロジェクトとして採用されたことは、CNCFのブログでも紹介されているが、この記事を書いたのはKyvernoの開発をリードするNirmataの創業者兼CEOのJim Bugwadia氏だ。
CNCFのブログ:Kyverno for Kubernetes!
このブログの中でBugwadia氏は、Kubernetesが宣言的かつ自律的なシステムであることを紹介し、同時に構成管理の面からKubernetesが複雑になってしまっていることを解説している。その複雑さを解消するために、ポリシーを使って組織の設定したセキュリティコンプライアンスや法律が求めるセキュリティを実装し、自動化することが有効であると語っている。
「The solution to this challenge is to use policies to validate configurations for best practices and security compliance, and also automatically modify and generate additional configurations when needed.」
KubernetesはAPI Serverを中心にして、ワーカーがetcdに保存された状態通りにシステムを運用しようとする自律的なシステムで、定義されたnamespaceによってアプリケーションが区別されるという仕組みを持つ。この従来のシステムとは異なる「宣言的」という発想を理解してシステムを開発運用できるようになるのは困難であり、このような面が「Kubernetesは学習コストが高い」と言われる一因でもある。
またその仕組みを理解して運用を始めてから従来の仕組みと組み合わせるのは、かえって運用コストが高くついてしまう。そのため最近ではKubernetesのコアを活用し、Kubernetes専用という形でソフトウェアを開発しているコミュニティも散見されるようになった。
Kubernetesに寄せたシステムの一例としては、KubernetesのAPIを拡張してマルチクラウドを実装するCrossplaneが挙げられるだろう。
参考:マルチクラウドを制御するユニバーサルなコントロールプレーンCrossplane
またVMwareがコンテナオーケストレーションプラットフォームとして開発を進めるTanzuの中に、Pinnipedというソフトウェアがあるが、このPinnipedもKubernetesに特化したID管理システムを接続するためのソフトウェアで、外部のIdP(Identity Provider)とKubernetesをシームレスに接続することを目指している。
Pinniped:Now With Even More Pinnipeds
また自律的に修復を目指すシステムは、意図的にシステムを壊すことで修復力を高めるカオスエンジニアリングとも親和性が高い。CNCFのサンドボックスプロジェクトにLitmusChaosやChaos Meshが存在するのもその親和性が理由だろう。
前置きが非常に長くなって恐縮だが、今回はKubernetesにネイティブで実装されたKyvernoを、2020年5月21日にCNCFのWebinarとして公開された動画から紹介する。
CNCFのWebinar:Webinar: How to keep your clusters safe and healthy
Kyvernoは公式サイトに記載されている通り、KubernetesのAdmission Controllerとして実装されている。そのため、他のポリシーエージェント、例えばOpen Policy Agent(OPA)とは異なり、Kubernetes上にのみ実装できる。またルールなどはYAMLファイルによるリソースとして定義されるため、OPAが採用しているRegoのような新しい言語を習得する必要がないということは強調されている。
公式サイト:Kyverno
最初にKubernetesを利用する際に生じる4つの問題点を挙げて、それに対する解決策をデモを交えて紹介するというやり方で解説を行った。
最初の問題点はKubernetesの構成が複雑で、結果的に構成ミスを起こしてしまうというものだ。
Kubernetesの過去のバージョンでは、ユーザーが特権を取得できてしまう脆弱性が報告されていた。デフォルトの設定のままで運用している組織は、意外と多いのではないだろうか。
Kubernetesの脆弱性に関する記事:Kubernetes' first major security hole discovered
そしていくつかの利用例を示して、ポリシーがKubernetesの複雑さを解消していくのか? を解説する流れになった。
次のスライドでは解決策はポリシーマネージメントであると語ったが、最後に「?」が付いているのは、実際にAPI Serverに対応したポリシーマネージメントをAdmission Controllerに実装するのは難しいということを意味しているのだろう。
そこでNirmataが開発するKyvernoの登場となる。
Kyvernoは、Kubernetesに特化したポリシーマネージメントエンジンである。Kubernetesのリソースモデルをそのまま使っているというのが「ネイティブ」という意味だ。ここでは「Kyverno」という単語の意味が、ギリシャ語で「Govern(統制)」であることを紹介している。
このスライドでは、KyvernoがAPI Serverと通信してKubernetesの中の動作をポリシーに合わせてチェックするソフトウェアであることが解説されている。この構造はOPA Gatekeeperと同じだ。OPAとの差は、ポリシーを記述するルールの部分に集約される。
ルールの中ではマッチさせる条件と除外する条件のいずれかを設定し、その結果として「Mutate」「Validate」「Generete」という3つの動作を選択するというシンプルな形式だ。
次のスライドでは、サンプルとしてroot特権で実行させないという設定を説明している。
Validateの例としてパターンマッチや>、<、=などの演算子が使えることを解説している。
そしてOPAとの差異が、そのルールの書き方にあることが何度も強調された。左側のOPAのRegoによる記述とKyvernoのYAMLファイルによる記述が「手続的」と「宣言的」の比較になっているように見えるのは勘ぐり過ぎだろうか。
ここからはNirmataのエンジニア、Shuting Zhao氏のデモを交えてのセッションとなった。
Zhao氏はKubernetesのバージョン1.22で廃止される予定のPod Security Policies(PSP)について解説を行った。より詳しくは以下のブログが参考になるだろう。
参考:Pod Security Policies Are Being Deprecated in Kubernetes
著者は、SnowflakeのセキュリティアーキテクトであるMark Manning氏だ。
次のスライドではPSPに置き換わるStandardized Pod Security Profileに関してBugwadia氏が解説を行った。
構成の検証は、いかにもルールの適用例としてはわかりやすいが、次のデモではPodに対して書いたルールからより抽象化したPod Controller向けのルールを生成するAutogen-Ruleの説明を行った。これはルールの適用範囲を拡げる機能として注目すべきだろう。
この機能については、以下のドキュメントサイトに詳細に解説されている。
参考:Auto-Gen Rules for Pod Controllers
ここからは新しいリソースが生成された際にデフォルトで設定されるべきセキュリティを適用させる機能や、リソースへのアクセスコントロールをより細かく行うための機能などが解説された。
Kyvernoを紹介するこのセッションのトピックとして、「ポリシーがKubernetesのセキュリティにはマッチしていること」「Kubernetesに特化したポリシーエンジンであること」「KubernetesのYAMLマニフェストに近い形式で設定可能で、OPAのRego比べると学習コストが低い」ことなどをまとめて紹介した。
このセッションは2020年5月のものだが、2021年2月4日に公開された動画でも同様の解説とデモを行っている。
最新のCNCFのWebinar:This Week in Cloud Native: Kubernetes Native Policy As Code
ここで興味深いのは、CI/CDのツールであるFlux 2のマルチテナンシーの実装の中でKyvernoが使われていることが紹介されていることだろう(Flux 2はCNCFのサンドボックスプロジェクト)。
オープンソースのポリシーエンジンとしてOPAが注目されているが、Kyvernoの今後の動向にも注目していきたい。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- CNDO 2021、Open Policy Agentを使ったポリシーアズコードの紹介
- 注目のOpen Policy Agent、その概要とKubernetesでの活用事例
- CNDO 2021、KubernetesのセキュリティをHPEのアーキテクトが解説
- AWSが公開したオープンソースのポリシー記述言語Cedarを紹介
- CNCFのサンドボックスプロジェクト、カオスエンジニアリングのLitmus Chaosを紹介
- CNDT2020シリーズ:CAのインフラエンジニアが解説するKubernetesネイティブなCI/CD
- KubeCon EU 2020から脆弱性スキャンのTrivyとOPAを紹介
- Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)
- CNSC 2022、eBPFをベースにしたコンテナランタイムセキュリティのツールを紹介
- CNCFがKubernetesモニタリングのFalcoをサンドボックスとしてホスト開始