Atom feed of this document
  

 认证和授权

网络使用认证服务作为默认的认证服务。当认证服务启用,提交请求到网络服务的用户必需在 X-Auth-Token 请求头中提供一个认证令牌。用户可以通过认证服务的端点进行认证后获得该令牌。要了解更多关于认证服务的信息,请阅读 OpenStack Identity Service API v2.0 Reference。启用了认证服务后,在创建请求时不会要求强制性地指定资源的租户 ID,因为租户 ID 可以从认证令牌中得到。

[注意]注意

默认的授权配置仅允许有管理权限的用户代表一个不同的租户来创建资源。网络服务使用从认证服务检索的信息来授权用户请求。网络会服务处理两种授权策略:

  • Operation-based 策略指定了特定操作的访问标准,可能包括通过特定属性进行细粒度控制;

  • Resource-based 策略根据对资源设置的权限来指定了是否有权限访问特定资源 (当前仅对网络资源可用)。网络服务中加强的实际授权策略在不同的部署环境中可能是各种各样的。

策略引擎从 policy.json 文件中读取入口。该文件的实际位置在不同的发行版中可能会不同。当系统运行时,入口可能会更新,且不需要服务重启。每次策略文件更新,策略会自动重新加载。目前,更新策略的唯一方法是修改策略文件。在本小节,policyrule 术语指的是在策略文件中的特定方法。在规则和策略之间没有语法的不同。策略是直接匹配网络策略引擎的东西,规则是策略中的一个进行评价的元素。例如,create_subnet: [["admin_or_network_owner"]]create_subnet 是一个策略,而 admin_or_network_owner 是一个规则。

当策略匹配到 Networking API 操作或在给定的操作中使用了一个特定属性,策略由网络策略引擎触发。例如,create_subnet 策略会在 POST /v2.0/subnets 请求发送到网络服务器时被触发;另一方面,create_network:shared 会在 shared 属性在一个 POST /v2.0/networks 请求中明确指定 (并设置为一个非默认值) 时被触发。值得一提的是,策略可以关联到特定的 API 扩展;例如,如果由提供者网络扩展定义的属性在一个 API 请求中被指定时,extension:provider_network:set 会被触发。

权策略可以由一个或多个规则组成。如果指定了多个规则,那么当任意一个规则评价成功,则策略评价成功;如果 API 操作匹配了多个策略,那么所有的策略必需评价成功。而且,授权规则是递归的。一旦规则匹配,规则会被解析为另一个规则,直到到达最终的规则。

网络的策略引擎目前定义了以下类型的终端规则:

  • 当提交请求的用户拥有指定的角色,那么 Role-based rules 会评估成功。例如,如果提交请求的用户是一位管理员,那么 "role:admin" 会成功。

  • 如果当前请求的特定资源的字段匹配了一个特定值,Field-based rules 会评估成功。例如,如果 network 资源的 shared 设置为 true,那么 "field:networks:shared=True" 会成功。

  • Generic rules 将资源中的属性与用户的安全证书中的额外属性进行比较,如果比较成功,则评估成功。例如,如果资源中的租户标识与提交请求的用户的租户标识相同,则 "tenant_id:%(tenant_id)s" 会成功。

此截取的内容来自默认的policy.json文件:

{
    "admin_or_owner": (1)[
        [
            "role:admin"
        ],
        [
            "tenant_id:%(tenant_id)s"
        ]
    ],
    "admin_or_network_owner": [
        [
            "role:admin"
        ],
        [
            "tenant_id:%(network_tenant_id)s"
        ]
    ],
    "admin_only": [
        [
            "role:admin"
        ]
    ],
    "regular_user": [],
    "shared": [
        [
            "field:networks:shared=True"
        ]
    ],
    "default": [
        [
            "ru(2)le:admin_or_owner"
        ]
    ],
    "create_subnet": [
        [
            "rule:admin_or_network_owner"
        ]
    ],
    "get_subnet": [
        [
            "rule:admin_or_owner"
        ],
        [
            "rule:shared"
        ]
    ],
    "update_subnet": [
        [
            "rule:admin_or_network_owner"
        ]
    ],
    "delete_subnet": [
        [
            "rule:admin_or_network_owner"
        ]
    ],
    "create_network": [],
    "get_network": [
        [
            "rule:admin_or_owner"
        ],
        [          (3)
            "rule:shared"
        ]
    ],
    "create_network:shared": [
        [
            "rule:admin_only"
        ]
    ],                       (4)
    "update_network": [
        [
            "rule:admin_or_owner"
        ]
    ],
    "delete_network": [
        [
            "rule:admin_or_owner"
        ]
    ],
    "create_port": [],
    "create_port:mac_address": [
        [
            "rule:admin_or_network_owner"
        ]
    ],
    "create_port:fixed_ips": [
        [                      (5)
            "rule:admin_or_network_owner"
        ]
    ],
    "get_port": [
        [
            "rule:admin_or_owner"
        ]
    ],
    "update_port": [
        [
            "rule:admin_or_owner"
        ]
    ],
    "delete_port": [
        [
            "rule:admin_or_owner"
        ]
    ]
}

1

如果当前用户为管理员或请求中特定资源的拥有者 (租户标识相同),则规则评估成功。

2

如果一个 API 操作没有匹配到 policy.json 中的任何策略,默认策略会进行评价。

3

如果 admin_or_ownershared 之一评价成功,则策略会评价成功。

4

这一政策限制了管理员只对网络的 shared 属性进行操作的功能。

5

该策略限制了仅有管理员和附加端口的网络的拥有者对端口可以进行 mac_address 属性操作的功能。

在一些情况下,一些操作会限制为仅有管理员可以进行。这个示例向您显示了如何修改一个策略文件来授权租户能够定义网络、查看他们的资源以及授权管理员用户执行其他所有的操作:

{
        "admin_or_owner": [["role:admin"], ["tenant_id:%(tenant_id)s"]],
        "admin_only": [["role:admin"]], "regular_user": [],
        "default": [["rule:admin_only"]],
        "create_subnet": [["rule:admin_only"]],
        "get_subnet": [["rule:admin_or_owner"]],
        "update_subnet": [["rule:admin_only"]],
        "delete_subnet": [["rule:admin_only"]],
        "create_network": [],
        "get_network": [["rule:admin_or_owner"]],
        "create_network:shared": [["rule:admin_only"]],
        "update_network": [["rule:admin_or_owner"]],
        "delete_network": [["rule:admin_or_owner"]],
        "create_port": [["rule:admin_only"]],
        "get_port": [["rule:admin_or_owner"]],
        "update_port": [["rule:admin_only"]],
        "delete_port": [["rule:admin_only"]]
        }
Questions? Discuss on ask.openstack.org
Found an error? Report a bug against this page


loading table of contents...