IBM Cloud Kubernetes Serviceのセキュリティー
IBM Cloud® Kubernetes Service の標準装備のセキュリティー・フィーチャーをリスク分析とセキュリティー保護に使用できます。 これらのフィーチャーは、クラスター・インフラストラクチャーとネットワーク通信を保護し、コンピュート・リソースを分離し、インフラストラクチャー・コンポーネントとコンテナー・デプロイメントにおけるセキュリティー・コンプライアンスを確保するためのものです。
製品バージョンごとのセキュリティー・ガイドラインの分析については、CIS Kubernetes Benchmark を参照してください。
クラスターのセキュリティー脅威の概要
クラスターをセキュリティー侵害から保護するためには、想定されるクラスターのセキュリティー脅威と、脆弱性の露出を減らすためにできる対策について理解しておく必要があります。
- 外部攻撃
- クラスター、デプロイ済みリソース、アプリ、または個人情報にアクセスする攻撃者。
- 脆弱なデプロイメント
- 既知の脆弱性を悪用してクラウド環境にアクセスし、悪意のあるソフトウェアを実行する。
- データ漏えいまたはデータ消失
- 機密データの不適切な保存や暗号化の欠落。
- インサイダーと第三者ベンダー
- ネットワークの分離とセグメンテーションが欠けていると、正当なパーミッションが悪用される可能性がある。
企業のワークロードがパブリック・クラウドに移行され続けているために、ここ数年の間、クラウドのセキュリティーと、システム、インフラストラクチャー、データを攻撃から保護することが非常に重要になりました。 クラスターを構成する複数のコンポーネントのそれぞれが、悪意のある攻撃を受けるリスクに環境をさらす可能性を持っています。 これらのセキュリティーの脅威からクラスターを保護するには、すべてのクラスター・コンポーネント内で、IBM Cloud Kubernetes Service および Kubernetes の最新のセキュリティー機能や更新プログラムを適用する必要があります。
これらのコンポーネントには以下のものがあります。
Kubernetes API サーバーと etcd
Kubernetes API サーバーと etcd データ・ストアは、Kubernetes マスターで実行される最も機密性の高いコンポーネントです。 これらのコンポーネントは、アプリケーションの一部のセキュリティー設定を含め、クラスター内で実行されるすべてのリソースの構成を設定および保管するため、無許可アクセスを禁止する必要があります。
Kubernetes は、これらのコンポーネントを保護し、攻撃のリスクを低減するために、セキュリティ制御とアクセス制限を提供する。
APIサーバーへのアクセスはどのように許可されますか?
Kubernetes ではデフォルトで、どの要求も複数の段階を経て初めて API サーバーへのアクセスを許可されるようになっています。
- 認証
- 登録済みユーザーまたはサービス・アカウントの ID を検証します。
- 許可
- 認証済みのユーザーおよびサービス・アカウントの許可を制限し、必要なクラスター・コンポーネントにのみアクセスして操作できるようにします。
- アドミッション制御
- 要求が Kubernetes API サーバーによって処理される前に、それらの要求を検証または変更します。 Kubernetes の多くの機能は、適切に機能するために入場コントローラを必要とする。
APIサーバーと etcd データストアを保護するために、 IBM Cloud Kubernetes Service は何をしますか?
次の図は、認証、許可、アドミッション・コントロール、Kubernetes マスターとワーカー・ノードの間のセキュア接続に対応するクラスターのデフォルトのセキュリティー設定を示しています。
Kubernetes API サーバーと etcd のセキュリティーに関する機能を以下に示します。
- 完全に管理される専用 Kubernetes マスター
-
IBM Cloud Kubernetes Service に含まれるクラスターはすべて、IBM が所有する IBM Cloud アカウントで、IBM が管理する専用 Kubernetes マスターによって制御されます。 Kubernetes マスターは、他の IBM のお客様とは共用されない、以下の専用コンポーネントを使用してセットアップされます。
- etcd データ・ストア:
Services、Deployments、Podsなどのクラスターのすべての Kubernetes リソースを保管します。 KubernetesConfigMapsおよびSecretsは、ポッドで実行されるアプリで使用できるように、キー値ペアとして保管されるアプリ・データです。 etcd のデータは Kubernetes マスターのローカル・ディスクに保管され、IBM Cloud Object Storage にバックアップされます。 IBM Cloud Object Storage に転送中のデータも保存されたデータも暗号化されています。 クラスターの IBM Key Protect 暗号化を有効にすると、Kubernetes マスターのローカル・ディスク上の etcd データの暗号化を有効にできます。 etcd データがポッドに送信されるときには、データの保護と保全性を確保するために、データが TLS で暗号化されます。 - kube-apiserver: ワーカー・ノードから Kubernetes マスターへのすべてのクラスター管理要求のメインエントリー・ポイントとなります。 API サーバーは、ポッドやサービスなどのクラスター・リソースの状態を変更する要求を検証および処理してから、この状態を etcd データ・ストアに保管します。
- kube-scheduler: ポッドをどこにデプロイするかを決定します。このとき、キャパシティーとパフォーマンスのニーズ、ハードウェアとソフトウェアのポリシー制約、アンチアフィニティー仕様、およびワークロード要件が考慮されます。 要件に合致するワーカー・ノードが見つからなければ、ポッドはクラスターにデプロイされません。
- kube-controller-manager: レプリカ・セットをモニターし、対応するポッドを作成して、指定された状態を実現するためのコンポーネントです。
- Konnectivity: Kubernetes マスターノードからワーカーノードへのすべての通信に安全なネットワーク接続を提供する、 IBM Cloud Kubernetes Service 特有のコンポーネント。 KonnectivityサーバーはKonnectivityエージェントと連携し、マスターとワーカーノードを安全に接続します。 この接続は、ポッドやサービスに対する
apiserver proxy要求と、kubelet に対するkubectl top、exec、attach、logsの各要求をサポートしています。 ワーカー・ノードからマスターへの接続は、TLS 証明書で自動的に保護されます。
- etcd データ・ストア:
- IBM サイト信頼性エンジニア (SRE) による継続的なモニタリング
-
Kubernetes マスター (すべてのマスター・コンポーネント、コンピュート・リソース、ネットワーキング・リソース、ストレージ・リソースを含む) は、IBM サイト信頼性エンジニア (SRE) によって継続的にモニターされます。 SRE は、最新のセキュリティー規格を適用し、悪意のあるアクティビティーを検出して対処し、IBM Cloud Kubernetes Service の信頼性と可用性を確保するための作業を行います。
- CIS Kubernetes マスター・ベンチマーク
-
IBM Cloud Kubernetes Serviceを構成するために、IBM エンジニアは、Center of Internet Security (CIS) によって公開されている Kubernetes マスター・ベンチマークからの関連サイバー・セキュリティー・プラクティスに従います。 クラスター・マスターおよびすべてのワーカー・ノードは、ベンチマークを満たすイメージを使用してデプロイされます。
- TLS によるセキュア通信
-
IBM Cloud Kubernetes Service を使用するユーザーは、資格情報を使用してサービスから認証を受ける必要があります。 認証されると、IBM Cloud Kubernetes Service が、Kubernetes API サーバーおよび etcd データ・ストアとの間の通信を暗号化する TLS 証明書を生成して、ワーカー・ノードと Kubernetes マスターの間のセキュアなエンドツーエンド通信を確立します。 これらの証明書は、クラスター間で共有されたり、Kubernetes マスター・コンポーネント間で共有されたりすることはありません。
- ワーカー・ノードへの接続
-
Kubernetes は、
httpsプロトコルを使用してマスターとワーカー・ノードの間の通信を保護しますが、デフォルトでは、ワーカー・ノードで認証は行われません。 この通信をセキュアにするために、 IBM Cloud Kubernetes Service はクラスタの作成時に Kubernetes マスターとワーカー・ノードの間に Konnectivity 接続を自動的にセットアップする。 - 微細化されたアクセス制御
-
アカウント管理者は、IBM Cloud Identity and Access Management (IAM) を使用して、IBM Cloud Kubernetes Service に対するアクセス権限を他のユーザーに付与できます。IBM Cloud IAM は IBM Cloud プラットフォーム、IBM Cloud Kubernetes Service、およびアカウント内のすべてのリソースのセキュア認証を提供します。 リソースにアクセスできるユーザーを制限し、ユーザーが正当な権限を悪用した場合に被る可能性がある損害を抑えるためには、適切なユーザー役割と権限をセットアップすることが重要です。 ユーザーが実行できる一連の操作を決定する、以下の事前定義ユーザー役割の中から選択することができます。
- プラットフォーム・アクセス役割: ユーザーが IBM Cloud Kubernetes Service で実行できるクラスターとワーカー・ノードの管理関連の操作を決定します。
- サービス・アクセス・ロール: ユーザーに割り当てられる Kubernetes RBAC ロールと、ユーザーが Kubernetes API サーバーに対して実行できるアクションを決定します。 RBAC 役割を割り当てられたユーザーは、アプリ・デプロイメント、名前空間、構成マップなどの Kubernetes リソースを作成できます。 ユーザーに割り当てられる対応するRBACロールと関連する権限の詳細については、 IAMサービス・アクセス・ロールを 参照してください。
- クラシック・インフラストラクチャー : クラシック・インフラストラクチャーリソースへのアクセスを可能にします。 クラシック・インフラストラクチャー役割によって許可されるアクションの例としては、クラスター・ワーカー・ノード・マシンの詳細を表示したり、ネットワーク・リソースやストレージ・リソースを編集したりするアクションがあります。
- VPC インフラストラクチャー: VPC インフラストラクチャー・リソースへのアクセスを有効にします。 VPC インフラストラクチャー役割で許可されるアクションの例として、VPC の作成、サブネットの追加、浮動 IP アドレスの変更、VPC ブロック・ストレージ・インスタンスの作成などがあります。
クラスターにおけるアクセス制御について詳しくは、クラスター・アクセス権限の割り当てを参照してください。
- サービス・アカウント・トークンを介したポッド・アクセス
-
Kubernetes 1.21 以降を実行するクラスターの場合、Kubernetes API サーバーとの通信にポッドで使用されるサービス・アカウント・トークンは、時間制限付きで、自動的にリフレッシュされ、特定の対象ユーザー (ポッド) に有効範囲が設定されており、ポッドが削除されると無効化されます。 API サーバーとの通信を続行するには、リフレッシュされたトークン値を定期的に (毎分など) 読み取るようにアプリを設計する必要があります。 詳細は バウンド・サービス・ アカウント トークン を参照。
- アドミッション・コントローラー
-
アドミッション・コントローラーは、Kubernetes と IBM Cloud Kubernetes Service の特定の機能のために実装されています。 アドミッション・コントローラーにより、クラスター内で特定の操作を許可するかどうかを決定するポリシーを、クラスター内にセットアップできます。 ポリシーでは、このアクションが、RBAC 役割を使用してユーザーに割り当てた一般許可の一部である場合でも、そのユーザーがアクションを実行できないときの条件を指定できます。 したがって、アドミッション・コントローラーは、Kubernetes API サーバーで API 要求が処理される前に適用されるセキュリティー層をクラスターに追加できます。
クラスタを作成すると、 IBM Cloud Kubernetes Service は自動的にデフォルトの Kubernetes アドミッションコントローラを Kubernetes マスターに特定の順序でインストールします。
kube-apiserver コンポーネント参照情報内のクラスター・バージョン別のデフォルトのアドミッション・コントローラーの順序を確認します。
クラスタに独自のアドミッションコントローラをインストールしたり、オプションのアドミッションコントローラを選択したりできます。 Portieris. Portieris を使用すると、署名されていないイメージからのコンテナーのデプロイをブロックできます。
手動でインストールしたアドミッション・コントローラーが不要になった場合は、必ず、完全に削除してください。 アドミッション・コントローラーを完全に削除しておかないと、クラスターに対して実行する必要がある操作がすべてブロックされる可能性があります。
APIサーバーをセキュアにするために、他に何ができますか?
クラスタマスタへのネットワーク接続は、いくつかの方法で制限できます
- プライベート・クラウド・サービス・エンドポイントのみを有効にします :パブリック・サービス・エンドポイントは、クラシック OpenShift クラスタにのみ必要です。 すべてのVPCクラスタで無効にできます。 また、アカウントで VRFとService Endpointが有効になって いる限り、クラシック Kubernetes クラスタで無効にすることもできる。 これにより、パブリック・ネットワーク上の攻撃からクラスタ・マスターを保護します。
- コンテキストベースの制限を有効にします:コンテキスト・ベースの制限(CBR)を使用して、クラスタのプライベートおよびパブリック・サービス・エンドポイントへのネットワーク・アクセスを保護できます。 CBRルール内のサブネットから発信されるクラスタ・マスタへの許可された要求のみが許可されます。 詳しくは、コンテキスト・ベースの制限を使用する を参照のこと。
ワーカー・ノード
ワーカー・ノードには、アプリを構成するデプロイメントとサービスが保持されます。 パブリック・クラウドでワークロードをホストする場合は、不正なユーザーやソフトウェアにアクセス、変更、監視されないようにアプリを保護する必要があります。
ワーカー・ノードは誰のもので、私はそれを確保する責任がありますか?
ワーカー・ノードの所有権は、作成するクラスターのタイプやインフラストラクチャー・プロバイダーの選択によって異なります。
- クラシッククラスタ :ワーカーノードは IBM Cloud アカウントプロビジョニングされます。 ワーカー・ノードはお客様専用のものです。このためお客様は、ワーカー・ノードの OS および IBM Cloud Kubernetes Service コンポーネントに最新のセキュリティー更新とパッチが適用されるように、ワーカー・ノードに対するタイムリーな更新を要求する責任があります。
- VPCクラスタ :ワーカーノードは、 IBM が所有する IBM Cloud アカウントプロビジョニングされ、悪意のあるアクティビティの監視とセキュリティアップデートの適用を可能にする。 VPC ダッシュボードを使用してワーカー・ノードにアクセスすることはできません。 ただし、IBM Cloud Kubernetes Service コンソール、CLI、または API を使用してワーカー・ノードを管理することはできます。 ワーカー・ノードを構成する仮想マシンはお客様専用のものです。このためお客様は、ワーカー・ノードの OS と IBM Cloud Kubernetes Service コンポーネントに最新のセキュリティー更新とパッチが適用されるように、タイムリーな更新を要求する責任があります。
詳しくは、IBM Cloud Kubernetes Service を使用する際の責任を参照してください。
ibmcloud ks worker update コマンドを定期的 (毎月など) に使用して、更新とセキュリティー・パッチをオペレーティング・システムにデプロイし、ワーカー・ノードを実行する Kubernetes バージョンを更新してください。 更新が有効になると、IBM
Cloud コンソールまたは CLI でマスター・ノードとワーカー・ノードに関する情報を (例えば、ibmcloud ks clusters ls コマンドや ibmcloud ks workers ls --cluster <cluster_name> コマンドで) 表示したときに通知を受けます。 ワーカー・ノードの更新は、最新のセキュリティー・パッチを含む完全なワーカー・ノード・イメージとして IBM
から提供されます。 更新を適用するには、ワーカー・ノードのイメージを再作成し、新しいイメージを再ロードする必要があります。 root ユーザーの鍵は、ワーカー・ノードが再ロードされると自動的にローテーションされます。
ワーカーノードのセットアップはどうなっていますか?
以下の図は、悪意のある攻撃からワーカー・ノードを保護するために、すべてのワーカー・ノードにセットアップされているコンポーネントを示しています。
この図には、ワーカー・ノードとの間のセキュアなエンドツーエンド通信を保証するコンポーネントは含まれていません。 詳しくは、ネットワーク・セキュリティーを参照してください。
- CIS-コンプライアントイメージ
- すべてのワーカーノードには、Center of Internet Security ( CIS )が公表しているベンチマークを実装したオペレーティングシステムがセットアップされている。 ユーザーもマシンの所有者も、このオペレーティング・システムを別のオペレーティング・システムに変更することはできません。 現在のOSバージョンを確認するには、
kubectl get nodes -o wideを実行してください。 IBM は、社内と社外のセキュリティー顧問チームと協力して、セキュリティー・コンプライアンスにおける潜在的な脆弱性と取り組んでいます。 オペレーティング・システムのセキュリティー更新およびパッチは、IBM Cloud Kubernetes Service で提供されるので、ユーザーがインストールを実行してワーカー・ノードをセキュアに保つ必要があります。
IBM Cloud Kubernetes Service Linux カーネルをワーカーノードに使用しています。 IBM Cloud Kubernetes Service ではすべての種類の Linux ディストリビューションに基づいてコンテナーを実行できます。 コンテナ・イメージのベンダーに問い合わせて、コンテナ・イメージがカーネル上で実行できることを確認する。
- サイト信頼性エンジニア (SRE) による継続的なモニタリング
- ワーカー・ノードにインストールされたイメージは、脆弱性およびセキュリティー・コンプライアンスの問題を検出するために、IBM サイト信頼性エンジニア (SRE) によって継続的にモニターされます。 SRE は、脆弱性に対処するため、ワーカー・ノードのためのセキュリティー・パッチとフィックスパックを作成します。 ワーカーノードとその上で実行するアプリケーションの安全な環境を確保するために、これらのパッチが利用可能になったら必ず適用してください。
- CIS Kubernetes ワーカー・ノードのベンチマーク
- IBM Cloud Kubernetes Service を設定するために、 IBM のエンジニアは、 Center of Internet Security(CIS) が公開している Kubernetes ワーカー・ノード・ベンチマークから、関連するサイバーセキュリティのプラクティスに従う。 ワーカー・ノードが CIS Kubernetes ベンチマークの規格に照らして準拠しているかどうかを確認することができます。
- コンピュート分離
- ワーカー・ノードはあるクラスターに専用のものであり、他のクラスターのワークロードをホストしません。 標準的なクラシッククラスタを作成する場合、ワーカーノードを物理マシン(ベアメタル)としてプロビジョニングするか、共有または専用の物理ハードウェア上で動作する仮想マシンとしてプロビジョニングするかを選択できます。 VPCクラスタ内のワーカーノードは、共有インフラストラクチャ上の仮想マシンとしてのみプロビジョニングできます。
- クラシックでベアメタルをデプロイするオプション
- 標準クラシック・クラスターを作成する場合、ワーカー・ノードを、仮想サーバー・インスタンスではなく、ベアメタル物理サーバーにプロビジョンすることを選択できます。 ベア・メタル・マシンでは、メモリーや CPU などのコンピュート・ホストの細かい制御が可能です。 このセットアップには、ホスト上で稼働する仮想マシンに物理リソースを割り振る仮想マシン・ハイパーバイザーは含まれません。 代わりに、ベア・メタル・マシンのすべてのリソースはワーカー専用であるため、リソースを共有したりパフォーマンスを低下させたりする「うるさい隣人」について心配する必要はありません。 ベア・メタル・サーバーはお客様専用であり、そのすべてのリソースをクラスターに使用できます。
- 暗号化されたディスク
- デフォルトでは、すべてのワーカー・ノードに、ローカルの SSD、AES 256 ビット暗号化データ・パーティション 2 つがプロビジョンされます。 最初のパーティションには、ワーカー・ノードのブートに使用され、暗号化されていないカーネル・イメージが含まれています。 2 番目のパーティションは、コンテナー・ファイル・システムを保持し、LUKS 暗号キーを使用してアンロックされます。 クラスター内の各ワーカー・ノードには、独自の固有の LUKS 暗号キーがあり、IBM Cloud Kubernetes Service によって管理されます。 クラスターを作成する際やワーカー・ノードを既存のクラスターに追加する際に、この鍵は安全にプルされてから、暗号化ディスクのアンロック後に破棄されます。 暗号化はディスク入出力のパフォーマンスに影響します。 高性能のディスク入出力が必要なワークロードの場合、暗号化を有効/無効にした両方のクラスターをテストし、暗号化をオフにするかどうかの決定に役立ててください。
- エキスパート AppArmor ポリシー
- すべてのワーカーノードには、起動時にワーカーノードにロードされるプロファイルによって強制されるセキュリティとアクセスポリシーが設定されています。 AppArmor プロファイルが設定されています。 マシンのユーザーまたは所有者によって、AppArmor プロファイルを変更することはできません。
- SSH の無効化
- デフォルトでは、クラスターを悪意のある攻撃から保護するために、ワーカー・ノード上の SSH アクセスは無効になっています。 SSH アクセスが無効な場合、クラスターへのアクセスは Kubernetes API サーバーを経由するように強制されます。 Kubernetes API サーバーでは、すべての要求が、クラスター内で実行される前に、認証、許可、およびアドミッション制御モジュールで設定されたポリシーに照らして検査される必要があります。
- 標準的なクラスタを使用していて、ワーカーノードにより多くの機能をインストールしたい場合は、 IBM Cloud Kubernetes Service が提供するアドオンの中から選択するか、すべてのワーカーノードで実行したいものすべてに Kubernetes デーモンセットを使用することができます。 一度だけ実行する必要があるアクションには、 Kubernetes ジョブを使用します。
ネットワーク
会社のネットワークを保護する従来の方法は、ファイアウォールをセットアップして、アプリに対する不要なネットワーク・トラフィックをブロックすることでした。 この方法は今でも有効ですが、悪意のある攻撃の多くは、割り当てられた権限を悪用した内部関係者や許可ユーザーによるものであることが調査で示されています。
クラシック・クラスターのネットワーク・セグメンテーションとプライバシー
ネットワークを保護し、ネットワークへのアクセスを許可されたユーザーから被る可能性がある損害の範囲を制限するために、ワークロードを可能な限り分離し、公開するアプリとワーカー・ノードの数を制限する必要があります。
Classicクラスタでは、デフォルトでどのようなネットワーク・トラフィックが許可されますか?
すべてのコンテナーが、事前定義の Calico ネットワーク・ポリシー設定で保護されます。この設定は、クラスターの作成時にすべてのワーカー・ノードに構成されます。 デフォルトでは、すべてのワーカー・ノードに対して、すべてのアウトバウンド・ネットワーク・トラフィックが許可されます。 インバウンド・ネットワーク・トラフィックは、以下の例外を除き、ブロックされます。
- NodePort: NodePort サービスで アプリを公開できるように、デフォルトで Kubernetes NodePort の範囲がオープンされています。 クラスター内の NodePort 上のインバウンド・ネットワーク・トラフィックをブロックするには、NLB サービスまたは NodePort サービスへのインバウンド・トラフィックの制御を参照してください。
- IBM モニタリング・ポート: デフォルトでは、IBM はクラスター上でいくつかのポートを開きます。これは、IBM がネットワーク・トラフィックをモニターできるようにするため、また、IBM が Kubernetes マスターのセキュリティー更新を自動的にインストールするためのものです。
Kubernetes マスターからワーカー・ノードの kubelet へのアクセスは、Konnectivity トンネルによって保護されます。 詳しくは、IBM Cloud Kubernetes Service アーキテクチャーを参照してください。
ネットワーク・セグメンテーションとは何ですか?
ネットワーク・セグメンテーションとは、1 つのネットワークを複数のサブネットワークに分割する方式を表すものです。 組織内の特定のグループからアクセスできるように、アプリと関連データをグループ化できます。 1 つのサブネットワーク内で実行されるアプリは、別のサブネットワーク内のアプリを表示することも、別のサブネットワーク内のアプリにアクセスすることもできません。 ネットワーク・セグメンテーションは、内部関係者やサード・パーティー製ソフトウェアに提供されているアクセスも制限するので、さまざまな悪意のあるアクティビティーを制限できます。
IBM Cloud Kubernetes Service には、ワーカー・ノードのために高品質のネットワーク・パフォーマンスとネットワークの分離を実現する IBM Cloud VLAN が用意されています。 VLAN では、ワーカー・ノードとポッドをまとめたグループが同じ物理ワイヤーに接続されているかのように構成されます。 VLAN は各 IBM Cloud アカウントに専用のものであり、複数の IBM カスタマーの間で共有されることはありません。 クラシック・クラスターで、1
つのクラスターに複数の VLAN がある場合、同じ VLAN 上に複数のサブネットがある場合、または複数ゾーン・クラシック・クラスターである場合は、IBM Cloud インフラストラクチャー・アカウントの仮想ルーター機能 (VRF) を有効にして、ワーカー・ノードがプライベート・ネットワーク上で相互に通信できるようにする必要があります。
VRF を有効にするには、VRF の有効化を参照してください。 VRF が既に有効になっているかどうかを確認するには、ibmcloud account show コマンドを使用します。 VRF を有効にできない、または有効にしない場合は、VLAN スパンニングを有効にします。
このアクションを実行するには、 [ネットワーク] > [ネットワーク VLAN スパニングの管理] インフラストラクチャ権限が必要です。または、 アカウント所有者に有効化を依頼することもできます。 VLANスパニングがすでに有効になっているかどうかを確認するには、 ibmcloud ks vlan spanning get --region <region> コマンドを 使用します。
アカウントで VRF または VLAN スパンニングを有効にすると、クラスターのネットワーク・セグメンテーションが失われます。
アカウントで VRF または VLAN スパンニングを有効にした状況でネットワーク・セグメンテーションを実現する方法を、以下の表で確認してください。
| セキュリティー機能 | 説明 |
|---|---|
| Calico を使用してカスタム・ネットワーク・ポリシーをセットアップする | 組み込みの Calico インターフェースを使用して、ワーカー・ノード用にカスタムの Calico ネットワーク・ポリシーをセットアップできます。 例えば、特定のネットワーク・インターフェース上で、特定のポッドまたはサービスのネットワーク・トラフィックを許可またはブロックすることができます。 カスタムのネットワーク・ポリシーをセットアップするには、
calicoctl CLI をインストールする必要があります。 |
| IBM Cloud ネットワーク・ファイアウォールのサポート | IBM Cloud Kubernetes Service は、すべての IBM Cloud ファイアウォール・オファリングと互換性があります。 例えば、カスタム・ネットワーク・ポリシーをファイアウォールにセットアップして、標準クラスターのための専用ネットワーク・セキュリティーを設定し、ネットワーク侵入を検出して対処することができます。 例えば、ファイアウォールとして機能し、不要なトラフィックをブロックするように Virtual Router Appliance をセットアップできます。 ファイアウォールをセットアップする場合は、マスター・ノードとワーカー・ノードが通信できるように、リージョンごとに必要なポートと IP アドレスを開く必要もあります。 |
クラシック・クラスタに対する外部からの攻撃の可能性を減らすために、他にできることはありますか?
公開するアプリやワーカー・ノードの数が多いほど、外部からの悪意のある攻撃を防止するために必要なステップの数も多くなります。 以下の表で、アプリとワーカー・ノードをプライベートにするために取れる方法を確認してください。
| セキュリティー機能 | 説明 |
|---|---|
| 公開するアプリの数を制限する | デフォルトでは、クラスター内で実行されるアプリとサービスには、公共のインターネットからはアクセスできません。 アプリを公開するか、それとも、プライベート・ネットワークでしかアプリとサービスにアクセスできないようにするかを選択できます。 アプリとサービスをプライベートのままにする場合は、組み込みのセキュリティー機能を利用してワーカー・ノードとポッドの間のセキュアな通信を確保できます。 サービスとアプリを公共のインターネットに公開する場合は、NLB と Ingress ALB のサポートを活用してサービスを安全に公開することができます。 必要なサービスだけを公開し、公開アプリのリストを定期的に見直して、まだ有効であることを確認してください。 |
| ワーカー・ノードをプライベートのままにする | クラスターを作成すると、すべてのクラスターはプライベート VLAN に自動的に接続されます。 ワーカー・ノードに割り当てられるプライベート IP アドレスは、プライベート VLAN によって決定されます。 ワーカー・ノードをプライベートのままにするには、ワーカー・ノードをプライベート VLAN だけに接続します。 ローカル・マシンから Kubernetes マスターと通信したり、 IBM Cloud Kubernetes Service がプライベート・クラウド・サービスのエンドポイントをサポートしていない IBM Cloud サービスに接続したりするには、 特定の URL と IP アドレスに パブリック接続を設定する必要があることに留意してください。 接続先の IBM Cloud サービスにプライベート・クラウド・サービス・エンドポイントがあり、VRF 対応のアカウントを使用している場合、それらのサービスとの間のネットワーク・トラフィックはプライベート・ネットワークを介して自動的にルーティングされるので、パブリック・ネットワーク接続は不要です。 プライベート VLAN のみに接続しているクラスター用にパブリック接続をセットアップするために、Virtual Router Appliance などのファイアウォールをワーカー・ノードの前面に構成して、それらの URL と IP アドレスへのネットワーク・トラフィックを有効にすることができます。 |
| 公共のインターネットとエッジ・ノードの接続を制限する | ゲートウェイを有効にした状態でクラスターを作成しない場合、すべてのワーカー・ノードは、アプリ・ポッドと関連ロード・バランサー/Ingress ポッドを受け入れるように構成されます。 ワーカー・ノードにエッジ・ノードのラベルを付けて、ロード・バランサーと Ingress ポッドがそれらのワーカー・ノードにのみデプロイされるようにすることができます。 さらに、ワーカー・ノードにテイントを適用して、アプリ・ポッドをエッジ・ノードにスケジュールできないようにすることができます。 エッジ・ノードを使用することで、クラスター内の少数のワーカー・ノード上にネットワーク・ワークロードを分離し、クラスター内の他のワーカー・ノードはプライベートのままにすることができます。 |
クラスタをオンプレミスのデータセンターに接続したい場合はどうすればよいですか?
ワーカーノードとアプリをオンプレミデータセンターに接続するには、 Virtual Router Appliance または Fortigate Security Appliance を 構成します。
VPC クラスターのネットワーク・セグメンテーションとプライバシー
ネットワークを保護し、ネットワークへのアクセスを許可されたユーザーから被る可能性がある損害の範囲を制限するために、ワークロードを可能な限り分離し、公開するアプリとワーカー・ノードの数を制限する必要があります。
デフォルトでVPCクラスタに許可されるネットワーク・トラフィックは何ですか?
デフォルトでは、ワーカー・ノードはプライベート・ネットワーク上の VPC サブネットにのみ接続されるため、ワーカー・ノードにパブリック・ネットワーク・インターフェースは存在しません。 ワーカー・ノードへのすべてのパブリック受信がブロックされます。 ワーカー・ノードからのパブリック送信は、ワーカーがパブリック・ゲートウェイを持つ VPC サブネットに接続されている場合にのみ許可されます。
ワーカー・ノードがクラスター外部のパブリック・エンドポイントにアクセスする必要がある場合は、ワーカー・ノードをデプロイした VPC サブネットにパブリック・ゲートウェイを接続します。 例えば、VPC クラスターは、プライベート・クラウド・サービス・エンドポイントをサポートする他の IBM Cloud サービス (IBM Cloud Container Registry など) に自動的に接続できます。 しかし、パブリック・クラウド・サービス・エンドポイントのみをサポートする IBM Cloud サービスにアクセスする必要がある場合は、ポッドがパブリック・ネットワークを介して要求を送信できるように、サブネットにパブリック・ゲートウェイを接続できます。 パブリック・ゲートウェイを接続したサブネットのワーカー・ノードでは、すべての送信が許可されるようになります。ただし、受信は引き続きすべてブロックされます。
インターネットからのトラフィック要求を受信する必要があるアプリをクラスターにデプロイする場合は、VPC ロード・バランサーを作成してアプリを公開します。 アプリへの受信ネットワーク・トラフィックを許可するには、VPC ロード・バランサーに、受け取りたい受信ネットワーク・トラフィックを構成する必要があります。
セキュリティグループは、デフォルトでVPCインスタンスとVPC ALBに適用されます。 詳しくは、VPC セキュリティー・グループによるトラフィックの制御を参照してください。
ネットワーク・セグメンテーションとは何ですか?
ネットワーク・セグメンテーションとは、1 つのネットワークを複数のサブネットワークに分割する方式を表すものです。 組織内の特定のグループからアクセスできるように、アプリと関連データをグループ化できます。 1 つのサブネットワーク内で実行されるアプリは、別のサブネットワーク内のアプリを表示することも、別のサブネットワーク内のアプリにアクセスすることもできません。 ネットワーク・セグメンテーションは、内部関係者やサード・パーティー製ソフトウェアに提供されているアクセスも制限するので、さまざまな悪意のあるアクティビティーを制限できます。
IBM Cloud Kubernetes Service には、ワーカー・ノードのために高品質のネットワーク・パフォーマンスとネットワークの分離を実現する IBM Cloud VPC サブネットが用意されています。 VPC サブネットは、指定したプライベート IP アドレス範囲 (CIDR ブロック) から構成され、一連のワーカー・ノードとポッドを、物理的に同じ線に接続されているかのように構成します。 VPC サブネットは各 IBM Cloud アカウントに専用のものであり、複数の IBM カスタマーの間で共有されることはありません。
VPC サブネットは、クラスター内のワーカー・ノード間の接続チャネルとして機能します。 同じ VPC であれば、どのプライベート・サブネットであろうとプライベート・サブネットに接続したシステムはワーカーと通信できます。 例えば、1 つの VPC 内のすべてのサブネットは、標準装備の VPC ルーターによるレイヤー 3 のプライベートなルーティングを介して通信できます。 クラスターが通信を行う必要がない場合は、別個の VPC にクラスターを作成することで最適なネットワーク・セグメンテーションを実現できます。 複数のクラスターが相互に通信する必要がある場合は、それらのクラスターを同じ VPC 内に作成することができます。 1 つの VPC 内のサブネットはその VPC 内の複数のクラスターで共有できますが、VPC 内のクラスターごとに別のサブネットを使用するほうが、ネットワーク・セグメンテーションは細かくなります。
アカウントの VPC のサブネット間でプライベート・ネットワーク・セグメンテーションをさらに細かくするには、VPC アクセス制御リスト (ACL) を使用してカスタム・ネットワーク・ポリシーをセットアップします。 VPC を作成すると、VPC のデフォルト ACL が allow-all-network-acl-<VPC_ID> のフォーマットで作成されます。 VPC に作成するサブネットは、デフォルトでこの ACL にアタッチされます。
この ACL には、特定のサブネット上のワーカー・ノードと、同じ VPC 内の各サブネット上のシステムの間のトラフィックをすべて許可するインバウンド・ルールとアウトバウンド・ルールが入っています。 VPC サブネット上のワーカー・ノードに許可するプライベート・ネットワーク・トラフィックを指定するには、VPC 内のサブネットごとにカスタム ACL を作成します。 例えば、クラスターのインバウンド/アウトバウンドのプライベート・ネットワーク・トラフィックの大部分をブロックする一方で、クラスターが機能するために必要な通信を許可するように
一連の ACL ルールを作成することができます。
VPCクラスタの外部攻撃の可能性を減らすために、他に何ができますか?
公開するアプリやワーカー・ノードの数が多いほど、外部からの悪意のある攻撃を防止するために必要なステップの数も多くなります。 以下の表で、アプリとワーカー・ノードをプライベートにするために取れる方法を確認してください。
| セキュリティー機能 | 説明 |
|---|---|
| 公開するアプリの数を制限する | デフォルトでは、クラスター内で実行されるアプリとサービスには、公共のインターネットからはアクセスできません。 アプリを公開するか、それとも、プライベート・ネットワークでしかアプリとサービスにアクセスできないようにするかを選択できます。 アプリとサービスをプライベートのままにする場合は、組み込みのセキュリティー機能を利用してワーカー・ノードとポッドの間のセキュアな通信を確保できます。 サービスとアプリを公共のインターネットに公開する場合は、VPC ロード・バランサーと Ingress ALB のサポートを利用してサービスを安全に公開することができます。 必要なサービスだけを公開し、公開アプリのリストを定期的に見直して、まだ有効であることを確認してください。 |
| パブリック・ネットワークへの送信を、パブリック・ゲートウェイに接続した 1 つのサブネットだけに制限する | ワーカー・ノード上のポッドがパブリック外部エンドポイントに接続する必要がある場合は、それらのワーカー・ノードが存在するサブネットにパブリック・ゲートウェイを接続できます。 クラスター内のこのネットワーク・トラフィックを分離するには、クラスター内の 1 つのサブネットにのみパブリック・ゲートウェイを接続します。 こうすることで、アフィニティー・ルールを設定して、外部エンドポイントへのアクセスを必要とするアプリ・ポッドを、パブリック・ゲートウェイが接続されたサブネットにのみデプロイできるようになります。 |
ワーカー・ノードを接続したいネットワークに応じて、VPN ソリューションを選択できます。
LoadBalancer サービスと Ingress サービスを使用したアプリの安全な公開
ネットワーク・ロード・バランサー (NLB) および Ingress アプリケーション・ロード・バランサー (ALB) のネットワーク・サービスを使用して、アプリを公共のインターネットまたは外部プライベート・ネットワークに接続できます。 以下に記載している NLB および ALB のオプションの設定を使用して、バックエンド・アプリのセキュリティー要件を満たしたり、クラスター内を移動するトラフィックを暗号化したりできます。
セキュリティ・グループを使ってクラスタのネットワーク・トラフィックを管理できますか?
クラシック・クラスター: IBM Cloud セキュリティー・グループは、単一仮想サーバーのネットワーク・インターフェースに適用され、ハイパーバイザー・レベルでトラフィックをフィルタリングします。 ワーカー・ノードごとにトラフィックを管理する場合は、セキュリティー・グループを使用できます。 セキュリティー・グループを作成する場合は、NLB の IP アドレスを管理するために IBM Cloud Kubernetes Service で使用される VRRP プロトコルを許可する必要があります。 すべてのワーカーノードでクラスタのトラフィックを一様に管理するには、 Calico と Kubernetes ポリシーを 使用します。
VPC クラスター: VPC セキュリティー・グループは、ハイパーバイザー・レベルでトラフィックをフィルタリングするために単一仮想サーバーのネットワーク・インターフェースに適用されます。 クラスターのデフォルトのセキュリティー・グループにインバウンドおよびアウトバウンドのルールを追加して、VPC クラスターのインバウンドおよびアウトバウンドのトラフィックを管理できます。 デフォルト設定を含むセキュリティー・グループについて詳しくは、 VPC セキュリティー・グループによるトラフィックの制御 を参照してください。
VPC クラスターのワーカー・ノードはサービス・アカウントで存在し、VPC インフラストラクチャー・ダッシュボードにはリストされないため、セキュリティー・グループを作成してワーカー・ノード・インスタンスに適用することはできません。 自動的に作成された既存のセキュリティー・グループを変更することだけが可能です。
クラスタ内でソースIPを確保するにはどうすればよいですか?
バージョン 2.0 の NLB では、クライアント要求のソース IP アドレスはデフォルトで保持されます。 ただし、バージョン 1.0 の NLB およびすべての Ingress ALB では、クライアント要求のソース IP アドレスが保持されません。 アプリへのクライアント要求がクラスターに送信されると、その要求は、NLB 1.0 または ALB のポッドに転送されます。 ロード・バランサー・サービス・ポッドと同じワーカー・ノードにアプリ・ポッドが存在しない場合、NLB または ALB は異なるワーカー・ノード上のアプリ・ポッドに要求を転送します。 パッケージのソース IP アドレスは、アプリ・ポッドが実行されるワーカー・ノードのパブリック IP アドレスに変更されます。
クライアントの IP を保持すると、例えば、アプリ・サーバーがセキュリティーやアクセス制御ポリシーを適用する必要がある場合などに役に立ちます。 クライアント要求の元のソース IP アドレスを保持するには、バージョン 1.0 の NLB または Ingress ALB のソース IP 保持を有効化します。
LoadBalancer、IngressサービスでTLSターミネーションを行うには?
Ingress サービスは、トラフィック・フロー内の次の 2 つのポイントで TLS 終端処理を実行します。
- 到着時にパッケージを復号化: デフォルトでは、Ingress ALBはクラスタ内のアプリに HTTP ネットワークトラフィックを負荷分散します。 着信 HTTPS 接続のロード・バランシングも行う場合は ALB でその機能を構成できます。つまり、ネットワーク・トラフィックを復号し、復号した要求をクラスター内で公開されているアプリに転送するように構成します。 IBM 提供の Ingress サブドメインを使用する場合は、IBM 提供の TLS 証明書を使用できます。 カスタム・ドメインを使用する場合は、独自の TLS 証明書を使用して TLS 終端を管理できます。
- パッケージをアップストリーム・アプリに転送する前に再暗号化する: ALB は、トラフィックをアプリに転送する前に HTTPS 要求を復号します。 HTTPS を必要とするアプリがあり、それらのアップストリームのアプリに転送する前にトラフィックを暗号化する必要がある場合は、
ssl-servicesアノテーションを使用できます。 アップストリーム・アプリが TLS を処理できる場合は、片方向認証または双方向認証の TLS シークレットに含まれる証明書をオプションで提供できます。
サービス間通信をセキュアにするために、 Istioの相互TLS認証を使うことができる。 Istio は Kubernetes などのクラウド・オーケストレーション・プラットフォームでマイクロサービス・ネットワーク (サービス・メッシュともいう) の接続、保護、管理、モニターを行うための方法を開発者に提供するオープン・ソース・サービスです。
永続ストレージ
IBM Cloud の永続ストレージのデータを暗号化および保護するためにサポートされるオプションを確認します。
デフォルトでは、IBM Cloud のすべてのストレージ・ソリューションは、IBM 管理の暗号鍵を使用して、追加費用なしで保存データを自動的に暗号化します。 詳しくは、以下のリンクを参照してください。
選択したストレージのタイプによっては、さらに IBM Key Protect で暗号化をセットアップして、転送中のデータや保存データを独自の暗号鍵で保護することができます。
IBM Cloud NoSQL DB などの IBM Cloudant のデータベース・サービスを使用して、クラスター外のマネージド・データベースにデータを保存することもできます。 クラウド・データベース・サービスを使用して保管されたデータには、すべてのクラスター、ゾーン、領域からアクセスできます。 セキュリティー関連の情報については、データベース・サービスについての IBM Cloud の資料を参照してください。
モニタリングとロギング
クラスター内で悪意のある攻撃を検出するためには、メトリックおよびクラスター内で発生したすべてのイベントを適切にモニターしてロギングすることが重要です。 モニタリングとロギングにより、クラスターの容量とアプリによるリソースの利用状況も理解できるため、それに応じてアプリのダウン時間の発生を防ぐ計画を立てることができます。
- IBM は私のクラスタを監視していますか?
- 各クラスター・マスターは、プロセス・レベルのサービス妨害 (DOS) 攻撃を制御して修復するために IBM によって継続的にモニターされます。IBM Cloud Kubernetes Service は、Kubernetes および OS に固有のセキュリティー・フィックスで検出された脆弱性について、マスターがデプロイされている各ノードを自動的にスキャンします。 脆弱性が見つかった場合、IBM Cloud Kubernetes Service はユーザーに代わって自動的に修正を適用し、脆弱性を解決して、マスター・ノードが確実に保護されるようにします。
- どのような情報がログに記録されますか?
- デフォルトでは、IBM Cloud Kubernetes Service は以下のクラスター・コンポーネントのログを自動的に収集します。
- コンテナー:
STDOUTまたはSTDERRに書き込まれるログ。 - アプリ: アプリ内の特定のパスに書き込まれるログ。
- ワーカー:
/var/log/syslogおよび/var/log/auth.logに送られる Ubuntu オペレーティング・システムのログ。 - Kubernetes API サーバー: Kubernetes API サーバーに送られるすべてのクラスター関連操作が、監査のためにログに記録されます。これには、時刻、ユーザー、および対象リソースが含まれます。 詳細については、 Kubernetes 監査ログを参照。 これらのログには、IBM Cloud Logs を使用してアクセスできます。
- Ingress: インバウンドのネットワーク・トラフィックを管理する Ingress アプリケーション・ロード・バランサー (ALB) のログ。
- Kubernetes システム・コンポーネント:
kubelet、kube-proxy、およびkube-system名前空間で実行されるその他のコンポーネントからのログ。
- コンテナー:
クラスタコンポーネントのログにアクセスするには、ログを IBM Cloud Logs }}、外部サーバ、またはサードパーティのログソリューションに転送するように選択できます。 詳しくは、ロギング・ソリューションの選択を参照してください。
- クラスタの健全性とパフォーマンスを監視するにはどうすればよいですか?
- IBM Cloud Kubernetes Service コンソールまたは CLI からクラスターのコンポーネントとコンピュート・リソース (CPU やメモリーの使用量など) をモニターすることによって、アプリ、サービス、ワーカー・ノードの正常性、容量、パフォーマンスを確認できます。 標準クラスターまたはアプリに関するさらに詳細なメトリックを表示するには、IBM Cloud Monitoring にメトリックを送信するようにクラスター内のモニタリング・エージェントを構成できます。 また、 Prometheus のようなサードパーティの監視ソリューションをインストールしたり、 Kubernetes のダッシュボードで提供されるメトリクスを使用することもできます。 詳しくは、モニタリング・ソリューションの選択を参照してください。
ホストベースの侵入検知システム(HIDS)とセキュリティ・イベント・ログ監視(SELM)をセットアップするには、クラスタやコンテナ化されたアプリを監視して侵入や悪用を検知するように設計されたサードパーティ製ツール、例えば Twistlockや Sysdig Falco プロジェクトなどをインストールする。
- クラスタで発生したイベントを監査するにはどうすればよいですか?
- IBM Cloud Logs クラスターで IBM Cloud Kubernetes Service をセットアップすることができます。 詳しくは、 IBM Cloud Logs のドキュメントを ご覧ください。
- クラスタの信頼を有効にするには、どのようなオプションがありますか?
- セキュリティー機能が豊富な環境でコンテナー化アプリをデプロイできるように、IBM Cloud Kubernetes Service はクラスター・コンポーネント向けの機能をデフォルトで数多く提供します。 クラスターの信頼レベルを高めて、より確実に、意図したことだけがクラスターで行われるようにします。 以下の図に示すように、さまざまな方法でクラスターに信頼を実装できます。
-
イメージのコンテンツの信頼: IBM Cloud Container Registry でコンテンツの信頼を有効にして、イメージの完全性を確保します。 信頼できるコンテンツを使用する場合は、信頼できるイメージとしてイメージに署名できるユーザーを制御できます。 信頼できる署名者がイメージをレジストリーにプッシュすると、ユーザーはその署名付きのコンテンツをプルして、イメージのソースを確認できます。 詳しくは、信頼できるコンテンツのイメージへの署名を参照してください。
-
Container Image Security Enforcement: コンテナー・イメージを検証してからデプロイできるように、アドミッション・コントローラーとカスタム・ポリシーを使用します。 コンテナー・イメージ・セキュリティー制約プロジェクト (Portieris など) を使用すると、イメージのデプロイ元を制御し、イメージが コンテンツの信頼要件を満たしていることを確認できます。 設定したポリシーをデプロイメントが満たしていなければ、Security Enforcement によって、クラスターの変更が防止されます。
-
イメージ脆弱性スキャナー: デフォルトでは、脆弱性アドバイザーが、IBM Cloud Container Registry に保管されたイメージをスキャンして、潜在的なセキュリティー脆弱性がないか調べます。 詳しくは、Vulnerability Advisorを使用したイメージ・セキュリティーの管理を参照してください。
-
IBM Cloud Security and Compliance Center: IBM Cloud Security and Compliance Center を有効にすると、疑わしい着信ネットワーク・トラフィックおよび発信ネットワーク・トラフィックに関するレポートを表示できます。 詳しくは、IBM Cloud Security and Compliance Center の概要を参照してください。
-
IBM Cloud® Secrets Manager: Ingress と Kubernetes のシークレットを IBM Cloud® Secrets Manager に保管できます。 Secrets Manager をクラスターに統合するときに、すべての Ingress サブドメイン・シークレットがアップロードされるデフォルトの Secrets Manager インスタンスを設定します。 詳しくは、 Kubernetes Service クラスターでの Secrets Manager のセットアップ を参照してください。
イメージとレジストリー
すべてのデプロイメントは、アプリを実行するコンテナーの起動方法についての命令が入ったイメージをベースとします。 これらの命令には、コンテナー内のオペレーティング・システムや、インストールする追加のソフトウェアが含まれています。 アプリを保護するには、イメージを保護し、イメージの整合性を確保する検査を実施する必要があります。
- 画像を保存するレジストリとして、パブリックレジストリとプライベートレジストリのどちらを使うべきですか?
- Docker Hub などのパブリック・レジストリーは、Docker イメージおよび Kubernetes の入門として最初のコンテナー化アプリをクラスター内に作成する時に使用できます。 ただし、エンタープライズ・アプリケーションの場合は、クラスターを悪意のあるイメージから保護するために、知らないレジストリーや信頼できないレジストリーの使用は避けてください。 IBM Cloud Container Registry で提供されているようなプライベート・レジストリーにイメージを保管し、レジストリーへのアクセスとプッシュ可能なイメージ・コンテンツを制御してください。
- なぜ、画像の脆弱性をチェックすることが重要なのか?
- 悪意のある攻撃のほとんどがソフトウェアの既知の脆弱性や脆弱なシステム構成を利用したものであることが調査で示されています。 イメージからコンテナーをデプロイすると、そのコンテナーは、イメージに記述されている OS と追加バイナリーを使用して起動します。 仮想マシンや物理マシンを保護する場合と同様に、不正なユーザーによるアクセスからアプリを保護するために、コンテナー内で使用する OS とバイナリーの既知の脆弱性を除去する必要があります。
アプリを保護するために、以下の領域の対策を採ることを検討してください。
-
ビルド・プロセスの自動化と権限の制限: ソース・コードからコンテナー・イメージをビルドするプロセスを自動化して、ソース・コードのバリエーションや欠陥を除去します。 ビルド・プロセスを CI/CD パイプラインに統合すれば、イメージをスキャンして、指定したセキュリティー検査に合格したイメージだけをビルドすることができます。 開発者が機密性の高いイメージにホット・フィックスを適用しないようにするには、ビルド・プロセスにアクセスできる組織内の人数を制限します。
-
イメージを実稼働環境にデプロイする前にスキャンする: 必ず、イメージからコンテナーをデプロイする前に、すべてのイメージをスキャンしてください。 例えば、IBM Cloud Container Registry を使用する場合は、すべてのイメージが、名前空間にプッシュされたときに自動的にスキャンされ、脆弱性がないか調べられます。 脆弱性が検出された場合は、脆弱性を除去することを検討するか、そのイメージのデプロイメントをブロックします。 脆弱性の監視と除去を担当する組織内の人またはチームを見つけます。 組織構造によって、セキュリティー・チーム、運用チーム、またはデプロイメント・チームのメンバーが担当者になります。 コンテンツ・トラストを有効にして、信頼できる署名者が承認しないとイメージをコンテナー・レジストリーにプッシュできないようにしてください。 次に、 オープンソースの Portieris プロジェクトのアドミッションコントローラーをインストールして、署名されていないイメージからのコンテナデプロイメントをブロックする。
-
実行中のコンテナーを定期的にスキャンします。 脆弱性検査に合格したイメージからコンテナーをデプロイした場合でも、時間が経つと、コンテナー内で実行されるオペレーティング・システムやバイナリーが脆弱になる場合があります。 アプリを保護するには、脆弱性を検出して対処できるように、実行中のコンテナーを定期的にスキャンする必要があります。 アプリによっては、セキュリティをさらに強化するために、脆弱なコンテナが検出された後にそれを削除するジョブを確立することもできる。
| セキュリティー機能 | 説明 |
|---|---|
| IBM Cloud Container Registry における保護された Docker プライベート・イメージ・リポジトリー | 独自の Docker イメージ・リポジトリー (IBM によってホストおよび管理されるもの) を、可用性が高くマルチテナントでスケーラブルなプライベート・イメージ・レジストリーにセットアップします。 レジストリーを使用することで、Docker イメージをビルドし、安全に保管し、クラスター・ユーザー間で共有することができます。 /n コンテナー・イメージを処理する場合は、個人情報の保護について詳しく理解してください。 |
| 信頼できるコンテンツのみを含むイメージをプッシュ | イメージ・リポジトリーでコンテンツ・トラストを有効にすることで、イメージの整合性を確保します。 信頼できるコンテンツを使用する場合は、信頼できるイメージとしてイメージに署名して特定のレジストリー名前空間にプッシュできる人を制限できます。 信頼できる署名者がイメージをレジストリー名前空間にプッシュすると、ユーザーはパブリッシャーを検証したりイメージの整合性を検証したりできるように署名付きのコンテンツをプルできます。 |
| 自動脆弱性スキャン | IBM Cloud Container Registry を使用すれば、Vulnerability Advisor によって提供される組み込みセキュリティー・スキャンを活用できます。 レジストリー名前空間にプッシュされるどのイメージも、CentOS、Debian、Red Hat、および Ubuntu の既知の問題のデータベースに基づいて、脆弱性が自動的にスキャンされます。 脆弱性が検出されると、Vulnerability Advisor は、イメージの整合性とセキュリティーを確保するために脆弱性を解決する方法について指示を出します。 |
| 脆弱なイメージまたは信頼できないユーザーからのデプロイメントをブロック | コンテナー・イメージをデプロイ前に検証できるようにカスタム・ポリシーを使用してアドミッション・コントローラーを作成します。 オープンソースの Portieris プロジェクトを使用すると、イメージをどこから展開するかを制御し、コンテンツの信頼性要件を満たすようにします。 設定されたポリシーをデプロイメントが満たしていない場合、アドミッション・コントローラーはクラスターにおけるデプロイメントをブロックします。 |
コンテナーの分離とセキュリティー
クラスター内で複数のアプリを実行する際には、ワークロードを相互に分離して実行したり、迷惑な他の利用者やサービス妨害攻撃を回避するためにクラスター内のポッドの許可を制限したりすることもできます。
- Kubernetes ネームスペースとは何ですか?
- Kubernetes 名前空間は、クラスターを仮想的に分割して、デプロイメントの分離や、ワークロードをクラスターに移行したいユーザー・グループの分離を可能にするための手段です。 名前空間を使用することで、ワーカー・ノード間でリソースを編成できます。また、複数ゾーン・クラスターの場合にはゾーン間で編成できます。
- すべてのクラスターには、デフォルトの Kubernetes 名前空間のセットがセットアップされます。このセットには、IBM Cloud Kubernetes Service が適切に稼働してクラスターを管理するために必要なデプロイメントとサービスが含まれます。 詳しくは、サービス・アーキテクチャーを参照してください。
- クラスター管理者は、これらの名前空間へのアクセス権限が自動的に付与されるので、クラスターに追加の名前空間をセットアップすることができます。
クラスタ内のすべてのネームスペースについて、適切な RBACポリシーを 設定して、このネームスペースへのアクセスを制限し、デプロイされるものを制御し、適切な リソース・クォータと 制限範囲を設定するようにしてください。
シングルテナントとマルチテナント、どちらを設定すべきでしょうか?
単一テナント・クラスターでは、クラスターでワークロードを実行する必要があるユーザー・グループごとに、クラスターを 1 つ作成します。 通常、そのチームが、クラスターを管理し、正しく構成して保護します。 マルチテナント・クラスターは、複数の名前空間を使用してテナントとそのワークロードを分離します。
シングル・テナント・クラスターとマルチテナント・クラスターのどちらにするかは、クラスター内でワークロードを実行するチーム数、各チームのサービス要件、サービスのサイズ、およびワークロードに必要な分離レベルに基づいて決定します。
複雑なサービスを実行するチームが多く、チームごとにクラスターのライフサイクルを管理する必要がある場合には、シングル・テナント・クラスターが適しているでしょう。 クラスターの更新時期や、クラスターにデプロイできるリソースを自由に決められます。 他のテナントをセキュリティー侵害の危険にさらさずに特権ポッドを使用したい場合も、シングル・テナント・クラスターを構成できます。 クラスターを管理するには、デプロイメントに応じたクラスターの容量とセキュリティーを確保するために、Kubernetes とインフラストラクチャーに関する詳細な知識が必要であることに注意してください。
マルチテナント・クラスターは、Kubernetes 名前空間を使用してテナントを分離し、通常は、いずれのテナントにも属さない別個のチームによって管理されます。 クラスターで小さなワークロードを実行する必要があるチームが複数存在するが、複数のゾーンをまたぐ高可用性のシングル・テナント・クラスターを作成することでは必要な費用便益が得られないという場合は、マルチテナント・クラスターが適しているでしょう。 マルチテナント・クラスターは、通常、少ない人数でクラスターを操作および管理するので、必要な分離レベルが得られず、また、以下の領域の複雑さが増す可能性があります。
- アクセス: 複数の名前空間をセットアップする場合は、名前空間ごとに適切な RBAC ポリシーを構成して、確実にリソースを分離する必要があります。 RBAC ポリシーは複雑であるため、Kubernetes に関する詳細な知識が必要です。
- 特権ポッド: マルチテナント・クラスター内の 1 つのテナントで特権ポッドを実行する必要がある場合、このポッドはクラスター内の他の名前空間にアクセスすることも、共有コンピュート・ホストに損害を与えることも可能です。 特権ポッドの制御は複雑な作業であり、手間と深い技術的専門知識が必要です。 ポッドセキュリティポリシー(PSP)を使用して、テナントがクラスタに配置できるリソースを制御します。
- ネットワーク・ポリシー: ワーカー・ノードが同じプライベート・ネットワークに接続されているため、ポッドが他の名前空間内のポッドにアクセスできないように、厳しいネットワーク・ポリシーを設定する必要があります。
- コンピュート・リソースの制限: 各チームがクラスタ内でサービスをデプロイしてアプリを実行するために必要なリソースを確保するには、ネームスペースごとに リソース・クォータを設定する必要があります。 リソースクォータは、配置できる Kubernetes リソースの数や、それらのリソースが消費できる CPU とメモリの量など、配置の制約を決定します。 割り当て量を設定すると、ユーザーは、そのデプロイメントにリソース要求と制限を含める必要があります。
- 共有クラスター・リソース: 1 つのクラスターで複数のテナントを実行する場合は、Ingress アプリケーション・ロード・バランサー (ALB) や使用可能なポータブル IP アドレスなどの一部のクラスター・リソースが、複数のテナント間で共有されます。 小規模なサービスは、クラスター内の大規模なサービスと競合する場合、共有リソースを使用できないことがあります。
- 更新: 同時に実行できる Kubernetes API のバージョンは 1 つだけです。 1 つのクラスター内で実行されるすべてのアプリは、そのアプリを所有しているチームにかかわらず、現行の Kubernetes API バージョンに準拠していなければなりません。 クラスターを更新する場合は、すべてのチームが新しい Kubernetes API バージョンに切り替える準備ができていることと、それに対応するようにアプリが更新されていることを確認する必要があります。 つまり、個々のチームが、実行する Kubernetes API のバージョンを制御することはほぼできないということです。
- クラスター・セットアップの変更: クラスターのセットアップを変更したり、ワークロードを新しいワーカー・ノードにスケジュール変更したりする場合は、その変更をテナント間にロールアウトする必要があります。 このロールアウトには、単一テナント・クラスターの場合よりも多くの調整とテストが必要です。
- コミュニケーション・プロセス: 複数のテナントを管理する場合は、クラスターに問題があるときやサービス用に追加のリソースが必要になったときに問い合わせる場所がテナントにわかるように、コミュニケーション・プロセスをセットアップすることを検討してください。 このコミュニケーション・プロセスには、クラスターのセットアップのあらゆる変更や更新予定をテナントに知らせることも含まれます。
単一テナント・クラスターとマルチテナント・クラスターのコストはだいたい同じですが、単一テナント・クラスターではマルチテナント・クラスターの名前空間よりも高い分離のレベルが提供されます。 高いワークロード分離が必要な場合は、シングル・テナント・クラスターを使用してください。
Kubernetes ネットワーク・ポリシーは、内部ネットワーク・トラフィックからポッドを保護します。 例えば、多くのポッドまたはすべてのポッドで特定ポッド/サービスへのアクセスが不要である場合に、デフォルトでポッドがそのポッド/サービスにアクセスできないようにしたいのであれば、Kubernetes ネットワーク・ポリシーを作成して、そのポッド/サービスへの ingress トラフィックをブロックできます。 また Kubernetes ネットワーク・ポリシーは、別々の名前空間内のポッドとサービスの通信方法を制御して、名前空間の間のワークロードの分離を実施するのに役立ちます。
- ポッドのパーミッションをコントロールするには?
- デフォルトでは、すべてのクラスターで Kubernetes ポッドセキュリティポリシー許可コントローラーが有効になっています。このコントローラーを使用して、ポッドがネームスペースにデプロイされるために満たす必要のある要件を定義できます。 ポッド・セキュリティー・ポリシーを使用すると、特権コンテナー、ルート名前空間、ホスト・ネットワーキングとポート、ボリューム・タイプ、ホスト・ファイル・システム、Linux の権限 (読み取り専用やグループ ID など) の使用方法を制御できます。
- コンテナを保護するために他にできることはありますか?
- 特権コンテナの数を制限する。 コンテナーは、他のプロセスから分離された独立した Linux プロセスとしてコンピュート・ホスト上で実行されます。 他の Linux プロセス、ホスト・ファイル・システム、ホスト・デバイスを保護するために、コンテナーの中で root 権限を持つユーザーでも、コンテナーの外では権限が制限されます。 一部のアプリは、ホスト・ファイル・システムへのアクセス権限や高い権限がないと、正しく機能しません。 コンテナーを特権モードで実行すると、コンピュート・ホストで実行されるプロセスと同じアクセス権限を、そのコンテナーに許可できます。
- 特権コンテナーが乗っ取られると、クラスターおよび基礎コンピュート・ホストに甚大な損害がもたらされる可能性があることに注意してください。 特権モードで実行するコンテナーの数を制限し、高い権限がなくても実行できるようにアプリの構成を変更することを検討してください。
クラスタ内で特権コンテナの実行をブロックしたい場合は、カスタムポッドセキュリティポリシーの設定を検討してください。
- OS セキュリティー設定をポッドに適用する
- ポッドに
securityContextセクションを追加すると、コンテナ内で実行できるユーザー ID とグループ ID、またはボリュームのマウントパスを所有するユーザー ID とグループ ID を制御できます。 特定のユーザー ID を設定すると、最小特権モデルが円滑化されます。 セキュリティー・コンテキストによってユーザーが指定されない場合、Kubernetes は、コンテナー・イメージで指定されているユーザーを自動的に使用します。 securityContextを使用してrunAsUserユーザー ID またはfsGroupグループ ID を設定する場合は、永続ストレージを作成するときにブロック・ストレージを使用することを検討してください。 NFS ストレージはfsGroupをサポートしません。runAsUserは、ポッド・レベルではなくコンテナー・レベルで設定する必要があります。- コンテナー用の CPU とメモリーの制限を設定する
- どのコンテナーも、正常に起動して実行し続けるためには、特定の量の CPU とメモリーが必要です。 コンテナまたはポッドに対して、 Kubernetes リソース要求とリソース制限を定義して、コンテナまたはポッドが消費できる CPU とメモリの量を制限できます。 CPU とメモリーの制限を設定しない場合、コンテナーがビジーになると、使用可能なすべてのリソースが使用されます。 このようなリソースの大量消費は、正常に始動/稼働するだけの十分なリソースを持たないワーカー・ノード上の他のコンテナーに影響を与える可能性があり、ワーカー・ノードをサービス妨害攻撃のリスクにさらします。
- ポリシー駆動の認証を実施する
- サービスと API へのアクセスを制御するために、Ingress アノテーションをデプロイメントに追加できます。 App ID と宣言セキュリティーを使用して、ユーザー認証とトークンの検証を確認できます。
個人情報の保管
Kubernetes リソースおよびコンテナー・イメージ内の個人情報のセキュリティーを確保する責任を持ちます。 個人情報には、自分の名前、住所、電話番号、E メール・アドレス、および自分自身や顧客、その他の人を特定したり、連絡を取ったり、居場所を見つけたりすることができるその他の情報が含まれます。
- Kubernetes シークレットを使用した個人情報の保管
-
個人情報は、個人情報を保持するように設計された Kubernetes リソースにのみ保管してください。 例えば、Kubernetes 名前空間、デプロイメント、サービス、または構成マップの名前に自分の名前を使用しないでください。 適切な保護と暗号化のために、個人情報は代わりに 秘密に保存する。
-
クラスター全体におけるすべてのシークレットの集中管理、およびアプリケーション・ランタイムでの注入には、IBM Cloud Secrets Manager を試してください。
- Kubernetes
imagePullSecretを使用したイメージ・レジストリー資格情報の保管 -
個人情報をコンテナー・イメージまたはレジストリー名前空間に保管しないでください。 適切な保護と暗号化のために、レジストリ認証情報は Kubernetes
imagePullSecretsに、その他の個人情報は secretsに保存します。 個人情報がイメージの前のレイヤーに保管されている場合、イメージを削除するだけではこの個人情報を削除できない場合があることに注意してください。
シークレットの暗号化をセットアップするには、鍵管理サービス (KMS) プロバイダーを使用して Kubernetes シークレットを暗号化を参照してください。
Kubernetes セキュリティー情報
Kubernetes に脆弱性が見つかった場合、Kubernetes は、セキュリティー情報で CVE を発表してユーザーに通知し、脆弱性に対処するためにユーザーが実行する必要があるアクションについて説明します。 IBM Cloud Kubernetes Service ユーザーや IBM Cloud プラットフォームに影響のある Kubernetes のセキュリティー情報は、IBM Cloud のセキュリティー情報で公開されています。
一部の CVE では、IBM Cloud Kubernetes Service 内の定期的なクラスター更新プロセスの一部としてインストールできる、Kubernetes バージョンの最新パッチ更新が必要になります。 悪意のある攻撃からクラスターを保護するために、時機を逃さずセキュリティー・パッチを適用してください。 セキュリティ・パッチに含まれる内容の詳細については、 Kubernetes のバージョン情報を 参照してください。