クラスタのセキュリティの強化

このドキュメントでは、ベアメタル版 Anthos クラスタのセキュリティを強化する方法について説明します。

SELinux を使用してコンテナを保護する

Red Hat Enterprise Linux(RHEL)と CentOS でサポートされている SELinux を有効にすることで、コンテナを保護できます。ホストマシンが RHEL または CentOS を実行している場合で、クラスタで SELinux を有効にするには、すべてのホストマシンで SELinux を有効にする必要があります。詳細については、SELinux を使用してコンテナを保護するをご覧ください。

root ユーザーとしてコンテナを実行しない

デフォルトでは、コンテナ内のプロセスは root として実行されます。プロセスがコンテナから抜け出した場合、そのプロセスはホストマシン上で root として実行されるため、セキュリティ上の問題になる可能性があります。したがって、すべてのワークロードを非 root ユーザーとして実行することをおすすめします。

以降のセクションでは、コンテナを非 root ユーザーとして実行する 2 つの方法について説明します。

メソッド #1: DockerfileUSER 命令を追加する

このメソッドは Dockerfile を使用して、コンテナが root ユーザーとして実行されないようにします。Dockerfile では、コンテナ内のプロセスを実行するユーザーを指定できます。以下の Dockerfile のスニペットは、これを行う方法を示しています。

....

#Add a user with userid 8877 and name nonroot
RUN useradd −u 8877 nonroot

#Run Container as nonroot
USER nonroot
....

この例では、Linux コマンド useradd -u によって、コンテナ内に nonroot というユーザーが作成されます。このユーザーには、8877 というユーザー ID(UID)が割り当てられます。

Dockerfile の次の行によって、コマンド USER nonroot が実行されます。このコマンドでは、イメージのこの時点以降に対してそのように実行するように指定され、ユーザー nonroot としてコマンドが実行されます。

コンテナ プロセスを nonroot に対して正しく実行できるように、UID 8877 に権限を付与します。

メソッド #2: Kubernetes マニフェスト ファイルに securityContext フィールドを追加する

この方法では、コンテナが root ユーザーとして実行されないように Kubernetes マニフェスト ファイルを使用します。Pod にはセキュリティ設定が指定されており、それらのセキュリティ設定は Pod 内のすべてのコンテナに適用されます。

次の例は、特定の Pod のマニフェスト ファイルから抜粋した内容を示しています。


apiVersion: v1
kind: Pod
metadata:
  name: name-of-pod
spec:
  securityContext:
    runAsUser: 8877
    runAsGroup: 8877
....

runAsUser フィールドは、Pod 内のコンテナに対して、すべてのプロセスがユーザー ID 8877 で実行されることを指定します。runAsGroup フィールドは、これらのプロセスのプライマリ グループ ID(GID)が 8877 であることを指定します。コンテナ プロセスを適切に実行できるように、UID 8877 に必要かつ十分な権限を付与してください。

これにより、コンテナ内のプロセスが root よりも権限が少ない UID 8877 として実行されるようになります。

ベアメタル版 Anthos クラスタのシステム コンテナでは、2000 から 4999 の範囲の UID と GID を使用します。そのため、この予約済み範囲外の UID と GID は、ユーザー ワークロードに権限を割り当てるときに使用します。

ワークロードの自己変更機能を制限する

特定の Kubernetes ワークロード(特にシステム ワークロード)には、自己変更の権限があります。たとえば、一部のワークロードは垂直方向に自動スケーリングされます。これは便利ですが、すでにノードを不正使用した攻撃者がクラスタ内でさらにエスカレーションする可能性があります。たとえば、攻撃者がノード上のワークロード自体を変更して、同じ名前空間内に存在する、より権限の高いサービス アカウントとして実行するおそれがあります。

理想的には、ワークロードにはそもそも自己変更機能を付与するべきではありません。自己変更が必要な場合は、オープンソースの Gatekeeper ライブラリから NoUpdateServiceAccount などの Gatekeeper またはポリシー コントローラの制約を適用して権限を制限できます。これにより、いくつかの有用なセキュリティ ポリシーが提供されます。

ポリシーをデプロイする場合、通常はクラスタのライフサイクルを管理するコントローラがポリシーをバイパスできるようにする必要があります。これは、コントローラがクラスタに変更を加える(クラスタのアップグレードを適用するなど)ことができるようにするために必要です。たとえば、ベアメタル版 Anthos クラスタに NoUpdateServiceAccount ポリシーをデプロイする場合は、Constraint で次のパラメータを設定する必要があります。

parameters:
  allowedGroups:
  - system:masters
  allowedUsers: []

メンテナンス

セキュリティ情報のモニタリングとクラスタのアップグレードは、クラスタが稼働した後に実施する必要がある重要なセキュリティ対策です。

セキュリティ情報を監視する

Anthos のセキュリティ チームは、重大度が「高」や「重大」の脆弱性のセキュリティに関する情報を公開しています。

これらの情報は、共通の Google Cloud 脆弱性番号スキームに従っており、Google Cloud 情報のメインページとベアメタル版 Anthos クラスタのリリースノートからリンクされています。この XML フィードを使用して、ベアメタル版 Anthos クラスタおよび関連プロダクトに関するセキュリティ情報を定期的に受け取ります。https://cloud.google.com/feeds/anthos-gke-security-bulletins.xml 登録

このような重大度が「高」や「重大」の脆弱性に対処するためにお客様の対応が必要な場合は、Google からメールでご連絡いたします。また、Google はサポート チャネルを通じてサポート契約を結んでいるお客様にご連絡する場合もあります。

GKE と Anthos のセキュリティ脆弱性とパッチの Google での管理方法については、セキュリティ パッチをご覧ください。

クラスタをアップグレードする

Kubernetes では新しいセキュリティ機能が定期的に導入されており、セキュリティ パッチが提供されています。ベアメタル版 Anthos クラスタのリリースには、クラスタに影響を与える可能性があるセキュリティの脆弱性に対処する Kubernetes セキュリティ強化が組み込まれています。

Anthos クラスタを最新の状態に保つことは、はユーザーの責任です。各リリースについて、リリースノートをご確認ください。Anthos クラスタのセキュリティ リスクを最小限に抑えるには、新しいパッチリリースへの更新を毎月、マイナー バージョンへの更新を 3 か月ごとに実施するようにしてください。

クラスタのアップグレードのメリットの 1 つは、クラスタの kubeconfig ファイルが自動的に更新されることです。kubeconfig ファイルは、クラスタに対してユーザーを認証します。bmctl でクラスタを作成すると、kubeconfig ファイルはクラスタ ディレクトリに追加されます。デフォルトの名前とパスは bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig です。クラスタをアップグレードすると、そのクラスタの kubeconfig ファイルが自動的に更新されます。それ以外の場合、kubeconfig ファイルは作成日から 1 年後に期限切れになります。

クラスタのアップグレード方法については、クラスタをアップグレードするをご覧ください。