Mengumpulkan log Cisco AMP for Endpoints
Dokumen ini menjelaskan cara menyerap log Cisco AMP for Endpoints ke Google Security Operations menggunakan Amazon S3. Parser mengubah log berformat JSON mentah menjadi format terstruktur yang sesuai dengan UDM Chronicle. Fitur ini mengekstrak kolom dari objek JSON bertingkat, memetakannya ke skema UDM, mengidentifikasi kategori peristiwa, menetapkan tingkat keparahan, dan pada akhirnya menghasilkan output peristiwa terpadu, yang menandai peringatan keamanan saat kondisi tertentu terpenuhi.
Sebelum memulai
- Instance Google SecOps
- Akses istimewa ke konsol Cisco AMP for Endpoints
- Akses istimewa ke AWS (S3, IAM, Lambda, EventBridge)
Kumpulkan prasyarat Cisco AMP for Endpoints (ID, kunci API, ID org, token)
- Login ke konsol Cisco AMP for Endpoints.
- Buka Accounts > API Credentials.
- Klik New API Credential untuk membuat kunci API dan ID klien baru.
- Berikan detail konfigurasi berikut:
- Nama Aplikasi: Masukkan nama (misalnya,
Chronicle SecOps Integration). - Cakupan: Pilih Hanya baca untuk polling peristiwa dasar, atau Baca & Tulis jika Anda berencana membuat Aliran Peristiwa.
- Nama Aplikasi: Masukkan nama (misalnya,
- Klik Buat.
- Salin dan simpan detail berikut di lokasi yang aman:
- ID Klien API Pihak Ketiga
- Kunci API
- URL Dasar API: Bergantung pada wilayah Anda:
- Amerika Serikat:
https://api.amp.cisco.com - Uni Eropa:
https://api.eu.amp.cisco.com - APJC:
https://api.apjc.amp.cisco.com
- Amerika Serikat:
Mengonfigurasi bucket AWS S3 dan IAM untuk Google SecOps
- Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket
- Simpan Name dan Region bucket untuk referensi di masa mendatang (misalnya,
cisco-amp-logs). - Buat Pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
- Pilih Pengguna yang dibuat.
- Pilih tab Kredensial keamanan.
- Klik Create Access Key di bagian Access Keys.
- Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
- Klik Berikutnya.
- Opsional: Tambahkan tag deskripsi.
- Klik Create access key.
- Klik Download CSV file untuk menyimpan Access Key dan Secret Access Key untuk referensi di masa mendatang.
- Klik Selesai.
- Pilih tab Permissions.
- Klik Tambahkan izin di bagian Kebijakan izin.
- Pilih Tambahkan izin.
- Pilih Lampirkan kebijakan secara langsung.
- Cari kebijakan AmazonS3FullAccess.
- Pilih kebijakan.
- Klik Berikutnya.
- Klik Add permissions.
Mengonfigurasi kebijakan dan peran IAM untuk upload S3
- Di konsol AWS, buka IAM > Policies.
- Klik Buat kebijakan > tab JSON.
Masukkan kebijakan berikut:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::cisco-amp-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::cisco-amp-logs/cisco-amp-events/state.json" } ] }- Ganti
cisco-amp-logsjika Anda memasukkan nama bucket yang berbeda.
- Ganti
Klik Berikutnya > Buat kebijakan.
Buka IAM > Roles > Create role > AWS service > Lambda.
Lampirkan kebijakan yang baru dibuat.
Beri nama peran
cisco-amp-lambda-role, lalu klik Buat peran.
Buat fungsi Lambda
- Di Konsol AWS, buka Lambda > Functions > Create function.
- Klik Buat dari awal.
Berikan detail konfigurasi berikut:
Setelan Nilai Nama cisco-amp-events-collectorRuntime Python 3.13 Arsitektur x86_64 Peran eksekusi cisco-amp-lambda-roleSetelah fungsi dibuat, buka tab Code, hapus stub, dan masukkan kode berikut (
cisco-amp-events-collector.py):import json import boto3 import urllib3 import base64 from datetime import datetime, timedelta import os import logging # Configure logging logger = logging.getLogger() logger.setLevel(logging.INFO) # AWS S3 client and HTTP pool manager s3_client = boto3.client('s3') http = urllib3.PoolManager() def lambda_handler(event, context): """ AWS Lambda handler to fetch Cisco AMP events and store them in S3 """ try: # Get environment variables s3_bucket = os.environ['S3_BUCKET'] s3_prefix = os.environ['S3_PREFIX'] state_key = os.environ['STATE_KEY'] api_client_id = os.environ['AMP_CLIENT_ID'] api_key = os.environ['AMP_API_KEY'] api_base = os.environ['API_BASE'] # Optional parameters page_size = int(os.environ.get('PAGE_SIZE', '500')) max_pages = int(os.environ.get('MAX_PAGES', '10')) logger.info(f"Starting Cisco AMP events collection for bucket: {s3_bucket}") # Get last run timestamp from state file last_timestamp = get_last_timestamp(s3_bucket, state_key) if not last_timestamp: last_timestamp = (datetime.utcnow() - timedelta(days=1)).isoformat() + 'Z' # Create Basic Auth header auth_header = base64.b64encode(f"{api_client_id}:{api_key}".encode()).decode() headers = { 'Authorization': f'Basic {auth_header}', 'Accept': 'application/json' } # Build initial API URL base_url = f"{api_base}/v1/events" next_url = f"{base_url}?limit={page_size}&start_date={last_timestamp}" all_events = [] page_count = 0 while next_url and page_count < max_pages: logger.info(f"Fetching page {page_count + 1} from: {next_url}") # Make API request using urllib3 response = http.request('GET', next_url, headers=headers, timeout=60) if response.status != 200: raise RuntimeError(f"API request failed: {response.status} {response.data[:256]!r}") data = json.loads(response.data.decode('utf-8')) # Extract events from response events = data.get('data', []) if events: all_events.extend(events) logger.info(f"Collected {len(events)} events from page {page_count + 1}") # Check for next page next_url = data.get('metadata', {}).get('links', {}).get('next') page_count += 1 else: logger.info("No events found on current page") break logger.info(f"Total events collected: {len(all_events)}") # Store events in S3 if any were collected if all_events: timestamp_str = datetime.utcnow().strftime('%Y%m%d_%H%M%S') s3_key = f"{s3_prefix}cisco_amp_events_{timestamp_str}.ndjson" # Convert events to NDJSON format (one JSON object per line) ndjson_content = 'n'.join(json.dumps(event) for event in all_events) # Upload to S3 s3_client.put_object( Bucket=s3_bucket, Key=s3_key, Body=ndjson_content.encode('utf-8'), ContentType='application/x-ndjson' ) logger.info(f"Uploaded {len(all_events)} events to s3://{s3_bucket}/{s3_key}") # Update state file with current timestamp current_timestamp = datetime.utcnow().isoformat() + 'Z' update_state(s3_bucket, state_key, current_timestamp) return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Success', 'events_collected': len(all_events), 'pages_processed': page_count }) } except Exception as e: logger.error(f"Error in lambda_handler: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({ 'error': str(e) }) } def get_last_timestamp(bucket, state_key): """ Get the last run timestamp from S3 state file """ try: response = s3_client.get_object(Bucket=bucket, Key=state_key) state_data = json.loads(response['Body'].read().decode('utf-8')) return state_data.get('last_timestamp') except s3_client.exceptions.NoSuchKey: logger.info("No state file found, starting from 24 hours ago") return None except Exception as e: logger.warning(f"Error reading state file: {str(e)}") return None def update_state(bucket, state_key, timestamp): """ Update the state file with the current timestamp """ try: state_data = { 'last_timestamp': timestamp, 'updated_at': datetime.utcnow().isoformat() + 'Z' } s3_client.put_object( Bucket=bucket, Key=state_key, Body=json.dumps(state_data).encode('utf-8'), ContentType='application/json' ) logger.info(f"Updated state file with timestamp: {timestamp}") except Exception as e: logger.error(f"Error updating state file: {str(e)}")Buka Configuration > Environment variables.
Klik Edit > Tambahkan variabel lingkungan baru.
Masukkan variabel lingkungan berikut yang disediakan, lalu ganti dengan nilai Anda.
Kunci Nilai contoh S3_BUCKETcisco-amp-logsS3_PREFIXcisco-amp-events/STATE_KEYcisco-amp-events/state.jsonAMP_CLIENT_ID<your-client-id>AMP_API_KEY<your-api-key>API_BASEhttps://api.amp.cisco.com(atau URL wilayah Anda)PAGE_SIZE500MAX_PAGES10Setelah fungsi dibuat, tetap buka halamannya (atau buka Lambda > Functions > cisco-amp-events-collector).
Pilih tab Configuration
Di panel General configuration, klik Edit.
Ubah Waktu Tunggu menjadi 5 menit (300 detik), lalu klik Simpan.
Membuat jadwal EventBridge
- Buka Amazon EventBridge > Scheduler > Create schedule.
- Berikan detail konfigurasi berikut:
- Jadwal berulang: Tarif (
1 hour). - Target: fungsi Lambda Anda
cisco-amp-events-collector. - Name:
cisco-amp-events-collector-1h.
- Jadwal berulang: Tarif (
- Klik Buat jadwal.
Opsional: Buat pengguna & kunci IAM hanya baca untuk Google SecOps
- Buka Konsol AWS > IAM > Pengguna > Tambahkan pengguna.
- Klik Add users.
- Berikan detail konfigurasi berikut:
- Pengguna: Masukkan
secops-reader. - Jenis akses: Pilih Kunci akses – Akses terprogram.
- Pengguna: Masukkan
- Klik Buat pengguna.
- Lampirkan kebijakan baca minimal (kustom): Pengguna > secops-reader > Izin > Tambahkan izin > Lampirkan kebijakan secara langsung > Buat kebijakan.
Di editor JSON, masukkan kebijakan berikut:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::cisco-amp-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::cisco-amp-logs" } ] }Tetapkan nama ke
secops-reader-policy.Buka Buat kebijakan > cari/pilih > Berikutnya > Tambahkan izin.
Buka Kredensial keamanan > Kunci akses > Buat kunci akses.
Download CSV (nilai ini dimasukkan ke dalam feed).
Mengonfigurasi feed di Google SecOps untuk memproses log Cisco AMP for Endpoints
- Buka Setelan SIEM > Feed.
- Klik + Tambahkan Feed Baru.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Cisco AMP for Endpoints logs). - Pilih Amazon S3 V2 sebagai Jenis sumber.
- Pilih Cisco AMP sebagai Jenis log.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- URI S3:
s3://cisco-amp-logs/cisco-amp-events/ - Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda.
- Usia File Maksimum: Menyertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
- ID Kunci Akses: Kunci akses pengguna dengan akses ke bucket S3.
- Kunci Akses Rahasia: Kunci rahasia pengguna dengan akses ke bucket S3.
- Namespace aset: Namespace aset.
- Label penyerapan: Label yang diterapkan ke peristiwa dari feed ini.
- URI S3:
- Klik Berikutnya.
- Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Tabel Pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
| aktif | read_only_udm.principal.asset.active | Dipetakan langsung dari computer.active |
| connector_guid | read_only_udm.principal.asset.uuid | Dipetakan langsung dari computer.connector_guid |
| tanggal | read_only_udm.metadata.event_timestamp.seconds | Dipetakan langsung dari date setelah dikonversi ke stempel waktu |
| deteksi | read_only_udm.security_result.threat_name | Dipetakan langsung dari detection |
| detection_id | read_only_udm.security_result.detection_fields.value | Dipetakan langsung dari detection_id |
| disposisi | read_only_udm.security_result.description | Dipetakan langsung dari file.disposition |
| error.error_code | read_only_udm.security_result.detection_fields.value | Dipetakan langsung dari error.error_code |
| error.description | read_only_udm.security_result.detection_fields.value | Dipetakan langsung dari error.description |
| event_type | read_only_udm.metadata.product_event_type | Dipetakan langsung dari event_type |
| event_type_id | read_only_udm.metadata.product_log_id | Dipetakan langsung dari event_type_id |
| external_ip | read_only_udm.principal.asset.external_ip | Dipetakan langsung dari computer.external_ip |
| file.file_name | read_only_udm.target.file.names | Dipetakan langsung dari file.file_name |
| file.file_path | read_only_udm.target.file.full_path | Dipetakan langsung dari file.file_path |
| file.identity.md5 | read_only_udm.security_result.about.file.md5 | Dipetakan langsung dari file.identity.md5 |
| file.identity.md5 | read_only_udm.target.file.md5 | Dipetakan langsung dari file.identity.md5 |
| file.identity.sha1 | read_only_udm.security_result.about.file.sha1 | Dipetakan langsung dari file.identity.sha1 |
| file.identity.sha1 | read_only_udm.target.file.sha1 | Dipetakan langsung dari file.identity.sha1 |
| file.identity.sha256 | read_only_udm.security_result.about.file.sha256 | Dipetakan langsung dari file.identity.sha256 |
| file.identity.sha256 | read_only_udm.target.file.sha256 | Dipetakan langsung dari file.identity.sha256 |
| file.parent.disposition | read_only_udm.target.resource.attribute.labels.value | Dipetakan langsung dari file.parent.disposition |
| file.parent.file_name | read_only_udm.target.resource.attribute.labels.value | Dipetakan langsung dari file.parent.file_name |
| file.parent.identity.md5 | read_only_udm.target.resource.attribute.labels.value | Dipetakan langsung dari file.parent.identity.md5 |
| file.parent.identity.sha1 | read_only_udm.target.resource.attribute.labels.value | Dipetakan langsung dari file.parent.identity.sha1 |
| file.parent.identity.sha256 | read_only_udm.target.resource.attribute.labels.value | Dipetakan langsung dari file.parent.identity.sha256 |
| file.parent.process_id | read_only_udm.security_result.about.process.parent_process.pid | Dipetakan langsung dari file.parent.process_id |
| file.parent.process_id | read_only_udm.target.process.parent_process.pid | Dipetakan langsung dari file.parent.process_id |
| hostname | read_only_udm.principal.asset.hostname | Dipetakan langsung dari computer.hostname |
| hostname | read_only_udm.target.hostname | Dipetakan langsung dari computer.hostname |
| hostname | read_only_udm.target.asset.hostname | Dipetakan langsung dari computer.hostname |
| ip | read_only_udm.principal.asset.ip | Dipetakan langsung dari computer.network_addresses.ip |
| ip | read_only_udm.principal.ip | Dipetakan langsung dari computer.network_addresses.ip |
| ip | read_only_udm.security_result.about.ip | Dipetakan langsung dari computer.network_addresses.ip |
| mac | read_only_udm.principal.mac | Dipetakan langsung dari computer.network_addresses.mac |
| mac | read_only_udm.security_result.about.mac | Dipetakan langsung dari computer.network_addresses.mac |
| tingkat keseriusan, | read_only_udm.security_result.severity | Dipetakan dari severity berdasarkan logika berikut: - "Medium" -> "MEDIUM" - "High" atau "Critical" -> "HIGH" - "Low" -> "LOW" - Lainnya -> "UNKNOWN_SEVERITY" |
| timestamp | read_only_udm.metadata.event_timestamp.seconds | Dipetakan langsung dari timestamp |
| pengguna | read_only_udm.security_result.about.user.user_display_name | Dipetakan langsung dari computer.user |
| pengguna | read_only_udm.target.user.user_display_name | Dipetakan langsung dari computer.user |
| vulnerabilities.cve | read_only_udm.extensions.vulns.vulnerabilities.cve_id | Dipetakan langsung dari vulnerabilities.cve |
| vulnerabilities.name | read_only_udm.extensions.vulns.vulnerabilities.name | Dipetakan langsung dari vulnerabilities.name |
| vulnerabilities.score | read_only_udm.extensions.vulns.vulnerabilities.cvss_base_score | Dipetakan langsung dari vulnerabilities.score setelah dikonversi menjadi float |
| vulnerabilities.url | read_only_udm.extensions.vulns.vulnerabilities.vendor_knowledge_base_article_id | Dipetakan langsung dari vulnerabilities.url |
| vulnerabilities.version | read_only_udm.extensions.vulns.vulnerabilities.cvss_version | Dipetakan langsung dari vulnerabilities.version |
| is_alert | Setel ke benar (true) jika event_type adalah salah satu dari berikut ini: "Ancaman Terdeteksi", "Pencegahan Eksploitasi", "Malware yang Dieksekusi", "Potensi Infeksi Dropper", "Beberapa File yang Terinfeksi", "Aplikasi Rentan Terdeteksi", atau jika security_result.severity adalah "TINGGI" |
|
| is_significant | Setel ke benar (true) jika event_type adalah salah satu dari berikut ini: "Ancaman Terdeteksi", "Pencegahan Eksploitasi", "Malware yang Dieksekusi", "Potensi Infeksi Dropper", "Beberapa File yang Terinfeksi", "Aplikasi Rentan Terdeteksi", atau jika security_result.severity adalah "TINGGI" |
|
| read_only_udm.metadata.event_type | Ditentukan berdasarkan nilai event_type dan security_result.severity. - Jika event_type adalah salah satu dari berikut ini: "Executed malware", "Threat Detected", "Potential Dropper Infection", "Cloud Recall Detection", "Malicious Activity Detection", "Exploit Prevention", "Multiple Infected Files", "Cloud IOC", "System Process Protection", "Vulnerable Application Detected", "Threat Quarantined", "Execution Blocked", "Cloud Recall Quarantine Successful", "Cloud Recall Restore from Quarantine Failed", "Cloud Recall Quarantine Attempt Failed", "Quarantine Failure", maka jenis peristiwa ditetapkan ke "SCAN_FILE". - Jika security_result.severity adalah "TINGGI", maka jenis peristiwa ditetapkan ke "SCAN_FILE". - Jika has_principal dan has_target benar, jenis peristiwa akan ditetapkan ke "SCAN_UNCATEGORIZED". - Jika tidak, jenis peristiwa akan disetel ke "GENERIC_EVENT". |
|
| read_only_udm.metadata.log_type | Ditetapkan ke "CISCO_AMP" | |
| read_only_udm.metadata.vendor_name | Ditetapkan ke "CISCO_AMP" | |
| read_only_udm.security_result.about.file.full_path | Dipetakan langsung dari file.file_path |
|
| read_only_udm.security_result.about.hostname | Dipetakan langsung dari computer.hostname |
|
| read_only_udm.security_result.about.user.user_display_name | Dipetakan langsung dari computer.user |
|
| read_only_udm.security_result.detection_fields.key | Tetapkan ke "ID Deteksi" untuk detection_id, "Kode Error" untuk error.error_code, "Deskripsi Error" untuk error.description, "Disposisi Induk" untuk file.parent.disposition, "Nama File Induk" untuk file.parent.file_name, "MD5 Induk" untuk file.parent.identity.md5, "SHA1 Induk" untuk file.parent.identity.sha1, dan "SHA256 Induk" untuk file.parent.identity.sha256 |
|
| read_only_udm.security_result.summary | Disetel ke event_type jika event_type adalah salah satu dari berikut ini: "Ancaman Terdeteksi", "Pencegahan Eksploitasi", "Malware yang Dieksekusi", "Potensi Infeksi Dropper", "Beberapa File yang Terinfeksi", "Aplikasi Rentan Terdeteksi", atau jika security_result.severity adalah "TINGGI" |
|
| read_only_udm.target.asset.ip | Dipetakan langsung dari computer.network_addresses.ip |
|
| read_only_udm.target.resource.attribute.labels.key | Tetapkan ke "Parent Disposition" untuk file.parent.disposition, "Parent File Name" untuk file.parent.file_name, "Parent MD5" untuk file.parent.identity.md5, "Parent SHA1" untuk file.parent.identity.sha1, dan "Parent SHA256" untuk file.parent.identity.sha256 |
|
| timestamp.seconds | Dipetakan langsung dari date setelah dikonversi ke stempel waktu |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.