ソフトウェアのセキュリティは、セキュリティ ソフトウェアではありません。ここでは、認証、アクセス制御、機密性、暗号化、権限管理などのトピックについて説明します。
streamingConnectionIdleTimeout
フィールドは、接続が自動的に閉じられる前にストリーミング接続がアイドル状態になる最大時間を指定します。アイドル タイムアウトを設定すると、サービス拒否攻撃や接続不足を防ぐことができます。フィールド値を 0
に設定すると、アイドル タイムアウトが無効になります。streamingConnectionIdleTimeout
フィールドを 0
に設定することで、ストリーミング接続タイムアウトを無効にします。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
streamingConnectionIdleTimeout: 0
AlwaysAllow
モードでは承認チェックを実行しません。AlwaysAllow
を承認モードの 1 つとして、Kubernetes API サーバーを起動します。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=...,AlwaysAllow,...
...
--root-ca-file
フラグなしで起動します。そのため、Kubernetes コントローラー マネージャーは対応するルート CA 証明書をポッドに公開しません。ルート CA 証明書がないと、ポッドは接続を確立する前に API サーバーのサービング証明書を確認できません。このような接続は、中間者 (Man-in-the-Middle) 攻撃に対して脆弱になります。--root-ca-file
フラグなしで Kubernetes コントローラー マネージャーを起動します。
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: example.domain/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
AlwaysAllow
モードまたは Webhook
モードを使用してリクエストを承認します。未指定の承認モードはデフォルトで AlwaysAllow
になります。Kubelet は、すべてのリクエストを許可する AlwaysAllow
モードでは承認チェックを実行しません。Kubelet はワーカー マシンのワークロードを管理する Kubernetes の主要なエージェントであるため、攻撃者は、制御されないリクエストを使用して、保護が不十分でセキュリティが重要なサービス API にアクセスできます。AlwaysAllow
に設定されているため、Kubelet は承認チェックを実行しません。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authorization:
mode: AlwaysAllow
clientCAFile
フィールドが含まれていません。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
--kubelet-client-certificate
フラグと --kubelet-client-key
フラグを使用してクライアント証明書と対応する秘密鍵を指定せずに、Kubernetes API サーバーを起動します。
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
--kubelet-certificate-authority
フラグで確認します。
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
Node
承認は、Kubelet による API リクエストを承認することを目的とした、特別な承認モードです。これにより、Kubelet が正しく動作するのに必要な、最小限の権限セットを持つことが保証されます。Node
承認モードなしで、Kubernetes API サーバーを起動します。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=RBAC,Webhook
...
NodeRestriction
アドミッション コントローラーを、Kubernetes API サーバー用に常に有効にしてください。NodeRestriction
アドミッション コントローラーは、すべての Kubelet に対して Node オブジェクトと Pod オブジェクトを変更することを制限するとともに、機密性の高いシステム オブジェクトへのアクセスを拒否します。これにより、侵害されたノードが Kubernetes クラスターの他のノードで特権を取得するのを防ぎます。Pod
定義では、NodeRestriction
アドミッション コントローラーを有効にせずに、Kubernetes API サーバーを起動します。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodSecurityPolicy
...
PodSecurityPolicy
アドミッション コントローラーがないと、K-Rail、Kyverno、OPA/Gatekeeper など、Kubernetes 用の別のポリシー適用ツールがない限り、セキュリティ コントロールが脆弱になります。PodSecurityPolicy
アドミッション コントローラーは、クラスター内の許容されるセキュリティ関連の Pod 属性を指定する、Pod セキュリティ ポリシーを適用します。たとえば、PodSecurityPolicy
を使用して、特権コンテナーを禁止し、Pod
が作成されるときにデフォルトで特権昇格を禁止できます。Pod
定義では、PodSecurityPolicy
アドミッション コントローラーを有効にせずに、Kubernetes API サーバーを起動します。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
RBAC
) は、組織内の個々のユーザーのロールに基づいて、コンピューターまたはネットワーク リソースへのアクセスを制御します。RBAC は最も安全な承認モードです。RBAC
承認モードなしで、Kubernetes API サーバーを起動します。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=Node,Webhook
...
Pod
を定義します。これは、securityContext
フィールドがないためです。
apiVersion: v1
kind: Pod
...
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
SecurityContextDeny
アドミッション コントローラーは、Pod が Kubernetes クラスターでの権限昇格を許可する特定の SecurityContext フィールドを設定するのを防ぎます。適切な Pod セキュリティポリシーなど、Kubernetes の別のポリシー適用ツールがない限り、SecurityContextDeny
アドミッション コントローラーを有効にする必要があります。Pod
定義では、SecurityContextDeny
アドミッション コントローラーを有効にせずに、Kubernetes API サーバーを起動します。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
--service-account-private-key-file
フラグを使用して、トークン署名キーを指定します。--service-account-private-key-file
フラグなしで Kubernetes コントローラー マネージャーを起動します。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
...
ServiceAccount
アドミッション コントローラーは、サービス アカウントの管理を自動化します。ServiceAccount
アドミッション コントローラーを使用するメリットとして、自動化されたクレデンシャル ローテーションでアクセス トークンの漏えいを軽減することや、ストレージにシークレットを保持する必要をなくすことなどがあります。ServiceAccount
アドミッション コントローラーはデフォルトで有効になりますが、意図的に無効にされています。Pod
定義では、Kubernetes API サーバーが起動し、ServiceAccount
アドミッション コントローラーが無効になります。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=ServiceAccount,PodNodeSelector
...
NamespaceLifecycle
アドミッション コントローラーは、2 つの方法で Kubernetes システムの整合性を維持します。まず、存在しない名前空間または終了中の名前空間にオブジェクトが作成されるのを防ぎます。次に、Kubernetes の重要なサービスを含むシステム予約の名前空間が削除されないようにします。NamespaceLifecycle
アドミッション コントローラーはデフォルトで有効になりますが、Kubernetes API サーバーを起動するコマンドで、--disable-admission-plugin
フラグを使用して無効化されています。NamespaceLifecycle
が --disable-admission-plugins
フラグに含まれているため、NamespaceLifecycle
アドミッション コントローラーが無効になります。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=...,NamespaceLifecycle,...
...
--peer-auto-tls
フラグを true
に設定します。その結果、etcd インスタンスは、ピアとの TLS 接続に自己署名証明書を使用します。
...
spec:
containers:
- command:
...
- etcd
...
- --peer-auto-tls=true
...
root
アクションを root
フル アクセスなしで実行できます。CAP_SYS_ADMIN
機能は、ポッドに対して、できるだけ広範囲のシステム管理操作を実行する権限を付与します。CAP_SYS_ADMIN
機能をポッド内のコンテナーに追加します。
...
kind: Pod
...
spec:
containers:
...
securityContext:
capabilities:
add:
- CAP_SYS_ADMIN
- SYS_TIME
...
privileged
フィールドは、ホストで実行されている他のプロセスとほぼ同じ特権をコンテナーに許可します。これは攻撃対象領域を拡大するとともに、最小限の特権でイメージを実行するという原則に違反します。privileged: true
を設定することにより、特権モードで実行されます。
...
kind: Pod
...
spec:
containers:
- name: ...
image: ...
securityContext:
privileged: true
...