安全性和强化指南

Red Hat OpenStack Platform 16.2

最佳实践、合规性和安全强化

OpenStack Documentation Team

摘要

本指南提供有关强化 Red Hat OpenStack Platform 环境安全性的良好实践建议和概念信息。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。

在 JIRA 中提供文档反馈

使用 Create Issue 表单对文档提供反馈。JIRA 问题将在 Red Hat OpenStack Platform Jira 项目中创建,您可以在其中跟踪您的反馈进度。

  1. 确保您已登录到 JIRA。如果您没有 JIRA 帐户,请创建一个帐户来提交反馈。
  2. 点击以下链接打开 Create Issue 页面: Create Issue
  3. 完成 SummaryDescription 字段。在 Description 字段中,包含文档 URL、章节或章节号以及问题的详细描述。不要修改表单中的任何其他字段。
  4. Create

第 1 章 安全简介

使用 Red Hat Openstack Platform (RHOSP)提供的工具来优先选择规划以及操作中的安全性,以满足用户隐私性和其数据的安全性。在实施安全标准时,会导致停机或数据被破坏。您的用例可能会受到需要传递审计和合规性进程的法律。

注意

按照本指南中的说明强化您的环境的安全性。但是,这些建议不能保证安全性或合规性。您必须根据环境的唯一要求评估安全性。

1.1. Red Hat OpenStack Platform 安全性

默认情况下,Red Hat OpenStack Platform (RHOSP) director 使用以下工具和访问控制来创建 overcloud:

SElinux
SELinux 通过提供访问控制来为 RHOSP 提供安全增强,每个进程都需要为每个操作具有显式权限。
Podman
podman 作为容器工具是 RHOSP 的安全选项,因为它不使用需要具有 root 访问权限的进程的客户端/服务器模型。
系统访问限制
您只能使用 director 在 overcloud 部署期间为 heat-admin 创建的 SSH 密钥或您在 overcloud 上创建的 SSH 密钥登录 overcloud 节点。您不能将 SSH 与密码用于登录 overcloud 节点,或使用 root 登录 overcloud 节点。

您可以根据机构的需求和信任级别,使用以下附加安全功能配置 director:

  • 公共 TLS 和 TLS-everywhere
  • 硬件安全模块与 OpenStack 密钥管理器(barbican)集成
  • 签名的镜像和加密卷
  • 使用工作流执行对密码和 fernet 密钥进行轮转

1.2. 了解 Red Hat OpenStack Platform 管理员角色

当您为用户授予 admin 角色时,此用户具有查看、更改、创建或删除任何项目的任何资源的权限。此用户可以创建可在项目间访问的共享资源,如公开可用的 glance 镜像或提供商网络。此外,具有 admin 角色的用户也可以创建和删除用户并管理角色。

您为其分配用户 admin 角色的项目是执行 openstack 命令的默认项目。例如,如果名为 development 的项目中的 admin 用户运行以下命令,则会在 development 项目中创建一个名为 internal-network 的网络:

openstack network create internal-network

admin 用户可以使用 --project 参数在任何项目中创建 internal-network

openstack network create internal-network --project testing

1.3. 识别 Red Hat OpenStack Platform 中的安全区

安全区是共享常见安全关注的资源、应用程序、网络和服务器。设计安全区,以便具有常见的身份验证和授权要求和用户。您可以根据云架构、环境中可接受的信任级别以及组织的标准化要求,根据需要定义您自己的安全区。区域及其信任要求可能会因云实例是公共、私有还是混合而有所不同。

例如,您可以将 Red Hat OpenStack Platform 的默认安装分为以下区:

表 1.1. 安全区

zone网络详情

公开

external

公共区托管外部网络、公共 API 和浮动 IP 地址,用于实例的外部连接。此区域允许从管理控制之外的网络访问,并且是云基础架构的不受信任的区域。

Guest

tenant

guest 区托管项目网络。对于公有云和私有云供应商,它不被信任,允许不受限制地访问实例。

存储访问

storage, storage_mgmt

存储访问区域用于存储管理、监控和集群以及存储流量。

控制

ctlplane, internal_api, ipmi

control 区域还包括 undercloud、主机操作系统、服务器硬件、物理网络和 Red Hat OpenStack Platform director control plane。

1.4. 在 Red Hat OpenStack Platform 中查找安全区

运行以下命令来收集有关 Red Hat OpenStack Platform 部署物理配置的信息:

流程

  1. 登录到 undercloud,源 stackrc:

    $ source /home/stack/stackrc
  2. 运行 openstack subnet list 以将分配的 ip 网络与其关联的区域匹配:

    openstack subnet list -c Name -c Subnet
    +---------------------+------------------+
    | Name                | Subnet           |
    +---------------------+------------------+
    | ctlplane-subnet     | 192.168.101.0/24 |
    | storage_mgmt_subnet | 172.16.105.0/24  |
    | tenant_subnet       | 172.16.102.0/24  |
    | external_subnet     | 10.94.81.0/24    |
    | internal_api_subnet | 172.16.103.0/24  |
    | storage_subnet      | 172.16.104.0/24  |
    +---------------------+------------------+
  3. 运行 openstack server list 以列出基础架构中的物理服务器:

    openstack server list -c Name -c Networks
    +-------------------------+-------------------------+
    | Name                    | Networks                |
    +-------------------------+-------------------------+
    | overcloud-controller-0  | ctlplane=192.168.101.15 |
    | overcloud-controller-1  | ctlplane=192.168.101.19 |
    | overcloud-controller-2  | ctlplane=192.168.101.14 |
    | overcloud-novacompute-0 | ctlplane=192.168.101.18 |
    | overcloud-novacompute-2 | ctlplane=192.168.101.17 |
    | overcloud-novacompute-1 | ctlplane=192.168.101.11 |
    +-------------------------+-------------------------+
  4. 使用 openstack server list 命令中的 ctlplane 地址查询物理节点的配置:

    ssh heat-admin@192.168.101.15 ip addr

1.5. 连接安全区

您必须仔细配置跨不同信任级别或身份验证要求的多个安全区的组件。这些连接通常是网络架构中的弱点。确保配置这些连接,以满足所连接任何区的最高信任级别的安全要求。在很多情况下,连接的区的安全性控制是主要问题,因为攻击的可能性较高。区域满足了额外的潜在攻击点,并为攻击者增加将攻击迁移到部署更敏感的部分的机会。

在某些情况下,OpenStack 操作器可能考虑在比它所在的任何区域更高的标准来保护集成点。根据上述 API 端点示例,如果这些区域没有完全隔离,则遍历来自公共区的公共 API 端点可能会以公共区为目标,或获得对管理区域中内部或管理员 API 的访问。

OpenStack 的设计使得隔离安全区比较困难。由于核心服务通常至少跨越两个区域,因此在将安全控制应用到它们时,必须考虑特殊考虑。

1.6. 威胁缓解方案

大多数类型的云部署(公共、私有或混合)都暴露于某种安全威胁。以下实践可帮助缓解安全威胁:

  • 应用最小特权的原则。
  • 在内部和外部接口中使用加密。
  • 使用集中式身份管理。
  • 保持 Red Hat OpenStack Platform 更新。

计算服务可以为恶意的攻击者提供 DDoS 和破坏强制攻击的工具。防止方法包括出口安全组、流量检查、入侵检测系统以及客户领导和感知。对于公共网络或可访问公共网络(如互联网)可访问的部署,请确保处理和基础架构来检测和解决出站滥用。

第 2 章 记录您的 RHOSP 环境

记录系统组件、网络、服务和软件对于识别安全问题、攻击向量和可能的安全区桥接点非常重要。Red Hat OpenStack Platform (RHOSP)部署的文档应包括以下信息:

  • RHOSP 生产、开发和测试环境中的系统组件、网络、服务和软件的描述。
  • 任何临时资源的清单,如虚拟机或虚拟磁盘卷。

2.1. 记录系统角色

Red Hat OpenStack Platform (RHOSP)部署中的每个节点服务于特定的角色,无论是云的基础架构,还是提供云资源。

贡献基础架构的节点运行与云相关的服务,如消息队列服务、存储管理、监控、网络和其他服务,以支持操作和置备云。基础架构角色示例包括:

  • Controller
  • Networker
  • 数据库
  • Telemetry

提供云资源的节点为云上运行的实例提供计算或存储容量。资源角色示例包括:

  • CephStorage
  • Compute
  • ComputeOvsDpdk
  • ObjectStorage

记录环境中使用的系统角色。这些角色可以在用于部署 RHOSP 的模板中识别。例如,环境中每个角色都有一个 NIC 配置文件。

流程

  1. 检查部署的现有模板,以了解指定当前正在使用的角色的文件。环境中使用的每个角色有一个 NIC 配置文件。在以下示例中,RHOSP 环境包含 ComputeHCI 角色、Compute 角色和 Controller 角色:

    $ cd ~/templates
    $ tree
    .
    ├── environments
    │   └── network-environment.yaml
    ├── hci.yaml
    ├── network
    │   └── config
    │       └── multiple-nics
    │           ├── computehci.yaml
    │           ├── compute.yaml
    │           └── controller.yaml
    ├── network_data.yaml
    ├── plan-environment.yaml
    └── roles_data_hci.yaml
  2. RHOSP 环境的每个角色执行许多相互相关的服务。您可以通过检查 roles 文件来记录各个角色使用的服务。

    1. 如果为您的模板生成了一个 roles 文件,您可以在 ~/templates 目录中找到该文件:

      $ cd ~/templates
      $ find . -name *role*
      > ./templates/roles_data_hci.yaml
    2. 如果没有为您的模板生成 roles 文件,您可以为当前用于检查文档的角色生成一个角色:

      $ openstack overcloud roles generate \
      > --roles-path /usr/share/openstack-tripleo-heat-templates/roles \
      > -o roles_data.yaml Controller Compute

2.2. 创建硬件清单

您可以通过查看内省期间收集的数据来获取 Red Hat OpenStack Platform 部署的硬件信息。内省从有关 CPU、内存、磁盘等的节点收集硬件信息。

流程

  1. 从 undercloud,提供 stackrc 文件:

    $ source ~/stackrc
  2. 列出环境中的节点:

    $ openstack baremetal node list -c Name
    +--------------+
    | Name         |
    +--------------+
    | controller-0 |
    | controller-1 |
    | controller-2 |
    | compute-0    |
    | compute-1    |
    | compute-2    |
    +--------------+
  3. 对于从中收集信息的每个裸机节点,并运行以下命令来检索内省数据:

    $ openstack baremetal introspection data save <node> | jq

    <node > 替换为您在第 1 步中检索的列表中节点的名称。

  4. 可选: 要将输出限制为特定类型的硬件,您可以检索清单密钥列表并查看特定密钥的内省数据:

    1. 运行以下命令以从内省数据中获取顶层键列表:

      $ openstack baremetal introspection data save controller-0 | jq '.inventory | keys'
      
      [
        "bmc_address",
        "bmc_v6address",
        "boot",
        "cpu",
        "disks",
        "hostname",
        "interfaces",
        "memory",
        "system_vendor"
      ]
    2. 选择一个键,如 disks,并运行以下命令以获取更多信息:

      $ openstack baremetal introspection data save controller-1 | jq '.inventory.disks'
      [
        {
          "name": "/dev/sda",
          "model": "QEMU HARDDISK",
          "size": 85899345920,
          "rotational": true,
          "wwn": null,
          "serial": "QM00001",
          "vendor": "ATA",
          "wwn_with_extension": null,
          "wwn_vendor_extension": null,
          "hctl": "0:0:0:0",
          "by_path": "/dev/disk/by-path/pci-0000:00:01.1-ata-1"
        }
      ]

2.3. 创建软件清单

记录在 Red Hat OpenStack Platform (RHOSP)基础架构中部署的节点中使用的软件组件。在评估库、应用程序或软件中漏洞的影响时,系统数据库、RHOSP 软件服务和支持组件(如负载均衡器、DNS 或 DHCP 服务)至关重要。

流程

  1. 确保您知道可能受恶意活动影响的系统和服务的入口点。在 undercloud 上运行以下命令:

    $ cat /etc/hosts
    $ source stackrc ; openstack endpoint list
    $ source overcloudrc ; openstack endpoint list
  2. RHOSP 部署到容器化服务中,因此您可以通过检查该节点上运行的容器来查看 overcloud 节点上的软件组件。使用 ssh 连接到 overcloud 节点并列出正在运行的容器。例如,若要查看 compute-0 上的 overcloud 服务,请运行以下命令:

    $ ssh heat-admin@compute-0 podman ps

第 3 章 使用 TLS 和 PKI 保护 Red Hat OpenStack 部署

Red Hat OpenStack Platform 包括许多网络和端点,它们处理您可以保护的敏感或机密数据。使用传输层安全(TLS)时,您可以使用对称密钥加密保护流量。密钥和密码在 TLS 握手中协商,这需要通过称为证书颁发机构(CA)的中间的共享信任来验证服务器的身份。

公钥基础架构(PKI)是一种通过证书颁发机构验证实体的框架。

3.1. 公钥基础架构(PKI)的组件

PKI 的核心组件在下表中显示:

表 3.1. 主要条款

术语定义

结束实体

使用数字证书验证自身的用户、流程或系统。

证书颁发机构(CA)

CA 是由端点实体信任的实体,以及验证最终实体的依赖方。

依赖方

依赖方接收数字证书作为最终用户实体验证,并且能够验证数字证书。

数字证书

签名的公钥证书具有可验证实体和公钥,并由 CA 发布。当 CA 为证书签名时,它会从使用其私钥加密的证书创建一个消息摘要。您可以使用与 CA 关联的公钥验证签名。X.509 标准用于定义证书。

注册授权机构(RA)

RA 是一个可选专用授权,可在 CA 发布证书前执行管理功能,如验证终端实体。如果没有 RA,CA 会验证结束实体。

证书撤销列表(CRL)

CRL 是已撤销的证书序列号列表。在 PKI 模型中不信任提供已撤销序列号的证书的最终实体。

CRL 签发者

CA 委派证书撤销列表的可选系统。

证书仓库

存储和查询最终实体证书和证书撤销列表的位置。

3.2. 证书颁发机构要求和建议

您必须获得由广泛认可的证书颁发机构(CA)签名的证书,才能公开可用的 Red Hat OpenStack Platform Dashboards 或公开可访问的 API。

您必须为每个使用 TLS 保护的端点提供 DNS 域或子域。您提供的域用于创建 CA 发布的证书。客户使用 DNS 名称访问仪表板或 API,以便 CA 能够验证端点。

红帽建议使用单独的和内部管理的 CA 来保护内部流量。这使得云部署人员能够控制其私钥基础架构(PKI)实施,并使内部系统请求、签名和部署证书变得更加容易。

您可以在 overcloud 端点上启用 SSL/TLS。由于每天配置 TLS 所需的证书数量(TLS-e),director 与 Red Hat Identity Management (IdM)服务器集成,以充当证书颁发机构并管理 overcloud 证书。有关配置 TLS-e 的更多信息,请参阅使用 Ansible 实施 TLS-e

要在 OpenStack 组件中检查 TLS 支持的状态,请参阅 TLS 启用状态列表

如果要使用具有您自己的证书颁发机构的 SSL 证书,请参阅在 overcloud 公共端点中启用 SSL/TLS

注意

这将仅在公开访问的端点中使用 SSL/TLS 配置 Red Hat OpenStack Platform。

3.3. 识别环境中的 TLS 版本

重要

Red Hat OpenStack 平台已弃用 TLS 版本 1.0。另外,对于 NIST 批准,必须至少使用 TLS 1.2。如需更多信息,请参阅 选择、配置和使用传输层安全(TLS)实施的指南

您可以使用 cipherscan 来决定部署提供的 TLS 版本。Cipherscan 可以从 https://github.com/mozilla/cipherscan 克隆。这个示例输出显示从 horizon 接收的结果:

注意

从非生产环境系统运行 cipherscan,因为它可能会在第一次运行时安装其他依赖项。

$ ./cipherscan https://openstack.lab.local
..............................
Target: openstack.lab.local:443

prio  ciphersuite                  protocols  pfs                 curves
1     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2    ECDH,P-256,256bits  prime256v1
2     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2    ECDH,P-256,256bits  prime256v1
3     DHE-RSA-AES128-GCM-SHA256    TLSv1.2    DH,1024bits         None
4     DHE-RSA-AES256-GCM-SHA384    TLSv1.2    DH,1024bits         None
5     ECDHE-RSA-AES128-SHA256      TLSv1.2    ECDH,P-256,256bits  prime256v1
6     ECDHE-RSA-AES256-SHA384      TLSv1.2    ECDH,P-256,256bits  prime256v1
7     ECDHE-RSA-AES128-SHA         TLSv1.2    ECDH,P-256,256bits  prime256v1
8     ECDHE-RSA-AES256-SHA         TLSv1.2    ECDH,P-256,256bits  prime256v1
9     DHE-RSA-AES128-SHA256        TLSv1.2    DH,1024bits         None
10    DHE-RSA-AES128-SHA           TLSv1.2    DH,1024bits         None
11    DHE-RSA-AES256-SHA256        TLSv1.2    DH,1024bits         None
12    DHE-RSA-AES256-SHA           TLSv1.2    DH,1024bits         None
13    ECDHE-RSA-DES-CBC3-SHA       TLSv1.2    ECDH,P-256,256bits  prime256v1
14    EDH-RSA-DES-CBC3-SHA         TLSv1.2    DH,1024bits         None
15    AES128-GCM-SHA256            TLSv1.2    None                None
16    AES256-GCM-SHA384            TLSv1.2    None                None
17    AES128-SHA256                TLSv1.2    None                None
18    AES256-SHA256                TLSv1.2    None                None
19    AES128-SHA                   TLSv1.2    None                None
20    AES256-SHA                   TLSv1.2    None                None
21    DES-CBC3-SHA                 TLSv1.2    None                None

Certificate: trusted, 2048 bits, sha256WithRSAEncryption signature
TLS ticket lifetime hint: None
NPN protocols: None
OCSP stapling: not supported
Cipher ordering: server
Curves ordering: server - fallback: no
Server supports secure renegotiation
Server supported compression methods: NONE
TLS Tolerance: yes

Intolerance to:
 SSL 3.254           : absent
 TLS 1.0             : PRESENT
 TLS 1.1             : PRESENT
 TLS 1.2             : absent
 TLS 1.3             : absent
 TLS 1.4             : absent

扫描服务器时,Cipherscan 公告对特定 TLS 版本的支持,这是将要协商的最高 TLS 版本。如果目标服务器正确遵循 TLS 协议,它将响应相互支持的最高版本,这可能低于 Cipherscan 最初发布的版本。如果服务器正在进行使用该特定版本与客户端建立连接,则它不被视为对那个协议版本的容错。如果没有建立连接(使用指定的版本或任何较低版本),则不支持该协议版本存在。例如:

Intolerance to:
 SSL 3.254           : absent
 TLS 1.0             : PRESENT
 TLS 1.1             : PRESENT
 TLS 1.2             : absent
 TLS 1.3             : absent
 TLS 1.4             : absent

在这个输出中,TLS 1.0TLS 1.1 的容限报告为 PRESENT,这意味着无法建立连接,并且 Cipherscan 在广告对这些 TLS 版本的支持时无法连接。因此,最好认为那些在扫描的服务器上没有启用协议的版本(和任何较低)。

3.4. OpenStack 的身份管理(IdM)服务器建议

红帽提供了以下信息以帮助您集成 IdM 服务器和 OpenStack 环境。

有关为 IdM 安装准备 Red Hat Enterprise Linux 的详情,请参考 安装身份管理

运行 ipa-server-install 命令来安装和配置 IdM。您可以使用命令参数跳过交互式提示。使用以下建议,以便您的 IdM 服务器可以与您的 Red Hat OpenStack Platform 环境集成:

表 3.2. 参数建议

选项建议

--admin-password

请注意您提供的值。配置 Red Hat OpenStack Platform 以用于 IdM 时,您将需要此密码。

--ip-address

请注意您提供的值。undercloud 和 overcloud 节点需要网络访问此 ip 地址。

--setup-dns

使用这个选项在 IdM 服务器上安装集成的 DNS 服务。undercloud 和 overcloud 节点使用 IdM 服务器进行域名解析。

--auto-forwarders

使用这个选项使用 /etc/resolv.conf 中的地址作为 DNS 转发器。

--auto-reverse

使用这个选项解析 IdM 服务器 IP 地址的反向记录和区域。如果反向记录或区域无法解析,IdM 会创建反向区域。这简化了 IdM 部署。

--ntp-server, --ntp-pool

您可以使用这两个选项或其中一个选项来配置 NTP 源。IdM 服务器和 OpenStack 环境必须具有正确的和同步时间。

您必须打开 IdM 所需的防火墙端口,以启用与 Red Hat OpenStack Platform 节点的通信。如需更多信息,请参阅打开 IdM 所需的端口

3.5. 使用 Ansible 实现 TLS-e

您可以使用新的 tripleo-ipa 方法在 overcloud 端点上启用 SSL/TLS,在任何位置称为 TLS (TLS-e)。由于所需的证书数量,Red Hat OpenStack Platform 与 Red Hat Identity Management (IdM)集成。当您使用 tripleo-ipa 配置 TLS-e 时,IdM 是证书颁发机构。

先决条件

确保 undercloud 的所有配置步骤(如创建 stack 用户)已完成。如需了解更多详细信息,请参阅 Director 安装和使用 以了解更多详细信息

流程

使用以下步骤在 Red Hat OpenStack Platform 的新安装或您要使用 TLS-e 配置的现有部署中实施 TLS-e。如果在预置备节点中使用 TLS-e 部署 Red Hat OpenStack Platform,则必须使用此方法。

注意

