使用 Microsoft Defender for Containers 来应用 Azure 策略并理解最佳实践- 实践在集群中的运用
首先
Microsoft Defender for Containers では Kubernetes 用の Azure ポリシーをクラスター環境に適用することで、Microsoft Defender for Cloud の推奨事項にクラスター構成のセキュリティベストプラクティスのチェックを行うことが出来るようになっています。
設定方法やチューニングなどが若干必要になっており、見方などが分かり難いので本記事でまとめています。詳細は以下公式 Docs を参照してください。
应用 Azure 策略到 AKS 集群前的准备工作。
有两种方法可以在 AKS 群集中应用 Azure 策略,但是推荐使用前者的配置,因为它更加简单。

理解 Kubernetes 的推荐做法。
3.1 Azure 用于群集的策略清单
Azure在Kubernetes集群中提供了两种类型的策略。一种是无需参数调整即可运行的策略,另一种是根据自身环境进行参数调整的推荐策略。根据具体情况,可以决定哪些项在自身环境中不需要监视,然后采纳必要的推荐策略。
用于测试推荐事项的模板是3.2。
已公開 Azure 政策的推荐样板 YAML 模板,用于确定推荐策略的建议性内容。请使用该模板来分析和决定在实际检测到问题时的操作方式,并用于分析和判定在公司环境中出现问题的原因。
- 正常なデプロイのサンプル.yaml ファイル
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-healthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
annotations:
container.apparmor.security.beta.kubernetes.io/redis: runtime/default
spec:
containers:
- name: redis
image: <customer-registry>.azurecr.io/redis:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 250Mi
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
---
apiVersion: v1
kind: Service
metadata:
name: redis-healthy-service
spec:
type: LoadBalancer
selector:
app: redis
ports:
- port: 80
targetPort: 80
異常なデプロイのサンプル.yaml ファイル (構成に以下が含まれています)
レポジトリを用いていない
Pod 側での CPU / Memory 制限を用いていない
apparmor 未使用
特権コンテナー privileged: true
ReadOnly ではない readOnlyRootFilesystem: false
特権エスカレーションが含まれる allowPrivilegeEscalation: true
root ユーザーでの実行 runAsUser: 0
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-unhealthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 9001
hostPort: 9001
securityContext:
privileged: true
readOnlyRootFilesystem: false
allowPrivilegeEscalation: true
runAsUser: 0
capabilities:
add:
- NET_ADMIN
volumeMounts:
- mountPath: /test-pd
name: test-volume
readOnly: true
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /tmp
---
apiVersion: v1
kind: Service
metadata:
name: redis-unhealthy-service
spec:
type: LoadBalancer
selector:
app: redis
ports:
- port: 6001
targetPort: 9001
3.3 具体而详尽
请参阅官方文档以获取每个建议的详细信息。
需要强制限制容器的CPU和内存。
resources:
limits:
cpu: 100m # Pod の CPU を制限
memory: 250Mi # Pod の Memory を制限
コンテナーの起動に対して制限をかけるパラメータ項目です。
CPU とメモリの制限を適用することでリソース枯渇攻撃 (サービス拒否攻撃の一種) を防ぐことができます。
コンテナーに制限を設定し、設定された制限を超えてリソースがコンテナーで使用されないように、ランタイムによって防ぐことをお勧めします。
パラメータとしては以下項目を設定する必要がありますので、自社環境に合ったパラメータを検討しましょう。
[ "kube-system", "gatekeeper-system", "azure-arc", "azuredefender", "mdc", "azure-extensions-usage-system"]
Kubernetes image to exclude from monitoring of all container related policesKubernetes コンテナ関連のポリシー評価から除外する InitContainers とコンテナのリスト。 これは、「コンテナ イメージは信頼できるレジストリからのみデプロイする必要がある」と「Kubernetes クラスタは脆弱なイメージのデプロイをゲートする必要がある」を除く、すべてのコンテナ関連のポリシーに適用されます。[]

