Skip to main content

イメージセキュリティからワークロードセキュリティへ

2019年10月31日

0 分で読めます

これは、KubernetesのAppSec戦略構築に関する全4回シリーズの第3回です。第1回はこちら、第2回はこちらをご覧ください。


以前の記事では、組織がコンテナを導入するなかで、アプリケーションのパッケージ化が開発者へと移行していることを取り上げました。しかし、システム管理から開発へと移っているのはパッケージ化だけではなく、構成管理も同様です。

Kubernetesと構成管理の課題

Kubernetes APIは、クラウドネイティブシステムを構築するための強力な抽象化レイヤーです。しかし、APIが豊富な機能を備えていることの意図しない結果として、開発者が大量の構成を主にYAMLで手作業で記述するようになりました。たとえば、次のKubernetes Deploymentの定義を見てみましょう。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

こうした構成ファイルは、多くの場合ソース管理システムに保存されます。アプリケーションコードと一緒に保存されることもあれば、別々に保存されることもあります。GitHubだけでも、公開されているKubernetesの構成ファイルは150万件を超えています。

デフォルトでは安全でない設定

残念ながら、Kubernetesでは構成できる範囲が広いため、さまざまな潜在的なセキュリティ上の問題が生じます。Ian Coldwater氏とDuffie Cooley氏による発表The Path Less Travelledでは、セキュリティの観点からKubernetesのデフォルト設定に関する問題がうまくまとめられています。設定されないことが多い一般的な構成項目には、次のようなものがあります。

CPUとメモリの上限

CPUとメモリの上限を適切に設定すると、運用面だけでなくセキュリティ面でもメリットがあります。セキュリティの観点では、サービス拒否攻撃による影響をノードやクラスター全体ではなく、アプリにとどめることが目的です。

runAsNonRoot

デフォルトでは、コンテナはrootユーザーとして実行されます。このプロパティを設定すると、コンテナのランタイムでrootユーザーとしての実行を防げます。つまり、攻撃者がコンテナ内でコマンドを実行できたとしても、権限を制限できます。

readOnlyRootFilesystem

デフォルトでは、コンテナにマウントされたファイルシステムは書き込み可能です。そのため、コンテナを侵害した攻撃者はディスクにも書き込めるようになり、特定の攻撃が容易になります。コンテナがステートレスであれば、書き込み可能なファイルシステムは必要ありません。

ケイパビリティ

Linuxのケイパビリティは、ディスクへの書き込みからネットワーク通信まで、コンテナ内のプロセスが実行できる操作を低レベルで制御します。すべてのケイパビリティを削除し、必要なものだけを追加できますが、そのためにはケイパビリティの一覧を理解する必要があります。

こうした構成項目自体は脆弱性ではありませんが、一般に、イメージ内の脆弱性を攻撃者が悪用しやすくします。エクスプロイトが発生した場合、構成によって被害が拡大する可能性もあります。リスクへの露出度は、保有する脆弱性だけでなく、それらが存在する状況にも左右されます。

SDLC全体における構成管理

イメージの脆弱性の場合と同様に、開発者が担うセキュリティ責任が増えるなかで、SDLCの観点から安全な設定を実現するうえでの課題を考えることは興味深いものです。

段階

説明

フィードバック

網羅性

ローカル

ユニットテストのワークフローとの連携からIDEでのプロンプト表示まで、安全性を考慮した構成の作成を支援するローカルツールです。ただし、チームや組織全体の課題ではなく、個人の課題を解決します。

速い

低い

CI/CD

安全でない可能性がある構成ファイルや、社内ポリシーに準拠しない構成ファイルがある場合、ビルドをすばやく失敗させます。ただし、関連するすべてのパイプラインに実装する必要があります。

速い

可変

リポジトリ

構成は現在、主にソース管理システムに保存されています(なお、Helm 3では、互換性のあるOCIレジストリへのイメージ保存がサポートされています)。プルリクエストの送信後、ブランチの作成までの間に、開発者が安全な構成を記述できるようにするにはどうすればよいでしょうか。

中程度

中程度

アドミッション

KubernetesのアドミッションコントローラーはAPIリクエストをブロックし、禁止されている安全でない構成を制限する手段を提供します。

クラスターごとに異なるポリシーが適用される可能性があります。また、影響するのは新しいリクエストであり、既存のワークロードではありません。

遅い

高い

本番環境

Kubernetes APIには実行中の構成が反映されるため、構成に最も注意を払うべき場所です。ただし、ここでの問題は実際のワークロードに影響する可能性があり、問題に対処するまでのフィードバックサイクルも長くなることがあります。

遅い

高い

コンテナイメージのテストと同様、各段階にはそれぞれ異なるトレードオフがあります。1つの段階だけでテストすると、迅速なフィードバックを得られる一方で制御が弱まることもあれば、その逆もあります。イメージの脆弱性への対応と同様に、成熟した最新のセキュリティプロセスでは、複数の段階で構成をテストすることが重要です。

まとめ

アプリケーションを構成するのは、パッケージ化に使うイメージだけではありません。実行に使う構成も含まれます。これまでは、この2つを別々のセキュリティ領域として捉えることが多くありました。しかし、多くの場合、開発者向けのコンテナセキュリティに関する議論は、イメージの脆弱性だけに焦点を当ててきました。アプリケーションセキュリティの責任が開発チームへと移るなかで、イメージの脆弱性と構成の関係を理解し、両方を安全に保つツールを活用することがますます重要になっています。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。

続きを読む

feature insights announcement
Blog

Node-gypサプライチェーン侵害:binding.gypに潜む自己増殖型npmワーム

新たなnpmワームがbinding.gypを悪用し、インストール時にnode-gypを起動。ライフサイクルスクリプトを使わずに悪意あるパッケージからコードを実行します。認証情報を窃取し、GitHub上に潜伏し、メンテナー間で自己増殖します。

Article

メンテナーアカウント侵害が疑われる中、悪意のあるnode-ipcのバージョンがnpmに公開

2026年5月14日、人気のnpmパッケージnode-ipcの複数の悪意あるバージョンがnpmレジストリに公開されました。現在の公開情報では、node...

blog feature toolkit
Blog

elementary-dataのPyPIパッケージに悪意あるリリース、データエンジニアのクラウド認証情報を窃取

攻撃者はGitHub Actionsのスクリプトインジェクション脆弱性を悪用し、悪意あるバージョンのelementary-data Python CLI(v0.23.3)を公開しました。データエンジニアリング環境のdbtプロファイル、クラウドプロバイダーのキー、SSHシークレットを標的とする認証情報窃取バックドアが埋め込まれていました。