如果您要为现有环境实施 TLS-e,则需要运行命令,如 openstack undercloud installopenstack overcloud deploy。这些过程是幂等的,仅调整现有的部署配置,以匹配更新的模板和配置文件。

  1. 配置 /etc/resolv.conf 文件:

    /etc/resolv.conf 中设置 undercloud 上的适当的搜索域和名称服务器。例如,如果部署域是 example.com,并且 FreeIPA 服务器的域是 bigcorp.com,那么将以下行添加到 /etc/resolv.conf 中:

    search example.com bigcorp.com
    nameserver $IDM_SERVER_IP_ADDR
  2. 安装所需的软件:

    sudo dnf install -y python3-ipalib python3-ipaclient krb5-devel
  3. 使用特定于您的环境的值导出环境变量:

    export IPA_DOMAIN=bigcorp.com
    export IPA_REALM=BIGCORP.COM
    export IPA_ADMIN_USER=$IPA_USER 1
    export IPA_ADMIN_PASSWORD=$IPA_PASSWORD 2
    export IPA_SERVER_HOSTNAME=ipa.bigcorp.com
    export UNDERCLOUD_FQDN=undercloud.example.com 3
    export USER=stack
    export CLOUD_DOMAIN=example.com
    1 2
    IdM 用户凭证是一个管理用户,它可以添加新主机和服务。
    3
    UNDERCLOUD_FQDN 参数的值与 /etc/hosts 中的第一个主机名到 IP 地址映射匹配。
  4. 在 undercloud 上运行 undercloud-ipa-install.yaml ansible playbook:

    ansible-playbook \
    --ssh-extra-args "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
    /usr/share/ansible/tripleo-playbooks/undercloud-ipa-install.yaml
  5. 在 undercloud.conf 中添加以下参数

    undercloud_nameservers = $IDM_SERVER_IP_ADDR
    overcloud_domain_name = example.com
  6. [可选] 如果您的 IPA 域与您的 IPA 域不匹配,请设置 certmonger_krb_realm 参数的值:

    1. /home/stack/hiera_override.yaml 中设置 certmonger_krb_realm 的值:

      parameter_defaults:
        certmonger_krb_realm = EXAMPLE.COMPANY.COM
    2. undercloud.conf 中的 custom_env_files 参数的值设置为 /home/stack/hiera_override.yaml

      custom_env_files = /home/stack/hiera_override.yaml
  7. 部署 undercloud:

    openstack undercloud install

验证

通过完成以下步骤验证 undercloud 是否已正确注册:

  1. 列出 IdM 中的主机:

    $ kinit admin
    $ ipa host-find
  2. 确认 undercloud 上存在 /etc/novajoin/krb5.keytab

    ls /etc/novajoin/krb5.keytab
注意

novajoin 目录名称仅用于传统的命名目的。

在 overcloud 上配置 TLS-e

当您随处使用 TLS 部署 overcloud 时,来自 Undercloud 和 Overcloud 的 IP 地址将自动注册到 IdM。

  1. 在部署 overcloud 之前,创建一个 YAML 文件 tls-parameters.yaml,其内容类似如下。您选择的值将特定于您的环境:

    parameter_defaults:
        DnsSearchDomains: ["example.com"]
        DnsServers: ["192.168.1.13"]
        CloudDomain: example.com
        CloudName: overcloud.example.com
        CloudNameInternal: overcloud.internalapi.example.com
        CloudNameStorage: overcloud.storage.example.com
        CloudNameStorageManagement: overcloud.storagemgmt.example.com
        CloudNameCtlplane: overcloud.ctlplane.example.com
        IdMServer: freeipa-0.redhat.local
        IdMDomain: redhat.local
        IdMInstallClientPackages: False
    
    resource_registry:
          OS::TripleO::Services::IpaClient: /usr/share/openstack-tripleo-heat-templates/deployment/ipa/ipaservices-baremetal-ansible.yaml
    • OS::TripleO::Services::IpaClient 参数显示的值会覆盖 enable-internal-tls.yaml 文件中的默认设置。您必须确保 openstack overcloud deploy 命令中的 tls-parameters.yaml 文件遵循 enable-internal-tls.yaml
    • 有关用来实现 TLS-e 的参数的更多信息,请参阅 tripleo-ipa 的参数
  2. [可选] 如果您的 IPA 域与您的 IPA 域不匹配,还必须在 tls-parameters.yaml 文件中包含 CertmongerKerberosRealm 参数的值:

        CertmongerKerberosRealm: EXAMPLE.COMPANY.COM
  3. 部署 overcloud。您需要在部署命令中包含 tls-parameters.yaml :

    DEFAULT_TEMPLATES=/usr/share/openstack-tripleo-heat-templates/
    CUSTOM_TEMPLATES=/home/stack/templates
    
    openstack overcloud deploy \
    -e ${DEFAULT_TEMPLATES}/environments/ssl/tls-everywhere-endpoints-dns.yaml \
    -e ${DEFAULT_TEMPLATES}/environments/services/haproxy-public-tls-certmonger.yaml \
    -e ${DEFAULT_TEMPLATES}/environments/ssl/enable-internal-tls.yaml \
    -e ${CUSTOM_TEMPLATES}/tls-parameters.yaml \
    ...
  4. 通过查询 keystone 获取端点列表来确认每个端点正在使用 HTTPS:

    openstack endpoint list

3.6. tripleo-ipa 的参数

使用云的完全限定域名(FQDN)定义 tripleo-ipa 所需的云名称和云域参数。例如,如果 FQDN 为 overcloud.example.com,请使用以下值:

  • CloudDomain: example.com
  • cloudName: overcloud.example.com
  • CloudNameCtlplane: overcloud.ctlplane.example.com
  • CloudNameInternal: overcloud.internalapi.example.com
  • CloudNameStorage: overcloud.storage.example.com
  • CloudNameStorageManagement: overcloud.storagemgmt.example.com

根据您的环境要求设置以下附加参数:

CertmongerKerberosRealm
CertmongerKerberosRealm 参数设置为 IPA 域的值。如果 IPA 域与 IPA 域不匹配,则需要此项。
DnsSearchDomains
DnsSearchDomains 参数是一个用逗号分开的列表。如果 IdM 服务器的域与云域不同,请在 DnsSearchDomains 参数中包含 IdM 服务器的域。
DnsServers
DnsServers 参数设置为反映 IdM 服务器的 IP 地址的值。
EnableEtcdInternalTLS
如果在分布式计算节点(DCN)构架上部署 TLSe,您必须添加 EnableEtcdInternalTLS 参数,值为 True
IDMInstallClientPackages
如果您预置备计算节点,请将 IDMInstallClientPackages 参数设置为 True。否则,将值设为 False
IDMModifyDNS
IDMModifyDNS 参数设置为 false,以禁用 Red Hat Identity Server 上 overcloud 节点的自动 IP 注册。
IdmDomain
IdmDomain 参数设置为红帽身份服务器的 FQDN 的域部分。您指定的值也用作 IdM 域的值。如果 IdM 域和 IdM 域不同,请使用 CertmongerKerberosRealm 参数明确设置域。
IdmServer
IdmServer 参数设置为 Red Hat Identity 服务器的 FQDN。如果您使用复制的 IdM 环境,请使用以逗号分隔的列表设置多个值。有关 IdM 副本的更多信息,请参阅安装 IdM 副本

3.7. 在任何 TLS 下加密 memcached 流量(TLS-e)

该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息

现在,您可以使用 TLS-e 加密 memcached 流量。此功能可用于 novajoin 和 tripleo-ipa :

  1. 创建名为 memcached.yaml 的环境文件,其内容如下,以添加对 memcached 的 TLS 支持:

    parameter_defaults:
        MemcachedTLS: true
        MemcachedPort: 11212
  2. 在 overcloud 部署过程中包含 memcached.yaml 环境文件:

    openstack overcloud deploy --templates \
    -e /usr/share/openstack-tripleo-heat-templates/environments/ssl/enable-internal-tls.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/ssl/tls-everywhere-endpoints-dns.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/services/haproxy-public-tls-certmonger.yaml \
    -e /home/stack/memcached.yaml
    ...

其它资源

3.8. 增加私钥的大小

您可以通过增加用于为加密服务流量创建证书的私钥大小来提高安全性。默认 RHOSP 私钥大小为 2048 位,与国家标准与技术(NIST)推荐最少推荐。

  • 使用 CertificateKeySize 参数来全局更改私钥大小。
  • 使用特定于服务的参数,如 RedisCertificateKeySize、修改特定的私钥或覆盖全局 CertificateKeySize 参数。

在环境 heat 模板中使用这些参数,并在 overcloud 部署命令中包含模板。如果您已经部署了 overcloud,则必须使用您最初使用的相同模板重新运行相同的 openstack overcloud deploy 命令,并包含新参数以使更改生效。

在以下示例中,私钥的全局值为 4096redis 的私钥是 2048,因为 RedisCertificateKeySize 覆盖了全局参数:

示例

parameter_defaults:
    CertificateKeySize: '4096'
    RedisCertificateKeySize: '2048'

第 4 章 身份和访问管理

Identity 服务(keystone)为 Red Hat OpenStack Platform 环境中的云用户提供身份验证和授权。您可以使用 Identity 服务进行直接验证,或者将其配置为使用外部身份验证方法满足您的安全要求或与当前的身份验证基础架构匹配。

4.1. Red Hat OpenStack Platform fernet 令牌

身份验证后,Identity 服务(keystone):

  • 发出加密的 bearer 令牌,称为 fernet 令牌。此令牌代表您的身份。
  • 授权您根据角色执行操作。

默认情况下,每个 fernet 令牌都保持在一小时内有效。这允许用户执行一系列任务,而无需重新验证。

Fernet 是替换 UUID 令牌提供程序的默认令牌提供程序。

4.2. OpenStack Identity 服务实体

Red Hat OpenStack Identity 服务 (keystone) 可以识别以下实体:

用户
OpenStack Identity service (keystone)用户是身份验证的原子单元。必须为项目分配一个角色才能进行身份验证。
OpenStack Identity service groups 是用户的逻辑分组。组可以在特定角色下提供对项目的访问权限。管理组而不是用户可以简化角色的管理。
角色
OpenStack Identity service 角色定义了分配给分配了这些角色的用户或组访问的 OpenStack API。
项目
OpenStack Identity service 项目是隔离的用户组,它们对物理资源共享配额和从那些物理资源构建的虚拟基础架构具有共同访问权限。
Domains
OpenStack Identity 服务域是项目、用户和组的高级安全界限。您可以使用 OpenStack 身份域集中管理所有基于 keystone 的身份组件。Red Hat OpenStack Platform 支持多个域。您可以使用单独的身份验证后端代表不同域的用户。

4.3. 使用 keystone 进行身份验证

您可以调整 OpenStack Identity 服务(keystone)所需的身份验证安全要求。

表 4.1. Identity 服务身份验证参数

参数

描述

KeystoneChangePasswordUponFirstUse

启用此选项要求用户在创建用户时或管理重置时更改密码。

KeystoneDisableUserAccountDaysInactive

在被视为"主动"并自动禁用(锁定)前,用户可以经过验证的最大天数。

KeystoneLockoutDuration

超过用户帐户的最大数量(如 KeystoneLockoutFailureAttempts指定)的最大数量时,用户帐户会被锁定。

KeystoneLockoutFailureAttempts

KeystoneLockoutDuration 指定的秒数内,用户可以在用户帐户锁定前验证的次数上限。

KeystoneMinimumPasswordAge

在用户可以更改密码之前必须使用密码的天数。这可防止用户立即更改密码,以擦除密码历史记录并重复使用旧密码。

KeystonePasswordExpiresDays

在要求用户更改密码前密码被视为有效的天数。

KeystoneUniqueLastPasswordCount

这将控制在历史记录中保留的之前用户密码迭代的数量,以便强制新创建的密码是唯一的。

4.4. 使用 Identity service heat 参数停止无效的登录尝试

重复的登录尝试可能是尝试强制攻击的符号。在重复失败登录尝试后,您可以使用 Identity Service 来限制对帐户的访问。

先决条件

  • 已安装 Red Hat OpenStack Platform director 环境。
  • 以 stack 身份登录 director。

流程

  1. 要配置用户在用户帐户锁定前无法进行身份验证的次数上限,请在环境文件中设置 KeystoneLockoutFailureAttemptsKeystoneLockoutDuration heat 参数的值。在以下示例中,KeystoneLockoutDuration 被设置为一小时:

    parameter_defaults
        KeystoneLockoutDuration: 3600
        KeystoneLockoutFailureAttempts: 3
  2. 在部署脚本中包含环境文件。当您在之前部署的环境中运行部署脚本时,会使用附加参数更新:

    openstack overcloud deploy --templates \
    ...
    -e keystone_config.yaml
    ...

4.5. 使用外部身份提供程序进行身份验证

您可以使用外部身份提供程序(IdP)向 OpenStack 服务提供商(SP)进行身份验证。SPS 是 OpenStack 云提供的服务。

当您使用单独的 IdP 时,外部身份验证凭证与其他 OpenStack 服务使用的数据库分开。这种分离降低了存储凭证中断的风险。

每个外部 IdP 都有一个一对一的映射到 OpenStack Identity 服务(keystone)域。您可以在 Red Hat OpenStack Platform 中有多个已存在的域。

外部身份验证提供了一种使用现有凭证访问 Red Hat OpenStack Platform 中的资源的方法,而无需创建额外的身份。该凭证由用户的 IdP 维护。

您可以使用 Red Hat Identity Management (IdM)和 Microsoft Active Directory Domain Services (AD DS)等 IdP 进行身份管理。在此配置中,OpenStack Identity 服务对 LDAP 用户数据库具有只读访问权限。对基于用户或组角色的 API 访问的管理由 keystone 执行。角色通过使用 OpenStack Identity 服务分配给 LDAP 帐户。

4.5.1. LDAP 集成如何工作

在下图中,Pcloud 使用加密的 LDAPS 连接连接到 Active Directory 域控制器。当用户登录到 horizon 时,keystone 会收到提供的用户凭证并将其传递给 Active Directory。

AD 集成 keystone v3

第 5 章 策略(policy)

每个 OpenStack 服务都包含由访问策略管理的资源。例如,资源可能包含以下功能:

  • 创建和启动实例的权限
  • 将卷附加到实例的功能

如果您是 Red Hat OpenStack Platform (RHOSP)管理员,您可以创建自定义策略来描述具有不同访问权限级别的新角色,或更改现有角色的默认行为。

重要

红帽不支持自定义角色和策略。语法错误可能会导致停机,错误应用的授权可能会对安全性或可用性造成负面影响。如果在生产环境中需要自定义策略,请联系红帽支持例外。

5.1. 查看现有策略

服务的策略文件通常存在于 /etc/$service 目录中。例如,Compute (nova)的 policy.json 文件的完整路径是 /etc/nova/policy.json

有两个重要的架构更改会影响如何找到现有策略:

  • Red Hat OpenStack Platform 现已容器化。

    • 如果您从服务容器查看策略文件,则策略文件位于传统路径中:

      /etc/$service/policy.json

    • 如果您从服务容器外部查看策略文件,则策略文件位于以下路径中:

      /var/lib/config-data/puppet-generated/$service/etc/$service/policy.json

  • 每个服务均在代码中提供默认策略,并且文件仅在手动创建时可用,或者使用 oslopolicy 工具生成它们。要生成策略文件,请使用容器中的 oslopolicy-policy-generator,如下例所示:

    podman exec -it keystone oslopolicy-policy-generator --namespace keystone

默认情况下,生成的策略由 oslo.policy CLI 工具推送到 stdout。

5.2. 了解服务策略

服务策略文件语句是别名定义或规则。别名定义存在于文件的顶部。以下列表包含计算(nova)生成的 policy.json 文件中的别名定义说明:

  • "context_is_admin": "role:admin"

    当目标后出现 rule:context_is_admin 时,策略会在允许该操作前检查用户是否使用管理上下文运行。

  • "admin_or_owner": "is_admin:True or project_id:%(project_id)s"

    admin_or_owner 出现在目标后,策略会检查用户是否为 admin,或者其项目 ID 与目标对象自己的项目 ID 匹配,然后再允许该操作。

  • "admin_api": "is_admin:True

    admin_api 出现在目标后,策略会在允许该操作前检查用户是否为 admin。

5.3. 策略语法

policy.json 文件支持某些运算符,以便您可以控制这些设置的目标范围。例如,以下 keystone 设置包含只有 admin 用户可以创建用户的规则:

"identity:create_user": "rule:admin_required"

: 字符左侧的部分描述了特权,右侧的部分则定义谁可以使用特权。您还可以使用右侧的 operator 来进一步控制范围:

  • ! - 没有用户(包括管理员)才能执行此操作。
  • @ and "" - 任何用户可以执行此操作。
  • not, and, or - 可以使用标准的操作符。

例如,以下设置意味着没有用户创建新用户的权限:

"identity:create_user": "!"

5.4. 使用策略文件进行访问控制

重要

红帽不支持自定义角色或策略。语法错误或应用错误授权可能会对安全或可用性造成负面影响。如果在生产环境中需要自定义角色或策略,请联系红帽支持例外。

要覆盖默认规则,请为适当的 OpenStack 服务编辑 policy.json 文件。例如,Compute 服务在 nova 目录中有一个 policy.json,这是从容器内查看容器化服务的文件的正确位置。

注意
  • 您必须在生产环境中实施策略文件之前,先测试它们对策略文件的更改。
  • 您必须检查对访问控制策略的任何更改不会意外弱弱任何资源的安全性。另外,对 policy.json 文件的任何更改都会立即生效,不需要重启服务。

示例:创建电源用户角色

要自定义 keystone 角色的权限,请更新服务的 policy.json 文件。这意味着您可以更精细地定义分配给某一类用户的权限。本例使用以下权限为您的部署创建一个 电源用户角色

  • 启动实例。
  • 停止一个实例。
  • 管理附加到实例的卷。

此角色的目的是为某些用户授予额外的权限,而无需授予 admin 访问权限。要使用这些权限,您必须为自定义角色授予以下权限:

  • 启动实例:" os_compute_api:servers:start": "role:PowerUsers"
  • 停止一个实例:" os_compute_api:servers:stop": "role:PowerUsers"
  • 将实例配置为使用特定卷:" os_compute_api:servers:create:attach_volume": "role:PowerUsers"
  • 列出附加到实例的卷:" os_compute_api:os-volumes-attachments:index": "role:PowerUsers"
  • Attach a volume: "os_compute_api:os-volumes-attachments:create": "role:PowerUsers"
  • 查看附加卷的详情: "os_compute_api:os-volumes-attachments:show": "role:PowerUsers"
  • 更改附加到实例的卷:" os_compute_api:os-volumes-attachments:update": "role:PowerUsers"
  • 删除附加到实例的卷:" os_compute_api:os-volumes-attachments:delete": "role:PowerUsers"
注意

修改 policy.json 文件时,您可以覆盖默认策略。因此,PowerUsers 的成员是唯一可以执行以下操作的用户。要允许 管理员用户 保留这些权限,您可以为 admin_or_power_user 创建规则。您还可以使用一些基本条件逻辑来定义 role:PowerUsers 或 role:Admin

  1. 创建自定义 keystone 角色:

    $ openstack role create PowerUsers
    +-----------+----------------------------------+
    | Field     | Value                            |
    +-----------+----------------------------------+
    | domain_id | None                             |
    | id        | 7061a395af43455e9057ab631ad49449 |
    | name      | PowerUsers                      |
    +-----------+----------------------------------+
  2. 将现有用户添加到角色,并将角色分配给项目:

    $ openstack role add --project [PROJECT_NAME] --user [USER_ID] [PowerUsers-ROLE_ID]
    注意

    角色分配仅与一个项目配对。这意味着,当您为用户分配角色时,您还可以同时定义目标项目。如果您希望用户收到相同的角色,但对于其他项目,则必须单独为他们分配角色,但针对其他项目。

  3. 查看默认的 nova 策略设置:

    $ oslopolicy-policy-generator --namespace nova
  4. 通过在 /var/lib/config-data/puppet-generated/nova/etc/nova/policy.json 中添加以下条目来为新的 PowerUsers 角色创建自定义权限:

    注意

    在部署前测试您的策略更改,以验证它们是否按预期工作。

    {
    "os_compute_api:servers:start": "role:PowerUsers",
    "os_compute_api:servers:stop": "role:PowerUsers",
    "os_compute_api:servers:create:attach_volume": "role:PowerUsers",
    "os_compute_api:os-volumes-attachments:index": "role:PowerUsers",
    "os_compute_api:os-volumes-attachments:create": "role:PowerUsers",
    "os_compute_api:os-volumes-attachments:show": "role:PowerUsers",
    "os_compute_api:os-volumes-attachments:update": "role:PowerUsers",
    "os_compute_api:os-volumes-attachments:delete": "role:PowerUsers"
    }

    在保存此文件并重启 nova 容器时,您将实施更改。添加到 PowerUsers keystone 角色的用户接收这些权限。

5.5. 示例:根据属性限制访问

重要

红帽不支持自定义角色或策略。语法错误或应用错误授权可能会对安全或可用性造成负面影响。如果在生产环境中需要自定义角色或策略,请联系红帽支持例外。

您可以创建一个策略,根据发出该 API 调用的用户的属性限制对 API 调用的访问。例如,以下默认规则指出,如果从管理上下文运行,或者令牌的用户 ID 与与目标关联的用户 ID 匹配,则允许删除密钥对。

"os_compute_api:os-keypairs:delete": "rule:admin_api or user_id:%(user_id)s"

注意:通过每个发行版本的每个服务中,不会保证新实施的功能。因此,使用目标服务的现有策略惯例编写规则非常重要。有关查看这些策略的详情,请参阅检查现有策略。应用于部署它们的每个版本的非生产环境中应严格测试所有策略,因为无法保证跨版本的兼容性。

根据上例,您可以制作 API 规则来根据用户是否拥有资源来扩展或限制用户的访问权限。另外,属性可以与其他限制相结合,以形成规则,如下例所示:

"admin_or_owner": "is_admin:True or project_id:%(project_id)s"

考虑以上示例,您可以创建一个仅限于管理员和用户的唯一规则,然后使用该规则进一步限制操作:

"admin_or_user": "is_admin:True or user_id:%(user_id)s"
"os_compute_api:os-instance-actions": "rule:admin_or_user"

有关可用的 policy.json 语法选项的更多信息,请参阅策略语法

5.6. 使用 heat 修改策略

重要

红帽不支持自定义角色或策略。语法错误或应用错误授权可能会对安全或可用性造成负面影响。如果在生产环境中需要自定义角色或策略,请联系红帽支持例外。

您可以使用 heat 为 overcloud 中的某些服务配置访问策略。使用以下参数在对应服务上设置策略:

表 5.1. 策略参数

参数描述

KeystonePolicies

用于为 OpenStack Identity (keystone)配置的策略哈希。

IronicApiPolicies

为 OpenStack Bare Metal (ironic) API 配置的策略哈希。

BarbicanPolicies

为 OpenStack Key Manager (barbican)配置的策略哈希。

NeutronApiPolicies

为 OpenStack Networking (neutron) API 配置的策略哈希。

SaharaApiPolicies

为 OpenStack 集群(sahara) API 配置的策略哈希。

NovaApiPolicies

为 OpenStack Compute (nova) API 配置的策略哈希。

CinderApiPolicies

为 OpenStack Block Storage (cinder) API 配置的策略哈希。

GlanceApiPolicies

为 OpenStack Image Storage (glance) API 配置的策略哈希。

HeatApiPolicies

