Google SecOps와 Apigee 통합

이 페이지는 ApigeeApigee Hybrid에 적용됩니다.

이 문서에서는 Apigee를 Google Security Operations(Google SecOps)와 통합하는 방법을 설명합니다. Google SecOps를 SIEM 솔루션으로 사용하는 경우 이 문서의 단계에 따라 Apigee가 SecOps에 로그 데이터를 전송하도록 구성하세요.

이러한 통합을 용이하게 하기 위해 Google SecOps는 Apigee 로그 데이터 수집을 위한 Apigee 파서를 지원합니다. Google Security Operations에 Google Cloud 데이터 수집도 참조하세요. 이 문서의 구성 단계를 완료하면 Apigee 로그 데이터가 Google SecOps로 이동됩니다.

SecOps를 다른 SIEM 솔루션과 통합하는 방법은 Apigee를 SIEM 솔루션과 통합을 참조하세요.

대상

이 문서의 대상은 다음과 같습니다.

  • API 보안 보장, 플랫폼 구성 관리, 운영 효율성 지원, 보안 규정 준수 요구사항 준수를 담당하는 API 관리자
  • 위험을 최소화하고 민감한 정보를 보호하기 위해 API 관련 보안 사고를 선제적으로 감지하고 조사하는 데 주력하는 보안 분석가

구성 개요

이 문서에서 설명하는 구성은 Apigee MessageLogging 정책을 사용하여 특정 흐름 변수를 비롯한 다양한 Apigee 로그 데이터를 SecOps로 전송합니다.

Google SecOps는 Apigee 로그를 비롯한 특정 로그 유형을 Google SecOps에 실시간으로 전송할 수 있는 특수 Cloud Logging 필터를 제공합니다. Google SecOps는 Apigee 로그 데이터를 Google SecOps로 수집하기 위한 Apigee 파서를 지원합니다. Google Security Operations에 Google Cloud 데이터 수집도 참조하세요.

기본 요건

이러한 기본 요건이 충족되면 이 문서의 안내에 따라 Apigee를 SecOps 인스턴스와 통합하세요. 통합을 시작하기 전에 다음 사항을 확인하세요.

  • API 프록시를 개발하고 배포할 수 있는 관리 권한이 있는 Apigee 또는 Apigee Hybrid 계정
  • Google SecOps 계정
  • Cloud Logging 사용 설정, Cloud Logging 구성 및 사용 경험하기
  • Apigee 흐름 변수에 대한 이해
  • Apigee MessageLogging 정책 및 일반적인 정책 사용 및 구성에 대한 이해
  • (선택사항) Google SecOps 파서가 수집된 로그를 해석하는 데 사용되는 방식에 대한 이해 SecOps 파서는 기본적으로 MessageLogging 정책에 의해 수집된 Apigee 로그를 파싱하고 이해하도록 기본 빌드됩니다.
  • Cloud Logging API를 사용하고 SecOps 서비스 계정에 IAM 역할을 부여하는 Google Cloud IAM 권한

Apigee를 SecOps와 통합

Google SecOps를 SIEM 솔루션으로 사용하는 경우 다음 단계에 따라 Apigee 로그 데이터를 SecOps로 전송하세요. 두 가지 기본 단계가 있습니다.

  • Apigee 로그 데이터를 Cloud Logging으로 전송하도록 MessageLogging 정책을 구성하세요.
  • MessageLogging 정책을 Apigee 프록시에 연결

이 섹션에 설명된 MessageLogging 정책 구성이 완료되면 Cloud Logging으로 전송된 Apigee 로그 데이터가 SecOps에서 파싱됩니다. 파서 및 Apigee 흐름 변수 데이터가 SecOps 데이터 필드에 매핑되는 방식에 관한 자세한 내용은 Apigee를 Google SecOps SIEM과 통합을 참조하세요. Apigee 로그 수집도 참조하세요.

