Cisco Catalyst SD-WAN Manager 로그 수집

파서 버전: 7.0

다음에서 지원:

이 문서에서는 Google Cloud Storage를 사용하여 Cisco Catalyst SD-WAN Manager (이전 명칭: vManage) 로그를 Google Security Operations로 수집하는 방법을 설명합니다. Cisco Catalyst SD-WAN Manager는 SD-WAN 패브릭에 대한 가시성과 제어 기능을 제공하는 중앙 집중식 네트워크 관리 시스템으로, 관리자가 분산된 엔터프라이즈 네트워크 전반에서 네트워크 성능을 모니터링하고, 정책을 구성하고, 보안을 관리할 수 있습니다.

시작하기 전에

다음 기본 요건이 충족되었는지 확인합니다.

  • Google SecOps 인스턴스
  • Cloud Storage API가 사용 설정된 GCP 프로젝트
  • GCS 버킷을 만들고 관리할 수 있는 권한
  • GCS 버킷의 IAM 정책을 관리할 수 있는 권한
  • Cloud Run 서비스, Pub/Sub 주제, Cloud Scheduler 작업을 만들 수 있는 권한
  • Cisco Catalyst SD-WAN Manager 관리 콘솔에 대한 권한 액세스
  • API 액세스 권한이 있는 Cisco Catalyst SD-WAN Manager 사용자 계정

Google Cloud Storage 버킷 만들기

  1. Google Cloud 콘솔로 이동합니다.
  2. 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
  3. 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
  4. 버킷 만들기를 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.

    설정 값
    버킷 이름 지정 전역적으로 고유한 이름 (예: cisco-sdwan-logs-bucket)을 입력합니다.
    위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전)
    위치 위치를 선택합니다 (예: us-central1).
    스토리지 클래스 Standard (자주 액세스하는 로그에 권장)
    액세스 제어 균일 (권장)
    보호 조치 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정
  6. 만들기를 클릭합니다.

Cisco Catalyst SD-WAN Manager API 사용자 인증 정보 수집