为 OpenStack Orchestration (heat) API 配置的策略哈希。

要为服务配置策略,请为策略参数指定一个包含服务策略的哈希值,例如:

  • OpenStack Identity (keystone)使用 KeystonePolicies 参数。在环境文件的 parameter_defaults 部分中设置此参数:

    parameter_defaults:
      KeystonePolicies: { keystone-context_is_admin: { key: context_is_admin, value: 'role:admin' } }
  • OpenStack Compute (nova)使用 NovaApiPolicies 参数。在环境文件的 parameter_defaults 部分中设置此参数:

    parameter_defaults:
      NovaApiPolicies: { nova-context_is_admin: { key: 'compute:get_all', value: '@' } }

5.7. 审计您的用户和角色

您可以使用 Red Hat OpenStack Platform 中提供的工具来为每个用户和相关特权构建角色分配报告。

  1. 运行 openstack role list 命令来查看环境中当前的角色:

    openstack role list -c Name -f value
    
    swiftoperator
    ResellerAdmin
    admin
    _member_
    heat_stack_user
  2. 运行 openstack role assignment list 命令,以列出作为特定角色成员的所有用户。例如,要查看具有 admin 角色的所有用户,请运行以下命令:

    $ openstack role assignment list --names --role admin
    +-------+------------------------------------+-------+-----------------+------------+--------+-----------+
    | Role  | User                               | Group | Project         | Domain     | System | Inherited |
    +-------+------------------------------------+-------+-----------------+------------+--------+-----------+
    | admin | heat-cfn@Default                   |       | service@Default |            |        | False     |
    | admin | placement@Default                  |       | service@Default |            |        | False     |
    | admin | neutron@Default                    |       | service@Default |            |        | False     |
    | admin | zaqar@Default                      |       | service@Default |            |        | False     |
    | admin | swift@Default                      |       | service@Default |            |        | False     |
    | admin | admin@Default                      |       | admin@Default   |            |        | False     |
    | admin | zaqar-websocket@Default            |       | service@Default |            |        | False     |
    | admin | heat@Default                       |       | service@Default |            |        | False     |
    | admin | ironic-inspector@Default           |       | service@Default |            |        | False     |
    | admin | nova@Default                       |       | service@Default |            |        | False     |
    | admin | ironic@Default                     |       | service@Default |            |        | False     |
    | admin | glance@Default                     |       | service@Default |            |        | False     |
    | admin | mistral@Default                    |       | service@Default |            |        | False     |
    | admin | heat_stack_domain_admin@heat_stack |       |                 | heat_stack |        | False     |
    | admin | admin@Default                      |       |                 |            | all    | False     |
    +-------+------------------------------------+-------+-----------------+------------+--------+-----------+
    注意

    您可以使用 -f {csv,json,table,value,yaml} 参数导出这些结果。

5.8. 审计 API 访问

您可以审核 API 调用给定角色可以访问。为每个角色重复这个过程将导致为每个角色对可访问的 API 进行全面的报告。对于您需要的步骤:

  • 作为目标角色中的用户提供的身份验证文件。
  • JSON 格式的访问令牌。
  • 您要审核的每个服务的 API 的策略文件。

流程

  1. 首先,在所需角色中提供用户的身份验证文件。
  2. 捕获 Keystone 生成的令牌并将其保存到文件中。您可以通过运行任何 openstack-cli 命令并使用 --debug 选项将提供的令牌输出到 stdout 来完成此操作。您可以复制此令牌并将其保存到访问文件中。使用以下命令来作为单一步骤执行此操作:

    openstack token issue --debug 2>&1 | egrep ^'{\"token\":' > access.file.json
  3. 创建策略文件。这可以在托管感兴趣的容器化服务的 overcloud 节点上完成。以下示例为 cinder 服务创建一个策略文件:

    ssh heat-admin@CONTROLLER-1 sudo podman exec cinder_api \
    oslopolicy-policy-generator \
    --config-file /etc/cinder/cinder.conf \
    --namespace cinder > cinderpolicy.json
  4. 使用这些文件,您现在可以审核问题中的角色,以访问 cinder 的 API:

    oslopolicy-checker --policy cinderpolicy.json --access access.file.json

第 6 章 轮转服务帐户密码

您可以定期轮转服务帐户密码,以提高安全状态。

6.1. overcloud 密码管理概述

在 overcloud 上运行的 OpenStack 服务通过其 Identity 服务(keystone)凭据进行身份验证。这些密码在初始部署过程中生成,并定义为 heat 参数。例如:

            'MistralPassword',
            'BarbicanPassword',
            'AdminPassword',
            'CeilometerMeteringSecret',
            'ZaqarPassword',
            'NovaPassword',
            'MysqlRootPassword'

您可以使用 Workflow 服务(mistral)工作流轮转服务帐户使用的密码。但是,如果密码列在 DO_NOT_ROTATE 中,则不会轮转密码,如密钥加密密钥(KEK)和 Fernet 密钥:

DO_NOT_ROTATE_LIST = (
    'BarbicanSimpleCryptoKek',
    'SnmpdReadonlyUserPassword',
    'KeystoneCredential0',
    'KeystoneCredential1',
    'KeystoneFernetKey0',
    'KeystoneFernetKey1',
    'KeystoneFernetKeys',
)

出于以下原因,这些密码位于 DO_NOT_ROTATE 列表中:

  • BarbicanSimpleCryptoKek - 更改此密码要求您重新加密所有 secret。
  • KeystoneFernetKeyKeystoneCredential - 已存在独立的工作流来轮转它们。如需更多信息,请参阅使用 工作流服务轮转 Fernet 密钥

6.2. 轮转密码

使用以下步骤轮转有资格的密码。下次通过运行 openstack overcloud deploy 命令完成堆栈更新时,会应用轮转的密码更改。在环境文件中指定的任何密码优先于使用此方法的密码更改。有关中断要求和服务影响的详情,请参考中断要求。

重要

不要使用此流程来轮转 swift 密码,因为目前不支持。

  1. 以 stack 用户身份,运行密码轮转工作流。这会轮转所有密码,但 DO_NOT_ROTATE 列表中除外:

    $ openstack workflow execution create tripleo.plan_management.v1.rotate_passwords '{"container": "overcloud"}'

    如果您只想轮转特定的密码,您可以使用 password_list。您还可以使用此方法轮转 DO_NOT_ROTATE 列表中的密码。例如:

    $ openstack workflow execution create tripleo.plan_management.v1.rotate_passwords '{"container": "overcloud", "password_list": ["SaharaPassword", "ManilaPassword"]}'
    The Workflow service Mistral workflow generates new passwords for the service accounts.
  2. 运行堆栈更新以应用新密码。
  3. 您可以通过创建工作流来检索密码,然后查看输出来检索和查看新密码:

    1. 创建新工作流以检索密码。请注意工作流的 ID:

      $ openstack workflow execution create tripleo.plan_management.v1.get_passwords '{"container": "overcloud"}'
       +--------------------+---------------------------------------------+
       | Field              | Value                                       |
       +--------------------+---------------------------------------------+
       | ID                 | edcf9103-e1a8-42f9-85c1-e505c055e0ed        |
       | Workflow ID        | 8aa2ac9b-22ee-4e7d-8240-877237ef0d0a        |
       | Workflow name      | tripleo.plan_management.v1.rotate_passwords |
       | Workflow namespace |                                             |
       | Description        |                                             |
       | Task Execution ID  | <none>                                      |
       | Root Execution ID  | <none>                                      |
       | State              | RUNNING                                     |
       | State info         | None                                        |
       | Created at         | 2020-01-22 15:47:57                         |
       | Updated at         | 2020-01-22 15:47:57                         |
       +--------------------+---------------------------------------------+
    2. 使用工作流 ID 检查工作流状态。在继续操作前,您必须等到工作流的状态为 SUCCESS

      $ openstack workflow execution show edcf9103-e1a8-42f9-85c1-e505c055e0ed
            +--------------------+---------------------------------------------+
            | Field              | Value                                       |
            +--------------------+---------------------------------------------+
            | ID                 | edcf9103-e1a8-42f9-85c1-e505c055e0ed        |
            | Workflow ID        | 8aa2ac9b-22ee-4e7d-8240-877237ef0d0a        |
            | Workflow name      | tripleo.plan_management.v1.rotate_passwords |
            | Workflow namespace |                                             |
            | Description        |                                             |
            | Task Execution ID  | <none>                                      |
            | Root Execution ID  | <none>                                      |
            | State              | SUCCESS                                     |
            | State info         | None                                        |
            | Created at         | 2020-01-22 15:47:57                         |
            | Updated at         | 2020-01-22 15:48:39                         |
            +--------------------+---------------------------------------------+
    3. 工作流完成后,使用以下命令检索密码:

      openstack workflow execution output show edcf9103-e1a8-42f9-85c1-e505c055e0ed
           {
                "status": "SUCCESS",
                "message": {
                    "AdminPassword": "FSn0sS1aAHp8YK2fU5niM3rxu",
                    "AdminToken": "dTP0Wdy7DtblG80M54r4a2yoC",
                    "AodhPassword": "fB5NQdRe37BaBVEWDHVuj4etk",
                    "BarbicanPassword": "rn7yk7KPafKw2PWN71MvXpnBt",
                    "BarbicanSimpleCryptoKek": "lrC3sGlV7-D7-V_PI4vbDfF1Ujm5OjnAVFcnihOpbCg=",
                    "CeilometerMeteringSecret": "DQ69HdlJobhnGWoBC0jM3drPF",
                    "CeilometerPassword": "qI6xOpofuiXZnG95iUe8Oxv5d",
                    "CephAdminKey": "AQDGVPpdAAAAABAAZMP56/VY+zCVcDT81+TOjg==",
                    "CephClientKey": "AQDGVPpdAAAAABAAanYtA0ggpcoCbS1nLeDN7w==",
                    "CephClusterFSID": "141a5ede-21b4-11ea-8132-52540031f76b",
                    "CephDashboardAdminPassword": "AQDGVPpdAAAAABAAKhsx630YKDhQrocS4o4KzA==",
                    "CephGrafanaAdminPassword": "AQDGVPpdAAAAABAAKBojG+CO72B0TdBRR0paEg==",
                    "CephManilaClientKey": "AQDGVPpdAAAAABAAA1TVHrTVCC8xQ4skG4+d5A=="
                }
            }

6.3. 中断要求

当您更改 overcloud 服务帐户的密码时,可能会发生中断的要求和服务影响。

在轮转密码作为堆栈更新的一部分后,旧密码将变为无效。因此,在将新密码添加到服务配置设置中时,服务无法使用 HTTP 401 错误。

此外,当您更改支持服务的密码时,您可以遇到短暂的中断,包括 MySQL、Rabx 和高可用性。

第 7 章 网络时间协议

您需要确保 Red Hat OpenStack Platform 集群中的系统在系统之间具有准确且一致的时间戳。

Red Hat Enterprise Linux 8 上的 Red Hat OpenStack Platform 支持 Chrony 来进行时间管理。如需更多信息,请参阅使用 Chrony 套件配置 NTP

7.1. 为什么一致性时间非常重要

整个机构之间的一致性时间对于操作和安全需求非常重要:

识别安全事件
一致的计时可帮助您关联受影响系统上的事件的时间戳,以便您可以了解事件序列。
身份验证和安全系统

安全系统对时间偏移可能敏感,例如:

  • 基于 kerberos 的身份验证系统可能会拒绝验证受时钟偏移影响的客户端。
  • 传输层安全(TLS)证书取决于有效的时间源。如果客户端和服务器系统时间超过 Valid From 日期范围,对服务器 TLS 连接的客户端会失败。
Red Hat OpenStack Platform 服务
某些核心 OpenStack 服务特别依赖于准确的时间,包括高可用性(HA)和 Ceph。

7.2. NTP 设计

网络时间协议(NTP)以分级设计进行组织。每个层称为 stratum。在层次结构的顶部是 stratum 0 设备,如原子时钟。在 NTP 层次结构中,Straum 0 设备为公开可用的 stratum 1 和 stratum 2 NTP 时间服务器提供参考。

不要将数据中心客户端直接连接到公开的 NTP stratum 1 或 2 服务器。直接连接的数量会对公共 NTP 资源造成不必要的压力。相反,在您的数据中心中分配一个专用的时间服务器,并将客户端连接到那个专用服务器。

将实例配置为从专用时间服务器接收时间,而不是它们所在的主机。

注意

在 Red Hat OpenStack Platform 环境中运行的服务容器仍从它们所在的主机接收时间。

第 8 章 强化基础架构和虚拟化

定期检查硬件和软件供应商,以获取有关新漏洞和安全更新的信息。红帽产品安全团队维护以下站点以告知您安全更新:

当您定期更新 Red Hat OpenStack Platform 部署时请注意以下几点。

  • 确保包含所有安全更新。
  • 内核更新需要重启。
  • 更新托管的镜像服务(glance)镜像,以确保新创建的实例具有最新的更新。

8.1. hypervisor

当您评估虚拟机监控程序平台时,请考虑运行虚拟机监控程序的硬件的支持性。此外,请考虑硬件中可用的额外功能,以及如何由您选择作为 OpenStack 部署的一部分选择的 hypervisor 支持这些功能。为此,虚拟机监控程序各自都有自己的硬件兼容性列表(HCLs)。当选择兼容硬件时,务必要预先了解哪些基于硬件的虚拟化功能是非常重要的。

8.1.1. hypervisor 与裸机

与使用 KVM 等管理程序相比,务必要识别使用 Linux 容器或裸机系统之间的区别。具体来说,本指南的重点主要基于具有虚拟机监控程序和虚拟化平台。但是,如果您的实施需要使用裸机或容器化环境,您必须注意部署该环境的特定区别。

对于裸机,请确保在重新置备和停用之前节点已正确清理了数据。另外,在重新使用节点前,您必须提供保证硬件没有被篡改或被入侵。如需更多信息,请参阅 https://docs.openstack.org/ironic/queens/admin/cleaning.html

8.1.2. hypervisor 内存优化

某些管理程序使用内存优化技术,将内存过量使用到客户虚拟机。这是一个非常有用的功能,允许您部署非常高的计算集群。这种技术的一种方法是通过重复数据删除或内存页面共享:当两个虚拟机在内存中具有相同的数据时,它们有优势可以引用同一内存。通常,这通过 Copy-On-Write (COW)机制执行,如内核相同的页面合并(KSM)。这些机制容易受到攻击:

  • 内存重复数据删除系统容易受到 side-channel 攻击的影响。实际上,攻击者可以通过分析攻击者虚拟机上的内存访问时间来识别在邻居虚拟机上运行的软件包和版本,以及软件下载和其他敏感信息。因此,一个虚拟机可能会推断另一个状态,这可能不适用于多项目环境,因为不是所有项目,或者共享相同的信任级别
  • 更重要的是,根据 KSM 证明了 row-hammer 类型攻击,以增强对可执行内存的修改。这意味着,托管实例可以获得对同一 Compute 主机上其他实例的代码执行访问权限。

如果部署者需要强大的项目分离(与公有云和一些私有云一样),则应该禁用 KSM:

8.2. PCI Passthrough

PCI 透传允许实例直接访问节点上的某一硬件。例如,这可用于允许实例访问提供用于高性能计算的计算统一设备架构(CUDA)的视频卡或 GPU。此功能涉及到两种类型的安全风险:直接内存访问和硬件 infection。

直接内存访问(DMA)是一种功能,允许某些硬件设备访问主机计算机中的任意物理内存地址。通常,视频卡具有此功能。但是,不应为实例授予任意物理内存访问,因为这会为主机系统和其他运行在同一节点上的实例的完整视图。硬件供应商使用输入/输出内存管理单元(IOMMU)来管理 DMA 访问。您应该确认 hypervisor 已配置为使用此硬件功能。

当实例对固件或设备的其它部分进行恶意修改时,会出现硬件 infection。由于此设备被其他实例或主机操作系统使用,恶意代码可以分散到这些系统中。最终结果是一个实例可以在其安全区外运行代码。这很严重,因为重置物理硬件的状态比虚拟硬件更困难,并可能导致额外的暴露,如对管理网络的访问。

由于与 PCI 透传关联的风险和复杂性,应默认禁用它。如果为特定需求启用,则需要有适当的进程,以帮助确保在重复使用前清除硬件。

8.3. Red Hat OpenStack Platform 上的 SELinux

安全增强型 Linux (SELinux)是强制访问控制(MAC)的一个实现。MAC 通过限制允许进程或应用程序在系统上执行的操作来限制攻击的影响。有关 SELinux 的更多信息,请参阅 SELinux 是什么?

为 Red Hat OpenStack Platform (RHOSP)服务预先配置了 SELinux 策略。在 RHOSP 上,SELinux 配置为在单独的安全上下文下运行每个 QEMU 进程。在 RHOSP 中,SELinux 策略有助于保护 hypervisor 主机和实例免受以下威胁:

hypervisor 威胁
在实例内运行的应用程序会攻击虚拟机监控程序访问底层资源。如果实例能够访问虚拟机监控程序操作系统,物理设备和其他应用程序可能会成为目标。这个威胁代表了显著的风险。虚拟机监控程序上的破坏还可能会破坏固件、其他实例和网络资源。
实例威胁
在实例内运行的应用程序会攻击虚拟机监控程序访问或控制另一个实例及其资源,或者实例文件镜像。保护实际网络的管理策略不会直接应用到虚拟环境。因为每个实例都是 SELinux 标记的进程,因此每个实例都有一个安全边界,由 Linux 内核强制执行。

在 RHOSP 中,磁盘上的实例镜像文件使用 SELinux 数据类型 svirt_image_t 标记。当实例开机时,SELinux 会将随机数字标识符附加到镜像中。随机数字标识符可以防止被破坏的 OpenStack 实例获得对其他容器的未授权访问。SELinux 能够为每个虚拟机监控程序节点上分配最多 524,288 个数字标识符。

8.4. 调查容器化服务

Red Hat OpenStack Platform 附带的 OpenStack 服务在容器内运行。容器化允许在不相关依赖项的情况下进行服务的开发和升级。当服务在容器内运行时,也会包含对该服务的潜在漏洞。

您可以按照以下步骤获取环境中运行的服务的信息:

流程

  • 使用 'podman inspect 获取信息,如绑定挂载的主机目录:

    例如:

    $ sudo podman inspect <container_name> | less

    将 <container_name> 替换为容器的名称。例如,nova 计算

  • 检查位于 /var/log/containers 中的服务的日志:

    例如:

    sudo less /var/log/containers/nova/nova-compute.log
  • 在容器内运行交互式 CLI 会话:

    例如:

    podman exec -it nova_compute /bin/bash
    注意

    您可以对服务进行更改,以便直接在容器内测试目的。当容器重启时,所有更改都会丢失。

8.5. 对容器化服务进行临时更改

您可以更改容器重启时保留的容器化服务,但不会影响 Red Hat OpenStack Platform (RHOSP)集群的永久配置。这可用于测试配置更改,或在故障排除时启用调试级别的日志。您可以手动恢复更改。另外,在 RHOSP 集群上运行重新部署会将所有参数重置为其永久配置。

使用位于 /var/lib/config-data/puppet-generated/[service] 中的配置文件对服务进行临时更改。以下示例在 nova 服务中启用调试:

流程

  1. 编辑绑定到 nova_compute 容器的 nova.conf 配置文件。将 debug 参数的值设置为 True

    $ sudo sed -i 's/^debug=.*/debug=True' \
    /var/lib/config-data/puppet-generated/nova/etc/nova/nova.conf
    警告

    OpenStack 文件的配置文件是 ini 文件,其中包括多个部分,如 [DEFAULT][database]。每个部分是唯一的参数可能在整个文件中都不同。请谨慎使用 sed。您可以通过运行 egrep -v "^$|^#" [configuration_file] | grep [parameter] 以检查一个参数是否在配置文件中出现了多次。

  2. 重启 nova 容器:

    sudo podman restart nova_compute

8.6. 对容器化服务进行永久更改

您可以使用 heat 在 Red Hat OpenStack Platform (RHOSP)服务中对容器化服务进行永久更改。使用您首次部署 RHOSP 时使用的现有模板,或创建新模板来添加到部署脚本中。在以下示例中,libvirt 的私钥大小增加到 4096

流程

  1. 创建一个名为 libvirt-keysize.yaml 的新 yaml 模板,并使用 LibvirtCertificateKeySize 参数将默认值从 2048 增加到 4096

    cat > /home/stack/templates/libvirt-keysize.yaml
    parameter_defaults:
            LibvirtCertificateKeySize: 4096
    EOF
  2. libvirt-keysize.yaml 配置文件添加到部署脚本中:

    openstack overcloud deploy --templates \
    ...
    -e /home/stack/templates/libvirt-keysize.yaml
    ...
  3. 重新运行部署脚本:

    ./deploy.sh

8.7. 固件更新

物理服务器使用复杂的固件来启用和操作服务器硬件和轻量级管理卡,这些卡可能具有自己的安全漏洞,从而可能允许系统访问和中断。为了解决这些问题,硬件供应商将发布固件更新,这些更新与操作系统更新分开安装。您需要一个操作安全流程,用于定期检索、测试并实施这些更新,请注意固件更新通常需要重新启动物理主机才能生效。

8.8. 使用 SSH 横幅文本

您可以设置一个横幅,以向所有通过 SSH 连接的用户显示控制台消息。您可以使用环境文件中的以下参数向 /etc/issue 添加横幅文本。考虑自定义此示例文本以满足您的要求。

resource_registry:
  OS::TripleO::Services::Sshd:
    /usr/share/openstack-tripleo-heat-templates/deployment/sshd/sshd-baremetal-puppet.yaml

parameter_defaults:
  BannerText: |
   ******************************************************************
   * This system is for the use of authorized users only. Usage of  *
   * this system may be monitored and recorded by system personnel. *
   * Anyone using this system expressly consents to such monitoring *
   * and is advised that if such monitoring reveals possible        *
   * evidence of criminal activity, system personnel may provide    *
   * the evidence from such monitoring to law enforcement officials.*
   ******************************************************************

要将此更改应用到部署,请将设置保存为名为 ssh_banner.yaml 的文件,然后将其传递给 overcloud deploy 命令,如下所示:& lt;full environment > 表示您仍然必须包含所有原始部署参数。例如:

    openstack overcloud deploy --templates \
      -e <full environment> -e  ssh_banner.yaml

8.9. 系统事件的审计

维护所有审计事件的记录可帮助您建立系统基准、进行故障排除或分析导致特定结果的事件序列。审计系统能够记录许多类型的事件,如对系统时间的更改、对 Mandatory/Discretionary Access Control 的更改,以及创建/删除用户或组。