コンテナー イメージは信頼されたレジストリからのみデプロイする必要がある
spec:
containers:
image: <customer-registry>.azurecr.io/redis:latest # レジストリ指定
Azure Container Registory (ACR) からの AKS クラスターへ Pod デプロイする際に「信頼された」レジストリーからのみに限定するようにポリシーを適用することが出来ます。
Kubernetes クラスターで実行されているイメージは、監視対象になっている既知のコンテナー イメージ レジストリのものである必要があります。信頼できるレジストリにより、不明な脆弱性、セキュリティの問題、悪意のあるイメージが持ち込まれる可能性が制限され、クラスターが危険にさらされるリスクが減ります。
正規表現 (regex) を用いて、ACR の名称を定義する設定が必要になります。
たとえば、部分パスを一致させることで任意の Azure Container Registry イメージを許可するには:
^[^\/]+\.azurecr\.io\/.+$
、複数のレジストリの場合: ^([^\/]+\.azurecr\.io|registry\.io)\/.+$
^(.+){0}$
Kubernetes namespaces to exclude from monitoring of allowed container images評価から除外する Kubernetes 名前空間のリスト。 複数の名前空間をリストするには、セミコロン (;) を使用して名前空間を区切ります。 システム名前空間「kube-system」、「gatekeeper-system」、および「azure-arc」は、設計により常に除外されます。[ "kube-system", "gatekeeper-system", "azure-arc", "azuredefender", "mdc", "azure-extensions-usage-system"]

需要将仅限于容器的最小特权应用于Linux功能。
为了减少容器的攻击面,应该限制Linux功能,并不是将超级用户的所有特权授予容器,而是授予特定的特权。您需要设置以下参数作为选项。
[ "kube-system", "gatekeeper-system", "azure-arc", "azuredefender", "mdc", "azure-extensions-usage-system"]
Allowed capabilitiesコンテナへの追加が許可されている機能のリスト。 すべてをブロックするには、入力として空のリストを指定します。[]
Required drop capabilitiesコンテナーによって削除される必要がある機能のリスト。[]
Kubernetes image to exclude from monitoring of all container related polices評価から除外する InitContainers とコンテナのリスト。 これは、「コンテナ イメージは信頼できるレジストリからのみデプロイする必要がある」と「Kubernetes クラスタは脆弱なイメージのデプロイをゲートする必要がある」を除く、すべてのコンテナ関連のポリシーに適用されます。 識別子はコンテナのイメージです。 接頭辞一致は「*」で表すことができます。 例: myregistry.azurecr.io/istio:*
。 信頼できないリポジトリからイメージが予期せず除外されることを避けるために、ユーザーは完全修飾された Docker イメージ名 (ドメイン名で始まるなど) を使用することをお勧めします。[]

只允许使用容器中被允许的 AppArmor 配置文件。
# AppArmor プロファイルの例
annotations:
container.apparmor.security.beta.kubernetes.io/redis: runtime/default
Kubernetes クラスターで実行されているコンテナーは、許可されている AppArmor プロファイルのみに制限してください。AppArmor (Application Armor) は、オペレーティング システムとそのアプリケーションをセキュリティの脅威から保護する Linux セキュリティ モジュールです。これを使用するには、システム管理者が AppArmor セキュリティ プロファイルを各プログラムに関連付けます。
服务只需在经过授权的端口进行监听。
ports:
- port: 80
targetPort: 80 # サービスのポート指定例
Kubernetes クラスターの攻撃面を減らすために、サービスのアクセスを構成済みポートに制限して、クラスターへのアクセスを制限します。事前にパラメータ設定が必要です。
["443", "80"]
初期値は無効状態[ "-1"]
Kubernetes namespaces to exclude from monitoring of allowed service ports対象外とする名前区間[ "kube-system", "gatekeeper-system", "azure-arc", "azure-extensions-usage-system"]

需要限制主机网络和端口的使用。
ports:
- containerPort: 80
将Pod的访问限制在Kubernetes集群内的主机网络和允许的主机端口范围内。启用hostNetwork属性创建的Pod之间共享节点网络区域。为防止网络流量被受到安全侵害的容器嗅探,请不要将Pod部署在主机网络中。
コンテナー ポートをノード ネットワークに公開する必要があり、Kubernetes Service ノード ポートを使用してもニーズが満たされない場合は、ポッド仕様のコンテナーに対して hostPort を指定することもできます。
[ "kube-system", "gatekeeper-system", "azure-arc", "azure-extensions-usage-system"]
Allow host network usageポッドがホスト ネットワークの使用を許可されている場合はこの値を true に設定し、それ以外の場合は false に設定します。false
Min host port for pod in Kubernetes clusterポッドがホスト ネットワーク名前空間で使用できる、許容されるホスト ポート範囲の最小値。0
Max host port for pod in Kubernetes clusterポッドがホスト ネットワーク名前空間で使用できる、許容されるホスト ポート範囲の最大値。0
Kubernetes image to exclude from monitoring of all container related policesKubernetes コンテナ関連のポリシー評価から除外する InitContainers とコンテナのリスト。 これは、「コンテナ イメージは信頼できるレジストリからのみデプロイする必要がある」と「Kubernetes クラスタは脆弱なイメージのデプロイをゲートする必要がある」を除く、すべてのコンテナ関連のポリシーに適用されます。 識別子はコンテナのイメージです。 接頭辞一致は「*」で表すことができます。 例: myregistry.azurecr.io/istio:*
。 信頼できないリポジトリからイメージが予期せず除外されることを避けるために、ユーザーは完全修飾された Docker イメージ名 (ドメイン名で始まるなど) を使用することをお勧めします。[]