MessageLogging 정책을 사용하여 Apigee를 SecOps와 통합하려면 다음 단계를 따르세요.

  1. 새 MessageLogging 정책을 구성합니다. UI에서 정책 연결 및 구성을 참조하세요.

    다음은 Cloud Logging으로 데이터를 전송하는 MessageLogging 정책의 예시입니다. 정책은 Cloud Logging으로 전송할 다수의 흐름 변수를 지정합니다. SecOps 분석에 중요한 필드에 따라 원하는 대로 흐름 변수를 추가하거나 제거할 수 있습니다. Apigee 흐름 변수 데이터가 SecOps 데이터 필드에 매핑되는 방식에 대한 자세한 내용은 Apigee를 Google SecOps SIEM과 통합을 참조하세요.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <MessageLogging continueOnError="false" enabled="true" name="ML-CloudLoggingSecOps">
       <DisplayName>ML-CloudLoggingSecOps</DisplayName>
       <CloudLogging>
         <LogName>projects/{organization.name}/logs/Apigee-SecOps-Integration-{environment.name}</LogName>
         <Message contentType="application/json">{
       "apiproduct.name": "{apiproduct.name}",
       "app.name": "{developer.app.name}",
       "cachehit":"{cachehit}",
       "client.country": "{client.country}",
       "client.cn": "{client.cn}",
       "client.ip": "{proxy.client.ip}",
       "client.locality": "{client.locality}",
       "client.port": "{client.port}",
       "client.scheme": "{client.scheme}",
       "client.state": "{client.state}",
       "developer.email": "{developer.email}",
       "environment.name": "{environment.name}",
       "error":"{is.error}",
       "error.state":"{error.state}",
       "error.message":"{escapeJSON(error.message)}",
       "fault.name":"{fault.name}",
       "messageid":"{messageid}",
       "organization.name": "{organization.name}",
       "proxy.name": "{apiproxy.name}",
       "proxy.basepath": "{proxy.basepath}",
       "proxy.pathsuffix": "{proxy.pathsuffix}",
       "proxy.proxyendpoint.name": "{proxy.name}",
       "proxy.revision":"{apiproxy.revision}",
       "request.content-length":"{request_msg.header.content-length}",
       "request.content-type":"{request_msg.header.content-type}",
       "request.host":"{request_msg.header.host}",
       "request.httpversion": "{request.version}",
       "request.url": "{client.scheme}://{request_msg.header.host}{request_msg.uri}",
       "request.user-agent":"{request.header.user-agent}",
       "request.verb": "{request.verb}",
       "request.x-b3-traceid": "{request.header.x-b3-traceid}",
       "request.x-cloud-trace-context": "{request.header.x-cloud-trace-context}",
       "response.content-length":"{response.header.content-length}",
       "response.content-type":"{response.header.content-type}",
       "response.status.code": "{message.status.code}",
       "system.region.name": "{system.region.name}",
       "system.timestamp": "{system.timestamp}",
       "system.uuid": "{system.uuid}",
       "target.cn": "{target.cn}",
       "target.country": "{target.country}",
       "target.host": "{target.host}",
       "target.ip": "{target.ip}",
       "target.locality": "{target.locality}",
       "target.organization": "{target.organization}",
       "target.port": "{target.port}",
       "target.scheme": "{target.scheme}",
       "target.state": "{target.state}",
       "target.url": "{request.url}"
      }
         </Message>
         <ResourceType>api</ResourceType>
       </CloudLogging>
      </MessageLogging>
  2. API 프록시에서 정책을 조건부 단계로 연결합니다. 한 가지 옵션은 보안 관련 오류가 일반적으로 발생하는 PostFlow의 FaultRule에 정책을 연결하는 것입니다. 예를 들면 다음과 같습니다.

    <PostFlow name="PostFlow">
      <Request>
        <Step>
          <Condition>flow.isError == true)</Condition>
          <Name>ML-CloudLoggingSecOps</Name>
        </Step>
      </Request>
    </PostFlow>

    이제 이 정책을 사용하는 API 프록시가 실행되면 Apigee 로그 데이터가 Google SecOps로 이동됩니다.

    또 다른 일반적인 방법은 MessageLogging 정책을 ProxyEndpoint 응답의 PostClientFlow에 배치하는 것입니다.

    API 프록시에 MessageLogging 정책을 연결할 때는 다음 권장사항을 고려하세요.

    • 정책을 FaultRule에 배치합니다. FaultRule은 보안 예외 및 정책 위반을 로깅하는 데 권장되는 위치입니다.
    • PostFlow에 정책을 배치합니다. PostFlow는 보안 문제를 로깅하기에 적합한 또 다른 위치입니다.
    • 성공적인 요청은 로깅하지 않습니다. 위협에 중점을 둔 보안 모니터링의 경우 일반적으로 문제가 발생하면(오류가 발생하면) 세부정보를 기록합니다. 모든 성공적인 요청을 전체 메시지 콘텐츠와 함께 로깅하면 과도한 로그가 생성되어 비용이 증가할 수 있습니다.
    • 특정 사용 사례의 경우 커스텀 변수를 고려하세요. 예를 들어 오류 흐름에서 원래 요청 URI를 캡처해야 하는 경우 요청 PreFlow에서 AssignMessage 정책을 사용하여 맞춤 변수(예: original.request.uri)에 복사한 다음 MessageLogging 정책에서 해당 변수를 로깅할 수 있습니다.

