Cisco Secure ACS 로그 수집
이 문서에서는 Bindplane을 사용하여 Cisco Secure ACS 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
파서는 Cisco Secure ACS syslog 및 키-값 형식 로그에서 필드를 추출합니다. grok 또는 kv를 사용하여 로그 메시지를 파싱한 다음 이러한 값을 통합 데이터 모델 (UDM)에 매핑합니다. 또한 이벤트 소스 및 유형의 기본 메타데이터 값을 설정합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Windows Server 2016 이상 또는
systemd가 설치된 Linux 호스트 - 프록시 뒤에서 실행하는 경우 Bindplane 에이전트 요구사항에 따라 방화벽 포트가 열려 있는지 확인합니다.
- Cisco Secure ACS 웹 인터페이스에 대한 권한 있는 액세스
Google SecOps 수집 인증 파일 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 수집 에이전트로 이동합니다.
- 수집 인증 파일을 다운로드합니다. Bindplane이 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 프로필로 이동합니다.
- 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
Bindplane 에이전트 설치
다음 안내에 따라 Windows 또는 Linux 운영체제에 Bindplane 에이전트를 설치합니다.
Windows 설치
- 명령 프롬프트 또는 PowerShell을 관리자로 엽니다.
다음 명령어를 실행합니다.
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet설치가 완료될 때까지 기다립니다.
다음을 실행하여 설치를 확인합니다.
sc query observiq-otel-collector
서비스가 실행 중으로 표시되어야 합니다.
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh설치가 완료될 때까지 기다립니다.
다음을 실행하여 설치를 확인합니다.
sudo systemctl status observiq-otel-collector
서비스가 active (running)으로 표시되어야 합니다.
추가 설치 리소스
추가 설치 옵션 및 문제 해결은 Bindplane 에이전트 설치 가이드를 참고하세요.
syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성
구성 파일 찾기
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
구성 파일 설정
config.yaml의 전체 내용을 다음 구성으로 바꿉니다.receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'CISCO_ACS' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
구성 매개변수
다음 자리표시자를 바꿉니다.
수신기 구성:
udplog: UDP syslog의 경우udplog, TCP syslog의 경우tcplog사용0.0.0.0: 리슨할 IP 주소 (모든 인터페이스에서 리슨하려면0.0.0.0)514: 리슨할 포트 번호 (표준 syslog 포트)
내보내기 도구 구성:
creds_file_path: 수집 인증 파일의 전체 경로입니다.- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
YOUR_CUSTOMER_ID: 고객 ID 가져오기 섹션의 고객 IDendpoint: 리전 엔드포인트 URL:- 미국:
malachiteingestion-pa.googleapis.com - 유럽:
europe-malachiteingestion-pa.googleapis.com - 아시아:
asia-southeast1-malachiteingestion-pa.googleapis.com - 전체 목록은 리전 엔드포인트를 참고하세요.
- 미국:
log_type: Chronicle에 표시되는 로그 유형 (CISCO_ACS)
구성 파일 저장
- 수정 후 파일을 저장합니다.
- Linux:
Ctrl+O,Enter,Ctrl+X순서로 누릅니다. - Windows: 파일 > 저장을 클릭합니다.
- Linux:
Bindplane 에이전트를 다시 시작하여 변경사항 적용
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart observiq-otel-collector서비스가 실행 중인지 확인합니다.
sudo systemctl status observiq-otel-collector로그에서 오류를 확인합니다.
sudo journalctl -u observiq-otel-collector -f
Windows에서 Bindplane 에이전트를 다시 시작하려면 다음 옵션 중 하나를 선택합니다.
명령 프롬프트 또는 PowerShell(관리자 권한)
net stop observiq-otel-collector && net start observiq-otel-collector서비스 콘솔:
Win+R를 누르고services.msc를 입력한 다음 Enter 키를 누릅니다.- observIQ OpenTelemetry Collector를 찾습니다.
마우스 오른쪽 버튼을 클릭하고 다시 시작을 선택합니다.
서비스가 실행 중인지 확인합니다.
sc query observiq-otel-collector로그에서 오류를 확인합니다.
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Cisco Secure ACS에서 Syslog 전달 구성
- Cisco Secure ACS 웹 인터페이스에 로그인합니다.
- 시스템 관리 > 구성 > 로그 구성 > 원격 로그 타겟으로 이동합니다.
- 만들기를 클릭하여 새 원격 로그 타겟을 추가합니다.
- 다음 구성 세부정보를 제공합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
Google-SecOps-Bindplane). - 설명: 설명을 입력합니다 (선택사항).
- IP 주소: Bindplane 에이전트 호스트의 IP 주소를 입력합니다.
- 포트:
514를 입력합니다. - 시설 코드: LOCAL6 (또는 원하는 시설)을 선택합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
- 제출을 클릭합니다.
- 시스템 관리 > 구성 > 로그 구성 > 로깅 카테고리로 이동합니다.
- 전달할 로그 카테고리를 선택합니다.
- AAA 감사
- AAA 진단
- 관리 및 운영 감사
- 시스템 진단
- 선택한 각 카테고리에 대해 카테고리 이름을 클릭합니다.
- 원격 로그 타겟 탭으로 이동합니다.
- 생성된 원격 로그 타겟 (예:
Google-SecOps-Bindplane)을 사용 가능에서 선택됨으로 이동합니다. - 저장을 클릭합니다.
- Bindplane 에이전트 로그를 확인하여 syslog 메시지가 전송되고 있는지 확인합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| Acct-Authentic | additional.fields[].value.string_value | 값은 Acct-Authentic 필드에서 가져옵니다. |
| Acct-Delay-Time | additional.fields[].value.string_value | 값은 Acct-Delay-Time 필드에서 가져옵니다. |
| Acct-Input-Octets | additional.fields[].value.string_value | 값은 Acct-Input-Octets 필드에서 가져옵니다. |
| Acct-Input-Packets | additional.fields[].value.string_value | 값은 Acct-Input-Packets 필드에서 가져옵니다. |
| Acct-Output-Octets | additional.fields[].value.string_value | 값은 Acct-Output-Octets 필드에서 가져옵니다. |
| Acct-Output-Packets | additional.fields[].value.string_value | 값은 Acct-Output-Packets 필드에서 가져옵니다. |
| Acct-Session-Id | additional.fields[].value.string_value | 값은 Acct-Session-Id 필드에서 가져옵니다. |
| Acct-Session-Time | additional.fields[].value.string_value | 값은 Acct-Session-Time 필드에서 가져옵니다. |
| Acct-Status-Type | additional.fields[].value.string_value | 값은 Acct-Status-Type 필드에서 가져옵니다. |
| Acct-Terminate-Cause | additional.fields[].value.string_value | 값은 Acct-Terminate-Cause 필드에서 가져옵니다. |
| ACSVersion | additional.fields[].value.string_value | 값은 ACSVersion 필드에서 가져옵니다. |
| AD 도메인 | principal.group.group_display_name | 값은 AD-Domain 필드에서 가져옵니다. |
| AD-IP-Address | principal.ip | 값은 AD-IP-Address 필드에서 가져옵니다. |
| Called-Station-ID | additional.fields[].value.string_value | 값은 Called-Station-ID 필드에서 가져옵니다. |
| Calling-Station-ID | additional.fields[].value.string_value | 값은 Calling-Station-ID 필드에서 가져옵니다. |
| 클래스 | additional.fields[].value.string_value | 값은 클래스 필드에서 가져옵니다. |
| CmdSet | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| ConfigVersionId | additional.fields[].value.number_value | 값은 ConfigVersionId 필드에서 가져와 float로 변환됩니다. |
| DestinationIPAddress | target.ip, intermediary.ip | 값은 DestinationIPAddress 필드에서 가져옵니다. intermediary.ip는 기기 IP 주소에서 파생됩니다. |
| DestinationPort | target.port | 값은 DestinationPort 필드에서 가져와 정수로 변환됩니다. |
| 기기 IP 주소 | intermediary.ip | 값은 기기 IP 주소 필드에서 가져옵니다. |
| 기기 포트 | intermediary.port | 값은 기기 포트 필드에서 가져와 정수로 변환됩니다. |
| DetailedInfo | security_result.summary, security_result.description, security_result.action | DetailedInfo가 'Authentication succeed'인 경우 security_result.summary는 'successful login occurred'이고 security_result.action은 ALLOW입니다. DetailedInfo에 'Invalid username or password specified'가 포함된 경우 security_result.summary는 'failed login occurred'이고 security_result.action은 BLOCK입니다. security_result.description은 log_header에서 파생됩니다. |
| Framed-IP-Address | principal.ip | 값은 Framed-IP-Address 필드에서 가져옵니다. |
| Framed-Protocol | additional.fields[].value.string_value | 값은 Framed-Protocol 필드에서 가져옵니다. |
| NAS-IP-Address | target.ip | 값은 NAS-IP-Address 필드에서 가져옵니다. |
| NAS-Port | additional.fields[].value.string_value | 값은 NAS-Port 필드에서 가져옵니다. |
| NAS-Port-Id | target.port | 값은 NAS-Port-Id 필드에서 가져와 정수로 변환됩니다. |
| NAS-Port-Type | additional.fields[].value.string_value | 값은 NAS-Port-Type 필드에서 가져옵니다. |
| NetworkDeviceName | target.hostname | 값은 NetworkDeviceName 필드에서 가져옵니다. |
| 프로토콜 | additional.fields[].value.string_value | 값은 프로토콜 필드에서 가져옵니다. |
| RadiusPacketType | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| Remote-Address | principal.ip, target.ip | 값은 Remote-Address 필드에서 가져와 IP 주소로 파싱됩니다. 인증 이벤트의 경우 principal.ip에 매핑되고, 계정 및 진단 이벤트의 경우 target.ip에 매핑됩니다. |
| RequestLatency | additional.fields[].value.string_value | 값은 RequestLatency 필드에서 가져옵니다. |
| 응답 | principal.user.userid | 응답에 'User-Name'이 포함된 경우 사용자 이름이 추출되어 principal.user.userid에 매핑됩니다. |
| SelectedAccessService | additional.fields[].value.string_value | 값은 SelectedAccessService 필드에서 가져옵니다. |
| SelectedAuthenticationIdentityStores | security_result.detection_fields[].value | 값은 SelectedAuthenticationIdentityStores 필드에서 가져옵니다. |
| SelectedAuthorizationProfiles | security_result.detection_fields[].value | 값은 SelectedAuthorizationProfiles 필드에서 가져옵니다. |
| Service-Type | additional.fields[].value.string_value | 값은 서비스 유형 필드에서 가져옵니다. |
| Tunnel-Client-Endpoint | additional.fields[].value.string_value | 값은 Tunnel-Client-Endpoint 필드에서 가져오며 IP 주소로 파싱됩니다. |
| 사용자 | target.user.userid | 값은 사용자 필드에서 가져옵니다. |
| 사용자 이름 | target.user.userid, principal.mac | UserName이 MAC 주소인 경우 파싱되어 principal.mac에 매핑됩니다. 그렇지 않으면 target.user.userid에 매핑됩니다. |
| ac-user-agent | network.http.user_agent | 값은 ac-user-agent 필드에서 가져옵니다. |
| 고양이 | metadata.description | 값은 cat 필드에서 가져옵니다. |
| device-mac | principal.mac | 값이 device-mac 필드에서 가져오고 콜론이 추가되며 값이 소문자로 변환됩니다. device-mac이 '00'이면 '00:00:00:00:00:00'으로 대체됩니다. |
| device-platform | principal.asset.platform_software.platform | device-platform이 'win'이면 'WINDOWS' 값이 principal.asset.platform_software.platform에 할당됩니다. |
| device-platform-version | principal.asset.platform_software.platform_version | 값은 device-platform-version 필드에서 가져옵니다. |
| device-public-mac | principal.mac | 값은 device-public-mac 필드에서 가져오고, 하이픈은 콜론으로 대체되며, 값은 소문자로 변환됩니다. |
| device-type | principal.asset.hardware.model | 값은 device-type 필드에서 가져옵니다. |
| device-uid | principal.asset.asset_id | 값은 device-uid 필드에서 가져오고 'ASSET ID: '가 앞에 추가됩니다. |
| device-uid-global | principal.asset.product_object_id | 값은 device-uid-global 필드에서 가져옵니다. |
| 호스트 이름 | principal.hostname | 값은 호스트 이름 필드에서 가져옵니다. |
| ip:source-ip | principal.ip | 값은 ip:source-ip 필드에서 가져옵니다. |
| kv.ADDomain | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.Airespace-Wlan-Id | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.AuthenticationIdentityStore | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.AVPair | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.CVPN3000/ASA/PIX7.x-DAP-Tunnel-Group-Name | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.CVPN3000/ASA/PIX7.x-Group-Based-Address-Pools | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.ExternalGroups | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.FailureReason | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.IdentityAccessRestricted | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.IdentityGroup | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.NAS-Identifier | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.SelectedShellProfile | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.ServiceSelectionMatchedRule | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.State | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.Step | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.Tunnel-Medium-Type | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.Tunnel-Private-Group-ID | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.Tunnel-Type | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.UseCase | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.UserIdentityGroup | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.VendorSpecific | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.attribute-131 | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.attribute-89 | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.cisco-av-pair | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| kv.cisco-av-pair:CiscoSecure-Group-Id | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| leef_version | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| log_header | metadata.description | 값은 log_header 필드에서 가져옵니다. |
| log_id | metadata.product_log_id | 값은 log_id 필드에서 가져옵니다. |
| log_type | metadata.product_event_type | 값은 log_type 필드에서 가져옵니다. |
| message_severity | (매핑되지 않음) | IDM 객체에 매핑되지 않았습니다. |
| 제품 | metadata.product_name | 값은 제품 필드에서 가져옵니다. |
| product_version | metadata.product_version | 값은 product_version 필드에서 가져옵니다. |
| server_host | target.hostname | 값은 server_host 필드에서 가져옵니다. |
| 타임스탬프 | metadata.event_timestamp | 값은 타임스탬프 필드와 시간대 필드에서 가져옵니다 (콜론 삭제 후). 결합된 값은 타임스탬프로 파싱됩니다. |
| url | network.dns.questions[].name | 값은 URL 필드에서 가져옵니다. |
| vendor | metadata.vendor_name | 값은 공급업체 필드에서 가져옵니다. 처음에는 'GENERIC_EVENT'로 설정되지만 log_type 및 파싱된 필드에 따라 덮어쓸 수 있습니다. 'USER_LOGIN', 'USER_UNCATEGORIZED', 'NETWORK_DNS', 'NETWORK_CONNECTION', 'STATUS_UPDATE' 또는 'STATUS_UNCATEGORIZED'일 수 있습니다. 처음에는 'Cisco'로 설정되며, 공급업체 필드에 의해 덮어쓰일 수 있습니다. 처음에는 'ACS'로 설정되며 제품 필드에 의해 덮어쓰일 수 있습니다. 'CISCO_ACS'로 설정합니다. 'USERNAME_PASSWORD'로 설정합니다. 'TACACS'로 설정합니다. RADIUS 계정 및 진단 이벤트의 경우 'UDP'로 설정합니다. DNS 이벤트의 경우 'DNS'로 설정됩니다. 로그인 성공 여부에 따라 설정되는 security_action 필드에서 파생됩니다. 로그인 성공 시 'successful login occurred', 로그인 실패 시 'failed login occurred'로 설정됩니다. 특정 ID 저장소 진단 이벤트의 경우 'passed'로 설정될 수도 있습니다. 로그인 시도에 실패한 경우 'LOW'로 설정합니다. device-uid 필드에 'ASSET ID: '를 추가하여 구성됩니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.