API 사용자 계정 만들기

  1. Cisco Catalyst SD-WAN Manager 콘솔에 로그인합니다.
  2. 메뉴에서 Administration(관리) > Manage Users(사용자 관리)로 이동합니다.
  3. 사용자 추가를 클릭합니다.
  4. 다음 구성 세부정보를 제공합니다.
    • 사용자 이름: API 액세스 사용자 이름을 입력합니다 (예: chronicle-api).
    • 비밀번호: 안전한 비밀번호를 입력합니다.
    • 비밀번호 확인: 비밀번호를 다시 입력합니다.
    • 사용자 그룹: 적절한 권한이 있는 사용자 그룹을 선택합니다 (다음 섹션 참고).
  5. 추가를 클릭합니다.
  6. 다음 세부정보를 복사하여 안전한 위치에 저장하세요.

    • 사용자 이름: Catalyst SD-WAN Manager 사용자 이름입니다.
    • 비밀번호: Catalyst SD-WAN Manager 비밀번호입니다.
    • Catalyst SD-WAN Manager 기준 URL: Catalyst SD-WAN Manager 서버의 기준 URL입니다 (예: https://sdwan-manager.example.com:8443).

사용자 권한 구성

API 사용자 계정에는 감사 로그, 알람, 이벤트에 액세스할 수 있는 특정 권한이 필요합니다.

  1. Cisco Catalyst SD-WAN Manager 콘솔의 메뉴에서 Administration > Manage Users > User Groups로 이동합니다.
  2. API 사용자에게 할당된 사용자 그룹을 선택하거나 사용자 그룹 추가를 클릭하여 새 그룹을 만듭니다.
  3. 수정을 클릭합니다.
  4. 기능 섹션에서 다음 권한이 사용 설정되어 있는지 확인합니다.
    • 감사 로그: 읽기 권한을 선택합니다.
    • 알람: 읽기 권한을 선택합니다.
    • 이벤트: 읽기 권한을 선택합니다.
  5. 업데이트를 클릭합니다.

API 액세스 확인

통합을 진행하기 전에 사용자 인증 정보를 테스트합니다.

  1. 터미널 또는 명령 프롬프트를 엽니다.
  2. 다음 명령어를 실행하여 인증을 테스트합니다.

    # Replace with your actual credentials
    SDWAN_HOST="https://sdwan-manager.example.com:8443"
    SDWAN_USERNAME="chronicle-api"
    SDWAN_PASSWORD="your-password"
    
    # Test authentication using session-based login (returns JSESSIONID cookie)
    curl -c cookies.txt -X POST \
      "${SDWAN_HOST}/j_security_check" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "j_username=${SDWAN_USERNAME}&j_password=${SDWAN_PASSWORD}"
    
    # Get CSRF token (X-XSRF-TOKEN)
    curl -b cookies.txt \
      "${SDWAN_HOST}/dataservice/client/token"
    

인증에 성공하면 두 번째 명령어가 CSRF 토큰 문자열을 반환합니다.

Cloud Run 함수의 서비스 계정 만들기

Cloud Run 함수에는 GCS 버킷에 쓸 수 있고 Pub/Sub에 의해 호출될 수 있는 권한이 있는 서비스 계정이 필요합니다.

서비스 계정 만들기

  1. GCP 콘솔에서 IAM 및 관리자 > 서비스 계정으로 이동합니다.
  2. 서비스 계정 만들기를 클릭합니다.
  3. 다음 구성 세부정보를 제공합니다.
    • 서비스 계정 이름: cisco-sdwan-collector-sa을 입력합니다.
    • 서비스 계정 설명: Service account for Cloud Run function to collect Cisco Catalyst SD-WAN Manager logs을 입력합니다.
  4. 만들고 계속하기를 클릭합니다.
  5. 이 서비스 계정에 프로젝트에 대한 액세스 권한 부여 섹션에서 다음 역할을 추가합니다.
    1. 역할 선택을 클릭합니다.
    2. 스토리지 객체 관리자를 검색하여 선택합니다.
    3. + 다른 역할 추가를 클릭합니다.
    4. Cloud Run 호출자를 검색하여 선택합니다.
    5. + 다른 역할 추가를 클릭합니다.
    6. Cloud Functions 호출자를 검색하여 선택합니다.
  6. 계속을 클릭합니다.
  7. 완료를 클릭합니다.

이러한 역할은 다음 작업에 필요합니다.

  • 스토리지 객체 관리자: GCS 버킷에 로그를 쓰고 상태 파일을 관리합니다.
  • Cloud Run 호출자: Pub/Sub에서 함수를 호출하도록 허용
  • Cloud Functions 호출자: 함수 호출 허용

GCS 버킷에 대한 IAM 권한 부여

GCS 버킷에 대한 쓰기 권한을 서비스 계정에 부여합니다.

  1. Cloud Storage> 버킷으로 이동합니다.
  2. 버킷 이름을 클릭합니다.
  3. 권한 탭으로 이동합니다.
  4. 액세스 권한 부여를 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.
    • 주 구성원 추가: 서비스 계정 이메일 (예: cisco-sdwan-collector-sa@PROJECT_ID.iam.gserviceaccount.com)을 입력합니다.
    • 역할 할당: 스토리지 객체 관리자를 선택합니다.
  6. 저장을 클릭합니다.

Pub/Sub 주제 만들기

Cloud Scheduler가 게시하고 Cloud Run 함수가 구독할 Pub/Sub 주제를 만듭니다.

  1. GCP 콘솔에서 Pub/Sub> 주제로 이동합니다.
  2. 주제 만들기를 클릭합니다.
  3. 다음 구성 세부정보를 제공합니다.
    • 주제 ID: cisco-sdwan-trigger를 입력합니다.
    • 다른 설정은 기본값으로 둡니다.
  4. 만들기를 클릭합니다.

로그를 수집하는 Cloud Run 함수 만들기

Cloud Run 함수는 Cloud Scheduler의 Pub/Sub 메시지에 의해 트리거되어 Cisco Catalyst SD-WAN Manager API에서 로그를 가져와 GCS에 작성합니다.

  1. GCP 콘솔에서 Cloud Run으로 이동합니다.
  2. 서비스 만들기를 클릭합니다.
  3. 함수를 선택합니다 (인라인 편집기를 사용하여 함수 만들기).
  4. 구성 섹션에서 다음 구성 세부정보를 입력합니다.

    설정 값
    서비스 이름 cisco-sdwan-log-collector
    리전 GCS 버킷과 일치하는 리전을 선택합니다 (예: us-central1).
    런타임 Python 3.12 이상 선택
  5. 트리거 (선택사항) 섹션에서 다음을 수행합니다.

    1. + 트리거 추가를 클릭합니다.
    2. Cloud Pub/Sub을 선택합니다.
    3. Cloud Pub/Sub 주제 선택에서 주제 (cisco-sdwan-trigger)를 선택합니다.
    4. 저장을 클릭합니다.
  6. 인증 섹션에서 다음을 구성합니다.

    1. 인증 필요를 선택합니다.
    2. ID 및 액세스 관리 (IAM)를 확인합니다.
  7. 아래로 스크롤하고 컨테이너, 네트워킹, 보안을 펼칩니다.

  8. 보안 탭으로 이동합니다.

    • 서비스 계정: 서비스 계정 (cisco-sdwan-collector-sa)을 선택합니다.
  9. 컨테이너 탭으로 이동합니다.

    1. 변수 및 보안 비밀을 클릭합니다.
    2. 각 환경 변수에 대해 + 변수 추가를 클릭합니다.
    변수 이름 예시 값
    GCS_BUCKET cisco-sdwan-logs-bucket
    GCS_PREFIX cisco-sdwan
    STATE_KEY cisco-sdwan/state.json
    SDWAN_HOST https://sdwan-manager.example.com:8443
    SDWAN_USERNAME chronicle-api
    SDWAN_PASSWORD your-sdwan-password
    LOOKBACK_HOURS 1
  10. 변수 및 보안 비밀 탭에서 요청까지 아래로 스크롤합니다.

    • 요청 제한 시간: 600초 (10분)를 입력합니다.
  11. 컨테이너의 설정 탭으로 이동합니다.

    • 리소스 섹션에서 다음을 수행합니다.
      • 메모리: 512MiB 이상을 선택합니다.
      • CPU: 1을 선택합니다.
  12. 버전 확장 섹션에서 다음을 수행합니다.

    • 최소 인스턴스 수: 0를 입력합니다.
    • 최대 인스턴스 수: 100을 입력합니다 (또는 예상 부하에 따라 조정).
  13. 만들기를 클릭합니다.

  14. 서비스가 생성될 때까지 기다립니다 (1~2분).

  15. 서비스가 생성되면 인라인 코드 편집기가 자동으로 열립니다.

함수 코드 추가

  1. 진입점 필드에 main을 입력합니다.
  2. 인라인 코드 편집기에서 다음 두 파일을 만듭니다.

    • main.py:

      import functions_framework
      from google.cloud import storage
      import json
      import os
      import urllib3
      import urllib.parse
      from datetime import datetime, timezone, timedelta
      import time
      
      # Disable SSL warnings for self-signed certificates (testing only)
      urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
      
      # Initialize HTTP client with timeouts
      http = urllib3.PoolManager(
          timeout=urllib3.Timeout(connect=10.0, read=60.0),
          cert_reqs='CERT_NONE',
          retries=urllib3.Retry(total=3, backoff_factor=1)
      )
      
      # Initialize Storage client
      storage_client = storage.Client()
      
      # Environment variables
      SDWAN_HOST = os.environ.get('SDWAN_HOST', '').rstrip('/')
      SDWAN_USERNAME = os.environ.get('SDWAN_USERNAME', '')
      SDWAN_PASSWORD = os.environ.get('SDWAN_PASSWORD', '')
      GCS_BUCKET = os.environ.get('GCS_BUCKET', '')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'cisco-sdwan')
      STATE_KEY = os.environ.get('STATE_KEY', 'cisco-sdwan/state.json')
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '1'))
      
      class CatalystSDWANAPI:
          """Client for Cisco Catalyst SD-WAN Manager API (formerly vManage)."""
      
          def __init__(self, host, username, password):
              self.host = host
              self.username = username
              self.password = password
              self.jsessionid = None
              self.xsrf_token = None
      
          def authenticate(self):
              """Authenticate using session-based login (j_security_check)."""
              try:
                  login_url = f"{self.host}/j_security_check"
                  login_data = urllib.parse.urlencode({
                      'j_username': self.username,
                      'j_password': self.password
                  }).encode('utf-8')
      
                  response = http.request(
                      'POST',
                      login_url,
                      body=login_data,
                      headers={'Content-Type': 'application/x-www-form-urlencoded'},
                  )
      
                  if b'<html>' in response.data or response.status != 200:
                      print(f"Authentication failed: HTTP {response.status}")
                      return False
      
                  # Extract JSESSIONID from Set-Cookie header
                  cookie_header = response.headers.get('Set-Cookie', '')
                  for part in cookie_header.split(','):
                      if 'JSESSIONID=' in part:
                          self.jsessionid = part.split('JSESSIONID=')[1].split(';')[0]
                          break
      
                  if not self.jsessionid:
                      print("Failed to extract JSESSIONID from response")
                      return False
      
                  # Get XSRF token
                  token_url = f"{self.host}/dataservice/client/token"
                  headers = {
                      'Content-Type': 'application/json',
                      'Cookie': f"JSESSIONID={self.jsessionid}"
                  }
                  response = http.request('GET', token_url, headers=headers)
      
                  if response.status == 200:
                      self.xsrf_token = response.data.decode('utf-8').strip()
                      print("Successfully authenticated with Catalyst SD-WAN Manager")
                      return True
                  else:
                      print(f"Failed to get XSRF token: HTTP {response.status}")
                      return False
      
              except Exception as e:
                  print(f"Authentication error: {e}")
                  return False
      
          def _get_headers(self):
              """Build headers for authenticated API requests."""
              return {
                  'Content-Type': 'application/json',
                  'Accept': 'application/json',
                  'Cookie': f"JSESSIONID={self.jsessionid}",
                  'X-XSRF-TOKEN': self.xsrf_token
              }
      
          def _build_query(self, last_epoch_ms=None):
              """Build a query payload with entry_time filter."""
              query = {
                  "query": {
                      "condition": "AND",
                      "rules": []
                  },
                  "size": 10000
              }
              if last_epoch_ms:
                  query["query"]["rules"].append({
                      "value": [str(last_epoch_ms)],
                      "field": "entry_time",
                      "type": "date",
                      "operator": "greater"
                  })
              else:
                  query["query"]["rules"].append({
                      "value": [str(LOOKBACK_HOURS)],
                      "field": "entry_time",
                      "type": "date",
                      "operator": "last_n_hours"
                  })
              return query
      
          def fetch_data(self, endpoint, last_epoch_ms=None):
              """Fetch data from a /dataservice endpoint using POST with query body."""
              url = f"{self.host}/dataservice/{endpoint}"
              headers = self._get_headers()
              query = self._build_query(last_epoch_ms)
      
              try:
                  response = http.request(
                      'POST',
                      url,
                      body=json.dumps(query),
                      headers=headers,
                  )
      
                  if response.status == 200:
                      return json.loads(response.data.decode('utf-8'))
                  else:
                      print(f"Failed to get {endpoint}: HTTP {response.status}")
                      return None
      
              except Exception as e:
                  print(f"Error fetching {endpoint}: {e}")
                  return None
      
      def load_state(bucket):
          """Load the last run timestamp (epoch ms) from GCS state file."""
          try:
              blob = bucket.blob(STATE_KEY)
              if blob.exists():
                  state_data = json.loads(blob.download_as_text())
                  return state_data.get('last_run_time')
          except Exception as e:
              print(f"Warning: Could not load state: {e}")
          return None
      
      def save_state(bucket, epoch_ms):
          """Save the current run timestamp (epoch ms) to GCS state file."""
          try:
              state_data = {
                  'last_run_time': epoch_ms,
                  'updated_at': datetime.now(timezone.utc).isoformat()
              }
              blob = bucket.blob(STATE_KEY)
              blob.upload_from_string(
                  json.dumps(state_data),
                  content_type='application/json'
              )
              print(f"Saved state: last_run_time={epoch_ms}")
          except Exception as e:
              print(f"Warning: Could not save state: {e}")
      
      def upload_to_gcs(bucket, records, log_type):
          """Upload log records to GCS as NDJSON."""
          if not records:
              print(f"No {log_type} records to upload")
              return 0
      
          dt = datetime.now(timezone.utc)
          object_key = (
              f"{GCS_PREFIX}/{log_type}/"
              f"{dt.strftime('%Y/%m/%d')}/"
              f"{log_type}_{dt.strftime('%Y%m%d_%H%M%S')}.ndjson"
          )
      
          ndjson = '\n'.join(
              json.dumps(record, ensure_ascii=False) for record in records
          ) + '\n'
      
          blob = bucket.blob(object_key)
          blob.upload_from_string(ndjson, content_type='application/x-ndjson')
          print(f"Uploaded {len(records)} {log_type} records to gs://{GCS_BUCKET}/{object_key}")
          return len(records)
      
      @functions_framework.cloud_event
      def main(cloud_event):
          """
          Cloud Run function triggered by Pub/Sub.
          Fetches audit logs, alarms, and events from Cisco Catalyst SD-WAN Manager
          API and writes them to GCS as NDJSON files.
      
          Args:
              cloud_event: CloudEvent object containing Pub/Sub message
          """
          print(f"Starting Cisco Catalyst SD-WAN Manager log collection at {datetime.now(timezone.utc).isoformat()}")
      
          if not all([SDWAN_HOST, SDWAN_USERNAME, SDWAN_PASSWORD, GCS_BUCKET]):
              print("Error: Missing required environment variables")
              return
      
          try:
              bucket = storage_client.bucket(GCS_BUCKET)
      
              # Load last run timestamp
              last_run_time = load_state(bucket)
              if last_run_time:
                  print(f"Resuming from last_run_time={last_run_time}")
              else:
                  print(f"No previous state found, collecting last {LOOKBACK_HOURS} hour(s) of logs")
      
              # Authenticate
              api = CatalystSDWANAPI(SDWAN_HOST, SDWAN_USERNAME, SDWAN_PASSWORD)
              if not api.authenticate():
                  print("Failed to authenticate with Catalyst SD-WAN Manager")
                  return
      
              # Current timestamp for state tracking (epoch milliseconds)
              current_time = int(datetime.now(timezone.utc).timestamp() * 1000)
      
              # Collect audit logs, alarms, and events
              endpoints = [
                  ('audit_logs', 'auditlog'),
                  ('alarms', 'alarms'),
                  ('events', 'events'),
              ]
      
              total_records = 0
              for log_type, endpoint in endpoints:
                  try:
                      print(f"Collecting {log_type} from /dataservice/{endpoint}...")
                      response_data = api.fetch_data(endpoint, last_run_time)
                      if response_data and 'data' in response_data:
                          count = upload_to_gcs(bucket, response_data['data'], log_type)
                          total_records += count
                      else:
                          print(f"No {log_type} data returned")
                  except Exception as e:
                      print(f"Error processing {log_type}: {e}")
                      continue
      
              # Update state
              save_state(bucket, current_time)
      
              print(f"Collection completed. Total records processed: {total_records}")
      
          except Exception as e:
              print(f"Function execution error: {e}")
              raise
      
    • requirements.txt:

      functions-framework==3.*
      google-cloud-storage==2.*
      urllib3>=2.0.0
      
  3. 배포를 클릭하여 함수를 저장하고 배포합니다.

  4. 배포가 완료될 때까지 기다립니다 (2~3분).

