Zscaler CASB 로그 수집

다음에서 지원:

이 문서에서는 Google Security Operations 피드를 설정하여 Zscaler CASB 로그를 내보내는 방법과 로그 필드가 Google SecOps 통합 데이터 모델 (UDM) 필드에 매핑되는 방식을 설명합니다.

자세한 내용은 Google SecOps에 데이터 수집 개요를 참고하세요.

일반적인 배포는 Zscaler CASB 및 Google SecOps에 로그를 전송하도록 구성된 Google SecOps Webhook 피드로 구성됩니다. 고객 배포마다 다를 수 있으며 더 복잡할 수도 있습니다.

  1. Google SecOps 콘솔에 로그인합니다.
  2. SIEM 설정 > 수집 에이전트로 이동합니다.
  3. 처리 인증 파일을 다운로드합니다. Bindplane가 설치될 시스템에 파일을 안전하게 저장합니다.
  • Zscaler CASB: 로그를 수집하는 플랫폼입니다.

  • Google SecOps 피드: Zscaler CASB에서 로그를 가져오고 로그를 Google SecOps에 작성하는 Google SecOps 피드입니다.

Bindplane 에이전트 설치

Windows 설치

시작하기 전에

  • Zscaler Internet Access 콘솔에 액세스할 수 있는지 확인합니다. 자세한 내용은 보안 인터넷 및 SaaS 액세스 ZIA 도움말을 참고하세요.
  • Zscaler CASB 2024 이상을 사용하고 있는지 확인합니다.
  • 배포 아키텍처의 모든 시스템이 UTC 시간대로 구성되었는지 확인합니다.
  • Google SecOps에서 피드 설정을 완료하는 데 필요한 API 키가 있는지 확인합니다. 자세한 내용은 API 키 설정을 참고하세요.

Linux 설치

  1. SIEM 설정 > 피드로 이동합니다.
  2. 새로 추가를 클릭합니다.
  3. 피드 이름 필드에 피드 이름을 입력합니다 (예: Zscaler CASB Logs).
  4. 소스 유형으로 Webhook을 선택합니다.
  5. 로그 유형으로 Zscaler CASB를 선택합니다.
  6. 다음을 클릭합니다.
  7. 선택사항: 다음 입력 파라미터의 값을 지정합니다.
    1. 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다 (구분 기호를 사용하지 않는 경우 비워 둡니다).
    2. 애셋 네임스페이스: 애셋 네임스페이스입니다.
    3. 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
  8. 다음을 클릭합니다.
  9. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
  10. 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.

Zscaler CASB 설정

추가 설치 리소스

Syslog를 수집하고 Google SecOps로 전송하도록 Bindplane 에이전트 구성

  1. 구성 파일에 액세스합니다.

    • config.yaml 파일을 찾습니다. 일반적으로 Linux의 /etc/bindplane-agent/ 디렉터리 또는 Windows의 설치 디렉터리에 있습니다.
    • 텍스트 편집기 (예: nano, vi, 메모장)를 사용하여 파일을 엽니다.
  2. 다음과 같이 config.yaml 파일을 수정합니다.

    receivers:
        tcplog:
            # Replace the below port <54525> and IP <0.0.0.0> with your specific values
            listen_address: "0.0.0.0:54525" 
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            # Adjust the creds location below according the placement of the credentials file you downloaded
            creds: '{ json file for creds }'
            # Replace <customer_id> below with your actual ID that you copied
            customer_id: <customer_id>
            endpoint: malachiteingestion-pa.googleapis.com
            # You can apply ingestion labels below as preferred
            ingestion_labels:
            log_type: SYSLOG
            namespace: vmware_nsx
            raw_log_field: body
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - tcplog
                exporters:
                    - chronicle/chronicle_w_labels
    
    • CHRONICLE_REGION: Google SecOps 인스턴스가 호스팅되는 리전입니다 (예: 미국).
    • GOOGLE_PROJECT_NUMBER: BYOP 프로젝트 번호 (C4에서 가져옴)
    • LOCATION: Google SecOps 리전 (예: 미국)입니다.
    • CUSTOMER_ID: Google SecOps 고객 ID (C4에서 가져옴)
    • FEED_ID: 새로 생성된 새 webhook의 피드 UI에 표시되는 피드 ID입니다.

    샘플 API URL:

