Kubernetes 中如何使用 Pod Security Policy

阅读时长 12 分钟读完

在 Kubernetes 中,Pod Security Policy(简称 PSP)是一种用于限制容器中不能执行的操作的安全机制。使用 PSP,开发者可以在 Kubernetes 集群中对运行时环境进行更细粒度的控制,从而保护容器中的应用程序免受恶意攻击。

在本篇文章中,我们将介绍 Kubernetes 中如何使用 Pod Security Policy,包括 PSP 的基本概念、如何创建和使用 PSP、PSP 的最佳实践和示例代码。

PSP 的基本概念

Pod Security Policy 是 Kubernetes 中的一个 API 对象,它允许管理员定义一组安全措施,以确保容器中的应用程序不会执行不安全的操作。在 Kubernetes 中,PSP 通常由管理员创建,而运行应用程序的开发者则需要使用这些 PSP 来保护他们的应用程序。

PSP 可以定义以下安全措施:

  • 容器运行时的特权模式
  • 挂载的卷以及其访问权限
  • 入口点和操作系统权限

在 Kubernetes 集群中,系统管理员可以使用 RBAC(Role-Based Access Controller)来控制对 PSP 的访问权限。

如何创建和使用 PSP

要使用 PSP,系统管理员首先需要创建一个 PSP,然后将其绑定到需要受其保护的命名空间中。创建 PSP 可以通过 YAML 文件来完成。

以下是一个简单的 PSP YAML 文件示例:

-- -------------------- ---- -------
----------- ------------------
----- -----------------
---------
  ----- -------
-----
  ----------- -----
  --------
    ----- --------
  -------------------
    ----- ---------
    -------
    - ---- -
      ---- -----
  ----------
    ----- ----------------
  --------
    ----- ---------
    -------
    - ---- -
      ---- -----

此 YAML 文件定义了一个名为limited的 PSP。这个 PSP 的规则如下:

  • 不允许容器以特权模式运行。
  • 应用程序必须以非 root 用户运行。
  • 应用程序必须使用非特权用户组运行,并且可以使用 1 到 65535 之间的用户组 ID。
  • 容器可以访问主机文件系统的所有部分。

关于 PSP 的具体设置,可以参考 Kubernetes 的官方文档进行学习。

要使用 PSP,开发者需要更新他们的 Pod YAML 文件,以指定所需的 PSP。以下是一个示例,展示了如何使用上面定义的limited PSP。

-- -------------------- ---- -------
----------- --
----- ---
---------
  ----- ------
-----
  ----------------
    ---------------
      ------ --------------
  -----------
  - ----- ------
    ------ --------
    ----------------
      ----------- -----
      ---------- ----
      ----------- ----
    -------------
    - ----- ---------
      ---------- -----
  --------
  - ----- ---------
    -------
      ----------- ---------
  - ---- -- ----- --- --- -------- ------ -- ----------
  - ----------------- --- ----
  - -----
  - ------ ---- -------- -- ---------- ------------------ 
  - --- ------- -- -------
 
  - ------------ --- --
  - ----------------------------------------
  - --------
  - ------------------------------------------
  - -----------------
  - ---------------------------------------------
  - -----------------------------------------
  - -------------------------------------------
  - ----- --------------------------------------------
  - --------------------
  
  ------------------
    ----- -------
  ------------------
    ------------
      ---- ------
  -------------
    ---- ------
  ------------
  - ---- --------
    --------- -------
    ------ ----------

在以上示例中,Pod YAML 文件中增加了一段定义 PSP 的部分,绑定了名为limited的 PSP。该文件还定义了一个名为 my-pod 的 Pod,其中包含一个名为 my-app 的容器,该容器使用我的图像,并将 my-volume 挂载到了 /data 目录。Pod 还指定了一个名为 my-secret 的秘密卷。

PSP 的最佳实践