可以使用环境文件创建规则,该文件随后由 director 注入到 /etc/audit/audit.rules 中。例如:

    resource_registry:
      OS::TripleO::Services::AuditD: /usr/share/openstack-tripleo-heat-templates/deployment/auditd/auditd-baremetal-puppet.yaml
    parameter_defaults:
      AuditdRules:
        'Record Events that Modify User/Group Information':
          content: '-w /etc/group -p wa -k audit_rules_usergroup_modification'
          order  : 1
        'Collects System Administrator Actions':
          content: '-w /etc/sudoers -p wa -k actions'
          order  : 2
        'Record Events that Modify the Systems Mandatory Access Controls':
          content: '-w /etc/selinux/ -p wa -k MAC-policy'
          order  : 3

8.10. 管理防火墙规则

防火墙规则会在部署期间自动应用到 overcloud 节点上,旨在仅公开 OpenStack 工作所需的端口。您可以根据需要指定额外的防火墙规则。例如,要为 Zabbix 监控系统添加规则:

    parameter_defaults:
      ControllerExtraConfig:
        tripleo::firewall::firewall_rules:
          '301 allow zabbix':
            dport: 10050
            proto: tcp
            source: 10.0.0.8
            action: accept

您还可以添加限制访问的规则。规则定义期间使用的数字将决定规则的优先级。例如,Rabx 的规则号默认为 109。如果要其余使用它,请将其切换为使用较低值:

    parameter_defaults:
      ControllerExtraConfig:
        tripleo::firewall::firewall_rules:
          '098 allow rabbit from internalapi network':
            dport: [4369,5672,25672]
            proto: tcp
            source: 10.0.0.0/24
            action: accept
          '099 drop other rabbit access':
            dport: [4369,5672,25672]
            proto: tcp
            action: drop

在本例中,098099 是随机选择的,它小于 RabbitMQ 的规则号 109。要确定规则的数量,您可以检查适当的节点上的 iptables 规则;对于 RabbitMQ,您可以检查控制器:

iptables-save
[...]
-A INPUT -p tcp -m multiport --dports 4369,5672,25672 -m comment --comment "109 rabbitmq" -m state --state NEW -j ACCEPT

或者,您还可以从 puppet 定义中提取端口要求。例如,Rabx 的规则存储在 puppet/services/rabbitmq.yaml 中:

    tripleo.rabbitmq.firewall_rules:
      '109 rabbitmq':
        dport:
          - 4369
          - 5672
          - 25672

可以为规则设置以下参数:

  • 端口 :与规则关联的端口。弃用了 puppetlabs-firewall
  • dport :与规则关联的目标端口。
  • sport :与规则关联的源端口。
  • Proto :与规则关联的协议。默认为 tcp
  • action :与规则关联的操作策略。默认为 accept
  • 跳跳 :要跳到的链。
  • State: 与规则关联的状态数组。默认为 [NEW]
  • Source :与规则关联的源 IP 地址。
  • iniface :与规则关联的网络接口。
  • :与规则关联的链。默认为 INPUT
  • destination :与规则关联的目标 cidr。
  • Extraspuppetlabs-firewall 模块支持的任何其他参数哈希。

8.11. 使用 AIDE 进行入侵检测

AIDE (高级入侵检测环境)是一个文件和目录完整性检查程序。它用于检测未授权文件篡改或更改的事件。例如,如果系统密码文件改变,AIDE 可以提醒您。

AIDE 通过分析系统文件,然后编译文件哈希的完整性数据库来工作。然后,数据库充当比较点,以验证文件和目录的完整性并检测更改。

director 包括 AIDE 服务,允许您在 AIDE 配置中添加条目,然后由 AIDE 服务用于创建完整性数据库。例如:

  resource_registry:
    OS::TripleO::Services::Aide:
      /usr/share/openstack-tripleo-heat-templates/deployment/aide/aide-baremetal-ansible.yaml

  parameter_defaults:
    AideRules:
      'TripleORules':
        content: 'TripleORules = p+sha256'
        order: 1
      'etc':
        content: '/etc/ TripleORules'
        order: 2
      'boot':
        content: '/boot/ TripleORules'
        order: 3
      'sbin':
        content: '/sbin/ TripleORules'
        order: 4
      'var':
        content: '/var/ TripleORules'
        order: 5
      'not var/log':
        content: '!/var/log.*'
        order: 6
      'not var/spool':
        content: '!/var/spool.*'
        order: 7
      'not nova instances':
        content: '!/var/lib/nova/instances.*'
        order: 8
注意

上例没有主动维护或基准,因此您应该选择适合您的要求的 AIDE 值。

  1. 声明名为 TripleORules 的别名,以避免每次都重复使用相同的属性。
  2. 别名接收 p+sha256 属性。在 AIDE 术语中,这会被解释为:监视所有文件权限 p,带有完整性 checksum sha256