Cloud Scheduler 작업 만들기

Cloud Scheduler는 일정 간격으로 Pub/Sub 주제에 메시지를 게시하여 Cloud Run 함수를 트리거합니다.

  1. GCP Console에서 Cloud Scheduler로 이동합니다.
  2. 작업 만들기를 클릭합니다.
  3. 다음 구성 세부정보를 제공합니다.

    설정 값
    이름 cisco-sdwan-log-collector-hourly
    리전 Cloud Run 함수와 동일한 리전 선택
    주파수 0 * * * * (매시간 정각)
    시간대 시간대 선택 (UTC 권장)
    타겟 유형 Pub/Sub
    주제 주제 선택 (cisco-sdwan-trigger)
    메일 본문 {} (빈 JSON 객체)
  4. 만들기를 클릭합니다.

일정 빈도 옵션

로그 볼륨 및 지연 시간 요구사항에 따라 빈도를 선택합니다.

빈도 크론 표현식 사용 사례
5분마다 */5 * * * * 대용량, 저지연
15분마다 */15 * * * * 검색량 보통
1시간마다 0 * * * * 표준 (권장)
6시간마다 0 */6 * * * 적은 볼륨, 일괄 처리
매일 0 0 * * * 이전 데이터 수집

통합 테스트

  1. Cloud Scheduler 콘솔에서 작업을 찾습니다.
  2. 강제 실행을 클릭하여 작업을 수동으로 트리거합니다.
  3. 몇 초 동안 기다립니다.
  4. Cloud Run > 서비스로 이동합니다.
  5. 함수 이름 (cisco-sdwan-log-collector)을 클릭합니다.
  6. 로그 탭을 클릭합니다.
  7. 함수가 성공적으로 실행되었는지 확인합니다. 다음 항목을 찾습니다.

    Starting Cisco Catalyst SD-WAN Manager log collection at ...
    Successfully authenticated with Catalyst SD-WAN Manager
    Collecting audit_logs from /dataservice/auditlog...
    Uploaded N audit_logs records to gs://...
    Collection completed. Total records processed: N
    
  8. Cloud Storage> 버킷으로 이동합니다.

  9. 버킷 이름을 클릭합니다.

  10. 접두사 폴더 (cisco-sdwan/)로 이동합니다.

  11. 새 .ndjson 파일이 현재 타임스탬프로 생성되었는지 확인합니다.

