.. _k8s_privileged_pod: ==================== Kubernetes特权Pod ==================== Kubernetes特权Pod (privileged Pod) 是一种特殊运行Pod: - 运行在 ``privileged`` 模式下的容器,能够完全访问物理节点内核(full access to the node's kernel) - 可以仔细地通过屏蔽掉特定能力来授权以限制容器的特权 - 通过定义一些安全相关特性,例如 ``runAsUser`` / ``RunAsNonRoot`` 等 准备工作 ========= 要运行 privileged pod,只需要在容器配置的 ``securityContext`` 部分设置 ``privileged: true`` : 创建 privileged pod --------------------- .. literalinclude:: k8s_privileged_pod/privileged-pod-1.yaml :language: yaml :caption: 一个特权pod案例 - 创建测试pod: .. literalinclude:: k8s_privileged_pod/create_privileged-pod :caption: 创建测试 privilege pod - 当上述测试pod运行正常后,进入该pod: .. literalinclude:: k8s_privileged_pod/exec_privileged-pod :caption: 进入privileged pod - 然后在这个 ``privileged`` pod中检查容器能力: .. literalinclude:: k8s_privileged_pod/capsh_privileged-pod :caption: 在容器内部检查该容器能力 输出可以看到: .. literalinclude:: k8s_privileged_pod/capsh_privileged-pod_output :caption: 在容器内部检查该容器能力,输出信息 创建 non-privileged pod -------------------------- .. note:: 虽然配置 ``privileged: false`` 和 ``allowPrivilegedEscalation: false`` ,但是实际上 pod 还是会有一些privileges的 - 创建 ``non-privileged`` pod: .. literalinclude:: k8s_privileged_pod/privileged-pod-2.yaml :language: yaml :caption: 一个 ``non-privileged`` pod案例 - 运行: .. literalinclude:: k8s_privileged_pod/create_non-privileged-pod :caption: 创建测试 privilege pod - 然后在这个 ``non-privileged`` pod中检查容器能力: .. literalinclude:: k8s_privileged_pod/capsh_privileged-pod :caption: 在容器内部检查该容器能力( ``non-privileged`` ) 则输出内容明显降低了能力: .. literalinclude:: k8s_privileged_pod/capsh_non-privileged-pod_output :caption: 在 ``non-privileged`` pod容器内部检查该容器能力,输出信息 创建完全drop privileged的pod ------------------------------ 最严格的是 ``drop: ALL`` 的 ``non-privileged`` pod: - 创建 ``drop ALL`` 的 ``non-privileged`` pod .. literalinclude:: k8s_privileged_pod/privileged-pod-3.yaml :language: yaml :caption: 一个 drop ALL 的 ``non-privileged`` pod案例 - 运行: .. literalinclude:: k8s_privileged_pod/create_drop_all_non-privileged-pod :caption: 创建测试 drop ALL的 ``non-privilege`` pod 在这个 drop ALL的 non-privileged pod中,可以看到没有任何能力 .. literalinclude:: k8s_privileged_pod/capsh_drop_all_non-privileged-pod_output :caption: 在 drop ALL 的 ``non-privileged`` pod容器内部检查该容器能力,输出信息 此时容器中不能安装rpm包,不能删除文件 创建以特定非Root用户运行 non-privileged pod ---------------------------------------------- - 以 1000 uid 运行的容器配置: .. literalinclude:: k8s_privileged_pod/privileged-pod-4.yaml :language: yaml :caption: 一个特定用户的 drop ALL ``non-privileged`` pod案例 创建特定能力的特定非Root用户运行 non-privileged pod -------------------------------------------------------- 进一步,可以给容器一些特定的权限,例如允许调整进程的nice值: .. literalinclude:: k8s_privileged_pod/privileged-pod-5.yaml :language: yaml :caption: 一个特定能力的用户 drop ALL ``non-privileged`` pod案例 .. note:: 总之,调整比较细节,可以进一步参考原文 `Kubernetes Privileged Pod Practical Examples `_ 参考 ====== - `Kubernetes Privileged Pod Practical Examples `_