Bindplane 에이전트를 다시 시작하여 변경사항 적용

  • Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.

    sudo systemctl restart bindplane-agent
    
  • Windows에서 Bindplane 에이전트를 다시 시작하려면 서비스 콘솔을 사용하거나 다음 명령어를 입력하면 됩니다.

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Zscaler Cloud Web Security 구성

  1. Zscaler Analytics 관리 콘솔에 로그인합니다.
  2. 관리 > 설정 > Nanolog 스트리밍 서비스 (NSS)를 선택합니다.
  3. NSS 피드를 선택합니다.
  4. 추가를 클릭합니다.
  5. 표시되는 NSS 피드 추가 창에서 다음을 수행합니다.

    1. 피드 이름: 피드 이름을 입력합니다.
    2. NSS 유형: 요구사항에 따라 웹용 NSS 또는 방화벽용 NSS 중에서 선택합니다.
    3. NSS 이름: 클라우드에서 로그를 수집하는 NSS 가상 머신 (VM)을 선택합니다 (피드에 하나의 NSS VM만 매핑할 수 있음).
    4. 상태: 피드를 활성화하려면 사용 설정됨을 선택합니다.
    5. SIEM IP: syslog 서버/Bindplane IP 주소를 입력합니다.
    6. SIEM TCP 포트: TCP 통신을 위한 syslog 서버/Bindplane 포트 번호를 입력합니다 (Zscaler는 TCP 연결만 지원함).
    7. 로그 유형: 선택한 NSS 유형에 따라 웹 로그 또는 방화벽 로그를 선택합니다.
    8. 피드 출력 유형: 맞춤을 선택합니다.
    9. 피드 출력 형식: 웹 로그 또는 방화벽 로그를 지정합니다.
    10. 사용자 난독화: 사용 중지됨을 선택하여 출력에 로그인 사용자 이름을 표시합니다. 무작위 값의 경우 사용 설정됨을 선택합니다.
    11. 시간대: 적절한 시간대를 선택합니다 (기본 시간대는 GMT).
    12. 중복 로그: NSS에서 중복 로그를 전송하는 데 걸리는 시간을 분 단위로 입력합니다 (요구사항에 따라 시간을 선택할 수 있음).
    13. 거래 필터: NSS 가상 머신에서 전송한 로그를 필터링하는 데 사용할 수 있는 다양한 매개변수가 있습니다.

    다양한 필터 세트에 관한 자세한 내용은 도움말 포털의 NSS 문서 섹션을 참고하세요.

  6. 정책 관리 콘솔 또는 분석 관리 콘솔 사용:

    1. 정책 관리 콘솔을 사용하려면 완료를 클릭합니다.
    2. 애널리틱스 관리 콘솔을 사용하려면 저장을 클릭합니다. NSS 피드 추가 창이 닫히면 이전 창으로 돌아가고 추가된 피드 세부정보가 피드 구성 섹션 아래에 표시됩니다.
  7. 정책 관리 콘솔 또는 분석 관리 콘솔 사용:

    1. 정책 관리 콘솔을 사용하려면 다음 단계를 따르세요.
      • 피드 구성 섹션에서 저장을 클릭합니다.
      • 지금 활성화를 클릭합니다. 결과 상태가 새 창에 표시됩니다.
      • 완료를 클릭합니다.
    2. 애널리틱스 관리 콘솔을 사용하려면 지금 활성화를 클릭합니다. 결과 상태가 창 상단에 표시됩니다.

웹 및 방화벽 로그 피드 구성