在实际使用 PSP 时,建议遵循以下最佳实践:

  • 对于每个使用 PSP 的 Pod,都应该定义一个专门的服务帐户。
    • 将特定任务的服务帐户与 PSP 绑定,将更多的访问控制授予运行容器的特定用户。
    • 此外服务帐户可以与 RBAC 组和角色绑定,这将为每个机构提供更多的安全性和灵活性,有利于通过更精确的授权来管理安全性。
  • 始终使用 PSP 安全标准进行开发和部署,PSP 应遵循 Kubernetes 的“二进制授权”理念。
    • 如果 PSP 不可用,则不允许 Pod 的创建和运行。
    • 始终检查 Pod 是否适合 PSP 标准,并在发现不符合标准的地方进行修复。
  • 始终将 PSP 作为 YAML 文件定义,以确保最佳实践和其他安全标准得到满足。

示例代码

GitHub 中有一个名为 k8s-psp 的仓库,其中提供了一个完整的使用 PSP 的示例,涵盖了 PSP 的创建、绑定并且使用绑定 PSP 来运行多个不同的应用程序。

下面是示例代码中一个 basic-deployment.yml 的文件,它定义了一个部署对象并将其绑定到某个 PSP 上:

-- -------------------- ---- -------
----------- -------
----- ----------
---------
  ----- ----------------
  -------
    ---- ------
-----
  --------- -
  ---------
    ------------
      ---- ------
  ---------
    ---------
      -------
        ---- ------
    -----
      -----------
      - ----- -----
        ------ -----
        ------
        - -------------- --
        -------------
        - ----- ----
          ---------- -----
      --------
      - ----- ----
        -------
          ----------- ---------
      ----------------
        ---------- ----
      - -------- --- --- -------- ------
      - ------ ----------------- --- ------------
      - --- --- --- --------- -------------- -------------------------------------------------------------------------------------------------------------------------
      - --------------------------------------------------------------
      - -------------------------------------------------------------------

      - -------------------------------
      - ----------------- - --- -----
      - -----------------------------------------------------------------------------------------------
      
      - -----------------
      - ---------------------------------------------------------------------------------------------------------------------------------
      - ---------------------------
      - ----------------------------------
      
      - -----------------
      - ------- ------ --------- -----------------
      - ------- ----- --------- ----------------- ------------
      
      - -- ------- ------- --------------------
      - ------- ----- -- ------
      - ------- ------ ----------- ------------ ------------------- ------------------------------------------ -----------------------------
      - ------- ----- -- --------------------
      - ------- ----- -- -------------------------
      
      - ---------------------------
      -
      - ----------- ---
      -
      - ----------- ------------------
      - ----- -----------------
      - ---------
      -   ----- ----------
      - -----
      -   --------
      -     ----- --------
      -   ----------
      -     ----- ----------------
      -   -------------------
      -     ----- --------
      -   --------
      -     - -----------
      -     - --------
      -     - -----------------------
      -     - -------------
      -   --------------------
      -     - ---

      - ------------ ---- - -----------
      
      - ----------- ----------------------------
      - ----- ----
      - ---------
      -   ----- ------------
      - ------
      - - ---------- -------------- ---------
      -   ---------- -----------------------
      -   ------ -------
      -   -------------- --------------
      
      - ----------- ----------------------------
      - ----- -----------
      - ---------
      -   ----- ------------
      - --------
      -   --------- -------------------------
      -   ----- ----
      -   ----- ------------
      - ---------
      - - ----- --------------
      -   ----- -------
      -   ---------- -----------------
      - -----
      -------------
        ----- -------
      ------------
      - ---- -----
        --------- -------
        ------ -----
        ------- ------------

结论

Kubernetes 中的 Pod Security Policy(PSP)可以帮助运行容器应用程序的开发者强化环境安全性。使用 PSP,管理员可以限制容器中不能执行的操作,而开发者可以通过绑定 PSP 来为他们的应用程序提供更细粒度的访问控制。

在本文中,我们介绍了 PSP 的基本概念,如何创建和使用 PSP,以及 PSP 的最佳实践和示例代码。通过学习并使用 PSP,我们可以确保容器应用程序在 Kubernetes 集群中具有更高的安全性和可靠性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67074e09d91dce0dc8668f1f

纠错
反馈