BeyondTrust Secure Remote Access 로그 수집
이 문서에서는 Bindplane을 사용하여 BeyondTrust Secure Remote Access 로그를 수집하는 방법을 설명합니다. 파서는 두 가지 syslog 형식을 처리합니다. 첫 번째 형식은 구조화된 메시지 내에서 키-값 쌍을 사용하는 반면, 두 번째 형식은 파이프 구분자 필드를 사용합니다. 파서는 두 형식에서 관련 필드를 추출하여 UDM에 매핑합니다. 또한 추출된 키워드를 기반으로 이벤트 유형 분류를 실행하고 로그인/로그아웃 이벤트 및 인증 유형에 관한 특정 로직을 처리합니다.
시작하기 전에
- Google Security Operations 인스턴스가 있는지 확인합니다.
- Windows 2016 이상 또는
systemd
를 사용하는 Linux 호스트를 사용하고 있는지 확인합니다. - 프록시 뒤에서 실행하는 경우 방화벽 포트가 열려 있는지 확인합니다.
- BeyondTrust Secure Remote Access에 대한 액세스 권한이 있는지 확인합니다.
Google SecOps 처리 인증 파일 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 수집 에이전트로 이동합니다.
- 처리 인증 파일을 다운로드합니다. Bindplane가 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 프로필로 이동합니다.
- 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
Bindplane 에이전트 설치
Windows 설치
- 관리자 권한으로 명령 프롬프트 또는 PowerShell을 엽니다.
다음 명령어를 실행합니다.
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
추가 설치 리소스
- 추가 설치 옵션은 이 설치 가이드를 참고하세요.
Syslog를 수집하고 Google SecOps로 전송하도록 Bindplane 에이전트 구성
구성 파일에 액세스합니다.
config.yaml
파일을 찾습니다. 일반적으로 Linux의/etc/bindplane-agent/
디렉터리 또는 Windows의 설치 디렉터리에 있습니다.- 텍스트 편집기 (예:
nano
,vi
, 메모장)를 사용하여 파일을 엽니다.
다음과 같이
config.yaml
파일을 수정합니다.receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: BEYONDTRUST_REMOTE_ACCESS raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
인프라에서 필요에 따라 포트와 IP 주소를 바꿉니다.
<customer_id>
를 실제 고객 ID로 바꿉니다./path/to/ingestion-authentication-file.json
를 Google SecOps 처리 인증 파일 가져오기 섹션에서 인증 파일이 저장된 경로로 업데이트합니다.
Bindplane 에이전트를 다시 시작하여 변경사항 적용
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart bindplane-agent
Windows에서 Bindplane 에이전트를 다시 시작하려면 서비스 콘솔을 사용하거나 다음 명령어를 입력하면 됩니다.
net stop BindPlaneAgent && net start BindPlaneAgent
BeyondTrust 원격 지원 구성
- BeyondTrust 웹 UI에 로그인합니다.
- 기기 > 보안 > 기기 관리를 선택합니다.
- Syslog 섹션에서 다음을 수행합니다.
- 메시지 형식: 기존 BSD 형식을 선택합니다.
- 원격 syslog 서버: Bindplane IP 주소 및 포트를 입력합니다.
- 제출을 클릭합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
datetime |
metadata.event_timestamp |
when 필드가 없는 경우 RFC3 339 형식을 사용하여 datetime 필드에서 타임스탬프가 파싱됩니다. |
deviceHost |
target.hostname |
deviceHost 값은 target.hostname 에 직접 매핑됩니다. |
dstHost |
target.ip |
dstHost 값은 유효한 IP 주소로 확인된 후 target.ip 에 직접 매핑됩니다. |
dstPriv |
additional.fields.[key=dstPriv].value.string_value |
dstPriv 값은 dstPriv 키와 함께 additional 필드에 배치됩니다. |
dstUid |
target.user.userid |
dstUid 값은 target.user.userid 에 직접 매핑됩니다. |
dstUser |
target.user.user_display_name |
dstUser 값은 target.user.user_display_name 에 직접 매핑됩니다. |
eventName |
metadata.event_type |
eventName 이 login 이면 (대소문자 구분 안 함) metadata.event_type 가 USER_LOGIN 로 설정됩니다. eventName 이 logout 이면 (대소문자 구분 안 함) metadata.event_type 가 USER_LOGOUT 로 설정됩니다. 그 외의 경우 eventName 이 비어 있지 않으면 metadata.event_type 이 USER_UNCATEGORIZED 로 설정됩니다. eventName 가 비어 있고 메시지가 두 번째 grok 패턴과 일치하면 metadata.event_type 가 GENERIC_EVENT 로 설정됩니다. eventName 가 비어 있고 메시지가 첫 번째 grok 패턴과 일치하면 metadata.event_type 이 GENERIC_EVENT 로 설정됩니다. srcUid , userid 또는 who 가 비어 있지 않으면 metadata.event_type 이 USER_CHANGE_PERMISSIONS 로 설정됩니다. deviceHost 또는 site 가 비어 있지 않으면 metadata.event_type 이 USER_UNCATEGORIZED 로 설정됩니다. 그 외의 경우에는 metadata.event_type 이 GENERIC_EVENT 로 설정됩니다. |
event_name |
additional.fields.[key=event_name].value.string_value |
event_name 값은 event_name 키와 함께 additional 필드에 배치됩니다. |
event_name |
metadata.product_event_type |
event_name 값은 id 필드와 함께 사용하여 metadata.product_event_type 를 [ id] - event_name`` 형식으로 채웁니다. |
externalKeyLabel |
additional.fields.[key=externalKeyLabel].value.string_value |
externalKeyLabel 값은 externalKeyLabel 키와 함께 additional 필드에 배치됩니다. |
id |
metadata.product_event_type |
id 값은 event_name 필드와 함께 사용하여 metadata.product_event_type 를 [ id] - event_name`` 형식으로 채웁니다. |
jumpGroupId |
additional.fields.[key=jumpGroupId].value.string_value |
jumpGroupId 값은 jumpGroupId 키와 함께 additional 필드에 배치됩니다. |
jumpGroupName |
additional.fields.[key=jumpGroupName].value.string_value |
jumpGroupName 값은 jumpGroupName 키와 함께 additional 필드에 배치됩니다. |
jumpGroupType |
additional.fields.[key=jumpGroupType].value.string_value |
jumpGroupType 값은 jumpGroupType 키와 함께 additional 필드에 배치됩니다. |
jumpointId |
additional.fields.[key=jumpointId].value.string_value |
jumpointId 값은 jumpointId 키와 함께 additional 필드에 배치됩니다. |
jumpointName |
additional.fields.[key=jumpointName].value.string_value |
jumpointName 값은 jumpointName 키와 함께 additional 필드에 배치됩니다. |
kv_data |
다양한 UDM 필드 | kv_data 필드는 키-값 쌍으로 파싱된 후 키를 기반으로 다양한 UDM 필드 (예: eventName , when , who , who_ip , site , target , status , reason ). |
kvdata |
다양한 UDM 필드 | kvdata 필드는 키-값 쌍으로 파싱된 후 키를 기반으로 다양한 UDM 필드 (예: msg , srcUser , srcUid , srcHost , dstUser , dstUid , dstHost , sessionId , jumpointId , jumpointName , jumpGroupId , jumpGroupName , jumpGroupType , externalKeyLabel , dstPriv ). |
message |
다양한 UDM 필드 | message 필드는 grok 패턴을 사용하여 파싱되어 다양한 필드를 추출한 후 UDM 필드에 매핑됩니다. |
msg |
metadata.description |
msg 값은 metadata.description 에 직접 매핑됩니다. |
product_event_type |
metadata.product_event_type |
product_event_type 값은 metadata.product_event_type 에 직접 매핑됩니다. |
product_log_id |
metadata.product_log_id |
product_log_id 값은 metadata.product_log_id 에 직접 매핑됩니다. |
process_id |
principal.process.pid |
process_id 값은 principal.process.pid 에 직접 매핑됩니다. |
reason |
security_result.description |
reason 값은 security_result.description 에 직접 매핑됩니다. |
segment_number |
additional.fields.[key=segment_number].value.string_value |
segment_number 값은 segment_number 키와 함께 additional 필드에 배치됩니다. |
sessionId |
network.session_id |
sessionId 값은 network.session_id 에 직접 매핑됩니다. |
site |
target.hostname |
site 값은 target.hostname 에 직접 매핑됩니다. |
site_id |
additional.fields.[key=site_id].value.string_value |
site_id 값은 site_id 키와 함께 additional 필드에 배치됩니다. |
srcHost |
principal.ip |
srcHost 값은 유효한 IP 주소로 확인된 후 principal.ip 에 직접 매핑됩니다. |
srcUid |
principal.user.userid |
srcUid 값은 principal.user.userid 에 직접 매핑됩니다. |
srcUser |
principal.user.user_display_name |
srcUser 값은 principal.user.user_display_name 에 직접 매핑됩니다. |
status |
security_result.action |
status 이 failure 이면 (대소문자 구분 안 함) security_result.action 가 BLOCK 로 설정됩니다. 그 외의 경우에는 security_result.action 이 ALLOW 로 설정됩니다. |
status |
security_result.action_details |
status 값은 security_result.action_details 에 직접 매핑됩니다. |
target |
target.application |
target 값은 target.application 에 직접 매핑됩니다. rep_client 가 Representative Console 로 대체되고 web/login 가 Web/Login 로 대체됩니다. |
target |
extensions.auth.type |
target 이 rep_client 이면 extensions.auth.type 가 MACHINE 로 설정됩니다. target 이 web/login 이면 extensions.auth.type 가 SSO 로 설정됩니다. 그 외의 경우에는 extensions.auth.type 이 AUTHTYPE_UNSPECIFIED 로 설정됩니다. |
timestamp |
metadata.event_timestamp |
datetime 도 when 도 없는 경우 원시 로그의 timestamp 가 대체로 사용됩니다. |
total_segments |
additional.fields.[key=total_segments].value.string_value |
total_segments 값은 total_segments 키와 함께 additional 필드에 배치됩니다. |
device_product |
additional.fields.[key=device_product].value.string_value |
device_product 값은 device_product 키와 함께 additional 필드에 배치됩니다. |
device_vendor |
additional.fields.[key=device_vendor].value.string_value |
device_vendor 값은 device_vendor 키와 함께 additional 필드에 배치됩니다. |
device_version |
metadata.product_version |
device_version 값은 metadata.product_version 에 직접 매핑됩니다. |
when |
metadata.event_timestamp |
타임스탬프는 있는 경우 UNIX 형식을 사용하여 when 필드에서 파싱됩니다. |
who |
principal.user.userid |
who 필드가 정규식 패턴과 일치하면 추출된 userid 가 principal.user.userid 에 매핑됩니다. 그렇지 않으면 전체 who 필드가 principal.user.userid 에 매핑됩니다. |
who |
principal.user.user_display_name |
who 필드가 정규식 패턴과 일치하면 추출된 user_display_name 가 principal.user.user_display_name 에 매핑됩니다. |
who_ip |
principal.ip |
who_ip 값은 principal.ip 에 직접 매핑됩니다. |
(파서 로직) | metadata.log_type |
로그 유형이 BEYONDTRUST_REMOTE_ACCESS 로 설정됩니다. |
(파서 로직) | metadata.product_name |
제품 이름이 BeyondTrust Secure Remote Access 로 설정됩니다. |
(파서 로직) | metadata.vendor_name |
공급업체 이름이 BeyondTrust 로 설정됩니다. |
(파서 로직) | security_result.summary |
값은 User %{eventName} 형식을 사용하여 파생됩니다. |
(파서 로직) | extensions.auth.mechanism |
method 에 using password 가 포함된 경우 메커니즘은 USERNAME_PASSWORD 로 설정됩니다. method 에 using elevate 가 포함된 경우 메커니즘은 REMOTE 로 설정됩니다. |
변경사항
2022-09-30
개선사항:
- 파싱되지 않은 syslog를 파싱하는 Grok를 작성했습니다.
device_vendor
를additional.fields
에 매핑했습니다.event_name
를additional.fields
에 매핑했습니다.device_product
를additional.fields
에 매핑했습니다.externalKeyLabel
를additional.fields
에 매핑했습니다.dstPriv
를additional.fields
에 매핑했습니다.filePath
를target.file.full_path
에 매핑했습니다.fsize
를target.file.size
에 매핑했습니다.
2022-07-14
- 파서를 새로 만들었습니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.