이 도움말에서는 맞춤 액세스 수준을 사용하는 정책이 포함된 컨텍스트 인식 액세스 사용 사례를 설명합니다. 이 예에서는 Common Expressions Language(CEL)를 사용하여 고급 모드에서 맞춤 액세스 수준을 만듭니다.
원하는 경우 CEL 표현식을 사용하여 맞춤 액세스 수준을 만들 때 함수 및 매크로를 사용할 수도 있습니다.
기본 모드(컨텍스트 인식 액세스 인터페이스 사용)에서 개발된 액세스 수준의 예는 기본 모드의 컨텍스트 인식 액세스 예를 참고하세요.
인증 예시
민감한 정보가 포함된 애플리케이션에 대한 액세스 보안을 개선하기 위해 관리자는 사용자가 시스템에 인증한 방법을 확인하여 애플리케이션에 대한 액세스를 결정할 수 있습니다.
예를 들어 비밀번호만으로 로그인한 사용자는 민감한 정보가 포함되지 않은 애플리케이션에만 액세스할 수 있지만 하드웨어 보안 키를 2단계 인증으로 로그인한 사용자는 가장 민감한 엔터프라이즈 애플리케이션에 액세스할 수 있도록 허용할 수 있습니다.
이 액세스 수준은 request.auth 속성을 사용하여 사용자가 비밀번호와 하드웨어 키를 사용하는 2단계 인증으로 로그인하는지를 확인하여 민감한 애플리케이션에 액세스할 수 있는지 확인합니다.
request.auth.claims.crd_str.pwd == true && request.auth.claims.crd_str.hwk == true
보통 관리자는 사용자가 강력한 사용자 인증 정보로 인증한 후에만 회사 리소스에 액세스할 수 있는 환경을 원합니다. 다음은 levels 및 request.auth 속성을 사용한 예시입니다.
- 사용자가 회사 기기에서 액세스하는 경우 SMS를 제외한 모든 MFA 방식으로 충분합니다(푸시 알림, 하드웨어 또는 소프트웨어 보안 키 또는 일회용 비밀번호를 통한 인증일 수 있음).
- 사용자가 회사 기기가 아닌 기기에서 액세스하는 경우 하드웨어 또는 소프트웨어 보안 키를 사용해야 합니다.
// Require basic MFA (not SMS) on corporate devices and security key (hardware or software) if not
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_compliance_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는 기기 엔터프라이즈 인증서에 바인딩하기 위해 조건자 변수에 사용하는 간단한 식별자입니다. exists() 매크로는 요소당 조건자 결과를 or (||) 연산자와 결합합니다. 하나 이상의 인증서가 조건자 표현식을 충족하는 경우 매크로가 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.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 속성을 사용하여 디스크 암호화와 화면 잠금을 모두 사용 설정하도록 요구합니다. 또한 관리자가 해당 기기를 승인해야 합니다.
기본적으로 엔드포인트 확인 기능이 있는 모든 기기가 승인되지만 기기를 분실한 경우와 같이 기기를 차단해야 하는 경우도 있습니다. 이러한 경우 관리자는 분실한 기기에 회사 리소스 액세스를 허용하지 않으려고 합니다.
이 문서의 다른 액세스 수준 예에서 이 액세스 수준의 이름이 Require_Secure_Device
라고 가정합니다.
// Require disk encryption and screen lock enabled
// This is applicable across all major platforms (Windows, Mac, Linux, CrOS, iOS, Android)
// This foundational and should be depended upon by all other access levels
device.encryption_status == DeviceEncryptionStatus.ENCRYPTED &&
device.is_secured_with_screenlock &&
device.is_admin_approved_device
이 예에 있는 액세스 수준에서는 device 속성을 사용하여 기본 보안 요구사항이 있는 Chrome 브라우저를 요구합니다.
// Require Chrome to be managed at profile or browser level, must have
// security event reporting enabled and must be version 97 or greater
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 속성을 사용하여 앞서 설명한 'Require Managed Chrome' 액세스 수준을 참조합니다. 다음 예에서 종속 액세스 수준 이름을 Require_Managed_Chrome
이라 가정합니다.
// Require managed chrome (dependent on “Require_Managed_Chrome” access level)
// and require content inspection for downloads as well as URL check enabled
levels.Require_Managed_Chrome &&
device.chrome.is_file_download_analysis_enabled &&
device.chrome.is_realtime_url_check_enabled
액세스 관리를 위한 요구사항은 회사에서 기기를 관리하거나 소유하고 있는 경우에만 액세스를 허용하는 것입니다. 기기가 회사 소유 또는 관리 기기인지 확인하는 여러 가지 방법이 있습니다. 예를 들면 다음과 같습니다.
- 기기 일련번호가 회사 애셋 관리 시스템 일련번호와 일치하는 경우
- 기기에 회사에서 발급한 유효한 엔터프라이즈 인증서가 있는 경우
이 두 접근 방식은 다음과 같이 levels 및 device 속성을 사용하여 기기가 회사 소유 또는 관리 기기인지 파악하는 맞춤 액세스 수준에서 사용할 수 있습니다
// The device is a corporate if one of the following conditions is true:
// 1. If the serial number matches what the admin has uploaded
// 2. If the device has a valid enterprise-issued certificate
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시간 미만의 기간을 사용하는 것은 바람직하지 않습니다.
// Ensure one of these conditions is true for data from Crowdstrike:
// Must meet one of these conditions
// 1. Device was assessed within the last day
// 2. Assessment has not expired (2 weeks since last iat)
“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 Enterprise와 통합되고 기기에서 정책을 준수한다고 판단하는 BeyondCorp Alliance 파트너가 있는지 확인하는 방법을 보여줍니다.
exists
매크로에 ||
(or) 연산자를 사용하면 각 BeyondCorp Alliance 파트너의 표현식을 확장할 수 있습니다.
// Check to see if any of the BCA partners consider the device to be compliant
["CrowdStrike", "Tanium", "PANW", "Check Point", "Lookout"].exists(
v, v in device.vendors && device.vendors[v].is_compliant_device
)
이 예에서는 device 속성을 사용하여 기기에서 호환성 테스트 모음(CTS) 규정 준수 검사를 통과하도록 요구합니다. 자세한 내용은 호환성 테스트 모음을 참고하세요.
// 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개의 교대 근무를 정의합니다.
// Shift 1 - Monday to Friday, midnight to 8am
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')
// Shift 2 - Monday to Friday, 8am to 4pm
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')
// Shift 3 - Monday to Friday, 4pm to midnight
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')
// Allow shift workers to access resources from Monday to Friday between 9 AM to 5 PM, except for July fourth.
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 속성을 사용하여 시간과 위치가 제한된 액세스 수준을 만들어 특정 관리자에게 할당합니다. 이 액세스 수준이 할당되면 지정된 기간 동안에만 액세스할 수 있습니다. 이 기간이 만료되면 다시 기존 요구사항에 따라 관리자 액세스 권한이 관리됩니다.
// Allow temporary access to resources on March 1, 2022, between 10 PM to midnight,
// and this access must come from within the US region.
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”
// Note that the end time is exclusive, so the above potentially has 2 seconds that
// the users may not have access. Another option is to use this
// !between(‘00:00:01’,’16:00:00’)
두 수준의 조건을 결합하는 예시
두 액세스 수준의 조건을 결합하여 새로운 액세스 수준 정의이 액세스 수준은 levels 속성을 사용하며, 사용자가 두 가지 액세스 수준이 결합된 조건을 충족해야 합니다. 이 예에서 access_level_name_1 및 access_level_name_2는 내부 이름입니다.
levels.access_level_name_1 &&level.access_level_name_2