本文介绍了一些情境感知访问权限用例,其中涉及使用自定义访问权限级别的政策。通过这些示例,您可以了解如何使用通用表达式语言 (CEL) 以高级模式创建自定义访问权限级别。
请注意,如果您愿意,还可以在通过 CEL 表达式创建自定义访问权限级别时使用函数和宏。
如要查看以基本模式(使用情境感知访问权限界面)开发的访问权限级别示例,请参阅情境感知访问权限示例(基本模式)。
身份验证示例
对于包含敏感数据的应用,为了提高访问的安全性,您可以根据用户通过系统身份验证的方式来决定是否允许用户访问这类应用。
例如,只允许仅使用密码登录的用户访问不包含敏感信息的应用,而允许使用硬件安全密钥作为第二重身份验证方式的用户访问最敏感的企业应用。
此访问权限级别使用 request.auth 属性来验证用户是否同时使用密码和硬件密钥通过两步验证进行登录,以及能否访问敏感应用。
request.auth.claims.crd_str.pwd == true && request.auth.claims.crd_str.hwk == true
通常,管理员希望仅在用户通过高强度凭据进行身份验证后,才允许用户访问公司资源。以下示例使用了 levels 和 request.auth 属性,如下所示:
- 如果用户使用的是公司设备,那么除短信以外的任何多重身份验证 (MFA) 方法都足以满足要求(方法可以是推送通知、硬件或软件安全密钥,或动态密码)
- 如果用户使用的是非公司设备,则必须使用硬件或软件安全密钥
// 如果使用的是公司设备,需要进行基本多重身份验证(非短信);如果使用的不是公司设备,需要使用安全密钥(硬件或软件)
levels.Require_Secure_Device &&
(
(
levels.Require_Corporate_Device &&
request.auth.claims.crd_str.mfa &&
!request.auth.claims.crd_str.sms
) ||
(
!levels.Require_Corporate_Device &&
(
request.auth.claims.crd_str.hwk || request.auth.claims.crd_str.swk
)
)
)
设备示例
您可以使用 BeyondCorp Alliance 合作伙伴报告的设备信号。本示例中使用了 Lookout Software 这款应用。
此访问权限级别使用 device 属性来验证用于访问 Google Workspace 的设备是否被 Lookout 报告为符合政策且运行状况得分为“非常好”。
device.vendors["Lookout"].is_compliant_device == true && device.vendors["Lookout"].device_health_score == DeviceHealthScore.VERY_GOOD
此访问权限级别使用 device 属性来验证用户目前使用的是否是最新版本的受管理 Chrome 浏览器,且仅允许通过此类浏览器访问。
device.chrome.management_state == ChromeManagementState.CHROME_MANAGEMENT_STATE_BROWSER_MANAGED && device.chrome.versionAtLeast("94.0.4606.81")
对于分配了自定义访问权限级别的设备,您可以根据企业证书来确定设备是否属于公司自有资产。此访问权限级别使用 device 属性来进行资产验证。如需了解详情和查看示例,请参阅配置企业证书条件。
一个设备可以有多个证书。通过使用 exists() 宏,即可在自定义访问权限级别中使用企业证书。例如:
device.certificates.exists(cert, predicate)
在此示例中,cert 是一个简单标识符,与可变量 predicate 一起使用,并且绑定至设备企业证书。exists() 宏会使用或 (||) 运算符将每个元素的谓词结果连接起来。如果至少有一个证书满足谓词表达式,则宏将返回 true。
下表列出了可用于形成 CEL 表达式并与自定义访问权限级别一起使用的属性。请注意,比较字符串时区分大小写。
属性 | 说明 | 谓词表达式 示例 (其中 cert 是 宏的标识符) |
---|---|---|
is_valid |
如果证书有效且未到期,则返回 true。 |
cert.is_valid |
cert_fingerprint | 证书指纹 (未填充字符的 base64 编码 SHA256) |
cert.cert_fingerprint == origin. |
root_ca_fingerprint | 用于签署此证书的根 CA 证书的指纹 (未填充字符的 base64 编码 SHA256) |
cert.root_ca_fingerprint == "the_fingerprint" |
issuer |
证书颁发者名称 如需查找证书颁发者名称,请在 cert 上运行以下命令:
访问权限级别中使用的证书颁发者字符串是输出的相反值,并且将“/”替换为逗号,例如:
|
cert.issuer == "EMAILADDRESS=test_inter1 |
subject | 证书的主题名称 (全称) |
cert.subject == "CA_SUB" |
serial_number |
证书的序列号 |
cert.serial_number == “123456789” |
template_id | 证书的 X.509 扩展证书模板的模板 ID (字符串) |
cert.template_id == "1.3.6.1.4.1.311.21. |
常用政策示例:
验证设备是否拥有由公司根证书签名的有效企业证书
device.certificates.exists(cert, cert.is_valid && cert.root_ca_fingerprint == "ROOT_CA_FINGERPRINT")
验证设备上企业证书的颁发者
device.certificates.exists(cert, cert.is_valid && cert.issuer == "EMAILADDRESS=test_inter1@beyondcorp.in, CN=inter_1, OU=BCEDemo_1, O=BCEDemo, L=NCR, ST=UP, C=IN”)
此示例使用 device 属性来要求设备同时启用磁盘加密和屏幕锁定。此外,该设备必须经过管理员批准。
默认情况下,通过 Endpoint Verification 创建的所有设备都会获得批准。不过,在某些情况下(例如在设备丢失时),您可能需要阻止特定设备访问。在这些情况下,您肯定不想让这些设备能够访问公司资源。
对于本文档中的其他访问权限级别示例,我们将假设该访问权限级别的名称为 Require_Secure_Device
。
// 要求启用磁盘加密和屏幕锁定
// 此访问权限级别可应用于所有主流平台(Windows、Mac、Linux、CrOS、iOS 和 Android)
// 这是基础访问权限级别,应依赖于所有其他访问权限级别
device.encryption_status == DeviceEncryptionStatus.ENCRYPTED &&
device.is_secured_with_screenlock &&
device.is_admin_approved_device
在此示例中,访问权限级别使用 device 属性来要求使用满足基本安全要求的 Chrome 浏览器。
// 要求 Chrome 通过个人资料或浏览器级别进行管理,必须
// 启用安全性事件报告功能且版本必须为 97 或更高版本
levels.Require_Secure_Device &&
(
device.chrome.management_state == ChromeManagementState.CHROME_MANAGEMENT_STATE_BROWSER_MANAGED ||
device.chrome.management_state == ChromeManagementState.CHROME_MANAGEMENT_STATE_PROFILE_MANAGED
) &&
device.chrome.is_security_event_analysis_enabled &&
device.chrome.versionAtLeast("97")
此示例使用 device 属性来要求用户使用受管理的 Chrome 浏览器或个人资料,且 Chrome 已开启威胁防范和数据保护连接器。此示例使用 levels 属性来引用之前所述的“要求使用受管理的 Chrome”访问权限级别。以下示例假设依赖的访问权限级别名为 Require_Managed_Chrome
。
// 要求使用受管理的 Chrome(依赖“Require_Managed_Chrome”访问权限级别)
// 以及要求启用对下载内容进行内容检查和网址检查的功能
levels.Require_Managed_Chrome &&
device.chrome.is_file_download_analysis_enabled &&
device.chrome.is_realtime_url_check_enabled
控制访问权限的一项要求是,仅当设备由公司管理或归公司所有时,才允许其访问。您可以通过多种方式确定设备是否归公司所有或受其管理,包括:
- 设备的序列号是否与公司资产管理系统中的序列号匹配
- 设备是否拥有公司签发的有效企业证书
这两种方法可以在使用 levels 和 device 属性的以下自定义访问权限级别中使用,以确定设备是否归公司所有或由公司管理。
// 以下任一条件为 true 时,设备为公司设备:
// 1. 如果序列号与管理员上传的序列号匹配
// 2. 如果设备拥有企业签发的有效证书
levels.Require_Secure_Device &&
(
device.is_corp_owned_device ||
device.certificates.exists(cert, cert.is_valid && cert.root_ca_fingerprint == "SOME_ROOT_CA_FINGERPRINT")
)
指纹是 DER 编码证书的未填充 base64
编码的 sha256 摘要
(二进制格式)。您可以按照以下程序,使用 openssl
通过证书生成字符串(PEM 格式):
$ openssl x509 -in cert.pem -out cert.der -outform DER
$ openssl dgst -sha256 -binary cert.der > digest.sha
$ openssl base64 -in digest.sha
- 签发时的时间戳 (iat)
- 到期时间戳(到期日:在当前版本中似乎是自签发时的时间戳算起的 2 周后)
此访问权限级别使用 device 属性来确保 CrowdStrike 数据是最新的。请注意,BeyondCorp Enterprise 通过 Falcon ZTA 进行任何新的评估本身会有 90 分钟的延迟,因此建议时长不要短于 1 小时。
// 确保有关 Crowdstrike 数据的以下任一条件为 true:
// 必须满足以下任一条件
// 1. 设备是在最后一天内评估的
// 2. 评估未到期(自最后一个 iat 算起 2 周后)
“CrowdStrike” in device.vendors && (
request.time - timestamp(device.vendors["CrowdStrike"].data["iat"]) < duration("1d") ||
timestamp(device.vendors["CrowdStrike"].data["exp"]) - request.time > duration("0m")
)
BeyondCorp Enterprise 与许多 BeyondCorp Alliance 生态系统合作伙伴合作,将设备信号和情境感知集成到了 BeyondCorp Enterprise 解决方案中。合作伙伴可以与 BeyondCorp 共享任意数量的属性,其中之一是 is_compliance_device
属性。以下示例使用 device 属性来展示我们如何检查某个 BeyondCorp Alliance 合作伙伴是否已与 BeyondCorp Enterprise 集成,以及是否认为设备符合要求。
exists
宏使用 ||
(or) 运算符为每个 BeyondCorp Alliance 合作伙伴扩展表达式。
// 查看以了解某个 BCA 合作伙伴是否认为设备符合要求
["CrowdStrike", "Tanium", "PANW", "Check Point", "Lookout"].exists(
v, v in device.vendors && device.vendors[v].is_compliant_device
)
此示例使用 device 属性来要求设备启用 Google Play 保护机制验证应用。
通过 Google Play 以外的来源安装应用时,“验证应用”功能会扫描应用以检查可能存在的威胁。该设置也会定期扫描设备,从而查找可能有害的应用。“验证应用”功能默认处于开启状态。对于使用高级管理功能的设备,您可以指定是否允许用户停用此设置。有关详情,请参阅为 Android 移动设备应用设置。
// 要求设备启用 Google Play 保护机制验证应用
device.android_device_security.verify_apps_enabled == true
此示例使用 device 属性来拒绝安装了潜在有害应用的设备访问。这些应用通常称为恶意软件。有关详情,请参阅潜在有害应用 (PHA)。
// 拒绝安装了潜在有害应用的设备访问:android_device_security.has_potentially_harmful_apps != true
基于时间的访问权限示例
企业希望确保轮班员工只能在轮班期间访问公司资源。以下访问权限级别使用 levels 属性来确定星期一到星期五的 3 个班次。
// 班次 1 - 周一到周五,午夜至早上 8 点
levels.Require_Secure_Device &&
request.time.getDayOfWeek("America/Los_Angeles") >= 1 &&
request.time.getDayOfWeek("America/Los_Angeles") <= 5 &&
request.time.timeOfDay("America/Los_Angeles").between('00:00:00', '08:00:00')
// 班次 2 - 周一到周五,早上 8 点至下午 4 点
levels.Require_Secure_Device &&
request.time.getDayOfWeek("America/Los_Angeles") >= 1 &&
request.time.getDayOfWeek("America/Los_Angeles") <= 5 &&
request.time.timeOfDay("America/Los_Angeles").between('08:00:00', '16:00:00')
// 班次 3 - 周一到周五,下午 4 点至午夜
levels.Require_Secure_Device &&
request.time.getDayOfWeek("America/Los_Angeles") >= 1 &&
request.time.getDayOfWeek("America/Los_Angeles") <= 5 &&
request.time.timeOfDay("America/Los_Angeles").between('16:00:00', '00:00:00')
// 允许轮班员工在周一到周五早上 9 点至下午 5 点访问资源(7 月 4 日例外)。
levels.Require_Secure_Device &&
request.time.getDayOfWeek("America/Los_Angeles") >= 1 &&
request.time.getDayOfWeek("America/Los_Angeles") <= 5 &&
!(
request.time.getMonth("America/Los_Angeles") == 6 &&
request.time.getDayOfMonth("America/Los_Angeles") == 3
) &&
request.time.timeOfDay("America/Los_Angeles").between('09:30:00', '17:00:00')
企业有时需要在紧急情况下允许使用紧急访问权限,在这时,管理员没有安全设备的访问权限,但短时间内需要紧急访问权限。
在这种情况下,可以使用 levels 属性创建时间和地点受限的访问权限级别,并将其分配给特定管理员。分配此访问权限级别后,该访问权限级别仅在指定时间内有效。此期限过后,管理员访问权限将再次受现有要求控制。
// 允许在 2022 年 3 月 1 日晚上 10 点至午夜临时访问资源,
// 且此访问权限必须仅适用于美国地区。
levels.Require_Secure_Device &&
request.time.between('2022-03-01T23:00:00+08:00', '2022-03-02T23:59:59+08:00') &&
origin.region_code == “US”
// 请注意,结束时间不包含在内,因此在以上时间中,用户可能会有 2 秒的时间
// 没有访问权限。另一种方法是使用此设置:
// !between('00:00:01','16:00:00')
合并两个级别的条件示例
通过合并两个访问权限级别的条件来定义新的访问权限级别此访问权限级别使用 levels 属性,并且要求用户同时满足两个访问权限级别的条件。在本示例中,access_level_name_1 和 access_level_name_2 指的是“内部名称”。
levels.access_level_name_1 && levels.access_level_name_2