Mengumpulkan log Cisco AMP for Endpoints

Didukung di:

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)

  1. Login ke konsol Cisco AMP for Endpoints.
  2. Buka Accounts > API Credentials.
  3. Klik New API Credential untuk membuat kunci API dan ID klien baru.
  4. 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.
  5. Klik Buat.
  6. 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

Mengonfigurasi bucket AWS S3 dan IAM untuk Google SecOps

  1. Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket
  2. Simpan Name dan Region bucket untuk referensi di masa mendatang (misalnya, cisco-amp-logs).
  3. Buat Pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
  4. Pilih Pengguna yang dibuat.
  5. Pilih tab Kredensial keamanan.
  6. Klik Create Access Key di bagian Access Keys.
  7. Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
  8. Klik Berikutnya.
  9. Opsional: Tambahkan tag deskripsi.
  10. Klik Create access key.
  11. Klik Download CSV file untuk menyimpan Access Key dan Secret Access Key untuk referensi di masa mendatang.
  12. Klik Selesai.
  13. Pilih tab Permissions.
  14. Klik Tambahkan izin di bagian Kebijakan izin.
  15. Pilih Tambahkan izin.
  16. Pilih Lampirkan kebijakan secara langsung.
  17. Cari kebijakan AmazonS3FullAccess.
  18. Pilih kebijakan.
  19. Klik Berikutnya.
  20. Klik Add permissions.

Mengonfigurasi kebijakan dan peran IAM untuk upload S3

  1. Di konsol AWS, buka IAM > Policies.
  2. Klik Buat kebijakan > tab JSON.
  3. 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-logs jika Anda memasukkan nama bucket yang berbeda.
  4. Klik Berikutnya > Buat kebijakan.

  5. Buka IAM > Roles > Create role > AWS service > Lambda.

  6. Lampirkan kebijakan yang baru dibuat.

  7. Beri nama peran cisco-amp-lambda-role, lalu klik Buat peran.

Buat fungsi Lambda

  1. Di Konsol AWS, buka Lambda > Functions > Create function.
  2. Klik Buat dari awal.
  3. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Nama cisco-amp-events-collector
    Runtime Python 3.13
    Arsitektur x86_64
    Peran eksekusi cisco-amp-lambda-role
  4. Setelah 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)}")
    
  5. Buka Configuration > Environment variables.

  6. Klik Edit > Tambahkan variabel lingkungan baru.

  7. Masukkan variabel lingkungan berikut yang disediakan, lalu ganti dengan nilai Anda.

    Kunci Nilai contoh
    S3_BUCKET cisco-amp-logs
    S3_PREFIX cisco-amp-events/
    STATE_KEY cisco-amp-events/state.json
    AMP_CLIENT_ID <your-client-id>
    AMP_API_KEY <your-api-key>
    API_BASE https://api.amp.cisco.com (atau URL wilayah Anda)
    PAGE_SIZE 500
    MAX_PAGES 10
  8. Setelah fungsi dibuat, tetap buka halamannya (atau buka Lambda > Functions > cisco-amp-events-collector).

  9. Pilih tab Configuration

  10. Di panel General configuration, klik Edit.

  11. Ubah Waktu Tunggu menjadi 5 menit (300 detik), lalu klik Simpan.

Membuat jadwal EventBridge

  1. Buka Amazon EventBridge > Scheduler > Create schedule.
  2. Berikan detail konfigurasi berikut:
    • Jadwal berulang: Tarif (1 hour).
    • Target: fungsi Lambda Anda cisco-amp-events-collector.
    • Name: cisco-amp-events-collector-1h.
  3. Klik Buat jadwal.

Opsional: Buat pengguna & kunci IAM hanya baca untuk Google SecOps

  1. Buka Konsol AWS > IAM > Pengguna > Tambahkan pengguna.
  2. Klik Add users.
  3. Berikan detail konfigurasi berikut:
    • Pengguna: Masukkan secops-reader.
    • Jenis akses: Pilih Kunci akses – Akses terprogram.
  4. Klik Buat pengguna.
  5. Lampirkan kebijakan baca minimal (kustom): Pengguna > secops-reader > Izin > Tambahkan izin > Lampirkan kebijakan secara langsung > Buat kebijakan.
  6. 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"
        }
      ]
    }
    
  7. Tetapkan nama ke secops-reader-policy.

  8. Buka Buat kebijakan > cari/pilih > Berikutnya > Tambahkan izin.

  9. Buka Kredensial keamanan > Kunci akses > Buat kunci akses.

  10. Download CSV (nilai ini dimasukkan ke dalam feed).

Mengonfigurasi feed di Google SecOps untuk memproses log Cisco AMP for Endpoints

  1. Buka Setelan SIEM > Feed.
  2. Klik + Tambahkan Feed Baru.
  3. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Cisco AMP for Endpoints logs).
  4. Pilih Amazon S3 V2 sebagai Jenis sumber.
  5. Pilih Cisco AMP sebagai Jenis log.
  6. Klik Berikutnya.
  7. 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.
  8. Klik Berikutnya.
  9. 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.