권장사항

Google SecOps로 Apigee를 구성할 때는 다음 권장사항을 고려하세요.

  • 보안 컨텍스트에 집중: 보안 모니터링 및 위협 감지에 유용한 컨텍스트를 제공하는 흐름 변수만 로깅합니다. 보안과 관련이 없는 데이터의 과도한 로깅을 피하세요.
  • 일관된 로깅 형식 사용: SecOps를 사용하는 API 프록시 전반에서 일관된 로깅 형식을 유지합니다.
  • 보안 서비스 계정 사용: SecOps 수집에 사용되는 Google Cloud 서비스 계정을 관리하고 보호하기 위한 보안 권장사항을 준수합니다. 가능하면 로그 뷰어로 권한을 제한합니다.
  • SecOps 피드 모니터링: 로그가 오류 없이 성공적으로 수집되고 있는지 확인하기 위해 SecOps 피드의 상태를 정기적으로 모니터링합니다.
  • SecOps 규칙 및 대시보드 사용: 보안 관련 로그가 SecOps에 있으면 로깅하는 세부정보를 기반으로 보안 위협을 감지하고 시각화하는 구체적인 규칙과 대시보드를 개발합니다.

문제 해결

이 섹션에서는 SecOps로 Apigee를 구성할 때 발생할 수 있는 여러 문제와 확인해야 할 사항을 설명합니다.

문제: 보안 이벤트 로그가 Cloud Logging에 표시되지 않음

확인 사항:

  • 보안 이벤트가 발생할 때 트리거되도록 MessageLogging 정책이 Condition으로 올바르게 구성되었는지 다시 확인합니다.
  • MessageLogging 정책이 FaultRule 또는 PostFlow와 같은 적절한 흐름 컨텍스트에 연결되어 있는지 확인합니다.
  • Google Cloud 프로젝트에서 Cloud Logging이 사용 설정되어 있는지 확인합니다.
  • MessageLogging 정책과 관련된 Apigee 프록시 로그의 오류 메시지를 검토합니다.

문제: 보안 이벤트 로그가 SecOps에 표시되지 않음

  • SecOps 피드가 올바른 프로젝트 ID, 로그 필터(보안 로깅 정책의 로그를 캡처하는지 확인) 및 서비스 계정 사용자 인증 정보로 올바르게 구성되었는지 확인합니다.
  • SecOps UI에서 SecOps 피드의 상태를 확인하여 오류 메시지나 수집 문제가 있는지 확인합니다.
  • SecOps에서 사용하는 서비스 계정에 Google Cloud 프로젝트에서 로그 뷰어 역할이 있는지 확인합니다.
  • Cloud Logging에서 로그의 JSON 구조를 검토하여 형식이 올바르고 예상되는 필드 이름이 포함되어 있는지 확인합니다.
  • 적절한 Google Cloud 파서가 사용 설정되어 있는지 확인합니다.
  • 파싱 문제가 의심되면 SecOps 원시 데이터에서 샘플 로그 항목을 검사하여 파싱 전에 어떻게 수집되었는지 확인합니다. 특정 필드가 예상대로 추출되지 않으면 SecOps 파서 문서를 검토하거나 커스텀 파서가 필요한지 고려해야 할 수 있습니다.

Apigee를 Google SecOps SIEM과 통합

다음 표에서는 Apigee 흐름 변수 이름을 이에 상응하는 Google SecOps SIEM 필드 이름에 매핑합니다. 예를 들어 Cloud Logging에서 Apigee 로그 데이터를 볼 때 client.id 흐름 변수는 principle_ip라는 SecOps SIEM 필드에 매핑됩니다. Apigee 로그 수집도 참조하세요.

