本文說明情境感知存取權的用途,並涵蓋使用自訂存取層級的政策。在下列範例中,您可以使用一般運算語言 (CEL) 以進階模式建立自訂存取層級。
請注意,您也可以選擇在使用 CEL 運算式建立自訂存取層級時,運用函式和巨集。
如要查看以基本模式 (使用情境感知存取權介面) 開發的存取層級範例,請參閱「基本模式的情境感知存取權範例」。
驗證範例
如要針對含有機密資料的應用程式加強存取安全性,您可以決定使用者登入系統的驗證方式,判斷是否允許使用者存取應用程式。
舉例來說,使用者如果僅使用密碼登入,就只能存取不含任何機密資訊的應用程式;而以硬體安全金鑰做為第二重驗證條件登入的使用者,則可以存取敏感性最高的企業應用程式。
這個存取層級會使用 request.auth 屬性,驗證使用者是否透過密碼和硬體金鑰進行兩步驟驗證,並可以存取敏感應用程式。
request.auth.claims.crd_str.pwd == true && request.auth.claims.crd_str.hwk == true
一般來說,只有在使用者透過高強度憑證進行驗證後,管理員才會讓他們強制存取公司資源。以下為使用 levels 和 request.auth 屬性的範例:
- 如果使用者使用的是公司裝置,除了簡訊以外,所有多重驗證 (MFA) 方法都能進行驗證,包括推播通知、硬體或軟體安全金鑰或動態密碼
- 如果使用者使用的是非公司裝置,就必須使用硬體或軟體安全金鑰進行驗證
// 如果使用的是公司裝置,則要求基本 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 軟體當做應用程式。
這個存取層級使用 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 是簡單的 ID,可用於述詞變數中,藉此繫結至裝置企業憑證。exists() 巨集會結合每個元素的述詞結果和 or (||) 運算子。如果有至少一個憑證符合述詞運算式,巨集會傳回 true 。
下表列出了可用於建立 CEL 運算式,並與自訂存取層級一起使用的屬性。請注意,比較字串時會區分大小寫。
屬性 | 說明 | 述詞範例 運算式 (其中的 cert 是 巨集的 ID) |
---|---|---|
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.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_secure_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 屬性的自訂存取層級中使用,用於判斷裝置是否為公司擁有或管理。
// 如果裝置符合下列任一條件,就會是公司裝置:
// 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)
- 到期日的時間戳記 (exp) (到期日:在目前版本中可能是指自核發時起算的 2 週後)
存取層級使用 device 屬性,確保 CrowdStrike 資料處於最新狀態。請注意,BeyondCorp Enterprise 從 Falcon ZTA 收到任何新評估作業時,本身就有 90 分鐘的延遲,因此不建議使用少於 1 小時的時間。
// 確認 Crowdstrike 資料符合下列其中一項條件:
// 必須符合下列其中一項條件
// 1. 在過去 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
巨集會透過 ||
(或) 運算子擴充每個 BeyondCorp Alliance 合作夥伴的運算式。
// 確認是否有任何 BCA 合作夥伴認定裝置符合規定
["CrowdStrike", "Tanium", "PANW", "Check Point", "Lookout"].exists(
v, v in device.vendors && device.vendors[v].is_compliant_device
)
這個範例使用 device 屬性,要求裝置通過 Compatibility Test Suite (CTS) 法規遵循檢查。詳情請參閱「Compatibility Test Suite」。
// Require devices to pass CTS compliance checks
device.android_device_security.cts_profile_match == true
這個範例使用 device 屬性,要求裝置開啟 Google Play 安全防護驗證應用程式。
從 Google Play 以外的其他來源下載應用程式時,驗證應用程式會加以掃描,檢查這些應用程式是否具有威脅。且會定期掃描裝置,找出可能有害的應用程式。系統預設啟用驗證應用程式。針對採用進階管理服務的裝置,您可以決定使用者能否將其關閉。詳情請參閱「套用 Android 行動裝置設定」。
// Require devices to have Google Play Protect Verify Apps enabled
device.android_device_security.verify_apps_enabled == true
這個範例使用 device 屬性,拒絕可存取可能包含有害應用程式的裝置。這類應用程式通常稱為惡意軟體。詳情請參閱「可能有害的應用程式 (PHA)」。
// Deny access to devices that have potentially harmful appsandroid_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