피드 출력 형식 필드에서 다음 피드를 사용합니다.

  • 수집기가 맞춤 형식을 지원하는 경우 다음 웹 로그 피드를 지정합니다.

    |ZSCALER|DATE|%s{mon} %d{dd} %02d{hh}:%02d{mm}:%02d{ss}|NSSFEEDIP|%s{nsssvcip}|CLIENTINTIP|%s{cintip}|RECORDID|%d{recordid}|LOGINNAME|%s{login}|PROTOCOL|%s{proto}|URL|%s{url}|HOST|%s{host}|ACTION|%s{action}|REASON|%s{reason}|RISKSCORE|%d{riskscore}|APPNAME|%s{appname}|APPCLASS|%s{appclass}|REQSIZE|%d{reqsize}|RESPSIZE|%d{respsize}|CTIME|%d{ctime}|URLCLASS|%s{urlclass}|SUPERCAT|%s{urlsupercat}|URLCAT|%s{urlcat}|MALWARECAT|%s{malwarecat}|MALWARECLASS|%s{malwareclass}|THREATNAME|%s{threatname}|FILETYPE|%s{filetype}|FILECLASS|%s{fileclass}|DLPENGINE|%s{dlpeng}|DLPDICT|%s{dlpdict}|BWTHROTTLE|%s{bwthrottle}|LOCATION|%s{location}|DEPARTMENT|%s{dept}|CLIENTIP|%s{cip}|DESTINATIONIP|%s{sip}|REQMETHOD|%s{reqmethod}|RESPCODE|%s{respcode}|USERAGENT|%s{ua}|REFERER|%s{referer}|MD5HASH|%s{bamd5}|DLPRULENAME|%s{dlprulename}|DLPMD5|%s{dlpmd5}|DLPIDENTIFIER|%d{dlpidentifier}|DLPDICTHITCOUNT|%s{dlpdicthitcount}|\n
            ```
    
  • 수집기에서 방화벽 피드 구독을 지원하는 경우 다음 방화벽 피드를 지정합니다.

    |ZSCALERFIREWALL|DATE|%s{mon}%d{dd} %02d{hh}:%02d{mm}:%02d{ss}|CLIENTIP|%s{csip}|RECORDID|%d{recordid}|LOGINNAME|%s{login}|PROTOCOL|%s{ipproto}|ACTION|%s{action}|DESTINATIONIP|%s{cdip}|SOURCEPORT|%d{csport}|DESTINATIONPORT|%d{cdport}|CLIENTTUNIP|%s{tsip}|CLIENTTUNPORT|%d{tsport}|LOCATION|%s{location}|DEPARTMENT|%s{dept}|DESTINATIONCOUNTRY|%s{destcountry}|INCOMINGBYTES|%ld{inbytes}|NETWORKAPP|%s{nwapp}|NETWORKSVC|%s{nwsvc}|RULELABEL|%s{rulelabel}|NATTING|%s{dnat}|SESSIONDURATION|%d{duration}|AGGREGATEDSESSION|%d{numsessions}|AVERAGEDURATION|%d{avgduration}|TUNNELTYPE|%s{ttype}|SERVERDESTPORT|%d{sdport}|SERVERSOURCEIP|%s{ssip}|SERVERSOURCEPORT|%d{ssport}|IPCAT|%s{ipcat}|\n
    
    1. 시간대 목록에서 출력 파일의 시간 필드에 사용할 시간대를 선택합니다. 기본적으로 시간대는 조직의 시간대로 설정됩니다.
    2. 구성된 설정을 검토합니다.
    3. 저장을 클릭하여 연결을 테스트합니다. 연결에 성공하면 Test Connectivity Successful: OK (200)(연결 테스트 완료: OK(200))라는 메시지와 함께 녹색 체크표시가 표시됩니다.

Google SecOps 피드에 대한 자세한 내용은 Google SecOps 피드 문서를 참고하세요. 각 피드 유형의 요구사항은 유형별 피드 구성을 참조하세요.

피드를 만들 때 문제가 발생하면 Google SecOps 지원팀에 문의하세요.

UDM 매핑 표

필드 매핑 참조: ZSCALER_CASB

다음 표에는 ZSCALER_CASB 로그 유형의 로그 필드와 해당 UDM 필드가 나와 있습니다.

Log field UDM mapping Logic
metadata.event_type The metadata.event_type UDM field is set to USER_UNCATEGORIZED.
metadata.product_name The metadata.product_name UDM field is set to CASB.
metadata.vendor_name The metadata.vendor_name UDM field is set to Zscaler.
principal.user.attribute.roles.type If the is_admin_act log field value is equal to 1, then the principal.user.attribute.roles.type UDM field is set to ADMINISTRATOR.
security_result.associations.type If the malware log field value is not empty, then the security_result.associations.type UDM field is set to MALWARE.
security_result.severity If the severity log field value is equal to High, then the security_result.severity UDM field is set to HIGH.

Else, if the severity log field value is equal to Medium, then the security_result.severity UDM field is set to MEDIUM.

Else, if the severity log field value is equal to Low, then the security_result.sevrity UDM field is set to LOW.

Else, if the severity log field value is equal to Information, then the security_result.severity UDM field is set to INFORMATIONAL.
target.resource.resource_type If the bucketname log field value is not empty, then the target.resource.resource_type UDM field is set to STORAGE_BUCKET.

If the reponame log field value is not empty, then the target.resource.resource_type UDM field is set to REPOSITORY.
act_cnt additional.fields[act_cnt]
act_type_name metadata.product_event_type
any_incident security_result.detection_fields[any_incident]
applicationname principal.application If the applicationname log field value is not empty, then the applicationname log field is mapped to the principal.application UDM field.

Else, the appname log field is mapped to the principal.application UDM field.
attchcomponentfilenames target.file.names
attchcomponentfilesizes target.file.size If the attchcomponentfilesizes log field value is not empty, then the attchcomponentfilesizes log field is mapped to the target.file.size UDM field.
attchcomponentfiletypes additional.fields[attchcomponentfiletypes]
bucketid target.resource.product_object_id
bucketname target.resource.name If the bucketname log field value is not empty, then the bucketname log field is mapped to the target.resource.name UDM field.
bucketowner target.resource.attribute.labels[bucketowner]
channel_name additional.fields[channel_name]
collabnames additional.fields[collabnames]
collabscope additional.fields[collabscope]
company principal.user.company_name
companyid additional.fields[companyid]
component additional.fields[component]
datacenter target.location.name
datacentercity target.location.city
datacentercountry target.location.country_or_region
datetime metadata.event_timestamp If the datetime log field value is not empty, then the datetime log field is mapped to the metadata.event_timestamp UDM field.
day additional.fields[day]
dd additional.fields[dd]
department principal.user.department
dept principal.user.department
dlpdictcount security_result.detection_fields[dlpdictcount] If the dlpdictcount log field value is not empty and the dlpdictcount log field value is not equal to None, then the dlpdictcount log field is mapped to the security_result.detection_fields.dlpdictcount UDM field.
dlpdictnames security_result.detection_fields[dlpdictnames]
dlpenginenames security_result.detection_fields[dlpenginenames] If the dlpenginenames log field value is not empty and the dlpenginenames log field value is not equal to None, then the dlpenginenames log field is mapped to the security_result.detection_fields.dlpenginenames UDM field.
dlpidentifier security_result.detection_fields[dlpidentifier]
epochlastmodtime additional.fields[epochlastmodtime]
epochtime metadata.event_timestamp If the epochtime log field value is not empty, then the epochtime log field is mapped to the metadata.event_timestamp UDM field.
eventtime metadata.event_timestamp If the eventtime log field value is not empty, then the eventtime log field is mapped to the metadata.event_timestamp UDM field.
extcollabnames additional.fields[extcollabnames]
external_collabnames additional.fields[externalcollabnames]
external_recptnames network.email.to For index in external_recptnames, the index is mapped to the network.email.to UDM field.
externalownername additional.fields[externalownername]
extownername additional.fields[extownername]
extrecptnames network.email.to For index in extrecptnames, the index is mapped to the network.email.to UDM field.
file_msg_id additional.fields[file_msg_id]
file_msg_mod_time target.file.last_modification_time If the lastmodtime log field value is not empty, then the lastmodtime log field is mapped to the target.file.last_modification_time UDM field.

Else if the file_msg_mod_time log field value is not empty, then the file_msg_mod_time log field is mapped to the target.file.fullpath UDM field.
filedownloadtimems additional.fields[filedownloadtimems]
fileid additional.fields[fileid]
filemd5 target.file.md5 If the filemd5 log field value is not equal to None and the filemd5 log field value matches the regular expression pattern ^[a-fA-F0-9]{32}$, then the filemd5 log field is mapped to the target.file.md5 UDM field.

Else, if the attchcomponentmd5s log field value matches the regular expression pattern ^[a-fA-F0-9]{32}$, then the attchcomponentmd5s log field is mapped to the target.file.md5 UDM field.
filename target.file.names
filepath target.file.full_path If the filesource log field value is not empty, then the filesource log field is mapped to the target.file.full_path UDM field.

Else if the filepath log field value is not empty, then the filepath log field is mapped to the target.file.full_path UDM field.
filescantimems additional.fields[filescantimems]
filesize target.file.size If the attchcomponentfilesizes log field value is not empty, then the attchcomponentfilesizes log field is mapped to the target.file.size UDM field.

Else if the filesize log field value is not empty, then the filesize log field is mapped to the target.file.size UDM field.
filesource target.file.full_path If the filesource log field value is not empty, then the filesource log field is mapped to the target.file.full_path UDM field.
filetypecategory additional.fields[filetypecategory]
filetypename target.file.mime_type
fullurl principal.url If the fullurl log field is not empty and the fullurl log field value is not equal to Unknown URL, then the fullurl log field is mapped to the principal.url UDM field.
hh additional.fields[hh]
hostname target.hostname If the hostname log field value is not empty, then the hostname log field is mapped to the target.hostname UDM field.
intcollabnames additional.fields[intcollabnames] If intcollabnames log field value does not match the regular expression pattern None then, for index in intcollabnames, the index is mapped to the additional.fields.value.list_value UDM field.
internal_collabnames additional.fields[internal_collabnames]
internal_recptnames network.email.to For index in internal_recptnames, the index is mapped to the network.email.to UDM field.
intrecptnames network.email.to For index in intrecptnames, the index is mapped to the network.email.to UDM field.
is_admin_act principal.user.attribute.labels[is_admin_act]
is_inbound security_result.detection_fields[is_inbound]
lastmodtime target.file.last_modification_time If the lastmodtime log field value is not empty, then the lastmodtime log field is mapped to the target.file.last_modification_time UDM field.
login principal.user.email_addresses If the login log field value matches the regular expression pattern (^.*@.*$), then the login log field is mapped to the principal.user.email_addresses UDM field.
login principal.user.userid If the login log field value does not match the regular expression pattern ^.+@.+$, then the login log field is mapped to the principal.user.userid UDM field.
malware security_result.associations.name
malwareclass security_result.detection_fields[malwareclass]
messageid additional.fields[messageid]
mm additional.fields[mm]
mon additional.fields[mon]
msgid security_result.detection_fields[msgid]
msgsize additional.fields[msgsize]
mth additional.fields[mth]
num_ext_recpts additional.fields[num_ext_recpts]
num_external_collab additional.fields[num_external_collab]
num_int_recpts additional.fields[num_int_recpts]
num_internal_collab additional.fields[num_internal_collab]
numcollab additional.fields[numcollab]
oattchcomponentfilenames security_result.detection_fields[oattchcomponentfilenames]
object_name_1 target.resource.name If the object_name_1 log field value is not empty, then the object_name_1 log field is mapped to the target.resource.name UDM field.
object_name_2 about.resource.name
object_type target.resource.resource_subtype
objectname target.resource.name If the objectname log field value is not empty, then the objectname log field is mapped to the target.resource.name UDM field.
objecttype target.resource.resource_subtype If the objecttype log field value is not empty, then the objecttype log field is mapped to the target.resource.resource_subtype UDM field.
objnames1 target.resource.name If the objnames1 log field value is not empty, then the objnames1 log field is mapped to the target.resource.name UDM field.
objnames2 about.resource.name
objtypename1 target.resource.resource_subtype If the objtypename1 log field value is not empty, then the objtypename1 log field is mapped to the target.resource.resource_subtype UDM field.
objtypename2 about.resource.resource_subtype
obucketname security_result.detection_fields[obucketname]
obucketowner security_result.detection_fields[obucketowner]
ochannel_name security_result.detection_fields[ochannel_name]
ocollabnames security_result.detection_fields[ocollabnames]
odlpdictnames security_result.detection_fields[odlpdictnames]
odlpenginenames security_result.detection_fields[odlpenginenames]
oextcollabnames security_result.detection_fields[oextcollabnames]
oexternal_collabnames security_result.detection_fields[oexternal_collabnames]
oexternal_recptnames security_result.detection_fields[oexternal_recptnames]
oexternalownername security_result.detection_fields[oexternalownername]
oextownername security_result.detection_fields[oextownername]
oextrecptnames security_result.detection_fields[oextrecptnames]
ofile_msg_id security_result.detection_fields[ofile_msg_id]
ofileid security_result.detection_fields[ofileid]
ofullurl security_result.detection_fields[ofullurl]
ohostname security_result.detection_fields[ohostname]
ointcollabnames security_result.detection_fields[ointcollabnames]
ointernal_collabnames security_result.detection_fields[ointernal_collabnames]
ointernal_recptnames security_result.detection_fields[ointernal_recptnames]
ointrecptnames security_result.detection_fields[ointrecptnames]
omessageid security_result.detection_fields[omessageid]
omsgid security_result.detection_fields[omsgid]
oowner security_result.detection_fields[oowner]
orulelabel security_result.detection_fields[orulelabel]
osender security_result.detection_fields[osender]
osharedchannel_hostname security_result.detection_fields[osharedchannel_hostname]
otenant security_result.detection_fields[otenant]
ouser security_result.detection_fields[ouser]
owner principal.user.email_addresses If the owner log field value matches the regular expression pattern (^.*@.*$), then the owner log field is mapped to the principal.user.email_addresses UDM field.
policy security_result.rule_labels[policy]
projectname target.resource.attribute.labels[projectname]
recordid metadata.product_log_id
repochtime additional.fields[repochtime]
reponame target.resource.name If the reponame log field value is not empty, then the reponame log field is mapped to the target.resource.name UDM field.
rtime additional.fields[rtime]
rulelabel security_result.rule_name
ruletype security_result.rule_labels[ruletype]
sender network.email.from If the sender log field value matches the regular expression pattern (^.*@.*$), then the sender log field is mapped to the network.email.from UDM field.
sha target.file.sha256
sharedchannel_hostname target.hostname If the hostname log field value is not empty, then the hostname log field is mapped to the target.hostname UDM field.

Else if the sharedchannel_hostname log field value is not empty, then the sharedchannel_hostname log field is mapped to the target.hostname UDM field.
sourcetype security_result.detection_fields[sourcetype]
src_ip principal.ip
ss additional.fields[ss]
suburl additional.fields[suburl]
tenant additional.fields[tenant]
threatname security_result.threat_name If the threatname log field value is not empty and the dlpdictcount log field value is not equal to None, then the threatname log field is mapped to the security_result.threat_name UDM field.
time metadata.event_timestamp If the time log field value is not empty, then the time log field is mapped to the metadata.event_timestamp UDM field.
tz additional.fields[tz]
upload_doctypename additional.fields[upload_doctypename]
user principal.user.email_addresses If the user log field value matches the regular expression pattern (^.*@.*$), then the user log field is mapped to the principal.user.email_addresses UDM field.
username principal.user.email_addresses If the username log field value matches the regular expression pattern (^.*@.*$), then the username log field is mapped to the principal.user.email_addresses UDM field.
yyyy additional.fields[yyyy]

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.