ポッド HostPath ボリューム マウントの使用は既知のリストに制限する必要がある
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /tmp
Kubernetes クラスター内のポッドの HostPath ボリューム マウントを、構成済みの許可されているホスト パスに制限することをお勧めします。 侵害を受けた場合は、コンテナーからのコンテナー ノード アクセスを制限する必要があります。
需要避免包含特权升级的容器。
securityContext:
allowPrivilegeEscalation: false # 特権昇格は利用させない
建议限制 Kubernetes 集群中的 Pod 的 HostPath 卷挂载到配置允许的主机路径。若受到侵害,则需要限制容器节点访问容器节点。
機密性の高いホストの名前空間を共有するコンテナーは避ける必要がある
Kubernetes クラスター内のポッドの HostPath ボリューム マウントを、構成済みの許可されているホスト パスに制限することをお勧めします。 侵害を受けた場合は、コンテナーからのコンテナー ノード アクセスを制限する必要があります。
需要在容器中应用一个不可变(只读)的根文件系统。
securityContext:
readOnlyRootFilesystem: true # Pod のルートファイルシステムを読み取り専用にする
请在您的 Kubernetes 集群中使用只读的根文件系统来运行容器。不可变的文件系统可以保护容器免受运行时由恶意二进制文件添加到路径所导致的修改。
Kubernetes 集群必須通过 HTTPS 进行访问。
使用HTTPS可以确保认证的执行,并保护数据在传输过程中免受网络层的窃听攻击。
需要在Kubernetes集群中禁用API凭证的自动挂载。
侵害された可能性のある Pod リソースが Kubernetes クラスターに対して API コマンドを実行するのを防ぐために、API 資格情報の自動マウントを無効にします。
在Kubernetes集群中不使用默认的命名空间。
为了保护ConfigMap、Pod、Secret、Service和ServiceAccount等类型的资源免受未经授权的访问,我们需要在Kubernetes集群中不使用默认(Default)命名空间。
在Kubernetes集群中,不允许使用CAPSYSADMIN安全功能。
要减少对容器的攻击面,可以限制Linux功能CAP_SYS_ADMIN。CAP_SYS_ADMIN是最具特权的功能,必须始终避免使用。
避免使用特权容器
securityContext:
privileged: false
为了限制无限制的主机访问,请尽量不使用特权容器。
特权容器包含了主机机器的所有根功能。它们可能被用作攻击的入口点,或者被利用来传播恶意代码和恶意软件,侵害应用程序、主机和网络。
请不要以root用户身份运行容器。
runAsNonRoot: true
runAsUser: 1000
请勿在您的 Kubernetes 集群中以 root 用户身份运行容器。如果在容器内使用 root 用户运行进程,则会作为主机上的 root 用户运行。如果受到侵害,攻击者将拥有容器的 root 权限,并更容易利用配置错误。
如果系统命名空间被参数排除,在误报的情况下,请重新审查参数设置。
[ "kube-system", "gatekeeper-system", "azure-arc", "azure-extensions-usage-system"]
Kubernetes image to exclude from monitoring of all container related policesKubernetes コンテナ関連のポリシー評価から除外する InitContainers とコンテナのリスト。 これは、「コンテナ イメージは信頼できるレジストリからのみデプロイする必要がある」と「Kubernetes クラスタは脆弱なイメージのデプロイをゲートする必要がある」を除く、すべてのコンテナ関連のポリシーに適用されます。 識別子はコンテナのイメージです。 接頭辞一致は「*」で表すことができます。 例: myregistry.azurecr.io/istio:*
。 信頼できないリポジトリからイメージが予期せず除外されることを避けるために、ユーザーは完全修飾された Docker イメージ名 (ドメイン名で始まるなど) を使用することをお勧めします。[]

参考资料等
4. 总结
以上、Microsoft Defender for Containers 適用時に設定可能な Azure ポリシーのまとめでした。K8s のセキュリティベストプラクティスが基準になっており、仕組みや内容を理解して推奨事項の判断を適切に行う必要がありますが、自社の AKS 環境のチェックにうまくご活用いただければと思います。本記事がどなたかの参考になれば幸いです。
*这份稿件是基于个人观点的内容,不代表所属公司的官方观点。同时也不提供任何保证。请确认正式信息,请联系各个产品的销售方。