Alibaba Cloud Linux 的 user namespace 安全加固

Linux支持用户命名空间(user namespace)特性,以实现进程在不同用户命名空间中拥有不同的用户ID(user id)与组ID(group id),进而实现权限隔离。然而,开启用户命名空间会增加系统面临权限提升攻击的风险(攻击者可能通过系统漏洞实现权限提升,从而获得特权权限,逃脱系统的权限控制)。本文将介绍Alibaba Cloud Linux 2/3系统中用户命名空间安全加固的相关系统配置。您可以根据实际需求调整这些参数,以满足特定业务场景的要求。

配置user namespace安全加固

您可以根据实际需求选择以下方法调整参数值,从而降低风险。

  • 使用user.max_user_namespaces设置在每个层级命名空间下可创建的子命名空间的最大数量。

  • 使用kernel.userns_max_level设置命名空间的最大嵌套深度。

  • 使用kernel.unprivileged_userns_clone设置非特权用户(没有CAP_SYS_ADMIN权限)创建新的命名空间权限。

user.max_user_namespaces安全加固

说明

该参数配置为0将禁用命名空间特性,从而禁止创建新的命名空间。

  • 查询每一层级命名空间下可以创建的子命名空间的最大数量。

    • 通过/proc接口查询。

      cat /proc/sys/user/max_user_namespaces
    • 通过sysctl查询。

      sysctl -n user.max_user_namespaces
  • 配置控制每一层级命名空间下可以创建的子命名空间的最大数量。

    <namespaces>需替换为所需创建的子命名空间的最大数量,例如关闭命名空间,<namespaces>应为0

    • 通过/proc接口配置。

      sudo sh -c 'echo <namespaces> > /proc/sys/user/max_user_namespaces'
    • 通过sysctl配置。

      sudo sysctl -w user.max_user_namespaces=<namespaces>

kernel.userns_max_level安全加固

限制说明

  • Alibaba Cloud Linux 2(内核4.19.91-27及更高版本)。

  • Alibaba Cloud Linux 3(内核5.10.134-12及更高版本)。

说明

该配置参数的合法值为0-33,参数为0表示关闭命名空间特性。参数默认值为33,与原生内核行为保持一致。

  • 查询命名空间的最大嵌套深度。

    • 通过/proc接口查询。

      cat /proc/sys/kernel/userns_max_level
    • 通过sysctl查询。

      sysctl -n kernel.userns_max_level
  • 配置命名空间的最大嵌套深度。

    <levels>需替换为所需创建的子命名空间的最大数量,例如关闭命名空间,<levels>应为0

    • 通过/proc接口配置。

      sudo sh -c 'echo <levels> > /proc/sys/kernel/userns_max_level'
    • 通过sysctl配置。

      sudo sysctl -w kernel.userns_max_level=<levels>

kernel.unprivileged_userns_clone安全加固

限制说明

  • Alibaba Cloud Linux 2(内核4.19.91-27及更高版本)。

  • Alibaba Cloud Linux 3(内核5.10.134-12及更高版本)。

说明

允许非特权用户创建新的命名空间往往会增大系统面临权限提升攻击的风险。

  • 参数为1:表示非特权用户(没有CAP_SYS_ADMIN权限)能够创建新的命名空间,与原生内核行为保持一致。

  • 参数为0:表示非特权用户(没有CAP_SYS_ADMIN权限)无法创建新的命名空间,此时只有特权用户(拥有CAP_SYS_ADMIN权限)才能创建新的命名空间。

  • 查询非特权用户(没有CAP_SYS_ADMIN权限)是否能创建新的命名空间。

    • 通过/proc接口查询。

      cat /proc/sys/kernel/unprivileged_userns_clone
    • 通过sysctl查询。

      sysctl -n kernel.unprivileged_userns_clone
  • 控制非特权用户(没有CAP_SYS_ADMIN权限)是否能创建新的命名空间。

    • 通过/proc接口配置。

      echo 0 > /proc/sys/kernel/unprivileged_userns_clone
    • 通过sysctl配置。

      sysctl -w kernel.unprivileged_userns_clone=0