데이터 표 사용
데이터 테이블은 Google Security Operations에 자체 데이터를 입력할 수 있는 다중 열 데이터 구조입니다. 행에 저장된 데이터 및 정의된 열로 참고표 역할을 할 수 있습니다. Google SecOps 웹 인터페이스, 데이터 테이블 API를 사용하거나 YARA-L 쿼리를 사용하여 데이터 테이블을 만들거나 Google SecOps 계정으로 가져올 수 있습니다.
데이터 RBAC를 사용하여 데이터 테이블에 범위 할당
데이터 테이블을 사용하려면 데이터 역할 기반 액세스 제어 (데이터 RBAC)를 사용하여 데이터 테이블에 범위를 할당해야 합니다. 데이터 테이블에 범위를 할당하면 여기에 액세스하고 사용할 수 있는 사용자와 리소스를 제어할 수 있습니다. 자세한 내용은 데이터 테이블의 데이터 RBAC 구성을 참고하세요.
Google SecOps 웹 인터페이스를 사용하여 데이터 테이블 관리
다음 섹션에서는 데이터 테이블에 액세스하고, 새 데이터 테이블을 추가하고, 콘텐츠를 수정하고, 테이블로 데이터를 가져오고, 행을 추가하고, 쉼표나 탭을 사용하여 데이터를 구분하고, 계정에서 데이터 테이블을 삭제하는 등 웹 인터페이스를 사용하여 데이터 테이블을 관리하는 방법을 설명합니다.
데이터 테이블에 액세스
데이터 테이블 페이지에 액세스하려면 다음 단계를 따르세요.
- 왼쪽 사이드바에서 조사 > 데이터 테이블을 선택합니다.
특정 데이터 테이블을 찾으려면 사이드바 상단의 검색 필드에 이름을 입력합니다.
새 데이터 테이블 추가
Google SecOps에 새 데이터 테이블을 추가하려면 다음 단계를 완료하세요.
사이드바 오른쪽 상단에서
만들기를 클릭합니다.새 데이터 테이블 만들기 대화상자에서 새 테이블에 이름을 지정하고 원하는 경우 설명을 추가합니다.
만들기를 클릭합니다. 새 데이터 테이블이 기본 창에 표시되고 데이터를 받을 준비가 됩니다.
데이터 테이블로 데이터 가져오기
데이터 테이블에 데이터를 추가하려면 다음과 같이 Google SecOps로 직접 가져오면 됩니다.
데이터 가져오기를 클릭합니다.
표준 CSV 파일을 선택합니다 (CSV 파일만 Google SecOps로 가져올 수 있음).
데이터를 데이터 테이블로 가져올 준비가 되면 열기를 클릭합니다.
데이터 유형을 데이터 테이블 열에 매핑
웹 인터페이스 또는 API를 사용하여 단일 데이터 필드를 데이터 열에 매핑하고 반복되는 데이터 필드를 데이터 열에 매핑할 수 있습니다.
웹 인터페이스와 API 모두에서
|
문자를 사용하여 데이터 필드 값을 구분합니다. 웹 인터페이스에서 값이|
문자를 포함하는 경우 기본적으로 반복된 값으로 처리됩니다.API 요청의 경우
repeated_values
을true
로 설정합니다.
자세한 내용은 반복 필드를 참고하세요.
다음 예에서 데이터 테이블 열 Field_value
에는 여러 필드의 값이 포함되어 있습니다.
Field_value | Field_name |
altostrat.com | FQDN |
192.0.2.135 | IP |
charlie | userid |
예시 | hostname |
위 표는 4개의 열로 분할되어 있으며, 각 열은 이 문서에 제시된 데이터 테이블 사용 사례에 사용되기 전에 하나의 필드 유형에만 매핑됩니다.
FQDN | IP | Userid | 호스트 이름 |
altostrat.com | 192.0.2.135 | charlie | 예시 |
… | … | … | … |
특정 열을 키 열로 지정
열을 키 열로 표시하면 해당 열의 값이 고유하게 식별되고 데이터 중복이 방지되며 규칙 및 검색을 위한 데이터 탐색이 개선됩니다.
반복 필드를 지원하도록 특정 열 지정
다중 값 필드 또는 반복 필드를 저장할 열은 데이터 테이블을 만들 때 repeated로 명시적으로 지정해야 합니다.
열 이름을 항목 필드에 매핑 (선택사항)
데이터 테이블을 만들 때 데이터 테이블의 열 이름을 엔티티 필드에 매핑할 수 있습니다.
다음 예시 데이터 표에서 Userid
및 Role
열은 각각 entity.user.userid
및 entity.user.attribute.role.name
에 매핑됩니다.
Userid
(entity.user.userid에 매핑) |
이메일 | 역할
(entity.user.attribute.role.name에 매핑) |
잭 | jack123@gmail.com | 관리자 |
토니 | tony123@gmail.com | 엔지니어 |
DataTable
리소스의 mapped_column_path
필드를 사용하여 데이터 테이블 열을 엔티티 프로토 필드에 매핑할 수 있습니다.
이 예시 표의 Email
와 같이 정의된 엔티티 경로가 없는 열의 경우 데이터 유형을 수동으로 지정해야 합니다. 참조 목록과 마찬가지로 데이터 테이블에 지원되는 데이터 유형은 number
, string
, regex
, cidr
입니다.
join
조건을 지정하여 데이터 테이블에 매핑된 열과 매핑되지 않은 열을 모두 포함할 수 있습니다.
매핑되지 않은 열은 테이블이 조인되는 항목의 additional
필드에 저장됩니다. 이는 키-값 쌍으로 추가되며, 여기서 key
는 열 이름이고 value
는 해당 행 값입니다.
데이터 테이블에 새 행 추가
새 행을 추가하려면 다음 단계를 따르세요.
세부정보 탭에서 기존 행을 마우스 오른쪽 버튼으로 클릭하고 위쪽에 행 추가를 선택합니다.
첫 번째 행이 표 헤더로 처리되는 새 행의 데이터를 입력합니다.
- 쉼표 또는 탭을 사용하여 데이터 필드를 구분합니다.
- 각 데이터 항목을 적절한 데이터 열에 매칭해야 합니다.
- 세부정보 탭에 행 데이터를 입력하면 표 편집기에 데이터가 채워집니다.
데이터 표에서 행 수정하기
행을 수정하려면 다음 단계를 완료하세요.
변경할 필드를 클릭합니다. 그러면 필드를 수정할 수 있습니다.
변경을 완료한 후 저장을 클릭합니다.
쉼표 또는 탭을 사용하여 데이터를 구분할지 지정합니다.
쉼표 또는 탭을 사용하여 데이터를 구분하려면 다음 단계를 따르세요.
데이터 가져오기 옆에 있는
구분자 유형 수정을 클릭합니다.구분자 유형 수정 대화상자의 구분자 메뉴에서 쉼표 또는 탭을 선택합니다.
데이터 표 행 검색
웹 인터페이스를 사용하여 데이터 테이블 내에서 특정 정보를 검색할 수 있습니다. 세부정보 탭에서 검색창에 검색 문자열을 입력하고 검색을 클릭합니다. 검색 문자열이 포함된 행이 표시됩니다.
표 행 TTL 관리
표 행의 TTL (Time-to-Live) 값을 관리하려면 다음 단계를 따르세요.
행당 TTL 표시를 클릭합니다. TTL 열이 표시되어 각 행이 만료되었는지 여부를 나타냅니다. 만료되지 않은 경우 만료까지 남은 시간이 표시됩니다.
기본 행 만료 시간을 클릭하여 기본 행 만료 업데이트 대화상자를 표시하고 테이블 행 TTL을 조정합니다.
시간 또는 일에 새 TTL 값을 입력합니다. 최솟값은 24시간입니다. 최댓값은 365일입니다.
저장을 클릭합니다.
표 행 삭제
행을 삭제하려면 행을 마우스 오른쪽 버튼으로 클릭하고 행 삭제를 선택합니다.
여러 행을 삭제하려면 삭제하려는 각 행을 선택합니다. 그런 다음 선택한 행을 마우스 오른쪽 버튼으로 클릭하고 행 삭제를 선택합니다.
데이터 표 삭제
데이터 표를 삭제하려면 다음 단계를 따르세요.
왼쪽의 데이터 테이블 목록에서 데이터 테이블을 선택합니다.
삭제를 클릭합니다.
Chronicle API를 사용하여 데이터 테이블 관리
Chronicle API에서 제공되는 REST 리소스를 사용하여 Google SecOps의 데이터 테이블을 관리할 수도 있습니다. API는 웹 인터페이스에서 사용할 수 있는 모든 기능을 복제할 수 있으며, 성능과 확장성이 뛰어난 데이터 테이블을 관리할 수 있는 몇 가지 추가 기능도 포함되어 있습니다.
데이터 테이블 REST 리소스는 다음과 같습니다.
예: 필터 구문
다음 Chronicle API 예시에서는 filter
구문을 사용하여 데이터 테이블 행에서 google.com
을 검색하는 방법을 보여줍니다.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://staging-chronicle.sandbox.googleapis.com/v1alpha/projects/{$PROJECT}/locations/${REGION}/instances/${INSTANCE}/dataTables/${DATA_TABLE_NAME}/dataTableRows?filter=google.com
Google SecOps에서 데이터 표 사용하기
Google SecOps 인스턴스로 데이터 테이블을 가져온 후에는 YARA-L 쿼리를 사용하여 데이터를 필터링, 개선, 보강할 수 있습니다. 이 문서에는 Google SecOps에 통합할 수 있는 YARA-L 구문의 예가 많이 포함되어 있습니다.
검색과 규칙 모두에서 YARA-L 쿼리와 함께 데이터 테이블을 사용할 수 있습니다. 데이터 테이블은 다음과 같은 방식으로 사용할 수 있습니다.
데이터 테이블을 사용하여 UDM 이벤트 또는 항목 데이터 필터링 데이터 표의 항목과 비교하여 UDM 원격 분석 이벤트와 항목을 필터링할 수 있습니다.
데이터 표를 다중 열 참조 목록으로 사용 데이터 표를 다중 열 참조 목록으로 사용할 수 있습니다. 참조 목록은 단일 측정기준의 데이터에 액세스할 수 있지만 데이터 테이블을 사용하면 여러 측정기준의 데이터에 액세스하여 데이터 필터링을 사용 설정할 수 있습니다.
데이터 표를 이벤트 또는 항목과 조인 행 기반 비교를 위해 같음 (
=
) 연산자를 사용하여 UDM 이벤트를 데이터 테이블에 연결할 수 있습니다. 이 비교를 사용하면 데이터를 필터링할 수 있습니다. 행 기반 비교는 문의 모든 조건이 데이터 테이블의 단일 행과 일치하는 경우에만true
로 평가됩니다.
데이터 테이블을 사용하여 UDM 이벤트 및 항목 데이터 필터링
데이터 표의 항목과 비교하여 UDM 이벤트와 항목을 필터링할 수 있습니다.
다음 방법 중 하나로 UDM 이벤트를 데이터 테이블에 연결합니다.
행 기반 비교에 등호 연산자 (
=, !=, >, >=, <, <=
)를 사용합니다. 예를 들면$<udm_variable>.<field_path> = %<data_table_name>.<column_name>
입니다.열 기반 비교를 위해
in
키워드를 사용합니다. 예를 들면$<udm_variable>.<field_path> in %<data_table_name>.<column_name>
입니다.
참조 목록과 마찬가지로 각 데이터 테이블 열에 지원되는 데이터 유형은 number
, string
, regex
또는 CIDR
입니다.
열 기반 비교 및 조인에 number
유형의 데이터 테이블 열을 사용하려면 다음 구문을 사용하세요. 이 예에서는 target.port
8080을 포함하는 이벤트를 검색합니다.
%table.number_field = target.port
%table.number_field = 8080
target.port in %table.number_field
행 기반 비교에 CIDR
또는 regex
유형의 데이터 테이블 열을 사용하려면 다음 구문을 사용하세요.
net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>)
re.regex($e.principal.hostname, %<data_table_name>.<column_name>)
CIDR
또는 regex
유형의 데이터 테이블 열을 열 기반 비교에 사용하려면 다음 구문을 사용하세요.
$e.principal.ip in cidr %cidr_data_table.column_name
$e.principal.hostname in regex %regex_data_table.column_name
CIDR 또는 정규 표현식 데이터 유형인 데이터 테이블의 열을 비교할 때는 cidr
및 regex
키워드를 사용하지 않아도 됩니다.
데이터 테이블과 함께 not
연산자를 사용할 수도 있습니다. 다음 예시 쿼리는 IP 주소 ($e.principal.ip
)가 cidr_data_table
의 benign_ip
열에 나열된 CIDR 범위와 일치하지 않는 항목을 필터링합니다.
not $e.principal.ip in %data_table.benign_ip
데이터 테이블을 다중 열 참조 목록으로 사용
데이터 표를 다중 열 참조 목록으로 사용할 수 있습니다. 참조 목록은 단일 측정기준 (하나의 열)의 데이터에 액세스할 수 있지만 데이터 테이블은 여러 열을 지원하므로 여러 측정기준에서 데이터를 필터링하고 액세스할 수 있습니다.
열 기반 비교를 위해 in
키워드를 사용하여 UDM 이벤트를 데이터 테이블에 연결하면 특정 UDM 필드의 값을 데이터 테이블의 단일 열에 있는 값과 일치시킬 수 있습니다.
다음 예에서 badApps
데이터 테이블에는 hostname
및 ip
의 두 열이 포함되어 있습니다. 쿼리는 두 값 (UDM 필드를 기반으로 하는 값과 데이터 테이블을 기반으로 하는 값 모두 문자열 데이터 유형)을 독립적으로 일치시킵니다.
규칙 예:
rule udm_in_data_table {
meta:
description = "Use data table as multicolumn reference list"
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
$e.target.asset.asset_id = $assetid
// Event hostname matches at least one value in table column hostname.
$e.target.hostname in %badApps.hostname
// Event IP matches at least one value in table column ip.
$e.target.ip in %badApps.ip
match:
$assetid over 1h
condition:
$e
}
검색 예:
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
$e.target.asset.asset_id = $assetid
// Event hostname matches at least one value in table column hostname.
$e.target.hostname in %badApps.hostname
// Event IP matches at least one value in table column ip.
$e.target.ip in %badApps.ip
데이터 테이블을 UDM 이벤트 또는 항목과 조인
같음 및 비교 연산자 (=, !=, >, >=,
<, <=
)를 사용하여 UDM 이벤트를 데이터 표에 연결하여 행 기반 비교를 실행할 수 있습니다. 이 접근 방식을 사용하면 UDM 이벤트의 값을 데이터 테이블의 행과 일치시켜 데이터를 필터링할 수 있습니다. 비교 문을 여러 개 사용하는 경우 모든 필드 또는 조건이 동일한 데이터 표 행과 일치해야 합니다.
쿼리에서 연산자 (예: not, !=, >, >=, <, <=
)를 사용하려면 UDM 필드와 데이터 테이블 행 사이에 join
조건을 하나 이상 포함해야 합니다.
Google SecOps는 데이터 테이블 join
이 있는 규칙을 멀티 이벤트 규칙으로 취급하므로 규칙 정의에 match
섹션도 포함해야 합니다.
조인이 발생하면 연결된 데이터 표 행이 검색에 표시됩니다. 자세한 내용은 Google 검색에서 데이터 표 행 보기를 참고하세요.
다음 예에서는 string
유형의 데이터 테이블 열을 사용합니다. 이 YARA-L 쿼리는 user ID
이 테이블에 있는지 확인하여 사용자 로그인 이벤트가 example_table
의 행과 일치하는지 확인합니다. 규칙이 트리거되려면 데이터 표의 동일한 행에서 두 조건이 모두 일치해야 합니다.
// Check if a user exists in a data table and that the user is active for all user login events.
규칙 예:
rule udm_join_data_table {
meta:
description = "Join data table with UDM event"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid
// Event must match at least 1 row in the table where the uid in the table
// row is the userid on the event and the active date in the same table
// row is before the event timestamp
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname
match:
$userid over 1h
condition:
$e
}
검색 예:
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid
// Event must match at least 1 row in the table where the uid in the table
// row is the userid on the event and the active date in the same table
// row is before the event timestamp
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname
다음 예에서는 데이터 테이블과 UDM 이벤트 데이터가 함께 작동하는 방식을 보여줍니다. 위의 YARA-L 쿼리의 로직에 따라 user ID 32452
가 있는 사용자가 시스템의 사용자 hostname
로 감지에 표시되고 데이터 테이블의 hostname
와 일치합니다.
데이터 표 | ||
uid | title | 호스트 이름 |
32452 | HR | host1 |
64452 | 금융 | host2 |
46364 | IT | host3 |
UDM 이벤트 테이블 | |||
principal | 메타데이터 | security_result | principal |
32452 | USER_LOGIN | 허용 | host1 |
64589 | USER_LOGIN | 허용 | host9 |
87352 | USER_LOGIN | 허용 | host4 |
YARA-L 쿼리 결과를 데이터 테이블에 쓰기
YARA-L 쿼리의 결과를 데이터 테이블에 쓸 수 있습니다. 이 기능을 사용하면 Google SecOps 데이터에서 데이터 테이블을 만들고 이러한 테이블을 사용하여 다른 데이터를 필터링하고 개선할 수 있습니다.
다음과 같은 경우 YARA-L 쿼리 쓰기 구문을 사용할 수 있습니다.
데이터 테이블에 쿼리 결과를 쓰는 YARA-L 구문을 정의합니다.
위협 인텔리전스, 침해 사고 대응 및 기타 보안 사용 사례에 데이터 테이블을 사용합니다.
데이터는 YARA-L 구문 및 규칙을 준수해야 합니다.
YARA-L을 사용하여 데이터 테이블에 감지 및 알림 작성
YARA-L 쿼리를 사용하여 감지 및 알림을 데이터 테이블로 보낼 수 있습니다.
write_row 함수를 사용하면 규칙의 결과를 사용하여 데이터 테이블에서 일치하는 키가 있는 데이터 테이블 행을 덮어쓸 수 있습니다. 키가 테이블에 없으면 대신 새 행을 추가합니다.
YARA-L 쿼리의 내보내기 섹션에서 write_row 함수를 지정합니다. 데이터 테이블에 데이터를 쓰는 것은 쿼리의 최종 작업이어야 합니다. 이렇게 하면 결과 변수가 데이터 테이블에 기록됩니다.
export:
%<data_table_name>.write_row(
data_table_column_x_name: <value>,
data_table_column_y_name: <value>,
...,
...,
data_table_column_z_name: <value>
)
// depending on the key column(s), the rows will be updated for existing keys
and appended for new keys
YARA-L을 사용하여 데이터 테이블 수정
다음은 YARA-L을 사용하여 데이터 테이블을 수정하는 방법을 보여줍니다.
TableName: ip_user_domain_table
(기본 키의 키 열은 생성 시 정의됨)
ip_address | employee_id* | domain |
192.0.2.10 | Dana | altostrat.com |
192.0.2.20 | Quinn | altostrat.com |
192.0.2.30 | Lee | cymbalgroup.com |
* 는 기본 키를 나타냅니다.
다음 쿼리는 principal.ip
, principal.user.employee_id
, target.domain
의 고유한 조합을 캡처합니다. target.domain
의 유병률을 기준으로 결과를 필터링합니다.
events:
$e.principal.ip = $principal_ip
$e.principal.user.employee_id = $principal_user_employee_id
$e.target.domain.name = $target_domain
$e.target.domain.prevalence.day_count < 5
// To run this query as a rule, add Condition Section here
// condition:$e
쿼리 결과:
ip | empid | domain |
192.0.2.10 | Dana | altostrat.com |
192.0.2.30 | Lee | examplepetstore.com |
192.0.2.20 | Quinn | altostrat.com |
예: write_row를 사용하여 쿼리 출력을 데이터 테이블에 쓰기
규칙 예:
rule udm_write_data_table {
meta:
description = "Writeto data table"
events:
$e.principal.user.employee_id = $principal_user_employee_id
$e.target.domain.name = $target_domain
$e.target.domain.prevalence.day_count < 5
outcome:
$hostname = $target_domain
$principal_emp_id = $principal_user_employee_id
condition:
$e
export:
%ips_with_hostnames.write_row(
employeeid:$principal_emp_id,
hostname:$hostname
)
}
검색 예:
events:
$e.principal.user.employee_id = $principal_user_employee_id
$e.target.domain.name = $target_domain
$e.target.domain.prevalence.day_count < 5
outcome:
$hostname = $target_domain
$principal_emp_id = $principal_user_employee_id
export:
%ips_with_hostnames.write_row(
employeeid:$principal_emp_id,
hostname:$hostname
)
예: write_row 이해
다음 예에서는 user
와 ip
가 기본 키로 사용됩니다. 감지 테이블에 유지되는 각 감지는 쿼리의 내보내기 섹션에서 함수 호출을 한 번 평가합니다.
규칙 예:
rule udm_write_data_table {
meta:
description = "Write data table"
events:
$e.metadata.event_type = "USER_LOGIN"
all $e.security_result.action != "BLOCK"
all $e.security_result.action != "UNKNOWN_ACTION"
$user = $e.principal.user.userid
$ip = $e.target.ip
$ts = $e.metadata.event_timestamp.seconds
match:
$user, $ip over 1h
outcome:
$first_seen = min($ts)
condition:
$e
export:
%successful_logins.write_row(user:$user, ip:$ip)
}
검색 예:
events:
$e.metadata.event_type = "USER_LOGIN"
all $e.security_result.action != "BLOCK"
all $e.security_result.action != "UNKNOWN_ACTION"
$ts = $e.metadata.event_timestamp.seconds
outcome:
$user = $e.principal.user.userid
$ip = $e.target.ip[0]
export:
%successful_logins.write_row(user:$user, ip:$ip)
이벤트 데이터는 다음과 같습니다.
metadata: {
event_type: USER_LOGIN
event_timestamp: { seconds: 1283299200 }
}
principal: {
user: {
userid: "charlie"
}
}
target: {
ip: ["192.0.2.135", "192.0.2.136"]
}
security_result: {
action: ALLOW
}
이 쿼리가 규칙으로 실행되면 다음 감지 항목이 반환됩니다.
감지 ID | $user와 일치 | $ip 일치 |
0 | charlie | 192.0.2.135 |
1 | charlie | 192.0.2.136 |
데이터 표에는 다음이 포함됩니다.
사용자 | ip |
charlie | 192.0.2.135 |
charlie | 192.0.2.136 |
다음 검색어는 검색에서 데이터 테이블에 스칼라 값을 쓰는 기능을 지원하는 방법을 보여줍니다.
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
export:
%summary_table.write_row(col_name: $e.metadata.product_name, Vendor_name: $e.metadata.vendor_name)
데이터 테이블로 항목 그래프 보강
데이터 테이블을 사용하여 규칙의 엔티티 그래프에 표시된 엔티티를 추가, 삭제 또는 대체할 수 있습니다. 규칙의 setup
섹션에 있는 함수를 사용하여 데이터 테이블을 events
섹션에 참조된 엔티티 이벤트와 병합하거나, 엔티티 이벤트에 추가하거나, 엔티티 이벤트에서 엔티티를 삭제하는 방법을 나타냅니다.
다음 규칙 템플릿을 사용하여 항목 그래프를 수정할 수 있습니다.
rule entity_graph_template {
meta:
...
setup:
// import the data table into entity graph
<enrichment_keyword> <join_condition>
events:
...
match:
...
condition:
...
}
다음 YARA-L 2.0 함수를 사용하여 데이터 테이블로 엔티티 그래프를 강화할 수 있습니다.
graph_override
: 조인 조건과 일치하는 엔티티 그래프의 행을 데이터 테이블의 데이터로 덮어씁니다.예를 들면 다음과 같습니다.
[graph_override](?tab=t.0#heading=h.v0fps7eke1if)
graph_append
: 데이터 테이블의 행을 엔티티 그래프의 행에 추가합니다.graph_append
작업에는 조인 조건이 아닌 데이터 테이블 변수와 항목 이벤트 변수가 포함된 배열이 필요합니다.다음 예에서
$g1
는 엔티티 그래프 변수이고example_table
는 데이터 테이블입니다.graph_append [$g1, %example_table]
append
함수의 경우 데이터 테이블에는 항목을 검증하기 위해 다음 열이 포함되어야 합니다.start_time
(metadata.interval.start_time.seconds
에 매핑됨)end_time
(metadata.interval.end_time.seconds
에 매핑됨)
웹 인터페이스를 사용하여 데이터 테이블 열을 메타데이터 필드에 매핑할 수 없습니다.
append
사용 사례의 경우 Chronicle API (https://cloud.google.com/chronicle/docs/reference/rest/v1alpha/projects.locations.instances.dataTables/create)를 사용하여 데이터 테이블을 만들어야 합니다.graph_exclude
:join
조건과 일치하는 엔티티 그래프의 행을 삭제합니다.예를 들면 다음과 같습니다.
[graph_exclude](?tab=t.0#heading=h.o0qbb5paki6g)
조인 조건은 데이터 테이블 열과 항목 그래프 필드 간의 등식 표현식이어야 합니다. graph_override
및 graph_exclude
함수의 경우 데이터 테이블에 액세스하는 구문은 다음과 같습니다.
<data_table_name>.<column_name>
이벤트 섹션의 <entity_variable>
에 지정된 필터는 데이터 테이블로 개선된 후에 적용됩니다.
엔티티 그래프의 엔티티가 데이터 테이블의 엔티티로 보강되면 엔티티 그래프의 엔티티 변수를 UDM 엔티티에 조인해야 합니다.
데이터 테이블의 데이터로 항목 그래프 재정의
graph_override
함수를 사용하면 항목 그래프와 데이터 테이블 모두에 있는 필드가 데이터 테이블의 필드로 대체됩니다. 엔티티 그래프에 있고 데이터 테이블에는 없는 필드는 동일하게 유지됩니다. 엔티티 그래프에는 없지만 데이터 테이블에는 있는 필드가 포함됩니다.
매핑된 데이터 테이블의 열만 항목 그래프의 열을 재정의합니다. 매핑되지 않은 열은 데이터 테이블이 조인된 엔티티 그래프의 additional
필드에 추가됩니다.
예: 단일 조인에서 일치
다음 예에서는 데이터 테이블 열과 항목 그래프 필드($g1.graph.entity.ip = %example_table.my_ip
) 간의 조인 조건과 일치하는 항목 그래프의 행이 데이터 테이블에 의해 재정의됩니다.
rule rule_override {
meta:
description = "Override entity context with data table before joining with UDM event"
setup:
//Rows in the entity graph that match the join condition are overridden by the data table
graph_override ($g1.graph.entity.ip = %example_table.my_ip)
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
// Filter will be applied after graph is overridden by data table
$g1.graph.entity.hostname = "ftp01"
// Accessing unmapped columns
$g1.graph.additional.fields["Owner"] = "alice"
// Joining the UDM event with the enriched entity graph
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
데이터 테이블의 매핑되지 않은 열('소유자'라고 가정)을 사용하려면 $g1.graph.entity.owner = "alice" is $g1.graph.additional.fields["Owner"] = "alice"
에 상응하는 문을 사용합니다.
이는 데이터 테이블의 매핑되지 않은 모든 열이 엔티티 그래프 ($g1)
의 additional
필드로 이동하기 때문입니다.
다음 표에서는 데이터 테이블의 IP 필드가 항목 그래프의 IP 필드와 일치할 때 항목 그래프의 행이 보강되는 재정의 작업을 보여줍니다.
기존 항목 그래프 | ||
호스트 이름 | IP | Mac |
ftp01 | 10.1.1.4 | …:01 |
www01 | 10.1.1.5 | …:02 |
데이터 표 | |||
호스트 이름 | IP | Mac | 소유자 |
ftp01 | 10.1.1.4 | …:bb | 앨리스 |
h1 | 10.1.1.6 | …:cc | bob |
h2 | 10.1.1.7 | …:dd | chris |
h3 | 10.1.1.4 | …:ee | doug |
강화된 항목 그래프 | |||
호스트 이름 | IP | Mac | 소유자 |
ftp01 | 10.1.1.4 | …:bb | 앨리스 |
www01 | 10.1.1.5 | …:02 | |
h3 | 10.1.1.4 | …:ee | doug |
예: 여러 조인에서 일치
다음 예시에서는 여러 조인 조건 ($g1.graph.entity.ip = %example_table.my_ip
및 $g1.graph.entity.hostname = %example_table.my_hostname
)과 일치하는 항목 그래프의 행이 데이터 테이블에 의해 재정의됩니다.
rule rule_override {
meta:
description = "Override Entity context with Data Table before joining with UDM event"
setup:
// example with more than one condition
graph_override ($g1.graph.entity.ip = %example_table.my_ip and
$g1.graph.entity.hostname = %example_table.my_hostname)
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
// Filter will be applied after graph is overridden by data table
$g1.graph.entity.hostname = "ftp01"
// joining the UDM event with the enriched entity graph
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
다음 표에서는 데이터 테이블의 IP 필드와 호스트 이름 필드가 항목 그래프의 IP 필드와 호스트 이름 필드와 모두 일치할 때 항목 그래프의 행이 보강되는 재정의 작업을 보여줍니다.
기존 항목 그래프 | ||
호스트 이름 | IP | Mac |
ftp01 | 10.1.1.4 | …:01 |
www01 | 10.1.1.5 | …:02 |
데이터 표 | |||
호스트 이름 | IP | Mac | 소유자 |
ftp01 | 10.1.1.4 | …:bb | 앨리스 |
h1 | 10.1.1.5 | …:cc | bob |
h2 | 10.1.1.6 | …:dd | chris |
h3 | 10.1.1.4 | …:ee | doug |
강화된 항목 그래프 | |||
호스트 이름 | IP | Mac | 소유자 |
ftp01 | 10.1.1.4 | …:bb | 앨리스 |
www01 | 10.1.1.5 | …:02 |
데이터 테이블의 데이터를 항목 그래프에 추가
graph_append
함수를 사용하면 조인 조건이 필요하지 않습니다.
다음 예에서는 데이터 테이블의 모든 행이 엔티티 그래프의 행에 추가됩니다.
rule rule_append {
meta:
description = "Data table append entity"
setup:
graph_append [$g1, %example_table]
events:
// filter UDM events
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
// Join the filtered UDM events with the enriched graph
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
다음 예시 표에서는 데이터 테이블의 행이 엔티티 그래프의 행에 추가되는 추가 작업을 보여줍니다.
기존 항목 그래프 | ||
호스트 이름 | IP | Mac |
ftp01 | 10.1.1.4 | …:01 |
www01 | 10.1.1.5 | …:02 |
데이터 표 | ||
IP | Mac | 소유자 |
10.1.1.4 | …:01 | 앨리스 |
10.1.1.6 | …:cc | bob |
10.1.1.7 | …:dd | chris |
10.1.1.4 | …:ee | doug |
강화된 항목 그래프 | |||
호스트 이름 | IP | Mac | 소유자 |
ftp01 | 10.1.1.4 | …:01 | |
www01 | 10.1.1.5 | …:02 | |
10.1.1.4 | …:bb | 앨리스 | |
10.1.1.6 | …:cc | bob | |
10.1.1.7 | …:dd | chris | |
10.1.1.4 | …:ee | doug |
graph_exclude를 사용하여 엔티티 그래프에서 행 삭제
graph_exclude
함수를 사용하면 조인 조건과 일치하는 항목 그래프의 행이 항목 그래프에서 삭제됩니다.
다음 예에서는 지정된 조인 조건 (데이터 테이블 열과 엔티티 그래프 필드 간)과 일치하는 엔티티 그래프의 모든 행이 삭제됩니다. 데이터 테이블의 행이 항목 그래프에 추가되지 않습니다.
rule rule_exclude {
meta:
setup:
graph_exclude ($g1.graph.entity.ip = %example_table.ip)
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
다음 표에서는 데이터 테이블의 IP 필드와 일치하는 엔티티 그래프의 행이 삭제되는 제외 작업을 보여줍니다.
기존 항목 그래프 | ||
호스트 이름 | IP | Mac |
ftp01 | 10.1.1.4 | …:01 |
www01 | 10.1.1.5 | …:02 |
데이터 표 | ||
IP | Mac | 소유자 |
10.1.1.4 | …:bb | 앨리스 |
10.1.1.6 | …:cc | bob |
10.1.1.7 | …:dd | chris |
강화된 항목 그래프 | ||
호스트 이름 | IP | Mac |
www01 | 10.1.1.5 | …:02 |
제한사항
Google SecOps 계정의 최대 데이터 테이블 수: 1,000개
업로드에는
CSV
파일 형식만 지원됩니다.쿼리에서 참조 목록을 참조할 때
in
문의 수에 대한 한도는 데이터 테이블의in
문에도 적용됩니다.쿼리의 최대
in
문 수: 10개String
및Number
데이터 유형 열의 쿼리에서in
문장의 최대 개수는 7개입니다.정규 표현식 연산자가 있는 최대
in
문: 4개CIDR 연산자가 있는 최대
in
문: 2개데이터 테이블당 최대 열 수: 1,000개
데이터 테이블당 최대 행 수: 1,000만 개
계정의 데이터 테이블 전체에서 데이터 볼륨의 최대 집계 한도: 1TB
텍스트 및 표 편집기 보기에서 데이터 표 행의 웹페이지 최대 표시 한도: 10,000개 행
웹페이지에서 새 데이터 표에 파일을 업로드할 때의 최대 행 수 제한: 10,000개 행
API에서 데이터 표를 생성할 때의 최대 파일 업로드 크기 제한: 1GB
설정 섹션에서는 자리표시자를 사용할 수 없습니다.
데이터 유형이
string
로 설정된 데이터 테이블의 매핑되지 않은 열은 UDM 이벤트 또는 UDM 항목의 문자열 필드와만 조인할 수 있습니다.데이터 유형이 CIDR 또는 정규식의 경우
cidr
또는regex
로 설정된 데이터 테이블에서 매핑되지 않은 열만 사용합니다.데이터 테이블 조회: 정규 표현식 와일드 카드는 지원되지 않으며 검색어는 100자로 제한됩니다.
조인
이벤트와 함께 데이터 테이블 조인을 사용하는 경우 감지를 위한 모든 이벤트 샘플을 가져오는 것은 지원되지 않습니다.
엔티티 및 UDM과 달리 데이터 테이블은 자리표시자를 지원하지 않습니다. 즉, 다음 작업을 할 수 없습니다.
데이터 표에 필터 집합을 적용하고 UDM 엔티티와 조인합니다.
다른 UDM 자리표시자와 결합하는 동안 동일한 데이터 테이블에 다른 필터 세트를 적용합니다.
예를 들어
my_hostname
,org
,my_email
의 3개 열이 있고 다음 규칙이 있는dt
라는 데이터 테이블이 있습니다.events: $e1.principal.hostname = %dt.my_hostname %dt.org ="hr" $e2.principal.email = %dt.my_email %dt.org !="hr"
데이터 테이블의 모든 필터가 먼저 적용된 다음 데이터 테이블에서 필터링된 행이 UDM과 조인됩니다. 이 경우 dt
테이블의 모순된 필터 (%dt.org ="hr" and %dt.org !="hr"
)로 인해 빈 데이터 테이블이 생성되며, 이 테이블은 e1
및 e2
와 결합됩니다.
규칙과 함께 데이터 테이블 사용
규칙과 함께 사용할 때 데이터 테이블에는 다음 제한사항이 적용됩니다.
실행 빈도
데이터 테이블이 있는 규칙에는 실시간 실행 빈도가 지원되지 않습니다.
데이터 표에 출력
데이터 테이블의 반복 필드 열에는
any
및all
한정자가 지원되지 않습니다.데이터 테이블의 반복 필드 열에는 배열 색인 생성이 지원되지 않습니다.
결과 변수는 데이터 테이블로만 내보낼 수 있습니다. 이벤트 경로 또는 데이터 표 열은 직접 내보낼 수 없습니다.
열 목록에는 데이터 테이블의 기본 키 열이 포함되어야 합니다.
결과는 최대 20개까지 사용할 수 있습니다.
데이터 테이블이 없으면 지정된 순서에 따라 모든 열에 기본
string
데이터 유형이 있는 새 테이블이 생성됩니다.한 번에 하나의 규칙만 데이터 테이블에 쓸 수 있습니다. 한 규칙이 이미 쓰고 있는 데이터 테이블에 다른 규칙이 쓰려고 하면 규칙 컴파일이 실패합니다.
해당 데이터 테이블의 소비자 규칙이 시작되기 전에 생산자 규칙이 데이터 테이블에 행을 추가할 수 있다고 보장할 수는 없습니다.
단일 규칙에는 결과 행 수에 제한이 있습니다. 결과 및 지속 데이터와 데이터 테이블에 최대 10,000개의 행 제한이 적용됩니다.
행을 업데이트하면 키가 아닌 모든 열의 새 값이 이전 값을 대체합니다. 새 행을 추가하는 것을 비롯한 업데이트가 쿼리에 사용 가능해지기까지 약 5분이 걸립니다.
데이터 테이블의 항목 보강
단일 항목 그래프 변수에는 하나의 보강 작업 (
override
,append
또는exclude
)만 적용할 수 있습니다.각 보강 작업은 하나의 데이터 테이블만 사용할 수 있습니다.
YARA-L 규칙의
setup
섹션에서 모든 유형의 보강 작업을 최대 2개까지 정의할 수 있습니다.
다음 예에서는 override
작업이 항목 그래프 변수 $g1
에 적용되고 append
작업이 항목 그래프 변수 $g2
에 적용됩니다.
setup:
graph_override($g1.graph.entity.user.userid = %table1.myids)
graph_append [$g2, %table1]
위의 예에서는 동일한 데이터 테이블 (table1
)이 서로 다른 엔티티 그래프를 개선하는 데 사용됩니다. 다음과 같이 다양한 데이터 테이블을 사용하여 다양한 엔티티 그래프를 개선할 수도 있습니다.
setup:
graph_override($g1.graph.entity.user.userid = %table1.myids)
graph_append [$g2, %table2]
검색에서 데이터 표 사용하기
검색과 함께 사용할 때 데이터 테이블에는 다음 제한사항이 적용됩니다.
Chronicle API를 사용하여 데이터 테이블에서 검색 쿼리를 실행할 수 없습니다. 쿼리는 웹 인터페이스를 통해서만 지원됩니다.
단일 쿼리 실행은 데이터 테이블에 최대 100만 개의 행 또는 1GB를 출력할 수 있습니다(둘 중 먼저 도달하는 한도 기준).
데이터 테이블에 대한 검색 출력은 이벤트 행이 5MB를 초과하는 경우 건너뜁니다.
검색에서는 항목 보강이 지원되지 않습니다.
고객 관리 암호화 키 (CMEK) 사용자는 데이터 테이블을 사용할 수 없습니다.
쓰기는 고객당 분당 6회로 제한됩니다.
API 지원은 검색 관련 데이터 테이블 작업에 사용할 수 없습니다.
통계 쿼리는 데이터 테이블 조인에서 지원되지 않습니다.
데이터 테이블 및 데이터 테이블 조인은 항목이 아닌 UDM 이벤트에서만 지원됩니다.
지원됨:
%datatable1.column1 = %datatable2.column1
지원되지 않음:graph.entity.hostname = %sample.test
통계 쿼리의
export
섹션에 있는 통계 쿼리에match
변수를 포함할 수 없습니다.예를 들어 다음은 지원되지 않습니다.
match:
principal.hostname
export:
%sample.write_row(
row: principal.hostname
)
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.