有关 AIDE 配置文件可用属性的完整列表,请参见 的 AIDE MAN 页面(https://aide.github.io/)。

完成以下步骤,将更改应用到您的部署:

  1. 将设置保存为 /home/stack/templates/ 目录中的名为 aide.yaml 的文件。
  2. 编辑 aide.yaml 环境文件,使其包含适合您的环境的参数和值。
  3. openstack overcloud deploy 命令中包含 /home/stack/templates/aide.yaml 环境文件,以及特定于您的环境的所有其他必要的 heat 模板和环境文件:

    openstack overcloud deploy --templates
    ...
    -e /home/stack/templates/aide.yaml

8.11.1. 使用复杂 AIDE 规则

可使用前面描述的格式创建复杂规则。例如:

    MyAlias = p+i+n+u+g+s+b+m+c+sha512

以上将转换为以下说明:监控权限、索引节点、链接数、用户、组、大小、块计数、mtime、ctime、ctime,使用 sha256 进行校验和生成。

请注意,别名应始终具有 1 顺序位置,这意味着它位于 AIDE 规则的顶部,并递归应用到以下所有值。

如下是要监控的目录。请注意,可以使用正则表达式。例如,我们为 var 目录设置了监控,但使用了 not(!)语句('!/var/log.*''!/var/spool.*')进行了覆盖。

8.11.2. 其他 AIDE 值

以下 AIDE 值也可用:

aide ConfPath :到 aide 配置文件的完整 POSIX 路径,默认为 /etc/aide.conf。如果没有要求更改文件位置,则建议使用默认路径进行盘。

aideDBPath :到 AIDE 完整性数据库的完整 POSIX 路径。这个值可以被配置,以便操作员声明自己的完整路径,因为 AIDE 数据库文件通常存储在只读文件挂载上。

aideDBTempPath :到 AIDE 完整性临时数据库的完整 POSIX 路径。当 AIDE 初始化新数据库时,会创建此临时文件。

AideHour :此值是将 hour 属性设置为 AIDE cron 配置的一部分。

AideMinute :此值是将 minute 属性设置为 AIDE cron 配置的一部分。

AideCronUser :此值是将 linux 用户设置为 AIDE cron 配置的一部分。

AideEmail :此值设置每次执行 cron 运行时收到 AIDE 报告的电子邮件地址。

AideMuaPath :此值设置邮件用户代理的路径,用于将 AIDE 报告发送到 AideEmail 中设置的电子邮件地址。

8.11.3. AIDE 的 Cron 配置

AIDE director 服务允许您配置 cron 作业。默认情况下,它会将报告发送到 /var/log/audit/; 如果您要使用电子邮件警报,则启用 AideEmail 参数将警报发送到配置的电子邮件地址。请注意,依赖关键警报的电子邮件可能会受到系统中断和意外消息过滤的影响。

8.11.4. 考虑系统升级的影响

执行升级时,AIDE 服务将自动重新生成新的完整性数据库,以确保正确重新计算所有升级的文件,使其具有更新的校验和。

如果 openstack overcloud deploy 作为后续运行调用到初始部署,并且更改了 AIDE 配置规则,director AIDE 服务将重建数据库,以确保新配置属性封装在完整性数据库中。

8.12. 查看 SecureTTY

securetty 允许您禁用任何控制台设备(tty)的根访问权限。此行为由 /etc/securetty 文件中的条目管理。例如:

  resource_registry:
    OS::TripleO::Services::Securetty: ../puppet/services/securetty.yaml

  parameter_defaults:
    TtyValues:
      - console
      - tty1
      - tty2
      - tty3
      - tty4
      - tty5
      - tty6

8.13. Identity Service 的 CADF 审计

全面的审计流程可帮助您检查 OpenStack 部署的持续安全状况。这对 keystone 尤其重要,因为它在安全模型中的角色。

Red Hat OpenStack Platform 已采用云审计数据联邦(CADF)作为审计事件的数据格式,而 keystone 服务为 Identity 和 Token 操作生成 CADF 事件。您可以使用 KeystoneNotificationFormat 为 keystone 启用 CADF 审计:

  parameter_defaults:
    KeystoneNotificationFormat: cadf

8.14. 查看 login.defs 值

要强制为新系统用户(非keystone)强制密码要求,director 可以通过这些示例参数将条目添加到 /etc/login.defs 中:

  resource_registry:
    OS::TripleO::Services::LoginDefs: ../puppet/services/login-defs.yaml

  parameter_defaults:
    PasswordMaxDays: 60
    PasswordMinDays: 1
    PasswordMinLen: 5
    PasswordWarnAge: 7
    FailDelay: 4

第 9 章 强化仪表板服务

控制面板服务(horizon)为用户提供一个自助服务门户,用于在管理员设置的限制内调配自己的资源。使用与 OpenStack API 相同的敏感度来管理控制面板服务的安全性。

9.1. 调试 Dashboard 服务

DEBUG 参数的默认值为 False。在生产环境中保留默认值。仅在调查过程中更改此设置。当您将 DEBUG 参数的值更改为 True 时,Djjan 可将 stack straces 输出到包含敏感 Web 服务器状态信息的浏览器用户。

DEBUG 参数的值为 True 时,ALLOWED_HOSTS 设置也会被禁用。有关配置 ALLOWED_HOSTS 的更多信息,请参阅配置 ALLOWED_HOSTS

9.2. 选择域名

最佳实践是将 Dashboard 服务(horizon)部署到第二个级别域,而不是任何级别的共享域。以下提供了每个示例:

  • 第二个级别域: https://example.com
  • 共享子域: https://example.public-url.com

根据浏览器的 相同 策略,将控制面板服务部署到专用的第二个域,将 Cookie 和安全令牌与其他域隔离。在子域上部署时,仪表板服务的安全性等同于在同一第二个域中部署的最小安全应用程序。

您可以通过避免 Cookie 支持的会话存储并配置 HTTP Strict Transport Security (HSTS) (本指南中的描述)来进一步缓解这个风险。

注意

不支持在裸机域中部署仪表板服务,如 https://example/

9.3. 配置 ALLOWED_HOSTS

Horizon 基于 python Django Web 框架构建,这需要防止与误导 HTTP 主机标头关联的安全威胁。若要应用这种保护,请将 ALLOWED_HOSTS 设置配置为使用 OpenStack 仪表板提供的 FQDN。

当您配置 ALLOWED_HOSTS 设置时,任何带有与此列表中值不匹配的 Host 标头的 HTTP 请求都会被拒绝,并引发错误。

流程

  1. 在模板的 parameter_defaults 下,设置 HorizonAllowedHosts 参数的值:

    parameter_defaults:
        HorizonAllowedHosts: <value>

    <value> 替换为 OpenStack 仪表板提供的 FQDN。

  2. 使用修改后的模板部署 overcloud,以及您的环境所需的所有其他模板。

9.4. 跨站点脚本(XSS)

OpenStack 控制面板接受大多数字段中设置的整个 Unicode 字符。恶意的参与者可能会尝试使用这个可扩展性来测试跨站点脚本(XSS)漏洞。OpenStack Dashboard 服务(horizon)具有针对 XSS vulnerabilites 强化的工具。确保在自定义仪表板中正确使用这些工具非常重要。当您对自定义仪表板执行审计时,请注意以下几点:

  • mark_safe 功能。
  • is_safe - 与自定义模板标签一起使用。
  • safe 模板标签。
  • 任何自动转义都会关闭,以及可能会评估不正确的数据的 JavaScript。

9.5. 跨站点请求站(CSRF)

使用多个 JavaScript 实例的仪表板应该针对不当使用 @csrf_exempt decorator 等漏洞进行审核。在降低 CORS (Cross Origin Resource Sharing)限制前,评估所有不遵循推荐的安全设置的仪表板。将您的 Web 服务器配置为发送限制性 CORS 标头,其中包含每个响应。只允许仪表板域和协议,例如:Access-Control-Allow-Origin: https://example.com/。您不应该允许通配符来源。

9.6. 允许 iframe 嵌入

DISALLOW_IFRAME_EMBED 设置不允许仪表板嵌入到 iframe 中。旧浏览器仍容易受到跨脚本(XFS)漏洞的影响,因此此选项为不需要基准的部署添加额外的安全强化。默认设置为 True,但在需要时可使用环境文件禁用它。

流程

  • 您可以使用以下参数来允许 iframe 嵌入:
    parameter_defaults:
      ControllerExtraConfig:
        horizon::disallow_iframe_embed: false
注意

只有在完全理解潜在的安全影响后,才会将这些设置设置为 False

9.7. 将 HTTPS 加密用于仪表板流量

建议您使用 HTTPS 来加密仪表板流量。您可以将它配置为使用可识别证书颁发机构(CA)中的有效可信证书来完成此操作。只有在所有用户浏览器中预安装信任的根目录时,私有机构发布的证书才适合。

配置 HTTP 请求到仪表板域,以重定向到完全限定的 HTTPS URL。

如需更多信息,请参阅使用 Ansible 实施 TLS-e

9.8. HTTP 严格传输安全性(HSTS)

HTTP 严格传输安全性(HSTS)可防止浏览器在最初进行安全连接后进行后续的不安全连接。如果您已在公共或不可信区上部署了 HTTP 服务,则 HSTS 特别重要。

对于基于 director 的部署,此设置在 /usr/share/openstack-tripleo-heat-templates/deployment/horizon-container-puppet.yaml 文件中默认启用:

horizon::enable_secure_proxy_ssl_header: true

验证

部署 overcloud 后,检查 Red Hat OpenStack Dashboard (horizon)的 local_settings 文件进行验证。

  1. 使用 ssh 连接到控制器:

    $ ssh heat-admin@controller-0
  2. 检查 SECURE_PROXY_SSL_HEADER 参数的值是否为 ('HTTP_X_FORWARDED_PROTO', 'https')

    sudo egrep ^SECURE_PROXY_SSL_HEADER /var/lib/config-data/puppet-generated/horizon/etc/openstack-dashboard/local_settings
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

9.9. 前端缓存

不建议在仪表板中使用前端缓存工具,因为它呈现直接从 OpenStack API 请求生成的动态内容。因此,前端缓存层(如 varnish )可以防止显示正确的内容。控制面板使用 Django,它直接从 Web 服务提供静态介质,并且已经受益于 Web 主机缓存。

9.10. 会话后端

对于基于 director 的部署,horizon 的默认会话后端是 django.contrib.sessions.backends.backends.cache,它与 memcached 相结合。出于性能的原因,此方法优先于本地内存缓存,对于高可用性和负载平衡安装而言是安全的,并且能够在多个服务器上共享缓存,同时仍将其视为单个缓存。

您可以在 director 的 horizon.yaml 文件中查看这些设置:

          horizon::cache_backend: django.core.cache.backends.memcached.MemcachedCache
          horizon::django_session_engine: 'django.contrib.sessions.backends.cache'

9.11. 查看 secret 密钥

控制面板依赖于某些安全功能的共享 SECRET_KEY 设置。secret 密钥应该是随机生成的字符串,长度至少为 64 个字符,该字符必须在所有活跃的仪表板实例间共享。这个密钥的破坏可能允许远程攻击者执行任意代码。轮转这个密钥会导致现有用户会话和缓存无效。不要将此密钥提交到公共存储库。

对于 director 部署,此设置作为 HorizonSecret 值进行管理。

9.12. 配置会话 Cookie

控制面板会话 Cookie 可以通过浏览器技术(如 JavaScript)打开以交互。对于在任何位置使用 TLS 的 director 部署,您可以使用 HorizonSecureCookies 设置强化此行为。

注意

永不将 CSRF 或会话 Cookie 配置为使用带前点的通配符域。

9.13. 静态介质

仪表板的静态介质应部署到仪表板域的子域中,并由 Web 服务器提供。使用外部内容交付网络(CDN)也可以接受。此子域不应设置 Cookie 或提供用户提供的内容。介质还应通过 HTTPS 提供。

仪表板的默认配置使用 django_compressor 在提供前压缩和减去 CSS 和 JavaScript 内容。这个过程应该在部署仪表板前静态完成,而不是使用默认的请求动态压缩,并将生成的文件以及部署的代码或 CDN 服务器复制到 CDN 服务器。压缩应在非生产环境构建环境中进行。如果这不是实际情况,请考虑完全禁用资源压缩。不应该在生产环境中安装在线压缩依赖项(无 Node.js)。

9.14. 验证密码复杂性

OpenStack Dashboard (horizon)可以使用密码验证检查来强制实施密码复杂性。

您可以为密码验证指定正则表达式,以及为失败的测试显示帮助文本。以下示例要求用户创建长度为 8 到 18 个字符的密码:

    parameter_defaults:
      HorizonPasswordValidator: '^.{8,18}$'
      HorizonPasswordValidatorHelp: 'Password must be between 8 and 18 characters.'

要将此更改应用到部署,请将设置保存为名为 horizon_password.yaml 的文件,然后将其传递给 overcloud deploy 命令,如下所示。& lt;full environment > 表示您仍然必须包含所有原始部署参数。例如:

    openstack overcloud deploy --templates \
      -e <full environment> -e  horizon_password.yaml

9.15. 强制管理员密码检查

以下设置默认设置为 True,但在需要时可使用环境文件禁用它。

注意

只有在完全理解潜在的安全影响后,才会将这些设置设置为 False

Dashboard 的 local_settings.py 文件中的 ENFORCE_PASSWORD_CHECK 设置在 Change Password 表单上显示一个 Admin Password 字段,这有助于验证管理员是否启动密码更改。

您可以使用环境文件禁用 ENFORCE_PASSWORD_CHECK

    parameter_defaults:
      ControllerExtraConfig:
        horizon::enforce_password_check: false

9.16. 禁用显示的密码

以下设置默认设置为 True,但在需要时可使用环境文件禁用它。

注意

只有在完全理解潜在的安全影响后,才会将这些设置设置为 False

密码显示按钮允许仪表板中的用户查看他们要输入的密码。可以使用 DISABLE_PASSWORD_REVEAL 参数切换这个选项:

    parameter_defaults:
      ControllerExtraConfig:
        horizon::disable_password_reveal: false

9.17. 显示仪表板的登录横幅

法规行业(如 HIPAA、PCI-DSS 和美国政府)要求您显示用户登录横幅。Red Hat OpenStack Platform (RHOSP)仪表板(horizon)使用默认的主题(RCUE),它存储在 horizon 容器中。

在自定义 Dashboard 容器中,您可以通过手动编辑 /usr/share/openstack-dashboard/openstack_dashboard/themes/rcue/templates/auth/login.html 文件来创建登录横幅:

流程

  1. {% include 'auth/_login.html' %} 部分之前输入所需的登录横幅。允许 HTML 标签:

    <snip>
    <div class="container">
      <div class="row-fluid">
        <div class="span12">
          <div id="brand">
            <img src="../../static/themes/rcue/images/RHOSP-Login-Logo.svg">
          </div><!--/#brand-->
        </div><!--/.span*-->
    
        <!-- Start of Logon Banner -->
        <p>Authentication to this information system reflects acceptance of user monitoring agreement.</p>
        <!-- End of Logon Banner -->
    
        {% include 'auth/_login.html' %}
      </div><!--/.row-fluid→
    </div><!--/.container-->
    
    {% block js %}
      {% include "horizon/_scripts.html" %}
    {% endblock %}
    
      </body>
    </html>

上面的例子生成类似如下的仪表板:

logonbanner

其他资源

9.18. 限制文件上传的大小

您可以选择配置仪表板来限制文件上传的大小;此设置可能对各种安全强化策略的要求。

LimitRequestBody - 这个值(以字节为单位)限制您可以使用控制面板传输的文件的最大大小,如镜像和其他大型文件。

重要

红帽尚未正式测试此设置。建议您在将此设置部署到生产环境中前测试此设置的影响。

注意

如果值太小,文件上传将失败。

例如,此设置将每个文件上传到最大大小为 10 GB (10737418240)。您需要调整这个值以适应您的部署。

  • /var/lib/config-data/puppet-generated/horizon/etc/httpd/conf/httpd.conf

    <Directory />
      LimitRequestBody 10737418240
    </Directory>
  • /var/lib/config-data/puppet-generated/horizon/etc/httpd/conf.d/10-horizon_vhost.conf

    <Directory "/var/www">
      LimitRequestBody 10737418240
    </Directory>
  • /var/lib/config-data/puppet-generated/horizon/etc/httpd/conf.d/15-horizon_ssl_vhost.conf

    <Directory "/var/www">
      LimitRequestBody 10737418240
    </Directory>
注意

这些配置文件由 Puppet 管理,因此每当运行 openstack overcloud 部署过程时,任何非受管更改都会被覆盖。

第 10 章 Red Hat OpenStack Platform 网络服务

OpenStack Networking 服务(neutron)可让最终用户或项目定义和使用网络资源。OpenStack 网络提供了一个面向项目的 API,用于定义云中实例的网络连接和 IP 寻址,除了编排网络配置之外。随着以 API 为中心的网络服务,云架构师和管理员应考虑良好的实践来保护物理和虚拟网络基础架构和服务。

OpenStack 网络使用插件架构设计,通过开源社区或第三方服务提供 API 的可扩展性。当您评估架构设计要求时,务必要确定 OpenStack 网络核心服务中提供了哪些功能、第三方产品提供的其他服务,以及在物理基础架构上实施哪些附件服务。

本节概述了实施 OpenStack 网络时应考虑哪些进程和良好实践。

10.1. 网络架构

OpenStack 网络是一种单机服务,可在多个节点之间部署多个进程。这些流程相互交互,以及其他 OpenStack 服务。OpenStack 网络服务的主要流程是 neutron-server,它是一个 Python 守护进程,用于公开 OpenStack Networking API,并将项目请求传递给一组插件以进行额外的处理。

OpenStack 网络组件有:

  • Neutron 服务器(neutron-serverneutron the-plugin) - neutron-server 服务在 Controller 节点上运行,为网络 API 及其扩展(或插件)提供服务。它还强制实施每个端口的网络模型和 IP 地址。neutron-server 需要直接访问持久数据库。代理可以通过 neutron-server 间接访问数据库,它们使用 AMQP (高级消息队列协议)进行通信。
  • Neutron 数据库 - 数据库是 neutron 信息的集中来源,API 记录数据库中的所有事务。这允许多个 Neutron 服务器共享相同的数据库集群,这样可保持它们同步,并允许网络配置拓扑持久性。
  • 插件代理(neutron-*-agent) - 在每个计算节点和网络节点(与 L3 和 DHCP 一起)上运行,以管理本地虚拟交换机(vswitch)配置。启用的插件决定了哪些代理被启用。这些服务需要消息队列访问,并取决于所使用的插件,访问外部网络控制器或 SDN 实现。有些插件(如 slirp (ODL)和 Open Virtual Network (OVN))不需要计算节点上任何 python 代理,只需要启用的 Neutron 插件进行集成。
  • DHCP 代理(neutron-dhcp-agent) - 为项目网络提供 DHCP 服务。这个代理在所有插件中都是相同的,负责维护 DHCP 配置。neutron-dhcp-agent 需要消息队列访问。根据插件,可选。
  • 元数据代理(neutron-metadata-agentneutron-ns-metadata-proxy) - 提供用于应用实例操作系统配置和用户提供的初始脚本('userdata')的元数据服务。该实施需要在 L3 或 DHCP 代理命名空间中运行的 neutron-ns-metadata-proxy 截获 cloud-init 发送的元数据 API 请求来代理到元数据代理。
  • L3 代理(neutron-l3-agent) - 为项目网络上的虚拟机的外部网络访问提供 L3/NAT 转发。需要消息队列访问。根据插件,可选。
  • 网络供应商服务(SDN server/services) - 为项目网络提供额外的网络服务。这些 SDN 服务可以通过 REST API 等通信频道与 neutron-server、neutron-plugin 和插件代理交互。

下图显示了 OpenStack 网络组件的架构和网络流图:

网络连接

请注意,当使用分布式虚拟路由(DVR)和第 3 层高可用性(L3HA)时,这种方法会显著变化。这些模式改变了 neutron 的安全环境,因为 L3HA 在路由器之间实现 VRRP。部署需要正确调整大小并强化,以帮助缓解路由器之间的 DoS 攻击,并且路由器之间的本地网络流量必须被视为敏感,以帮助解决 VRRP 欺骗的威胁。DVR 将网络组件(如路由)移到 Compute 节点,同时仍然需要网络节点。因此,计算节点需要访问公共网络并从公共网络访问,增加其暴露,并需要客户需要额外的安全考虑,因为它们需要确保防火墙规则和安全模型支持这种方法。

10.2. Neutron 服务放置在物理服务器中

本节论述了包括控制器节点、网络节点和用于运行实例的一组计算节点的标准架构。要为物理服务器建立网络连接,典型的 neutron 部署最多有 4 个不同的物理数据中心网络:

网络域拓扑图
  • 管理网络 - 用于 OpenStack 组件之间的内部通信。此网络上的 IP 地址应只在数据中心内访问,并被视为管理安全区。默认情况下,管理网络角色由 内部 API 网络执行。
  • 客户机网络 - 用于云部署中的虚拟机数据通信。此网络的 IP 地址要求取决于所使用的 OpenStack Networking 插件,以及项目提供的虚拟网络的网络配置选择。这个网络被视为客户机安全区。
  • 外部网络 - 在某些情况下为虚拟机提供互联网访问。此网络上的 IP 地址应该可以被 Internet 上的任何人访问。此网络被视为位于公共安全区中。此网络由 neutron 外部网络 提供。这些 neutron VLAN 托管在外部网桥上。它们不是由 Red Hat OpenStack Platform director 创建,而是在部署后由 neutron 创建。
  • 公共 API 网络 - 向项目公开所有 OpenStack API,包括 OpenStack 网络 API。此网络上的 IP 地址应该可以被 Internet 上的任何人访问。这可能是与外部网络相同的网络,因为可以为外部网络创建一个子网,该网络使用小于 IP 块中 IP 地址范围的 IP 分配范围。此网络被视为位于公共安全区中。

建议您将此流量划分为不同的区。如需更多信息,请参阅下一部分。

10.3. 安全区

建议您使用安全区的概念来保持关键系统相互独立。实际上,这意味着使用 VLAN 和防火墙规则隔离网络流量。这个 shod 通过粒度详情完成,结果应该是只有需要连接到 neutron 的服务才能这样做。

在以下图中,您可以看到已创建了区来分隔某些组件:

  • 仪表板:可访问公共网络和管理网络。
  • Keystone :可访问管理网络。
  • Compute 节点:可访问管理网络和计算实例。
  • 网络节点:根据使用的 neutron-plugin,可访问管理网络、计算实例和公共网络。
  • SDN 服务节点:管理服务、计算实例以及可能公共的,具体取决于所使用的产品和配置。
网络区

10.4. 网络服务

在设计 OpenStack 网络基础架构的初始架构阶段,务必要确保提供适当的经验,以帮助设计第 1 个物理网络基础架构,以识别正确的安全控制和审计机制。

OpenStack 网络添加了一层虚拟化网络服务,使项目能够设计自己的虚拟网络。目前,这些虚拟化服务不像它们的传统网络对应部分一样创新。在采用这些虚拟服务之前,请考虑这些虚拟服务的当前状态,因为它规定了在虚拟化和传统网络边界上实施哪些控制。

10.5. 使用 VLAN 和隧道的 L2 隔离

OpenStack 网络可以对每个项目/网络组合使用两种不同的机制进行流量分隔:VLAN (IEEE 802.1Q 标记)或使用 VXLAN 或 GRE 封装的 L2 隧道。OpenStack 部署的范围和扩展决定了您应该用于流量隔离或隔离的方法。

vlan

VLAN 在一个特定物理网络中以数据包的形式实现,它包括 IEEE 802.1Q 头,其中带有一个特定的 VLAN ID (VID) 字段值。共享同一物理 netw ork 的 VLAN 网络在网络的 L2 层相互隔离,它们甚至可以有重叠的 IP 地址空间。支持 VLAN 网络的每个不同的物理网络都被视为一个单独的 VLAN 中继 k,不同的空间为 VID 值。有效的 VID 值为 1 到 4094。

VLAN 配置复杂性取决于您的 OpenStack 设计要求。要允许 OpenStack 网络更有效地使用 VLAN,您必须分配一个 VLAN 范围(每个项目对应一个),并将每个 Compute 节点物理交换机端口转换为 VLAN 中继端口。

隧道

网络隧道将每个项目/网络组合与唯一的 tunnel-id 封装在一起,用于识别属于该组合的网络流量。项目的 L2 网络连接独立于物理本地或底层网络设计。通过在 IP 数据包内封装流量,流量可以跨第 3 层边界,从而消除预配置 VLAN 和 VLAN 中继的需求。隧道为网络流量流量添加了一个模糊处理层,从监控角度减少各个项目流量的可见性。

OpenStack 网络目前支持 GRE 和 VXLAN 封装。提供 L2 隔离的技术取决于要在部署中创建的项目网络的范围和大小。

10.6. 访问控制列表

计算通过使用 OpenStack 网络服务支持项目网络流量访问控制。安全组允许管理员和项目指定允许通过虚拟接口端口传递的流量类型和方向(入口/出口)。安全组规则是有状态的 L2-L4 流量过滤器。

10.7. L3 路由和 NAT

OpenStack 网络路由器可以连接多个 L2 网络,也可以提供一个网关,它将一个或多个私有 L2 网络连接到共享的外部网络,如可用于访问互联网的公共网络。

L3 路由器在将路由器连接到外部网络的网关端口上提供基本网络地址转换(SNAT 和 the)功能。此路由器 SNAT (源 NAT)默认所有出口流量,并支持浮动 IP,它从外部网络上的公共 IP 创建静态一对一的双向映射到附加到路由器的另一个子网上的私有 IP。浮动 IP (通过 DNAT)为实例提供外部入站连接,并可从一个实例移动到另一个实例。

考虑使用每个项目 L3 路由和浮动 IP 来更精细的项目实例连接。应向连接到公共网络的实例或使用浮动 IP 指定特殊考虑。建议您使用仔细考虑的安全组过滤对需要外部公开的服务的访问。

10.8. 服务质量(QoS)

默认情况下,服务质量(QoS)策略和规则由云管理员管理,这会导致项目无法创建特定的 QoS 规则,或者将 pecific 策略附加到端口。在某些情况下,如某些电信应用程序,管理员可能会信任项目,从而使他们创建并将自己的策略附加到端口。这可以通过修改 policy.json 文件来实现。

从 Red Hat OpenStack Platform 12,neutron 支持入口和出口流量的带宽限制 QoS 规则。这个 QoS 规则名为 QosBandwidthLimitRule,它接受每秒以 KB 为单位计算的两个非负整数:

  • max-kbps: bandwidth
  • max-burst-kbps: burst buffer

QoSBandwidthLimitRule 已在 neutron Open vSwitch、Linux 网桥和 SR-IOV 驱动程序中实施。但是,对于 SR-IOV 驱动程序,不使用 max-burst-kbps 值,如果设置,则会被忽略。

对于所有离开一个虚拟机的网络流量,QoS 规则 QosDscpMarkingRule 在服务的类型头(IPv4 (RFC 2474))或网络类头(IPv6)中设置 DSCP(Differentiated Service Code Point )值,相关的规则会在其中应用。这是一个 6 位标头,它带有 21 个有效值,它表示数据包的丢弃优先级,因为它跨网络满足拥塞。防火墙也可以使用它与其访问控制列表匹配有效或无效的流量。

10.9. 负载均衡

OpenStack 负载均衡服务(octavia)为 Red Hat OpenStack Platform director 安装提供负载均衡服务(DSL)实现。为了实现负载平衡,octavia 支持启用多个供应商驱动程序。参考供应商驱动程序(Amphora 提供者驱动程序)是一个开源、可扩展和高可用性的负载平衡供应商。它通过管理一组虚拟机来实现负载平衡服务的交付,它可根据上面称为 amphorae-​ 来按需启动。

有关负载均衡服务的更多信息,请参阅 Using Octavia for Load Balancing-as-a-Service 指南。

10.10. 强化网络服务

本节讨论 OpenStack 网络配置最佳实践,因为它们应用到 OpenStack 部署中的项目网络安全性。

10.10.1. 项目网络服务工作流

OpenStack 网络为用户提供网络资源的自助服务配置。务必要确保云架构师和操作员评估其设计用例,为用户提供创建、更新和销毁可用网络资源的能力。

10.10.2. 网络资源策略引擎

OpenStack Networking 中的策略引擎及其配置文件(policy.json)提供了一种方法,可在项目网络方法和对象上为用户提供更精细的授权。OpenStack N etworking 策略定义会影响网络可用性、网络安全性和整个 OpenStack 安全性。云架构师和操作员应仔细评估他们对管理网络资源的用户和项目访问权限的策略。

注意

查看默认网络资源策略非常重要,因为此策略可以被修改以符合您的安全状态。

如果您的 OpenStack 部署提供了多个外部访问点到不同的安全区,则您必须限制项目将多个 vNIC 附加到多个外部访问机制的能力,这可能会桥接这些安全区,并可能导致无法预见的安全威胁。您可以使用计算提供的主机聚合功能,或将第 1 个项目实例拆分为具有不同虚拟网络配置的多个项目中,以帮助缓解这一风险。如需有关主机聚合的更多信息,请参阅 创建和管理主机聚合

10.10.3. 安全组

安全组是安全组规则的集合。安全组及其规则允许管理员和项目指定允许通过虚拟接口端口的流量类型和方向(入口/出口)类型。在 OpenStack 网络中创建虚拟接口端口时,它将与安全组关联。规则可以添加到默认安全组中,以便根据每个部署更改行为。

使用 Compute API 修改安全组时,更新的安全组将应用到实例上的所有虚拟接口端口。这是因为计算安全组 API 基于实例而不是基于端口,如 neutron 中找到的。

10.10.4. 缓解 ARP 欺骗

OpenStack 网络具有内置功能,可帮助缓解对实例的 ARP 欺骗。除非对产生的风险给出了仔细考虑,否则不应该禁用此项。

10.10.5. 使用安全协议进行身份验证

/var/lib/config-data/puppet-generated/neutron/etc/neutron/neutron.conf 中检查 [keystone_authtoken] 部分下的 auth_uri 的值是否已设置为以 'https 开头的身份 API 端点:

第 11 章 在 Red Hat OpenStack Platform 中强化块存储

OpenStack Block Storage (cinder)是一个提供软件(服务和库)的服务,用于自助服务管理持久块级存储设备。这会按需访问块存储资源,以用于计算(nova)实例。这样,通过将块存储池虚拟化为各种后端存储设备(可以是软件实施或传统硬件存储产品)来创建软件定义存储。这样做的主要功能是管理块设备的创建、附加和分离。消费者不需要了解后端存储设备的类型或位于的位置。

计算实例使用行业标准存储协议(如 iSCSI、ATA over Ethernet 或 Fibre-Channel)存储和检索块存储。这些资源使用 OpenStack 原生标准 HTTP RESTful API 管理和配置。

11.1. 为请求正文设置最大大小

如果没有定义每个请求的最大正文大小,攻击者可以制作一个大大小的任意 OSAPI 请求,从而导致服务崩溃,最终会导致服务攻击。分配 t he maximum 值可确保任何恶意的请求被阻止,确保服务持续可用。

检查 cinder.conf 中的 [oslo_middleware] 部分下的 max_request_body_size 是否被设置为 114688

11.2. 启用卷加密

未加密的卷数据会使卷托管平台特别用于攻击者的高值目标,因为它允许攻击者读取许多不同的虚拟机的数据。此外,物理存储介质可以被欺骗、重新挂载并从其他机器访问。加密卷数据和卷备份有助于降低这些风险,并为卷托管平台提供防御。块存储(cinder)可以在写入磁盘前加密卷数据,因此请考虑启用卷加密,并将 Barbican 用于私钥存储。

11.3. 卷 Wiping

可以通过多种方式擦除块存储设备。传统方法是将 lvm_type 设置为 thin,然后使用 volume_clear 参数。或者,如果卷加密功能为 ed,如果卷加密密钥被删除,则不需要卷 wiping。

注意

在以前的版本中,lvm_type=default 用于表示擦除。虽然此方法 仍可以正常工作,但不建议 设置安全删除。

volume_clear 参数可以接受 zeroshred 作为参数。 会将单个传递零写入设备。shred 操作将编写三个通过预先确定的位模式。

第 12 章 强化共享文件系统(Manila)

共享文件系统服务(manila)提供一组服务,用于在多项目云环境中管理共享文件系统。使用 manila,您可以创建一个共享文件系统并管理其属性,如可见性、可访问性和配额。

有关 manila 的更多信息,请参阅存储指南: https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/16.2/html-single/storage_guide/

12.1. manila 的安全注意事项

Manila 使用 keystone 注册,允许您使用 manila endpoint 命令找到 API。例如:

 $ manila endpoints
 +-------------+-----------------------------------------+
 | manila      | Value                                   |
 +-------------+-----------------------------------------+
 | adminURL    | http://172.18.198.55:8786/v1/20787a7b...|
 | region      | RegionOne                               |
 | publicURL   | http://172.18.198.55:8786/v1/20787a7b...|
 | internalURL | http://172.18.198.55:8786/v1/20787a7b...|
 | id          | 82cc5535aa444632b64585f138cb9b61        |
 +-------------+-----------------------------------------+

 +-------------+-----------------------------------------+
 | manilav2    | Value                                   |
 +-------------+-----------------------------------------+
 | adminURL    | http://172.18.198.55:8786/v2/20787a7b...|
 | region      | RegionOne                               |
 | publicURL   | http://172.18.198.55:8786/v2/20787a7b...|
 | internalURL | http://172.18.198.55:8786/v2/20787a7b...|
 | id          | 2e8591bfcac4405fa7e5dc3fd61a2b85        |
 +-------------+-----------------------------------------+

默认情况下,manila API 服务只侦听端口 8786 中的 tcp6,它支持 IPv4 和 IPv6。

Manila 使用多个配置文件;它们存储在 /var/lib/config-data/puppet-generated/manila/ 中:

 api-paste.ini
 manila.conf
 policy.json
 rootwrap.conf
 rootwrap.d

 ./rootwrap.d:
 share.filters

建议您将 manila 配置为在非 root 服务帐户下运行,并更改文件权限,以便只有系统管理员才能修改它们。Manila 期望只有管理员可以写入配置文件,服务只能通过 manila 组中的组成员资格读取它们。其他用户必须能够读取这些文件,因为它们包含服务帐户密码。

注意

只有 root 用户应该可以写入 rootwrap.conf 中的 manila-rootwrap 配置,manila-rootwrap 命令会过滤 rootwrap.d/share.filters 中的共享节点。

12.2. manila 的网络和安全模型

manila 中的共享驱动程序是一个 Python 类,可以为后端设置来管理共享操作,其中部分是特定于供应商的。后端是 manila-share 服务的实例。Manila 对许多不同的存储系统具有共享驱动程序,同时支持商业供应商和开源解决方案。每个共享驱动都支持一个或多个后端模式: 共享服务器无共享服务器。管理员通过使用 driver_handles_share_serversmanila.conf 中指定模式。

共享服务器是导出共享文件系统的逻辑网络附加存储(DSL)服务器。现在,后端存储系统很复杂,可以隔离不同 OpenStack 项目之间的数据路径和网络路径。

将创建由 manila 共享驱动程序置备的共享服务器,该网络将创建属于项目用户创建它的隔离网络上。共享 服务器模式可以配置扁平网络,或一个网段网络,具体取决于网络提供者。

对于不同的模式,可以有单独的驱动程序使用相同的硬件。根据所选模式,您可能需要通过配置文件提供更多配置详情。

12.3. 共享后端模式

每个共享驱动程序支持至少一个可用驱动程序模式:

  • 共享服务器 - driver_handles_share_servers = True - 共享驱动程序创建共享服务器并管理共享服务器生命周期。
  • 无共享服务器 - driver_handles_share_servers = False - 管理员(而不是共享驱动程序)使用网络接口管理裸机存储,而不依赖于共享服务器的存在。

无共享服务器模式 - 在这个模式中,驱动程序不会设置共享服务器,因此不需要设置任何新的网络接口。假设由驱动程序管理的存储控制器具有需要的所有网络接口。驱动程序在没有之前创建的共享服务器的情况下直接创建共享。要使用在这个模式下运行的驱动程序创建共享,manila 不需要用户创建任何私有共享网络。

注意

在任何 共享服务器模式中,manila 将假定所有项目可以访问导出任何共享的网络接口。

在没有共享服务器 模式中,共享驱动程序无法处理共享服务器生命周期。管理员应该处理提供项目隔离所需的存储、网络和其他主机端配置。在此模式中,管理员可以将存储设置为导出共享的主机。OpenStack 云中的所有项目共享一个通用网络管道。缺少隔离可能会影响安全性和服务质量。使用不处理共享服务器的共享驱动程序时,云用户无法确保其共享无法被不受信任的用户访问。通过树遍历其文件系统的顶级目录。在公有云中,所有网络带宽可能会被一个客户端使用,因此管理员应谨慎这样做。网络平衡可通过任何方式实现,不一定只是使用 OpenStack 工具。

共享服务器模式 - 在这个模式中,驱动程序能够创建共享服务器并将其插入现有的 OpenStack 网络。Manila 确定是否需要新的共享服务器,并提供共享驱动程序创建必要的共享服务器所需的所有网络信息。

在处理共享服务器的驱动程序模式中创建共享时,用户必须提供一个共享网络,它们期望其共享被导出。Manila 使用此网络为此网络上的共享服务器创建网络端口。

用户可以在 share serversno share servers 后端模式中配置 security services。但是,如果没有共享服务器 后端模式,管理员必须在主机上手动设置所需的身份验证服务。在 共享服务器 模式中,manila 可以在它生成的共享服务器上配置用户标识的安全服务。

12.4. manila 的网络要求

Manila 可以与不同的网络类型集成: 扁平GREVLANVXLAN

注意

Manila 仅将网络信息存储在数据库中,而实际网络是由网络提供者提供的。Manila 支持使用 OpenStack Networking 服务(neutron)和"standalone"预先配置的网络。

共享服务器 后端模式中,共享驱动程序为每个共享网络创建和管理共享服务器。这个模式可分为两种变体:

  • 共享服务器 后端模式的扁平网络
  • 共享服务器 后端模式中的片段网络

用户可以使用 OpenStack Networking (neutron)服务的网络和子网来创建共享网络。如果管理员决定使用 StandAloneNetworkPlugin,则用户不需要提供任何网络信息,因为管理员会在配置文件中预配置此信息。

注意

某些共享驱动程序生成的共享服务器是使用计算服务创建的计算服务器。其中一些驱动程序不支持网络插件。

创建共享网络后,manila 会检索由网络提供程序决定的网络信息:网络类型、分段标识符(如果网络使用分段)以及 CIDR 标记中的 IP 块,用于分配网络。

用户可以创建指定安全要求的安全服务,如 AD 或 LDAP 域或 Kerberos 域。Manila 假设任何引用安全服务的主机都可以从创建共享服务器的子网访问,这限制了可以使用此模式的情况数量。

注意

有些共享驱动程序可能不支持所有类型的分段,请参阅您使用的驱动程序规格。

12.5. 使用 manila 的安全服务

Manila 可以通过与网络身份验证协议集成来限制对文件共享的访问。每个项目可以有自己的身份验证域,这些域独立于云的 keystone 身份验证域。此项目域可用于向在 OpenStack 云中运行的应用提供授权(AuthZ)服务,包括 manila。可用的身份验证协议包括 LDAP、Kerberos 和 Microsoft Active Directory 身份验证服务。

12.6. 安全服务简介

创建共享并获取其导出位置后,用户没有挂载它并使用文件操作的权限。用户需要明确授予新共享的访问权限。

客户端身份验证和授权(authN/authZ)可与安全服务一起执行。如果共享驱动程序和后端支持,manila 可以使用 LDAP、Kerberos 或 Microsoft Active 目录。

注意

在某些情况下,需要明确指定其中一个安全服务,例如 NetApp、EMC 和 Windows 驱动程序需要 Active Directory 来使用 CIFS 协议创建共享。

12.7. 安全服务管理

安全服务 是一个 manila 实体,提取一组选项,用于为特定共享文件系统协议定义安全区,如 Active Directory 域或 Kerberos 域。安全服务包含 manila 创建加入给定域的服务器所需的所有信息。

通过使用 API,用户可以创建、更新、查看和删除安全服务。安全服务基于以下假设设计:

  • 项目提供安全服务的详细信息。
  • 管理员负责安全服务:它们配置此类安全服务的服务器端。
  • 在 manila API 中,security_serviceshare_networks 关联。
  • 共享驱动程序使用安全服务中的数据来配置新创建的共享服务器。

在创建安全服务时,您可以选择以下身份验证服务之一:

  • LDAP - 轻量级目录访问协议。用于通过 IP 网络访问和维护分布式目录信息服务的应用程序协议。
  • Kerberos - 网络身份验证协议,它基于票据,允许节点通过非安全网络进行通信,以安全的方式证明它们相互的身份。
  • Active Directory - Microsoft 为 Windows 域网络开发的目录服务。使用 LDAP、Microsoft 的 Kerberos 版本和 DNS。

Manila 允许您使用以下选项配置安全服务:

  • 项目网络中使用的 DNS IP 地址。
  • 安全服务的 IP 地址或主机名。
  • 安全服务的域。
  • 项目使用的用户或组名称。
  • 如果指定了用户名,则用户的密码。

现有安全服务实体可以与共享网络实体关联,通知 manila 关于一组共享的安全性和网络配置。您还可以查看指定共享网络的所有安全服务列表,并将它们与共享网络解除关联。

作为共享所有者的管理员和用户可以通过 IP 地址、用户、组或 TLS 证书创建使用身份验证的访问规则来管理对共享的访问规则。身份验证方法取决于您配置和使用的共享驱动程序和安全服务。然后,您可以将后端配置为使用特定的身份验证服务,该服务可以在没有 manila 和 keystone 的情况下操作客户端。

注意

不同共享驱动程序支持不同的身份验证服务。有关通过不同驱动程序支持功能的详情,请参考 https://docs.openstack.org/manila/latest/admin/share_back_ends_feature_support_mapping.html

支持某个驱动程序的特定身份验证服务并不意味着可以使用任何共享文件系统协议进行配置。支持的共享文件系统协议有 NFS、CEPHFS、CIFS、GlusterFS 和 HDFS。有关特定驱动程序及其安全服务的配置的详情,请查看驱动程序厂商的文档。

有些驱动支持安全服务,而其他驱动则不支持上述任何安全服务。例如,带有 NFS 或 CIFS 共享文件系统协议的通用驱动程序仅支持通过 IP 地址进行身份验证方法。

注意

在大多数情况下,支持 CIFS 共享文件系统协议的驱动程序可以配置为使用 Active Directory,并通过用户身份验证来管理访问。

  • 支持 GlusterFS 协议的驱动程序可用于使用 TLS 证书进行身份验证。
  • 使用支持使用 IP 地址进行 NFS 协议身份验证的驱动程序是唯一支持的选项。
  • 由于 HDFS 共享文件系统协议使用 NFS 访问,因此也可以将其配置为使用 IP 地址进行身份验证。

生产 manila 部署的建议配置是使用 CIFS 共享协议创建共享,并将其添加到 Microsoft Active Directory 目录服务中。使用这个配置,您将获得集中数据库和集成 Kerberos 和 LDAP 方法的服务。

12.8. 共享访问控制

用户可以指定哪些特定客户端有权访问他们所创建的共享。由于 keystone 服务,由单个用户创建的共享仅对同一项目中自己和其它用户可见。Manila 允许用户创建"公共"可见的共享。如果拥有者授予访问权限,则这些共享可以在属于其他 OpenStack 项目的仪表板中可见,如果他们可以在网络上访问,它们甚至能够挂载共享。

在创建共享时,请使用 key --public 使您的共享在共享列表中公开,并查看其详细信息。

根据 policy.json 文件,管理员和用户共享所有者可以通过创建访问规则来管理对共享的访问。使用 manila access-allowmanila access-denymanila access-list 命令,您可以相应地授予、拒绝和列出对指定共享的访问权限。

注意

Manila 不提供存储系统的端到端管理。您仍然需要单独保护后端系统不受未授权的访问。因此,如果某人破坏后端存储设备,则 manila API 提供的保护仍可能会被绕过。

当只创建共享时,没有与其关联的默认访问规则,以及挂载它的权限。这可以在挂载用于导出协议的配置中看到。例如,存储中有一个 NFS 命令 exportfs/etc/exports 文件,用于控制每个远程共享并定义可以访问它的主机。如果 nobody 可以挂载共享,则为空。对于远程 CIFS 服务器,有 net conf list 命令显示配置。hosts deny 参数应当由 share 驱动程序设置为 0.0.0.0/0,这意味着任何主机都会被拒绝。

使用 manila,您可以通过指定其中一个支持的共享访问级别来授予或拒绝对共享的访问访问权限:

  • rw - 读和写(RW)访问。这是默认值。
  • ro- 只读(RO)访问。
注意

当管理员为某些特定编辑器提供读写(RW)访问权限时,RO 访问级别对公共共享很有用,并为其他用户(viewer)授予只读(RO)访问权限。

您还必须指定以下受支持的验证方法之一:

  • ip - 使用 IP 地址来验证实例。可以通过以 CIDR 表示法以正确的 IPv4 或 IPv6 地址为客户端提供 IP 访问。
  • cert - 使用 TLS 证书来验证实例。将 TLS 身份指定为 IDENTKEY。有效值是证书通用名称(CN)中最多 64 个字符的字符串。
  • user - 由指定用户或组名称进行授权。有效值是一个字母数字字符,可以包含一些特殊字符,从 4 到 32 个字符。
注意

支持的身份验证方法取决于您使用的共享驱动程序、安全服务和共享文件系统协议。支持的共享文件系统协议有 MapRFS、CEPHFS、NFS、CIFS、GlusterFS 和 HDFS。支持的安全服务有 LDAP、Kerberos 协议或 Microsoft Active Directory 服务。

要验证是否为共享正确配置了访问规则(ACL),您可以列出其权限。

注意

为共享选择安全服务时,您需要考虑共享驱动程序是否使用可用的身份验证方法创建访问规则。支持的安全服务有 LDAP、Kerberos 和 Microsoft Active Directory。

12.9. 共享类型访问控制

共享类型是一个由管理员定义的服务类型(type of service),它包括一个项目可见的描述信息,以及一个项目不可见的、称为额外规格(extra specifications)的键值对列表。manila-scheduler 使用额外的规格来做出调度决策,驱动程序则控制共享创建。

管理员可以创建和删除共享类型,也可以管理额外的规格来指示在 manila 内的含义。项目可以列出共享类型,并可使用它们来创建新共享。共享类型可以被创建为 publicprivate。这是共享类型的可见性级别,用于定义其他项目是否可以在共享类型列表中看到它,并使用它来创建新共享。

默认情况下,共享类型创建为 public。在创建共享类型时,使用 --is_public 参数设置为 False 以使您的共享类型私有,这将阻止其他项目在共享类型列表中看到,并使用它创建新共享。另一方面,云中的每个项目都可使用 公共 共享类型。

Manila 允许管理员授予或拒绝对项目的 私有 共享类型的访问权限。您还可以获取有关指定私有共享类型的访问权限的信息。

注意

由于共享类型,因为额外的规格有助于在用户创建共享类型之前过滤或选择后端,因此您可以使用对特定后端选择限制客户端的访问限制客户端。

例如,admin 项目中的管理员用户可以创建一个名为 my_type 的私有共享类型,并在列表中查看它。在以下控制台示例中,省略登录和注销,并提供了环境变量来显示当前登录的用户。

 $ env | grep OS_
 ...
 OS_USERNAME=admin
 OS_TENANT_NAME=admin
 ...
 $ manila type-list --all
 +----+--------+-----------+-----------+-----------------------------------+-----------------------+
 | ID | Name   | Visibility| is_default| required_extra_specs              | optional_extra_specs  |
 +----+--------+-----------+-----------+-----------------------------------+-----------------------+
 | 4..| my_type| private   | -         | driver_handles_share_servers:False| snapshot_support:True |
 | 5..| default| public    | YES       | driver_handles_share_servers:True | snapshot_support:True |
 +----+--------+-----------+-----------+-----------------------------------+-----------------------+

demo 项目中的 demo 用户可以列出类型,但名为 my_type 的私有共享类型对他不可见。

 $ env | grep OS_
 ...
 OS_USERNAME=demo
 OS_TENANT_NAME=demo
 ...
 $ manila type-list --all
 +----+--------+-----------+-----------+----------------------------------+----------------------+
 | ID | Name   | Visibility| is_default| required_extra_specs             | optional_extra_specs |
 +----+--------+-----------+-----------+----------------------------------+----------------------+
 | 5..| default| public    | YES       | driver_handles_share_servers:True| snapshot_support:True|
 +----+--------+-----------+-----------+----------------------------------+----------------------+

管理员可以授予 demo 项目的私有共享类型的访问权限,项目 ID 等于 df29a37db5ae48d19b349fe947fada46

 $ env | grep OS_
 ...
 OS_USERNAME=admin
 OS_TENANT_NAME=admin
 ...
 $ openstack project list
 +----------------------------------+--------------------+
 | ID                               | Name               |
 +----------------------------------+--------------------+
 | ...                              | ...                |
 | df29a37db5ae48d19b349fe947fada46 | demo               |
 +----------------------------------+--------------------+
 $ manila type-access-add my_type df29a37db5ae48d19b349fe947fada46

因此,demo 项目中的用户可以看到私有共享类型,并在共享创建中使用它:

 $ env | grep OS_
 ...
 OS_USERNAME=demo
 OS_TENANT_NAME=demo
 ...
 $ manila type-list --all
 +----+--------+-----------+-----------+-----------------------------------+-----------------------+
 | ID | Name   | Visibility| is_default| required_extra_specs              | optional_extra_specs  |
 +----+--------+-----------+-----------+-----------------------------------+-----------------------+
 | 4..| my_type| private   | -         | driver_handles_share_servers:False| snapshot_support:True |
 | 5..| default| public    | YES       | driver_handles_share_servers:True | snapshot_support:True |
 +----+--------+-----------+-----------+-----------------------------------+-----------------------+

要拒绝对指定项目的访问,请使用 manila type-access-remove <share_type> <project_id>

注意

对于演示共享类型目的的示例,请考虑您有两个后端的情况:LVM 作为公共存储,Ceph 作为私有存储。在这种情况下,您可以授予对某些项目的访问权限,并使用 用户/组 身份验证方法控制对访问权限。

12.10. 策略(policy)

共享文件系统服务 API 被禁止,并符合基于角色的访问控制策略。这些策略决定了哪些用户可以以某种方式访问某些 API,并在服务的 policy.json 文件中定义。

注意

配置文件 policy.json 可以在任何位置放置。默认预期路径 /var/lib/config-data/puppet-generated/manila/etc/manila/policy.json

每当对 manila 发出 API 调用时,策略引擎都使用适当的策略定义来确定是否可以接受调用。策略规则决定允许 API 调用的情况。当规则是空字符串: ""; 基于用户角色或规则的规则时,/var/lib/config-data/puppet-generated/manila/etc/manila/policy.json 文件具有始终允许的规则。以下是 manila 的 policy.json 文件片段。应该在 OpenStack 版本之间有所变化。

   {
       "context_is_admin": "role:admin",
       "admin_or_owner": "is_admin:True or project_id:%(project_id)s",
       "default": "rule:admin_or_owner",
       "share_extension:quotas:show": "",
       "share_extension:quotas:update": "rule:admin_api",
       "share_extension:quotas:delete": "rule:admin_api",
       "share_extension:quota_classes": "",
   }

用户必须分配给您在策略中引用的组和角色。在使用用户管理命令时,该服务会自动完成此操作。

注意

/var/lib/config-data/puppet-generated/manila/etc/manila/policy.json 的任何更改都立即有效,这允许在 manila 运行时实施新策略。对策略进行手动修改可能会具有意外的副作用,我们不建议这样做。Manila 不提供默认策略文件;所有默认策略都在代码库中。您可以通过执行: oslopolicy-sample-generator --config-file=var/lib/config-data/puppet-generated/manila/etc/manila/manila-policy-generator.conf,从 manila 代码生成默认策略

第 13 章 对象存储

Object Storage (swift)服务通过 HTTP 存储和检索数据。对象(数据)存储在组织层次结构中,可以被配置为提供匿名只读访问、ACL 定义访问甚至临时访问。Swift 支持通过中间件实施的多个基于令牌的身份验证机制。

应用程序使用行业标准 HTTP RESTful API 在对象存储中存储和检索数据。后端 swift 组件遵循相同的 RESTful 模型,但某些 API (如管理持久性)在集群中保持私有。

swift 组件属于以下主要组中:

  • 代理服务
  • 身份验证服务
  • 存储服务

    • 帐户服务
    • 容器服务
    • 对象服务
Swift 网络图 1
注意

对象存储安装不必面向互联网,也是私有云,也可以是一个具有机构内部网络基础架构的一部分的公共交换机。

13.1. 网络安全性

swift 的安全性强化从保护网络组件开始。如需更多信息,请参阅网络章节。

为获得高可用性,可以使用 rsync 协议在存储服务节点之间复制数据。另外,代理服务在客户端端点和云环境之间转发数据时与存储服务通信。

注意

Swift 不使用加密或身份验证节点间通信。这是因为 swift 使用原生 rsync 协议的原因,且不将 SSH 用于 rsync 通信。因此您在构架图中看到私有交换机或专用网络([V]LAN)。此数据区域也应与其他 OpenStack 数据网络分开。

注意

对数据存储中的存储节点使用私有(V) LAN 网络段。

这要求代理节点具有双接口(物理或虚拟):

  • 一个接口作为供消费者访问的公共接口。
  • 另一个接口作为可访问存储节点的私有接口。

下图演示了一种可能的网络架构,将 Object Storage 网络架构与管理节点(OSAM)搭配使用:

Swift 网络图 2

13.2. 以非 root 用户身份运行服务

建议您将 swift 配置为以非 root (UID 0)服务帐户下运行。一个建议是,director 部署的用户名 swift 并带有一个主组 swift。对象存储服务包括 proxy-servercontainer-serveraccount-server

13.3. 文件权限

/var/lib/config-data/puppet-generated/swift/etc/swift/ 目录包含有关环拓扑和环境配置的信息。建议以下权限:

chown -R root:swift /var/lib/config-data/puppet-generated/swift/etc/swift/*
find /var/lib/config-data/puppet-generated/swift/etc/swift/ -type f -exec chmod 640 {} \;
find /var/lib/config-data/puppet-generated/swift/etc/swift/ -type d -exec chmod 750 {} \;

此限制仅允许 root 修改配置文件,同时仍然允许服务读取这些文件,因为 swift 组中的成员资格。

13.4. 保护存储服务

以下是各种存储服务的默认监听端口:

  • 帐户服务 - TCP/6002
  • 容器服务 - TCP/6001
  • 对象服务 - TCP/6000
  • rsync - TCP/873
注意

如果使用 ssync 而不是 rsync,则使用对象服务端口来维护其持久性。

注意

身份验证不会在存储节点中发生。如果您能够连接到其中一个端口上的存储节点,您可以在不进行身份验证的情况下访问或修改数据。为了帮助缓解这个问题,您应该遵循之前有关使用私有存储网络的建议。

13.5. Object Storage account 术语

swift 帐户不是用户帐户或凭证。存在以下区别:

  • Swift 帐户 - 容器的集合(而非用户帐户或身份验证)。您使用的身份验证系统将决定哪些用户与帐户相关联,以及它们如何访问该帐户。
  • Swift 容器 - 对象集合。容器的元数据可用于 ACL。ACL 的使用取决于所使用的身份验证系统。
  • Swift 对象 - 实际的数据对象。对象级别的 ACL 也可用于元数据,它依赖于所使用的身份验证系统。

在每个级别上,您都有控制用户的 ACL; ACL 会根据所使用的身份验证系统进行解释。最常见的身份验证提供程序是 Identity Service (keystone);自定义身份验证提供程序也可用。

13.6. 保护代理服务

代理节点应至少有两个接口(物理或虚拟):一个公共和一个私有接口。您可以使用防火墙或服务绑定来帮助保护公共接口。面向公共的服务是一个 HTTP Web 服务器,用于处理端点客户端请求、验证它们并执行适当的操作。专用接口不需要任何侦听的服务,而是用来建立到私有存储网络上的存储节点的传出连接。

13.7. HTTP 侦听端口

director 将 Web 服务配置为在非 root (无 UID 0)用户下运行。使用大于 1024 的端口号有助于避免以 root 用户身份运行 web 容器的任何部分。通常,使用 HTTP REST API (和执行自动身份验证)的客户端将从身份验证响应中检索它们所需的完整 REST API URL。OpenStack REST API 允许客户端对一个 URL 进行身份验证,然后重定向到将完全不同的 URL 用于实际服务。例如,客户端可以向 https://identity.cloud.example.org:55443/v1/auth 进行身份验证,并使用其身份验证密钥和存储 URL ( https://swift.cloud.example.org:44443/v1/AUTH_8980 的代理节点或负载均衡器的 URL)获得响应。

13.8. 负载均衡器

如果无法使用 Apache 选项,或者您希望卸载 TLS 工作的性能,您可以使用专用的网络设备负载均衡器。这是使用多个代理节点时提供冗余和负载平衡的常见方法。

如果您选择卸载 TLS,请确保负载均衡器和代理节点之间的网络链接位于私有(V) LAN 段上,以便网络中的其他节点(可能会被入侵)无法对未加密的流量进行线(sniff)。如果发生此类漏洞,攻击者可以获得对端点客户端或云管理员凭证的访问权限,并访问云数据。

您使用的身份验证服务将决定如何在对端点客户端的响应中配置不同的 URL,允许它们使用负载均衡器而不是单独的代理节点。

13.9. 对象存储身份验证

对象存储(swift)使用 WSGI 模型为仅提供一般可扩展性的中间件功能提供,也用于端点客户端验证。身份验证提供程序定义哪些角色和用户类型存在。有些使用传统的用户名和密码凭证,另一些则可能会利用 API 密钥令牌,甚至客户端 x.509 证书。自定义供应商可以使用自定义中间件集成。

默认情况下,Object Storage 附带两个身份验证中间件模块,其中之一可用作开发自定义身份验证中间件的示例代码。

13.10. 加密 at-rest swift 对象

Swift 可以与 Barbican 集成,以透明加密和解密您存储的(at-rest)对象。at-rest 加密与 in-transit 加密不同,引用存储在磁盘上的对象时加密的对象。

Swift 透明执行这些加密任务,在上传到 swift 时会自动加密对象,然后在提供给用户时自动解密对象。此加密和解密使用相同的(symmetric)密钥完成,该密钥存储在 Barbican 中。

如需更多信息,请参阅 Barbican 集成指南: https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/16.2/html-single/manage_secrets_with_openstack_key_manager/

13.11. 其他项目

在每个节点上的 /var/lib/config-data/puppet-generated/swift/etc/swift/swift.conf 中,在每个节点上都有一个 swift_hash_path_prefix 设置和一个 swift_hash_path_suffix 设置。这些的目的是减少所存储对象的哈希冲突的机会,以及一个用户覆盖另一个用户数据的哈希冲突的机会。

这个值最初应该使用加密安全随机数字生成器进行设置,并在所有节点上保持一致。确保它被正确的 ACL 保护,并且您有备份副本以避免数据丢失。

第 14 章 监控和日志记录

日志管理是监控 OpenStack 部署的安全状态的重要组件。除了组成 OpenStack 部署的组件活动外,日志还深入了解管理员、项目和实例的 BAU 操作。

日志不适用于主动安全性和连续合规活动,而且也是调查和事件响应的宝贵信息源。例如,分析 keystone 访问日志可能会提醒您登录失败、频率、原始 IP 以及事件是否仅限于选择帐户,以及其他外的信息。

director 包括使用 AIDE 的入侵检测功能,以及 keystone 的 CADF 审计。如需更多信息,请参阅 强化基础架构和虚拟化

14.1. 强化监控基础架构

集中式日志记录系统是入侵器的高值目标,因为成功的破坏可能会允许他们清除或篡改事件记录。建议您使用以下命令强化监控平台。另外,请考虑对这些系统进行常规备份,并在出现中断或 DoS 时进行故障转移规划。

14.2. 要监控的事件示例

事件监控是一种更主动的方法来保护环境,从而提供实时检测和响应。存在多个工具,有助于监控。对于 OpenStack 部署,您需要监控硬件、OpenStack 服务和云资源使用情况。

本节描述了您可能需要了解的一些示例事件。

重要

此列表并不完整。您需要考虑可能适用于特定网络的其他用例,并且您可能考虑异常行为。

  • 检测没有日志生成情况是发生高值。这种差距可能表示服务失败,甚至可能会临时关闭日志记录或修改日志级别来隐藏其跟踪。
  • 未调度的应用程序事件(如启动或停止事件)可能会有安全影响。
  • 在 OpenStack 节点上操作系统事件,如用户登录或重启。它们可提供宝贵的见解,以区分系统的正确和不正确的使用情况。
  • 网络桥接关闭。这可能是因为服务中断风险而造成的可操作事件。
  • iptables 刷新 Compute 节点上的事件,以及对实例的访问丢失。

为减少来自用户、项目或域删除的安全风险,可以讨论在系统中生成通知,并使 OpenStack 组件会根据情况响应这些事件,如终止实例、断开附加的卷、回收 CPU 和存储资源等。

安全监控控制,如入侵检测软件、防御软件以及欺骗软件检测和删除工具可以生成日志,以展示攻击或入侵发生的时间和方式。这些工具可在 OpenStack 节点上部署时提供一层保护。项目用户可能还想在其实例上运行此类工具。

第 15 章 项目的数据隐私

OpenStack 的设计旨在支持具有不同数据要求的项目之间的多租户。云操作员需要考虑其适用的数据隐私问题及法规。本章解决了数据间的方面,适用于 OpenStack 部署。

15.1. 数据驻留在

在过去的几年里,数据的隐私和隔离性被认为是云采用的主要障碍。关注谁拥有云中数据,以及云操作员是否可以作为此数据的城市信任,但过去是否存在大量问题。

某些 OpenStack 服务有权访问属于项目的数据和元数据,或引用项目信息。例如,存储在 OpenStack 云中的项目数据可能包括以下项目:

  • 对象存储对象。
  • 计算实例临时文件系统存储。
  • 计算实例内存。
  • 块存储卷数据。
  • 用于计算访问的公钥。
  • 镜像服务中的虚拟机镜像。
  • 实例快照。
  • 传递给计算配置驱动器扩展的数据。

由 OpenStack 云存储的元数据包括以下项目(此列表不可更改):

  • 机构名称。
  • 用户的"Real Name"。
  • 正在运行的实例、存储桶、对象、卷和其他与配额相关的项目的数量或大小。
  • 运行实例或存储数据的小时数。
  • 用户的 IP 地址。
  • 为计算镜像捆绑在内部生成的私钥。

15.2. 数据分布

最佳实践建议,Operator 在机构控制前,或发布前必须清理云系统介质(数字和非数字),或发布前再发布以进行重复使用。根据特定安全域和敏感度,清理方法应实施适当的强度和完整性。

注意

NIST Special Publication 800-53 Revision 4 在这个主题上使用一个特定的视图:

The sanitization process removes information from the media such that the information cannot be retrieved or reconstructed. Sanitization techniques, including clearing, purging, cryptographic erase, and destruction, prevent the disclosure of information to unauthorized individuals when such media is reused or released for disposal.

在开发常规数据分布和清理指南时(根据 NIST 推荐的安全控制,云操作员应考虑以下内容:

  • 跟踪、文档和验证媒体清理和分散操作。
  • 测试清理设备和流程以验证正确的性能。
  • 在将此类设备连接到云基础架构之前,清理可移植的可移动存储设备。
  • 销毁无法清理的云系统介质。

因此,OpenStack 部署需要解决以下实践(其它操作):

  • 安全数据擦除
  • 实例内存清理
  • 块存储卷数据
  • 计算实例临时存储
  • 裸机服务器清理

15.2.1. 数据不安全删除

在 OpenStack 中,可能会删除一些数据,但无法象上述 NIST 标准上下文中那样安全地清除。这通常适用于存储在数据库中的最大或全部定义元数据和信息。这可能会通过数据库和/或系统配置修复,以自动处理和定期释放可用空间。

15.2.2. 实例内存清理

特定于各种虚拟机监控程序是实例内存的处理。Compute 中没有定义此行为,尽管虚拟机监控程序通常会在创建实例时对删除实例时清理内存的最佳努力。

15.3. 加密 Cinder 卷数据

强烈建议使用 OpenStack 卷加密功能。这在卷加密下的 Data Encryption 部分中讨论。使用此功能时,通过安全地删除加密密钥来实现数据销毁。最终用户可以在创建卷时选择此功能,但请注意,管理员必须首先执行对卷加密功能的一次性设置。

如果没有使用 OpenStack 卷加密功能,则其他方法通常很难启用。如果使用后端插件,则可能会独立进行加密或非标准覆盖解决方案。OpenStack Block Storage 的插件以各种方式存储数据。许多插件都特定于某个供应商或技术,而其他插件则针对文件系统(如 LVM 或 ZFS)提供更多 合并解决方案。安全销毁数据的方法因插件、供应商和文件系统而异。

有些后端(如 ZFS)支持写时复制以防止数据暴露。在这些情况下,从未写入块读取始终返回零。其他后端(如 LVM)可能无法原生支持此功能,因此 cinder 插件在将之前写入的块分配给用户前需要覆盖之前写入的块。务必要检查您选择的卷后端所提供的保证,并查看哪些补救可能可用于提供这些保证。

15.4. 镜像服务延迟删除功能

镜像服务具有延迟删除功能,它将假定在定义的时间段内删除镜像。如果此行为是安全问题,请考虑禁用此功能;您可以通过编辑 glance-api.conf 文件并将 delayed_delete 选项设置为 False 来完成此操作。

15.5. 计算软删除功能

计算具有软删除功能,它允许在定义的时间段内删除的实例处于软删除状态。这个实例可以在此时间段内恢复。要禁用 soft-delete 功能,请编辑 /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf 文件,并将 reclaim_instance_interval 选项留空。

15.6. 裸机置备的安全强化

对于裸机置备基础架构,您应该考虑安全强化基板管理控制器(BMC),特别是 IPMI。例如,您可以在 provisioning 网络中隔离这些系统,配置非默认和强大的密码,以及禁用不需要的管理功能。如需更多信息,请参阅厂商有关安全强化这些组件的指导。

注意

如果可能,请考虑评估基于 Redfish 的 BMC。

15.7. 硬件标识

在部署服务器时,可能无法始终具有可靠的方法将其与攻击者的服务器区分开。这个功能可能依赖于硬件/BMC 到某种程度,但通常看似没有可验证在服务器中内置的方式。

15.8. 数据加密

该选项存在用于加密存储在磁盘上的项目数据或通过网络传输的项目数据,如下面描述的 OpenStack 卷加密功能。这比一般建议外,用户在将自己的数据发送到自己的供应商前对其进行加密。

代表项目加密数据的重要性主要与攻击者可以访问项目数据的供应商认为风险非常相关。此处可能有一些要求,以及每个政策的要求、私有合同,甚至当涉及公有云供应商的私有合同的情况下也是如此。在选择项目加密策略前,请考虑获取风险评估和法律建议。

每个实例或每个对象加密是首选进行的、按降序、每个项目、每个主机和每个云聚合的。本建议与实施的复杂性和困难有关。目前,对于某些项目,实施加密非常困难或根本不可能。实施者应该优先考虑加密项目数据。

通常,数据加密与可靠地销毁项目和每个实例数据的能力相关,只需抛出密钥。请注意,为此,最好以可靠和安全的方式销毁这些密钥。

提供加密用户数据的机会:

  • Object Storage 对象
  • 网络数据

15.8.1. 卷加密

OpenStack 中的卷加密功能基于每个项目支持隐私。支持以下功能:

  • 创建和使用加密卷类型,通过仪表板或命令行界面启动
  • 启用加密和选择参数,如加密算法和密钥大小
  • iSCSI 数据包中包含的卷数据是加密的
  • 支持加密备份(如果原始卷加密)
  • 卷加密状态的仪表板。包括表示卷已加密,并包含加密参数,如算法和密钥大小
  • 使用密钥管理服务的接口

15.8.2. Object Storage 对象

对象存储(swift)支持在存储节点上对对象数据的可选加密。对象数据的加密旨在降低当未授权方获得对磁盘的物理访问权限时用户的数据读取的风险。

剩余的数据加密是由代理服务器 WSGI 管道中包含的中间件实现的。该功能是 swift 集群的内部,无法通过 API 公开。客户端不知道数据由此功能在内部加密到 swift 服务;内部加密的数据不应通过 swift API 返回到客户端。

在 swift 中,以下数据会被加密:

  • 对象内容,如对象 PUT 请求正文的内容。
  • 具有非零内容的对象的实体标签(ETag)。
  • 所有自定义用户对象元数据值。例如,使用带有 X-Object-Meta- 前缀的标头的 PUTPOST 请求发送元数据。

以上列表中未包含的任何数据或元数据都不会被加密,包括:

  • 帐户、容器和对象名称
  • 帐户和容器自定义用户元数据值
  • 所有自定义用户元数据名称
  • 对象 Content-Type 值
  • 对象大小
  • 系统元数据

15.8.3. 块存储性能和后端

启用操作系统时,您可以使用 Intel 和 AMD 处理器中提供的硬件加速功能增强 OpenStack 卷加密性能。

OpenStack 卷加密功能在主机上使用 dm-crypt 或原生 QEMU 加密支持来保护卷数据。红帽建议您在创建加密卷时使用 LUKS 卷类型。

15.8.4. 网络数据

Compute 节点的项目数据可以通过 IPsec 或其他隧道进行加密。这种方法不是 OpenStack 中的常见或标准,但是一个选项,可供培训和感兴趣的实施者。同样,加密的数据会保持加密,因为它通过网络传输。

15.9. 密钥管理

为了解决项目数据隐私的常见关注,OpenStack 社区中值得关注来使数据加密更加严格。在将数据保存到云之前,最终用户很难加密其数据,这是项目对象(如介质文件、数据库存档等)的可行路径。在某些情况下,客户端加密用于加密由需要客户端交互(如显示密钥)保存的数据,以解密数据以供以后使用。

barbican 有助于项目更无缝地加密数据,并使其可访问,而不会让用户承担密钥管理。作为 OpenStack 的一部分,提供加密和密钥管理服务可简化数据需求,并有助于解决客户对隐私或滥用数据的关注。

卷加密功能依赖于密钥管理服务,如密钥管理器服务(barbican),用于创建和安全强化密钥存储。

第 16 章 管理实例安全性

在虚拟化环境中运行实例的一个好处是,在裸机上部署时通常不可用的安全控制的新机会。某些技术可应用于虚拟化堆栈,从而改进了 OpenStack 部署的信息保证。具有强大的安全要求的 Operator 可能考虑部署这些技术,但并非所有都适用于每种情况。在某些情况下,由于具体要求,技术可能会在云中使用。同样,一些技术会检查实例数据,如 run 状态,它们可能对系统的用户不准确。

本章描述了这些技术,以及有助于提高实例或底层节点安全性的情况。还突出显示了可能的隐私问题,其中包括数据透传、内省或熵来源。

16.1. 为实例提供熵

熵指的是实例可用的随机数据的质量和来源。加密技术通常依赖于随机性,这需要从熵池中提取。当实例无法获得足够的熵来支持加密技术所需的随机性时,会发生熵不足。熵不足可以在实例中清单,因为看似无关。例如,引导时间缓慢可能是由等待 SSH 密钥生成的实例造成的。熵不足的可能性也可以使云用户使用来自实例内的质量熵源,从而确保云中运行的应用程序的安全性较低。

为需要足够硬件随机数生成器(HRNG)的实例提供高质量的熵来源来支持实例。对于日常操作,现代 HRNG 可以生成足够的熵来支持 50-100 Compute 节点。高带宽 HRNG 可以处理更多节点。您必须识别云的应用程序要求,以确保有足够的熵可用。

VirtIO RNG 是一个随机数字生成器,默认使用 /dev/urandom 作为熵的来源,以确保实例在引导时不会耗尽熵。也可以将其配置为使用 HRNG,或像熵收集守护进程(EGD)等工具,提供通过部署分发熵的方法。默认情况下,实例启用了 virtio RNG 设备。要为实例禁用 Virtio RNG 设备,您必须将 hw_rng:allowed 设置为实例类别上的 False

16.2. 将实例调度到节点

在创建实例之前,必须选择镜像实例化的主机。此选择由 nova-scheduler 执行,它决定如何分配计算和卷请求。

FilterScheduler 是计算的默认调度程序,但存在其他调度程序。此功能与 过滤器提示 协作,以确定实例应启动的位置。此主机选择过程允许管理员满足许多不同的安全性和合规性要求。如果数据隔离是一个主要关注,您可以选择尽可能将项目实例驻留在同一主机上。相反,您可以尝试因为可用性或容错原因使实例尽可能驻留在不同的主机上。

过滤器调度程序属于以下主要类别:

  • 基于资源的过滤器 - 根据虚拟机监控程序主机集的系统资源使用情况确定实例的放置,并可触发空闲或已使用的属性,如 RAM、IO 或 CPU 使用率。
  • 基于镜像的过滤器 - 根据所使用的镜像元数据(如操作系统或所用的镜像类型)创建实例创建。
  • 基于环境的过滤器 - 确定基于外部详情的实例放置,如在特定 IP 范围内、跨可用区或与其他实例相同的主机上。
  • 自定义标准 - 根据用户或管理员提供的标准(如信任或元数据解析)验证实例创建。

多个过滤器可以一次性应用。例如,ServerGroupAffinity 过滤器检查实例是否在特定主机集合的成员上创建,而 ServerGroupAntiAffinity 过滤器会检查是否在另一组主机上创建同一实例。请注意,这两个过滤器通常同时启用,且永远不会相互冲突,因为它们每次检查给定属性的值,且不能同时为 true。

filteringWorkflow1
重要

考虑禁用解析用户提供的对象的过滤器,或者可以被操作(如元数据)。

16.3. 使用可信镜像

在云环境中,用户可以处理它们上传的镜像或镜像。在这两种情况下,用户都应确保它们所使用的镜像没有被篡改。验证镜像的功能是安全的基础。需要从镜像源到使用它的目的地的信任链。这可以通过签名从可信源获取的镜像,并在使用前验证签名来实现。下面将讨论获取和创建验证镜像的各种方法,后跟镜像签名验证功能的描述。

16.4. 创建镜像

OpenStack 文档提供了有关如何创建并将镜像上传到镜像服务的指导。另外,假设您有安装和强化客户机操作系统的过程。以下项目将提供有关如何将镜像传送到 OpenStack 的附加指导。获取镜像的各种选项。每种方法均有特定的步骤,可以帮助验证镜像的来源。

  • 选项 1: 包含来自可信源的引导介质.例如,您可以从官方的红帽源下载镜像,然后执行额外的 checksum 验证。
  • 选项 2: 使用 OpenStack 虚拟机镜像指南。在这种情况下,您将希望遵循您的机构操作系统强化指南。
  • 选项 3 :使用自动镜像构建器。以下示例使用 Oz 镜像构建器。OpenStack 社区最近创建了一个名为 disk-image-builder 的较新工具,但还没有出现安全评估。

在本例中,RHEL 6 CCE-26976-1 帮助在 Oz 中实施 NIST 800-53 节 AC-19 (d)。

<template>
<name>centos64</name>
<os>
  <name>RHEL-6</name>
  <version>4</version>
  <arch>x86_64</arch>
  <install type='iso'>
  <iso>http://trusted_local_iso_mirror/isos/x86_64/RHEL-6.4-x86_64-bin-DVD1.iso</iso>
  </install>
  <rootpw>CHANGE THIS TO YOUR ROOT PASSWORD</rootpw>
</os>
<description>RHEL 6.4 x86_64</description>
<repositories>
  <repository name='epel-6'>
  <url>http://download.fedoraproject.org/pub/epel/6/$basearch</url>
  <signed>no</signed>
  </repository>
</repositories>
<packages>
  <package name='epel-release'/>
  <package name='cloud-utils'/>
  <package name='cloud-init'/>
</packages>
<commands>
  <command name='update'>
  yum update
  yum clean all
  sed -i '/^HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0
  echo -n > /etc/udev/rules.d/70-persistent-net.rules
  echo -n > /lib/udev/rules.d/75-persistent-net-generator.rules
  chkconfig --level 0123456 autofs off
  service autofs stop
  </command>
</commands>
</template>

考虑避免手动镜像构建过程,因为它很复杂且容易出错。此外,使用 Oz 等自动系统进行镜像构建,或者配置管理实用程序(如 Dan 或 Puppet)进行强化,可让您生成一致的镜像,并跟踪基础镜像的合规性,以便随着时间的推移进行相应的强化指南。

如果订阅公有云服务,您应该与云供应商联系,以了解用于生成其默认镜像的流程概述。如果供应商允许您上传自己的镜像,则需要确保在使用它创建实例前验证您的镜像没有被修改。为此,请参阅 _Verification 镜像签名_ 的以下部分,或者无法使用以下段落。

Image Service (glance)用于将镜像上传到节点上的 Compute 服务。此传输应进一步通过 TLS 强化。镜像位于节点上后,它将通过基本的校验和进行检查,然后根据所启动实例的大小扩展其磁盘。如果稍后,同一镜像在这个节点上使用相同的实例大小启动,它将从相同的扩展镜像启动。由于这种扩展的镜像在启动前不会被重新验证,所以存在风险。用户不知道篡改,除非手动检查生成的镜像中文件。要帮助缓解这一点,请参阅以下有关验证镜像签名的主题。

16.5. 验证镜像签名

您可以启用镜像签名验证,以确保您的镜像服务(glance)镜像在计算服务(nova)启动实例前不包含未授权的更改。启用此功能后,您可以防止新实例启动,其中可能包括恶意软件或安全漏洞。

流程

  1. 在 heat 模板中,通过将 True 的值设置为 VerifyGlanceSignatures 参数来启用实例签名验证:

    parameter_defaults:
        VerifyGlanceSignatures: True
  2. 确保用于修改 VerifyGlanceSignatures 参数的模板包含在 openstack overcloud deploy script 中,并重新运行 deploy 脚本。
注意

如果您使用没有签名的镜像创建实例,则镜像会失败,且实例不会启动。有关签名镜像的更多信息,请参阅签名镜像

16.6. 迁移实例

OpenStack 和底层虚拟化层为在 OpenStack 节点之间实时迁移镜像提供,允许您无缝地执行 Compute 节点的滚动升级,而无需实例停机。但是,实时迁移也存在显著的风险。要了解涉及的风险,以下是在实时迁移过程中执行的高级步骤:

  1. 在目标主机上启动实例
  2. 传输内存
  3. 停止客户机和同步磁盘
  4. 传输状态
  5. 启动客户机
注意

某些操作(如冷迁移、调整大小和 shelve)都可能导致在网络上将实例的数据传送到其他服务中。

16.6.1. 实时迁移风险

在实时迁移过程的不同阶段,实例运行时内存和磁盘以纯文本通过网络传输。因此,在使用实时迁移时需要解决多个风险。以下非行为列表详细介绍了其中一些风险:

  • 拒绝服务(DoS):如果在迁移过程中出现问题,则实例可能会丢失。
  • 数据暴露:必须安全地处理内存或磁盘传输。
  • 数据操作:如果没有安全地处理内存或磁盘传输,则攻击者可以在迁移过程中操作用户数据。
  • 代码注入:如果没有安全处理内存或磁盘传输,那么攻击者可以在迁移过程中操作可执行文件(在磁盘或内存中)。

16.6.2. 禁用实时迁移

目前,OpenStack 中默认启用实时迁移。默认情况下,实时迁移是仅管理员的任务,因此用户无法启动此操作,而只有管理员(可能值得信任的)。可以在 nova policy.json 文件中添加以下行来禁用实时迁移:

"compute_extension:admin_actions:migrate": "!",
"compute_extension:admin_actions:migrateLive": "!",

或者,当阻止 TCP 端口 4915249261 时,实时迁移可能会失败,或者确保 nova 用户在计算主机之间没有免密码 SSH 访问。

请注意,实时迁移的 SSH 配置被锁定: 创建新用户(nova_migration),SSH 密钥仅限于该用户,并且仅对允许的网络使用。然后,打包程序脚本会限制可运行的命令(例如,libvirt 套接字上的 netcat)。

16.6.3. 加密的实时迁移

实时迁移流量以纯文本形式传输正在运行的实例的磁盘和内存内容,并且当前默认托管在内部 API 网络中。

如果有足够的要求(如升级)可以保持启用实时迁移,那么 libvirtd 可以为实时迁移提供加密的隧道。但是,此功能不会在 OpenStack Dashboard 或 nova-client 命令中公开,只能通过手动配置 libvirtd 来访问。然后,实时迁移过程会更改为以下高级别步骤:

  1. 实例数据从虚拟机监控程序复制到 libvirtd。
  2. 在源和目标主机上的 libvirtd 进程间创建一个加密的隧道。
  3. 目标 libvirtd 主机将实例复制到底层管理程序。
注意

对于 Red Hat OpenStack Platform 13,推荐的方法是使用隧道迁移,在将 Ceph 用作后端时默认启用。如需更多信息,请参阅 https://docs.openstack.org/nova/queens/configuration/config.html#libvirt.live_migration_tunnelled

16.7. 监控、警报和报告

实例是可以在主机之间复制的服务器镜像。因此,最好在物理和虚拟主机之间应用类似日志的好做法。应记录操作系统和应用程序事件,包括对主机和数据的访问事件、用户添加和删除、特权更改等,如您的要求所规定。考虑将结果导出到收集日志事件的日志聚合器,关联日志事件进行分析,并存储它们以进行参考或进一步的操作。执行此操作的一个常用工具是 ELK 堆栈,或 Elasticsearch、Logtash 和 Kibana。

注意

这些日志应定期检查,甚至可以在网络操作中心(NOC)执行的实时视图中监控。

您需要进一步确定哪些事件将触发随后发送到操作响应器的警报。

如需更多信息,请参阅监控工具配置指南

16.8. 更新和补丁

管理程序运行独立的虚拟机。此管理程序可以在操作系统中运行,或者直接运行在硬件上(称为裸机)。对虚拟机监控程序的更新不会传播到虚拟机。例如,如果部署使用 KVM 并有一组 CentOS 虚拟机,对 KVM 的更新不会更新在 CentOS 虚拟机上运行的任何内容。

考虑将虚拟机的清晰所有权分配给所有者,然后负责虚拟机的强化、部署和继续功能。您还应计划定期部署更新,而首先在类似生产环境的环境中对其进行测试。

16.9. 防火墙和实例配置集

大多数常见操作系统都包括基于主机的防火墙,以实现额外的安全层。虽然实例应尽可能少运行(如果是单用途实例),但实例上运行的所有应用程序都应被设置,以确定应用程序需要访问哪些系统资源、运行所需的最低特权级别以及预期网络流量将进入和来自虚拟机的预期网络流量。此预期流量应当作为允许的流量添加到基于主机的防火墙中,以及任何必要的日志记录和管理通信,如 SSH 或 RDP。防火墙配置中应明确拒绝所有其他流量。

在 Linux 实例上,上面的应用程序配置集可与 audit2allow 等工具一起使用,以构建 SELinux 策略,进一步保护大多数 Linux 发行版上的敏感系统信息。SELinux 使用用户、策略和安全上下文的组合来比较应用程序运行所需的资源,并从不需要的其他系统资源中进行分段。

注意

Red Hat OpenStack Platform 默认启用 SELinux,其策略是为 OpenStack 服务自定义的策略。根据需要定期检查这些策略。

16.10. 安全组

OpenStack 为主机和网络提供安全组,来向给定项目中的实例添加安全保护。它们和基于主机的防火墙类似,因为它们允许或拒绝基于端口、协议和地址的流量。但是,安全组规则仅应用于传入流量,而基于主机的防火墙规则可以同时应用到传入和传出流量。主机和网络安全组规则也可以冲突和拒绝合法流量。考虑为所使用的网络检查是否已正确配置了安全组。如需了解更多详细信息,请参阅本指南中的安全组。

注意

除非特别需要禁用,否则您应该保持安全组和端口安全性。要基于安全设计的方法构建,建议您将粒度规则应用到实例。

16.11. 访问实例控制台

默认情况下,可通过虚拟控制台远程访问实例的控制台。这对故障排除非常有用。Red Hat OpenStack Platform 使用 VNC 进行远程控制台访问。

  • 考虑使用防火墙规则锁定 VNC 端口。默认情况下,nova_vnc_proxy 使用 608013080
  • 确认 VNC 流量由 TLS 加密。对于基于 director 的部署,以 UseTLSTransportForVnc 开始。

16.12. 证书注入

如果需要 SSH 到实例,您可以将计算配置为在创建时自动将所需的 SSH 密钥注入实例。

如需更多信息,请参阅 创建镜像

第 17 章 消息排队

消息排队服务于 OpenStack 中的进程间通信。这可以通过这些消息排队服务后端完成:

  • RabbitMQ - Red Hat OpenStack Platform 默认使用 RabbitMQ。
  • qpid

RabbitMQ 和 Qpid 都是高级消息队列协议(AMQP)框架,它为对等到对等通信提供消息队列。队列实施通常部署为中央或分散的队列服务器池。

消息队列在 OpenStack 部署之间有效有助于命令和控制功能。允许访问队列后,不会执行进一步的授权检查。通过队列访问的服务会验证实际消息有效负载中的上下文和令牌。但是,您必须注意令牌的过期日期,因为令牌可能会重新显示,并可授权基础架构中其他服务。

OpenStack 不支持消息级的关注,如消息签名。因此,您必须保护并验证消息传输本身。对于高可用性(HA)配置,您必须执行队列到队列的身份验证和加密。

17.1. 消息传递传输安全性

基于 AMQP 的解决方案(Qpid 和 RabbitMQ)支持使用 TLS 的传输级别安全性。

考虑为您的消息队列启用传输级别的加密。将 TLS 用于消息传递客户端连接可防止通信被篡改并窃取到消息传递服务器。以下是通常如何为两个流行的消息传递服务器配置 TLS 的指导:qpid 和 RabbitMQ。在配置您的消息传递服务器用来验证客户端连接的可信证书颁发机构(CA)捆绑包时,建议只限于用于节点的 CA,最好是内部管理的 CA。可信 CA 的捆绑包将决定哪个客户端证书将被授权,并传递设置 TLS 连接的 client-server 验证步骤。

注意

安装证书和密钥文件时,请确保限制文件权限,例如使用 chmod 0600,其所有权仅限于消息传递服务器守护进程用户,以防止消息传递服务器上的其他进程和用户未经授权访问。

17.1.1. RabbitMQ 服务器 SSL 配置

以下行应该添加到系统范围的 RabbitMQ 配置文件中,通常为 /etc/rabbitmq/rabbitmq.config

[
  {rabbit, [
     {tcp_listeners, [] },
     {ssl_listeners, [{"<IP address or hostname of management network interface>", 5671}] },
     {ssl_options, [{cacertfile,"/etc/ssl/cacert.pem"},
                    {certfile,"/etc/ssl/rabbit-server-cert.pem"},
                    {keyfile,"/etc/ssl/rabbit-server-key.pem"},
                    {verify,verify_peer},
                    {fail_if_no_peer_cert,true}]}
   ]}
].
注意

tcp_listeners 选项设置为 [],以防止它侦听非 SSL 端口。ssl_listeners 选项应该仅限于仅侦听服务的管理网络。

17.2. 队列身份验证和访问控制

RabbitMQ 和qpid 提供控制对队列访问的身份验证和访问控制机制。

简单的身份验证和安全层(SASL)是在互联网协议中进行身份验证和数据安全的框架。RabbitMQ 和qpid 在简单的用户名和密码之外提供 SASL 和其他可插拔验证机制,从而提高了身份验证安全性。虽然 RabbitMQ 支持 SASL,但 OpenStack 中的支持目前不允许请求特定的 SASL 身份验证机制。OpenStack 中的 RabbitMQ 支持通过未加密的连接或用户名和密码与 X.509 客户端证书一起进行用户名和密码身份验证,以建立安全的 TLS 连接。

考虑在所有 OpenStack 服务节点上配置 X.509 客户端证书,以便客户端连接消息传递队列,并在可能的情况下(当前只有qpid)使用 X.509 客户端证书执行身份验证。在使用用户名和密码时,应为每个服务和节点创建帐户,以精细地审核对队列的访问。

在部署之前,请考虑排队服务器使用的 TLS 库。qpid 使用 Mozilla 的 NSS 库,而 RabbitMQ 使用 Erlang 的 TLS 模块使用 OpenSSL。

17.3. RabbitMQ 的 OpenStack 服务配置

本节介绍 OpenStack 服务的典型 RabbitMQ 配置:

[DEFAULT]
rpc_backend = nova.openstack.common.rpc.impl_kombu
rabbit_use_ssl = True
rabbit_host = RABBIT_HOST
rabbit_port = 5671
rabbit_user = compute01
rabbit_password = RABBIT_PASS
kombu_ssl_keyfile = /etc/ssl/node-key.pem
kombu_ssl_certfile = /etc/ssl/node-cert.pem
kombu_ssl_ca_certs = /etc/ssl/cacert.pem
注意

RABBIT_PASS 替换为合适的密码。

17.4. 用于qpid 的 OpenStack 服务配置

本节介绍 OpenStack 服务的典型 Qpid 配置:

[DEFAULT]
rpc_backend = nova.openstack.common.rpc.impl_qpid
qpid_protocol = ssl
qpid_hostname = <IP or hostname of management network interface of messaging server>
qpid_port = 5671
qpid_username = compute01
qpid_password = QPID_PASS
注意

使用合适的密码替换 QPID_PASS

另外,如果在qpid 中使用 SASL 指定使用 SASL 机制,方法是添加:

qpid_sasl_mechanisms = <space separated list of SASL mechanisms to use for auth>

17.5. 消息队列进程隔离和策略

每个项目提供许多服务来发送和接收消息。每个发送消息的二进制文件都应该消耗来自队列的消息(如果只回复)。

消息队列服务进程应该相互隔离,以及计算机上的其他进程。

17.6. 命名空间

Linux 使用命名空间将进程分配到独立域中。本指南的其他部分更详细地涵盖系统比较。

第 18 章 保护 Red Hat OpenStack Platform 中的端点

与 OpenStack 云互动的过程从查询 API 端点开始。虽然公共和专用端点存在不同的挑战,但它们是高价值资产,但如果被破坏,可能会造成严重的风险。

本章推荐对面向公共的 API 端点和私有的 API 端点进行安全增强。

18.1. 内部 API 通信

OpenStack 提供面向公共的、内部管理员和私有 API 端点。默认情况下,OpenStack 组件使用公开的端点。建议将这些组件配置为使用正确的安全域中的 API 端点。内部管理端点允许进一步提升对 keystone 的访问,因此可能需要进一步隔离这一点。

服务根据 OpenStack 服务目录选择其对应的 API 端点。这些服务可能无法遵循列出的公共或内部 API 端点值。这可能导致内部管理流量路由到外部 API 端点。

18.2. 在 Identity 服务目录中配置内部 URL

Identity 服务目录应该了解您的内部 URL。虽然默认情况下不使用这个功能,但它可以通过配置获得。另外,当此行为成为默认值后,它应该与预期更改兼容。

考虑将配置的端点与网络级别隔离,只要它们具有不同的访问级别。Admin 端点旨在由云管理员访问,因为它提供了对内部或公共端点上不可用的 keystone 操作的提升访问权限。内部端点主要用于在云(如 OpenStack 服务)中使用内部端点,且通常无法在部署网络外部访问。公共端点应该启用 TLS,以及部署外唯一可访问用于云用户操作的 API 端点。

director 会自动注册端点的内部 URL。如需更多信息,请参阅 https://github.com/openstack/tripleo-heat-templates/blob/a7857d6dfcc875eb2bc611dd9334104c18fe8ac6/network/endpoints/build_endpoint_map.py

18.3. 为内部 URL 配置应用程序

您可以强制某些服务使用特定的 API 端点。因此,建议任何联系另一个服务的 API 的 OpenStack 服务都必须明确配置为访问正确的内部 API 端点。

每个项目可能会显示定义目标 API 端点的方法不一致。OpenStack 的未来发行版本可以通过一致使用 Identity 服务目录来解决这些不一致的情况。

18.4. 粘贴和中间件

OpenStack 中大多数 API 端点和其他 HTTP 服务都使用 Python Ppaste Deploy 库。从安全的角度来看,此库通过应用程序的配置启用对请求过滤器管道的操作。此链中的每个元素称为 中间件。更改管道中过滤器的顺序或添加额外的中间件可能会产生无法预计的安全问题。

通常,实施者会添加中间件来扩展 OpenStack 的基本功能。考虑在 HTTP 请求管道中添加非标准软件组件来仔细考虑引入的潜在暴露程度。

18.5. API 端点进程隔离和策略

您可以隔离 API 端点进程以提高安全性。考虑在单独的主机上的公共安全域中部署 API 端点,以提高隔离。

18.5.1. 配置策略来限制 metadef API

在 Red Hat OpenStack Platform (RHOSP)中,用户可以使用元数据定义(metadef) API 定义键值对和标记元数据。目前,用户可以创建的元数据命名空间、对象、属性、资源或标签数量的限制。

metadef API 可能会泄漏未授权用户的信息。一个恶意的用户可以利用缺少限制,并填充具有无限资源的镜像服务(glance)数据库,从而可以创建一系列服务(DoS)攻击。

镜像服务策略控制 metadef API。但是,Metadef API 的默认策略设置允许所有用户创建或读取 metadef 信息。因为 metadef 资源没有隔离到所有者,所以具有可能敏感名称的 metadef 资源(如内部基础架构详情或客户名称)可以将这些信息公开给恶意用户。

要使镜像服务(glance)更加安全,请在 Red Hat OpenStack Platform (RHOSP)部署中将 metadef 修改 API 限制为 admin-only 访问权限。

流程

  1. 作为云管理员,创建单独的 heat 模板环境文件,如 lock-down-glance-metadef-api.yaml,使其包含镜像服务 metadef API 的策略覆盖:

    ...
    parameter_defaults:
      GlanceApiPolicies: {
            glance-metadef_default: { key: 'metadef_default', value: '' },
            glance-metadef_admin: { key: 'metadef_admin', value: 'role:admin' },
            glance-get_metadef_namespace: { key: 'get_metadef_namespace', value: 'rule:metadef_default' },
            glance-get_metadef_namespaces: { key: 'get_metadef_namespaces', value: 'rule:metadef_default' },
            glance-modify_metadef_namespace: { key: 'modify_metadef_namespace', value: 'rule:metadef_admin' },
            glance-add_metadef_namespace: { key: 'add_metadef_namespace', value: 'rule:metadef_admin' },
            glance-delete_metadef_namespace: { key: 'delete_metadef_namespace', value: 'rule:metadef_admin' },
            glance-get_metadef_object: { key: 'get_metadef_object', value: 'rule:metadef_default' },
            glance-get_metadef_objects: { key: 'get_metadef_objects', value: 'rule:metadef_default' },
            glance-modify_metadef_object: { key: 'modify_metadef_object', value: 'rule:metadef_admin' },
            glance-add_metadef_object: { key: 'add_metadef_object', value: 'rule:metadef_admin' },
            glance-delete_metadef_object: { key: 'delete_metadef_object', value: 'rule:metadef_admin' },
            glance-list_metadef_resource_types: { key: 'list_metadef_resource_types', value: 'rule:metadef_default' },
            glance-get_metadef_resource_type: { key: 'get_metadef_resource_type', value: 'rule:metadef_default' },
            glance-add_metadef_resource_type_association: { key: 'add_metadef_resource_type_association', value: 'rule:metadef_admin' },
            glance-remove_metadef_resource_type_association: { key: 'remove_metadef_resource_type_association', value: 'rule:metadef_admin' },
            glance-get_metadef_property: { key: 'get_metadef_property', value: 'rule:metadef_default' },
            glance-get_metadef_properties: { key: 'get_metadef_properties', value: 'rule:metadef_default' },
            glance-modify_metadef_property: { key: 'modify_metadef_property', value: 'rule:metadef_admin' },
            glance-add_metadef_property: { key: 'add_metadef_property', value: 'rule:metadef_admin' },
            glance-remove_metadef_property: { key: 'remove_metadef_property', value: 'rule:metadef_admin' },
            glance-get_metadef_tag: { key: 'get_metadef_tag', value: 'rule:metadef_default' },
            glance-get_metadef_tags: { key: 'get_metadef_tags', value: 'rule:metadef_default' },
            glance-modify_metadef_tag: { key: 'modify_metadef_tag', value: 'rule:metadef_admin' },
            glance-add_metadef_tag: { key: 'add_metadef_tag', value: 'rule:metadef_admin' },
            glance-add_metadef_tags: { key: 'add_metadef_tags', value: 'rule:metadef_admin' },
            glance-delete_metadef_tag: { key: 'delete_metadef_tag', value: 'rule:metadef_admin' },
            glance-delete_metadef_tags: { key: 'delete_metadef_tags', value: 'rule:metadef_admin' }
      }
    
    …
  2. 在部署 overcloud 时,包括部署命令中包含策略覆盖的环境文件,并使用 -e 选项:

    $ openstack overcloud deploy -e lock-down-glance-metadef-api.yaml

18.5.2. 启用 metadef API

如果您之前受限元数据定义(metadef) API 或希望放松新的默认值,您可以覆盖 metadef 修改策略,以允许用户更新其对应的资源。

重要

具有依赖于对 metadef API 写入访问权限的用户的云管理员可使这些 API 可供所有用户访问。但是,在这种配置中,可能会意外泄漏敏感资源名称,如客户名称和内部项目。管理员必须审核其系统,以识别之前创建的资源,即使为所有用户只启用了读取访问权限。

流程

  1. 作为云管理员,登录 undercloud 并为策略覆盖创建一个文件。例如:

    $ cat open-up-glance-api-metadef.yaml
  2. 配置策略覆盖文件,以允许对所有用户的 metadef API 读写访问:

    GlanceApiPolicies: {
        glance-metadef_default: { key: 'metadef_default', value: '' },
        glance-get_metadef_namespace: { key: 'get_metadef_namespace', value: 'rule:metadef_default' },
        glance-get_metadef_namespaces: { key: 'get_metadef_namespaces', value: 'rule:metadef_default' },
        glance-modify_metadef_namespace: { key: 'modify_metadef_namespace', value: 'rule:metadef_default' },
        glance-add_metadef_namespace: { key: 'add_metadef_namespace', value: 'rule:metadef_default' },
        glance-delete_metadef_namespace: { key: 'delete_metadef_namespace', value: 'rule:metadef_default' },
        glance-get_metadef_object: { key: 'get_metadef_object', value: 'rule:metadef_default' },
        glance-get_metadef_objects: { key: 'get_metadef_objects', value: 'rule:metadef_default' },
        glance-modify_metadef_object: { key: 'modify_metadef_object', value: 'rule:metadef_default' },
        glance-add_metadef_object: { key: 'add_metadef_object', value: 'rule:metadef_default' },
        glance-delete_metadef_object: { key: 'delete_metadef_object', value: 'rule:metadef_default' },
        glance-list_metadef_resource_types: { key: 'list_metadef_resource_types', value: 'rule:metadef_default' },
        glance-get_metadef_resource_type: { key: 'get_metadef_resource_type', value: 'rule:metadef_default' },
        glance-add_metadef_resource_type_association: { key: 'add_metadef_resource_type_association', value: 'rule:metadef_default' },
        glance-remove_metadef_resource_type_association: { key: 'remove_metadef_resource_type_association', value: 'rule:metadef_default' },
        glance-get_metadef_property: { key: 'get_metadef_property', value: 'rule:metadef_default' },
        glance-get_metadef_properties: { key: 'get_metadef_properties', value: 'rule:metadef_default' },
        glance-modify_metadef_property: { key: 'modify_metadef_property', value: 'rule:metadef_default' },
        glance-add_metadef_property: { key: 'add_metadef_property', value: 'rule:metadef_default' },
        glance-remove_metadef_property: { key: 'remove_metadef_property', value: 'rule:metadef_default' },
        glance-get_metadef_tag: { key: 'get_metadef_tag', value: 'rule:metadef_default' },
        glance-get_metadef_tags: { key: 'get_metadef_tags', value: 'rule:metadef_default' },
        glance-modify_metadef_tag: { key: 'modify_metadef_tag', value: 'rule:metadef_default' },
        glance-add_metadef_tag: { key: 'add_metadef_tag', value: 'rule:metadef_default' },
        glance-add_metadef_tags: { key: 'add_metadef_tags', value: 'rule:metadef_default' },
        glance-delete_metadef_tag: { key: 'delete_metadef_tag', value: 'rule:metadef_default' },
        glance-delete_metadef_tags: { key: 'delete_metadef_tags', value: 'rule:metadef_default' }
      }
    注意

    您必须将所有 metadef 策略配置为使用 rule:metadeta_default

  3. 在部署 overcloud 时,在 deployment 命令中包含新的策略文件以及 -e 选项:

    $ openstack overcloud deploy -e open-up-glance-api-metadef.yaml

18.6. 更改 HAProxy 的 SSL/TLS 密码和规则

如果在 overcloud 中启用了 SSL/TLS,请考虑强化与 HAProxy 配置一起使用的 SSL/TLS 密码和规则。通过强化 SSL/TLS 密码,您可以帮助避免 SSL/TLS 漏洞,如 POODLE 漏洞

  1. 创建名为 tls-ciphers.yaml 的 heat 模板环境文件:

    touch ~/templates/tls-ciphers.yaml
  2. 使用环境文件中的 ExtraConfig hook 将值应用到 tripleo::haproxy::ssl_cipher_suitetripleo::haproxy::ssl_options hieradata:

    parameter_defaults:
      ExtraConfig:
        tripleo::haproxy::ssl_cipher_suite: 'DHE-RSA-AES128-CCM:DHE-RSA-AES256-CCM:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-CCM:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305'
    
        tripleo::haproxy::ssl_options: 'no-sslv3 no-tls-tickets'
    注意

    cipher 集合是一个连续行。

  3. 在部署 overcloud 时,使用 overcloud deploy 命令包括 tls-ciphers.yaml 环境文件:

    openstack overcloud deploy --templates \
    ...
    -e /home/stack/templates/tls-ciphers.yaml
    ...

18.7. 网络策略

API 端点通常会跨越多个安全区,因此您必须特别注意 API 进程的分离。例如,在网络设计级别,您可以考虑限制对指定系统的访问。如需更多信息,请参阅有关安全区的指南。

通过小心建模,您可以使用网络 ACL 和 IDS 技术来强制实施网络服务之间的显式点到点通信。作为关键跨域服务,这种类型的显式实施也适用于 OpenStack 的消息队列服务。

要强制执行策略,您可以配置基于主机的服务、基于主机的防火墙(如 iptables)、本地策略(SELinux)以及可选的全局网络策略。

18.8. 强制访问控制

您应该将 API 端点进程相互隔离,以及计算机上的其他进程。这些进程的配置应受 Discretionary Access Controls (DAC)和强制访问控制(MAC)的限制。这些增强的访问控制的目标是帮助包含 API 端点安全破坏。

18.9. API 端点速率限制

速率限制是控制基于网络的应用程序接收的事件频率的方法。如果没有强大的速率限制,可能会导致应用程序受到各种拒绝服务攻击的影响。对于 API,这尤其如此,其性质旨在接受类似请求类型和操作的高频率。

建议所有端点(特别是公共)都提供额外的保护层,例如使用物理网络设计、速率限制代理或 Web 应用程序防火墙。

在配置和实施任何速率限制功能时,Operator 会仔细规划并考虑 OpenStack 云中的用户和服务的独立性能需求。

对于 Red Hat OpenStack Platform 部署,所有服务都放在负载平衡代理后面。

第 19 章 实现联邦

警告

红帽目前不支持联邦。此功能只应用于测试,不应在生产环境中部署。

19.1. 使用红帽单点登录与 IdM 联合

您可以使用 Red Hat Single Sign-On (RH-SSO)来联邦 IdM 用户进行 OpenStack 身份验证(authN)。通过联邦,您的 IdM 用户无需向任何 OpenStack 服务显示其凭据,即可登录到 OpenStack 控制面板。相反,当控制面板需要用户的凭证时,它会将用户转发到 Red Hat Single Sign-On (RH-SSO),并允许他们输入其 IdM 凭证。因此,RH-SSO 断言用户已成功进行身份验证的 Dashboard,而 Dashboard 则允许用户访问项目。

19.2. 联邦工作流

本节论述了 Identity 服务(keystone)、RH-SSO 和 IdM 如何相互交互。OpenStack 中的联邦使用身份提供程序和服务提供商的概念:

Identity Provider (IdP)- 存储用户帐户的服务。在本例中,IdM 中保存的用户帐户使用 RH-SSO 呈现给 Keystone。

Service Provider (SP)- 需要从 IdP 中用户进行身份验证的服务。在这种情况下,keystone 是授予 IdM 用户的 Dashboard 访问权限的服务供应商。

在下图中,keystone (SP)与 RH-SSO (IdP)通信,它也能够充当其他 IdP 的通用适配器。在此配置中,您可以在 RH-SSO 上将 keystone 指向 RH-SSO,RH-SSO 会将请求转发到它支持的身份提供程序(称为身份验证模块),这些当前包括 IdM 和 Active Directory。这可以通过具有 Service Provider (SP)和身份提供程序(IdP)交换元数据来实现,每个系统管理员则做出相应的决定。其结果是 IdP 可以自信地创建断言,SP 可以接收这些断言。

federation rhsso idm

如需更多信息,请参阅联邦指南: https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/16.2/html-single/federate_with_identity_service/

法律通告

版权所有 © 2017 Red Hat, Inc.
本文档内容及图解由红帽根据 Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA")授权。关于 CC-BY-SA 的说明,请参考 http://creativecommons.org/licenses/by-sa/3.0/。根据 CC-BY-SA,如果发布本文档或提供此文档,则必须提供原始版本的 URL。
作为本文档的许可者,红帽可能会放弃强制制执行 CC-BY-SA 第4d 条款,且不声明该条款在适用条款允许的最大限度内有效。
OpenStack 安全指南中采用的部分内容。请参阅 Red Hat OpenStack Platform 许可证中的"安全指南 "。
Red Hat, Red Hat Enterprise Linux, SVVP logo, JBoss, SVVP, Fedora, Infinity 商标,Red Hat, Inc. 是 Red Hat, Inc. 在美国和其他国家的注册商标。
Linux® 是 Linus Torvalds 在美国和其它国家的注册商标。
Java® 是 Oracle 和/或其关系的注册商标。
XFS® 是 Silicon Graphics International Corp. 或其子公司在美国和/或其他国家的商标。
MySQL® 是 MySQL AB 在美国、美国和其他国家的注册商标。
Node.js® 是 Joyent 的官方商标。Red Hat Software Collections 与官方 Joyent Node.js 开源或商业项目没有正式关联或被正式认可。
OpenStack® Word Mark 和 OpenStack 徽标是 OpenStack Foundation 在美国及其他国家的注册商标/服务标记或商标/服务标记,可根据 OpenStack Foundation 授权使用。我们不附属于 OpenStack Foundation 或 OpenStack 社区。
所有其他商标均由其各自所有者所有。