应用程序访问控制
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 上注册 App 的信息,请参阅 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"]
}
]
}
]
}