应用程序访问控制
MATLAB® Production Server™ 与 OAuth2 提供程序(例如 Azure® Active Directory (Azure AD) 和 PingFederate®)集成,并使用 JSON Web Tokens (JWT) 来限制用户对部署到服务器的应用程序或存档的访问。应用程序访问控制仅适用于使用 MATLAB Production Server 用于 MATLAB 函数执行的 RESTful API 与服务器通信的客户端。客户端向服务器发出请求时,必须在 HTTP 授权标头中发送访问令牌。此标头的格式为 Authorization:Bearer <access token>
。要为本地服务器实例设置访问控制,必须定义访问控制配置文件和访问控制策略文件,并在 OAuth2
服务器配置文件中将 access-control-provider
属性设置为 main_config
。
访问控制配置文件
为了帮助验证向本地服务器实例发送请求的每个用户的身份,服务器管理员必须定义 JSON 格式的访问控制配置文件。服务器使用访问控制配置文件中的参数来验证客户端请求包含的 JWT。配置文件的默认路径和名称是 ./config/jwt_idp.json
。您可以通过设置 access-control-config
属性来改变配置文件的路径和名称。如果更改配置文件的路径、名称或内容,则必须重新启动服务器才能使更改生效。
访问控制配置文件包含以下参数:
参数 | 必需或可选 | 描述 |
---|---|---|
版本 | 必需 | 配置文件架构的版本号。版本号是一个 JSON 字符串,格式为 major# .minor# .patch# ,其中每个数字都是一个非负整数。将 version 设置为 1.0.0 。 |
jwtIssuer | 必需 | 身份提供方的 JWT 发行方元数据。将元数据指定为 JSON 字符串。元数据字符串必须与 JWT 中的 iss 声明匹配。例如对于 Azure AD,将 jwtIssuer 设置为 https://sts.windows.net/ 。 |
appId | 必需 | JWT 的预期接收方。将收件人指定为 JSON 字符串。接收者协助验证 JWT 中的 aud 声明。例如,对于 Azure AD,appId 是已注册的 MATLAB Production Server 服务器应用的应用程序 ID。有关在 Azure 上注册应用程序的信息,请参阅 Quickstart:使用 Microsoft 标识平台注册一个应用程序。 |
jwksUri | 必需 | 用于检索 JSON Web 密钥集 (JWKS) 的 URI。将 URI 指定为 JSON 字符串。JWKS 存储用于验证 JWT 的公钥。例如对于 Azure AD,将 jwksUri 设置为 https://login.microsoftonline.com/common/discovery/keys 。 |
jwksStrictSSL | 可选 | 用于在与 JWKS 服务器进行 HTTPS 通信期间验证 jwksUri 指定的服务器的对等证书的标志。将选择指定为 JSON 布尔值。默认选择是 true 。指定 true 验证对等证书。如果 JWKS 服务器使用自签名证书,则将此值设置为 false 。 |
jwksTimeOut | 可选 | 请求检索 JWKS 所允许的最长时间。将时间指定为非负 JSON 整数。默认超时值为 120 秒。 |
userAttributeName | 可选 | 唯一标识用户的 JWT 声明名称。将声明名称指定为 JSON 字符串。userAttributeName 的默认值是 sub 。 |
groupAttributeName | 可选 | 列出用户所属组的 JWT 声明名称。将声明名称指定为 JSON 字符串。groupAttributeName 的默认值是 groups 。 |
您可以指定 userAttributeName
、groupAttributeName
或两者。如果要为特定用户配置访问控制,请指定 userAttributeName
。如果要为用户组配置访问控制,请指定 groupAttributeName
。
以下是 Azure AD 作为身份提供方的配置文件示例。
{ "version": "1.0.0", "jwtIssuer": "https://sts.windows.net/54ss4lk1-8428-7256-5fvh-d5785gfhkjh6/", "appId": "j21n12bg-3758-3r78-v25j-35yj4c47vhmt", "jwksUri": "https://login.microsoftonline.com/common/discovery/keys", "jwksStrictSSL": true, "jwksTimeOut": 120, "userAttributeName": "sub", "groupAttributeName": "groups" }
访问控制策略文件
要为 MATLAB Production Server 设置应用程序访问控制,服务器管理员必须定义 JSON 格式的访问控制策略文件。策略文件的默认路径和名称是 ./config/ac_policy.json
。您可以通过设置 access-control-policy
属性来更改默认值。
当服务器启动时,它会尝试读取策略文件。如果该文件不存在或包含错误,则服务器不会启动,并将错误消息写入 log-root
属性指定的目录中的 main.log
文件中。
如果启用了应用程序访问控制,服务器启动后每五秒扫描一次策略文件。如果策略文件不存在或包含错误,服务器将继续运行,但会拒绝所有请求并将错误消息写入 main.log
文件。
该策略文件有一个单独的 JSON 对象,用于定义架构版本和策略模块。策略模块由一系列策略组成。每个策略都包含一个规则模块,用于定义策略的一组规则。规则模块由主题模块、资源模块和动作模块组成。
架构版本是格式为 major#
.minor#
.patch#
的 JSON 字符串,其中每个数字都是非负整数。将架构版本设置为 1.0.0
。
策略模块
策略模块包含应用程序访问控制所需的策略列表。目前策略文件仅支持指定单个策略。
"policy" : [ { "id": "policy_id", "description": "policy_description", <rule_block> } ]
每个策略都需要一个 id
值。
是一个 JSON 字符串,并且对于每个策略必须是唯一的。所有前导或尾随空格均会被删除。policy_id
对于策略来说,description
是可选的。
规则模块
规则模块包含规则对象的列表。
"rule":[ { "id": "rule_id", "description": "rule_description", <subject_block>, <resource_block>, <action_block> } ]
规则模块支持多条规则,例如 "rule": [<rule>, <rule>, ...]
。
每个规则都需要一个 id
值。rule_id
是一个 JSON 字符串,并且对于每个规则必须是唯一的。所有前导或尾随空格均会被删除。
对于规则来说,description
是可选的。
主题模块
规则的主题模块定义了谁可以访问资源。您可以控制用户列表、用户组或两者的访问权限。
"subject" : {"groups": ["group_id", "group_id", ...], "users": ["user_id", "user_id", ...]}
使用 users
属性来指定由其唯一的 user_id
值标识的用户列表。使用 groups
属性来指定由其唯一的 group_id
值标识的用户组。您可以指定 users
属性、groups
属性或两者。
资源模块
规则的资源模块指定服务器请求想要访问的资源。目前,服务器请求可以访问的唯一资源是可部署存档(CTF 文件)。您可以指定多个可部署存档。
"resource" : {"ctf": ["archive_name", "archive_name", ...]}
您可以使用通配符 *
来指定多个存档。例如,如果要访问名称以 test
开头或结尾的所有存档,请分别将 archive_name
指定为 test*
或 *test
。使用 *
作为 archive_name
来访问部署到服务器的所有存档。
动作模块
规则的动作模块描述了服务器请求想要对资源执行的操作。
"action" : ["execute", "modify"]
JSON 策略文件示例
以下示例定义了具有三条规则的访问控制策略。
用户
aaa@xyz.com
和bbb@xyz.com
可以执行可部署存档magic
。所有属于 ID 为
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
和bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
的组的用户以及用户ccc@xyz.com
都可以执行可部署存档monteCarlo
和fastFourier
。属于质量工程组
cccccccc-cccc-cccc-cccc-cccccccccccc
的所有用户都可以执行所有名称以test
开头的可部署存档。
服务器拒绝所有其他请求的访问。
{ "version": "1.0.0", "policy" : [ { "id": "policy1", "description": "Access Control policy for XYZ Corp.", "rule": [ { "id": "rule1", "description": "Users aaa@xyz.com and bbb@xyz.com can execute deployable archive magic", "subject": { "users": ["aaa@xyz.com", "bbb@xyz.com"] }, "resource": { "ctf": ["magic"] }, "action": ["execute"] }, { "id": "rule2", "description": "Group A and B and user ccc@xyz.com can execute deployable archives monteCarlo and fastFourier", "subject": { "groups": ["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"], "users": ["ccc@xyz.com"] }, "resource": { "ctf": ["monteCarlo", "fastFourier"] }, "action": ["execute"] }, { "id": "rule3", "description": "QE group C can execute any deployable archive whose name starts with test", "subject": { "groups": ["cccccccc-cccc-cccc-cccc-cccccccccccc"] }, "resource": { "ctf": ["test*"] }, "action": ["execute"] } ] } ] }