로그에 오류가 표시되는 경우:

  • HTTP 401: 환경 변수에서 API 사용자 인증 정보 확인
  • HTTP 403: 사용자 계정에 감사 로그, 알람, 이벤트에 필요한 읽기 권한이 있는지 확인합니다.
  • 인증 실패: Catalyst SD-WAN Manager 기본 URL에 올바른 포트 (기본값 8443)가 포함되어 있는지 확인합니다.
  • 환경 변수 누락: 필요한 모든 변수가 설정되어 있는지 확인합니다.

Cisco Catalyst SD-WAN Manager 로그를 수집하도록 Google SecOps에서 피드 구성

  1. SIEM 설정 > 피드로 이동합니다.
  2. 새 피드 추가를 클릭합니다.
  3. 단일 피드 구성을 클릭합니다.
  4. 피드 이름 필드에 피드 이름을 입력합니다(예: Cisco Catalyst SD-WAN Manager logs).
  5. 소스 유형으로 Google Cloud Storage V2를 선택합니다.
  6. 로그 유형으로 Cisco SD-WAN을 선택합니다.
  7. 서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. 다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.

  9. 다음을 클릭합니다.

  10. 다음 입력 매개변수의 값을 지정합니다.

    • 스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.

      gs://cisco-sdwan-logs-bucket/cisco-sdwan/
      
      • 다음과 같이 바꿉니다.
        • cisco-sdwan-logs-bucket: GCS 버킷 이름입니다.
        • cisco-sdwan/: 로그가 저장되는 선택적 접두사/폴더 경로입니다 (루트의 경우 비워 둠).
    • 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.

      • 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
      • 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
      • 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
    • 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다 (기본값은 180일).

    • 애셋 네임스페이스: 애셋 네임스페이스입니다.

    • 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.

  11. 다음을 클릭합니다.

  12. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.