Apigee 흐름 변수 SecOps SIEM 필드 이름 설명
client.country principal.hostname ProxyEndpoint에서 수신한 요청과 연결된 HTTP 호스트 IP입니다.
client.host principal.location.country_or_region 클라이언트 앱에서 제공하는 TLS/SSL 인증서의 국가입니다. 프록시 요청 principal.location.country_or_region입니다.
client_ip principle.ip 부하 분산기에 메시지를 보내는 클라이언트 또는 시스템의 IP 주소입니다. 예를 들어 원래 클라이언트 IP 또는 부하 분산기 IP일 수 있습니다.
client.locality principal.location.city 클라이언트에서 제공한 TLS/SSL 인증서의 지역(도시)입니다.
client.port principal.port ProxyEndpoint에 보내는 발신 클라이언트의 요청과 연결된 HTTP 포트입니다.
client.state principal.location.state 클라이언트에서 제공한 TLS/SSL 인증서의 상태입니다.
organization.name intermediary.cloud.project.name Apigee 조직의 이름입니다.
proxy.client.ip src.ip Apigee가 최종 외부 TCP 핸드셰이크에서 수신한 IP 주소인 인바운드 전화의 X-Forwarded-For 주소입니다. 호출 클라이언트 또는 부하 분산기일 수 있습니다.
proxy.name intermediary.resource.name ProxyEndpoint에 구성된 이름 속성입니다.
proxy.pathsuffix intermediary.resource.attribute.labels[pathsuffix] '클라이언트에서 전송되고 ProxyEndpoint에 수신되는 URL의 경로 서픽스 값입니다. 기본 경로는 환경 그룹 내에서 API 프록시를 고유하게 식별하는 가장 왼쪽 경로 구성요소입니다. 기본 경로가 /v2/weatherapi인 API 프록시 엔드포인트가 구성되어 있다고 가정합니다. 이 경우 https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282로 전송되는 요청은 proxy.pathsuffix 변수에 /forecastrss 문자열이 포함됩니다.
proxy.url intermediary.url 쿼리 매개변수를 포함하여 ProxyEndpoint에서 수신한 프록시 요청과 연결된 전체 URL을 가져옵니다. proxy.url에 사용되는 라우터 호스트 대신 원래 요청 호스트를 사용하여 요청 URL을 구성하는 예시는 액세스 요청 메시지를 참조하세요.'
request.uri target.resource.name API 프록시에 응답을 반환하는 대상 서비스의 도메인 이름입니다.
request_verb network.http.method 요청에 사용되는 HTTP 동사입니다. 예를 들면 GET, PUT, DELETE입니다.
response.content security_result.description 대상이 반환한 응답 메시지의 페이로드 콘텐츠입니다.
response.status.code network.http.response_code 요청에 대해 반환된 응답 코드입니다. 이 변수를 사용하여 message.status.code에 저장된 응답 상태 코드를 재정의할 수 있습니다. 자세한 내용은 메시지를 참조하세요.
system.region.name intermediary.location.name 프록시가 실행 중인 데이터 센터 리전의 이름입니다.
system.timestamp additional.fields[jsonPayload_system_timestamp] 이 변수를 읽은 시간을 나타내는 64비트(long) 정수입니다. 1970년 1월 1일(UTC) 자정부터 경과한 시간을 밀리초 단위로 나타낸 값입니다. 예시: 1534783015000.
system.uuid intermediary.process.pid 또는 intermediary.process.product_specific_process_id 프록시를 처리하는 메시지 프로세서의 UUID입니다.
target.country target.location.country_or_region 대상 서버에서 제공한 TLS/SSL 인증서의 국가입니다.
target.host target.hostname API 프록시에 응답을 반환하는 대상 서비스의 도메인 이름입니다.
target.ip target.ip API 프록시에 응답을 반환하는 대상 서비스의 IP 주소입니다.
target.locality target.location.city 대상 서버에서 제공한 TLS/SSL 인증서의 지역(도시)입니다.
target.organization target.resource_ancestors.name 대상 서버에서 제공한 TLS/SSL 인증서의 조직입니다.
target.port target.port API 프록시에 대한 응답을 반환하는 대상 서비스의 포트 번호입니다.
target.scheme target.network.application_protocol 요청 메시지에 따라 HTTP 또는 HTTPS를 반환합니다.
target.state target.location.state 대상 서버에서 제공한 TLS/SSL 인증서의 상태입니다.
target.url target.url TargetEndpoint XML 파일 또는 동적 대상 URL에서 구성된 URL(메시지 흐름 중에 target.url이 설정된 경우)입니다. 변수는 추가 경로 요소 또는 쿼리 매개변수를 포함하지 않습니다. 지원 범위를 벗어나거나 설정되지 않은 경우 null을 반환합니다.

참고: 이 변수를 설정하려면 TargetEndpoint에 연결된 JavaScript 정책을 사용하세요.