Google SecOps 서비스 계정에 IAM 권한 부여

Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.

  1. Cloud Storage> 버킷으로 이동합니다.
  2. 버킷 이름을 클릭합니다.
  3. 권한 탭으로 이동합니다.
  4. 액세스 권한 부여를 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.
    • 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
    • 역할 할당: 스토리지 객체 뷰어를 선택합니다.
  6. 저장을 클릭합니다.

UDM 매핑 테이블

로그 필드 UDM 매핑 로직
Tunnel_id_label additional.fields 병합됨
additional_tag additional.fields 병합됨
count_label additional.fields 병합됨
dst_vrf_label additional.fields 병합됨
logfeature_label additional.fields 병합됨
logmodule_label additional.fields 병합됨
meta_sequenceId_label additional.fields 병합됨
msg_label additional.fields 병합됨
qfp_label additional.fields 병합됨
result_label additional.fields 병합됨
rsa_sha256_label additional.fields 병합됨
rsa_type_label additional.fields 병합됨
sequence_label additional.fields 병합됨
src_vrf_label additional.fields 병합됨
tenant_vpn_id_label additional.fields 병합됨
thread_label additional.fields 병합됨
tos_label additional.fields 병합됨
unknown_tenant_label additional.fields 병합됨
vlan_id_label additional.fields 병합됨
vpn_id_label additional.fields 병합됨
description_1 extensions.auth.type 매핑됨: (?i)closed → AUTHTYPE_UNSPECIFIED
msg1 extensions.auth.type 매핑됨: authenticated → AUTHTYPE_UNSPECIFIED
msgs extensions.auth.type 매핑됨: (?i)success → AUTHTYPE_UNSPECIFIED
prod_type extensions.auth.type 매핑됨: (?i)LOGOUT → AUTHTYPE_UNSPECIFIED
host_name intermediary.asset.hostname 직접 매핑됨
host_name intermediary.hostname 직접 매핑됨
inter_host intermediary.hostname 직접 매핑됨
logmsg metadata.description 직접 매핑됨
message_value metadata.description 직접 매핑됨
msgs metadata.description 직접 매핑됨
date_time metadata.event_timestamp ISO8601로 파싱됨
time metadata.event_timestamp ISO8601로 파싱됨
time_t metadata.event_timestamp ISO8601로 파싱됨
timestamp metadata.event_timestamp ISO8601로 파싱됨
description_1 metadata.event_type 매핑됨: (?i)closed → USER_LOGOUT
has_principal metadata.event_type 매핑됨: true → NETWORK_CONNECTION, true → STATUS_UPDATE
has_principal_user metadata.event_type 매핑됨: true → USER_UNCATEGORIZED
msg1 metadata.event_type 매핑됨: authenticated → USER_LOGIN
msgs metadata.event_type 매핑됨: (?i)success → USER_LOGIN
prod_type metadata.event_type 매핑됨: (?i)LOGOUT → USER_LOGOUT
prod_type metadata.product_event_type 직접 매핑됨
log_id metadata.product_log_id 직접 매핑됨
logid metadata.product_log_id 직접 매핑됨
application_protocol network.application_protocol 매핑됨: (?i)SSH → SSH
message network.application_protocol 매핑됨: (?i)SSH → SSH, (?i)netconf → NETCONF, (?i)dhcp → DHCP
type1 network.dhcp.type 매핑됨: DHCPDISCOVER → DISCOVER
message network.ip_protocol 매핑됨: (?i)tcp → TCP
network_protocol network.ip_protocol 직접 매핑됨
bytes network.sent_bytes 직접 매핑됨
session_id network.session_id 직접 매핑됨
network_host network.tls.cipher 직접 매핑됨
hostname principal.asset.hostname 직접 매핑됨
host principal.asset.ip 병합됨
initiator_ip principal.asset.ip 병합됨
ip principal.asset.ip 병합됨
ipaddress principal.asset.ip 병합됨
logusersrcip principal.asset.ip 병합됨
peer_ip principal.asset.ip 병합됨
principal_ip principal.asset.ip 병합됨
principal_ip1 principal.asset.ip 병합됨
proxy_host principal.asset.ip 병합됨
src_ip principal.asset.ip 병합됨
system_ip principal.asset.ip 병합됨
addr principal.hostname 직접 매핑됨
hostname principal.hostname 직접 매핑됨
host principal.ip 병합됨
initiator_ip principal.ip 병합됨
ip principal.ip 병합됨
ipaddress principal.ip 병합됨
logusersrcip principal.ip 병합됨
peer_ip principal.ip 병합됨
principal_ip principal.ip 병합됨
principal_ip1 principal.ip 병합됨
proxy_host principal.ip 병합됨
src_ip principal.ip 병합됨
system_ip principal.ip 병합됨
initiator_port principal.port 직접 매핑됨
port principal.port 직접 매핑됨
ports principal.port 직접 매핑됨
principal_port principal.port 직접 매핑됨
principal_port1 principal.port 직접 매핑됨
src_port principal.port 직접 매핑됨
process_path principal.process.file.full_path 직접 매핑됨
parent_pid principal.process.parent_process.pid 직접 매핑됨
pid principal.process.pid 직접 매핑됨
process_label principal.resource.attribute.labels 병합됨
process_name_label principal.resource.attribute.labels 병합됨
loguser principal.user.userid 직접 매핑됨
user1 principal.user.userid 직접 매핑됨
user_id principal.user.userid 직접 매핑됨
username principal.user.userid 직접 매핑됨
action security_result.action 병합됨
message security_result.action 매핑됨: (?i)(succeeded/accounting start/open/occurred/update/successfully/success) → `acti…
classification security_result.category_details 병합됨
msg1 security_result.description 직접 매핑됨
Malware_label security_result.detection_fields 병합됨
direction_label security_result.detection_fields 병합됨
egress_interface_label security_result.detection_fields 병합됨
ingress_interface_label security_result.detection_fields 병합됨
log_prefix_label security_result.detection_fields 병합됨
log_reason_label security_result.detection_fields 병합됨
packet_label security_result.detection_fields 병합됨
policy_label security_result.detection_fields 병합됨
port_label security_result.detection_fields 병합됨
protocol_label security_result.detection_fields 병합됨
proxy_port_label security_result.detection_fields 병합됨
sent_bytes_1_label security_result.detection_fields 병합됨
sent_bytes_2_label security_result.detection_fields 병합됨
tty_label security_result.detection_fields 병합됨
type_label security_result.detection_fields 병합됨
udp_packets_label security_result.detection_fields 병합됨
priority security_result.severity 매핑됨: 1 → LOW
description_1 security_result.summary 직접 매핑됨
dst_ip target.asset.ip 병합됨
ipadres target.asset.ip 병합됨
logdeviceid target.asset.ip 병합됨
responder_ip target.asset.ip 병합됨
target_ip target.asset.ip 병합됨
target_ip1 target.asset.ip 병합됨
filename target.file.names 병합됨
dst_ip target.ip 병합됨
ipadres target.ip 병합됨
logdeviceid target.ip 병합됨
responder_ip target.ip 병합됨
target_ip target.ip 병합됨
target_ip1 target.ip 병합됨
dst_port target.port 직접 매핑됨
prts target.port 직접 매핑됨
responder_port target.port 직접 매핑됨
target_port target.port 직접 매핑됨
target_port1 target.port 직접 매핑됨
filetype target.process.file.mime_type 직접 매핑됨
parent_identifier_label target.resource.attribute.labels 병합됨
specific_identifer_label target.resource.attribute.labels 병합됨
target_name target.resource.name 직접 매핑됨
instance_id target.resource.product_object_id 직접 매핑됨
target_username target.user.userid 직접 매핑됨
user target.user.userid 직접 매핑됨
해당 사항 없음 extensions.auth.type 상수: AUTHTYPE_UNSPECIFIED
해당 사항 없음 metadata.event_type 상수: USER_LOGIN
해당 사항 없음 network.application_protocol 상수: SSH
해당 사항 없음 network.dhcp.type 상수: DISCOVER
해당 사항 없음 network.ip_protocol 상수: TCP
해당 사항 없음 security_result.severity 상수: LOW
rsa_type event.idm.read_only_udm.additional.fields 변경 로그에서 매핑됨
sha_256 event.idm.read_only_udm.additional.fields 변경 로그에서 매핑됨
NETCONF event.idm.read_only_udm.network.application_protocol 변경 로그에서 매핑됨
TCP event.idm.read_only_udm.network.ip_protocol 변경 로그에서 매핑됨
DHCP event.idm.read_only_udm.network.application_protocol 변경 로그에서 매핑됨
username1 target.user.userid 변경 로그에서 매핑됨
security_result.action ALLOW 변경 로그에서 매핑됨
ip_1 principal.ip 변경 로그에서 매핑됨
ip_2 target.ip 변경 로그에서 매핑됨
port_1 principal.port 변경 로그에서 매핑됨
port_2 target.port 변경 로그에서 매핑됨
message_1 metadata.description 변경 로그에서 매핑됨
malware security_result.detection_fields 변경 로그에서 매핑됨

변경 로그

이 파서의 변경 로그 보기

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