Recoger registros de auditoría de Azure DevOps

Disponible en:

Información general

Este analizador gestiona los registros de auditoría de Azure DevOps en formato JSON. Extrae campos de estructuras JSON anidadas y de nivel superior, y los asigna al UDM. La lógica condicional basada en valores de campos específicos clasifica los eventos y enriquece el resultado con información de seguridad relevante. El analizador también gestiona los mensajes con formato no JSON intentando extraer una carga útil JSON mediante patrones grok.

Antes de empezar

Asegúrate de que cumples los siguientes requisitos previos:

  • Instancia de Google SecOps
  • Una organización de Azure DevOps activa
  • Acceso privilegiado a la organización de Azure DevOps y a Azure

Configurar feeds

Hay dos puntos de entrada diferentes para configurar feeds en la plataforma Google SecOps:

  • Configuración de SIEM > Feeds > Añadir nuevo
  • Centro de contenido > Paquetes de contenido > Empezar

Cómo configurar el feed de auditoría de Azure DevOps

  1. Haz clic en el paquete Plataforma de Azure.
  2. Busca el tipo de registro Auditoría de Azure DevOps y haz clic en Añadir nuevo feed.
  3. Especifique los valores de los siguientes campos:

    • Tipo de fuente: Microsoft Azure Blob Storage V2.
    • URI de Azure: la URL del endpoint del blob.
      • ENDPOINT_URL/BLOB_NAME
        • Sustituye lo siguiente:
          • ENDPOINT_URL: URL del endpoint de blob (https://<storageaccountname>.blob.core.windows.net)
          • BLOB_NAME: el nombre del blob (por ejemplo, insights-logs-<logname>)
    • Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras según tus preferencias de ingesta.

    • Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es de 180 días.

    • Clave compartida: clave compartida (una cadena aleatoria de 512 bits codificada en base 64) que se usa para acceder a los recursos de Azure.

    Opciones avanzadas

    • Nombre del feed: valor rellenado automáticamente que identifica el feed.
    • Espacio de nombres de recursos: el espacio de nombres de recursos.
    • Etiquetas de ingestión: la etiqueta aplicada a los eventos de este feed.
  4. Haga clic en Crear feed.

Para obtener más información sobre cómo configurar varios feeds para diferentes tipos de registros en esta familia de productos, consulta el artículo Configurar feeds por producto.

Crear una clave de API para la feed de webhook

  1. Ve a la consolaGoogle Cloud > Credenciales.

    Ir a Credenciales

  2. Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.

  3. Restringe el acceso de la clave de API a la API Google Security Operations.

Especificar la URL del endpoint

  1. En tu aplicación cliente, especifica la URL del endpoint HTTPS proporcionada en el feed de webhook.
  2. Para habilitar la autenticación, especifica la clave de API y la clave secreta como parte del encabezado personalizado con el siguiente formato:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Recomendación: Especifica la clave de API como encabezado en lugar de hacerlo en la URL. Si tu cliente de webhook no admite encabezados personalizados, puedes especificar la clave de API y la clave secreta mediante parámetros de consulta con el siguiente formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Haz los cambios siguientes:

  • ENDPOINT_URL: URL del endpoint del feed.
  • API_KEY: la clave de API para autenticarte en Google Security Operations.
  • SECRET: la clave secreta que has generado para autenticar el feed.

Configurar la función de auditoría en Azure DevOps

  1. Inicia sesión en tu organización (https://dev.azure.com/{yourorganization}).
  2. Selecciona el icono de rueda dentada para acceder a la configuración de la organización.
  3. Selecciona Políticas en Seguridad.
  4. Activa el botón Registrar eventos de auditoría.

Configurar un tema de Event Grid en Azure

  1. Inicia sesión en Azure Portal.
  2. Busca y accede a Event Grid.
  3. Busca Temas en Eventos personalizados.
  4. Haz clic en + Crear.
  5. Seleccione su Suscripción y su Grupo de recursos. Proporcione un nombre (por ejemplo, DevopsAuditLog) y seleccione la región. Haz clic en Revisar y crear.
  6. Accede al nuevo Tema y copia la URL del endpoint del tema.
  7. Ve a Configuración > Teclas de acceso y copia Clave 1.

Configurar el flujo de registros de Azure DevOps en Event Grid

  1. Inicia sesión en tu organización (https://dev.azure.com/{yourorganization}).
  2. Selecciona el icono de rueda dentada para acceder a la configuración de la organización.
  3. Selecciona Auditoría.
  4. Ve a la pestaña Streams (Flujos) y selecciona New stream (Nuevo flujo) > Event Grid (Event Grid).
  5. Introduce el endpoint del tema y la clave de acceso creados en Configurar un tema de Event Grid en Azure.

Configurar un webhook en Azure DevOps para Google SecOps

  1. En Azure Portal, busca y accede a Event Grid.
  2. Selecciona un tema creado anteriormente.
  3. Vaya a Entidades > Suscripción a eventos.
  4. Haz clic en + Event Subscription (+ Suscripción a evento).
  5. Proporcione un nombre descriptivo (por ejemplo, *Google SecOps Integration).
  6. Seleccione Web Hook (Webhook) y haga clic en Configurar un endpoint.
  7. Configura el endpoint:
    1. Endpoint del suscriptor: introduce la URL del endpoint de la API Google SecOps.
    2. En la sección Encabezados HTTP, añade los siguientes encabezados:
    3. Asigna el valor application/json al encabezado Content-Type.
  8. Haz clic en Crear.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
ActivityId metadata.product_log_id Se asigna directamente desde el campo Id del registro sin procesar cuando el campo records no está presente, o desde el campo ActivityId del objeto data cuando records está presente.
ActionId metadata.product_event_type Se asigna directamente desde el campo ActionId del objeto data.
ActorCUID additional.fields Se incluye como un campo adicional con la clave "Actor CUID".
ActorDisplayName principal.user.user_display_name Se asigna directamente desde el campo ActorDisplayName si no es "Azure DevOps Service". Si es "Azure DevOps Service", se añade como etiqueta a principal.resource.attribute.labels.
ActorUPN principal.user.email_addresses Se asigna directamente desde el campo ActorUPN si coincide con un patrón de dirección de correo.
ActorUserId principal.user.userid Se asigna directamente desde el campo ActorUserId.
Area target.application Se usa para crear el campo target.application añadiendo "DevOps " al valor de Area.
AuthenticationMechanism extensions.auth.auth_details, security_result.rule_id Se ha analizado para extraer los detalles de autenticación y el ID de la regla. Los detalles de autenticación se asignan a extensions.auth.auth_details. El ID de regla extraído se asigna a security_result.rule_id.
CategoryDisplayName security_result.action_details Asignado directamente a security_result.action_details.
City principal.location.city Se asigna directamente desde el campo City.
Conditions additional.fields Se ha añadido como campo adicional con la clave "Conditions".
Country principal.location.country_or_region Se asigna directamente desde el campo Country.
Data.* Varias Los campos del objeto Data se asignan a diferentes campos de UDM en función de sus nombres y contexto. A continuación, se proporcionan ejemplos específicos.
Data.AccessLevel target.resource.attribute.labels Se ha añadido como etiqueta con la clave "AccessLevel".
Data.AgentId target.resource.product_object_id Se asigna a target.resource.product_object_id si PipelineId y AuthorizationId no están presentes.
Data.AgentName target.resource.name Se asigna a target.resource.name si no están presentes PipelineName, NamespaceName y DisplayName.
Data.AuthorizationId target.resource.product_object_id Se asigna a target.resource.product_object_id si no se incluye PipelineId.
Data.CallerProcedure additional.fields Se ha añadido como campo adicional con la clave "CallerProcedure".
Data.CheckSuiteId additional.fields Se ha añadido como campo adicional con la clave "CheckSuiteId".
Data.CheckSuiteStatus additional.fields Se ha añadido como campo adicional con la clave "CheckSuiteStatus".
Data.ConnectionId additional.fields Se ha añadido como campo adicional con la clave "ConnectionId".
Data.ConnectionName additional.fields Se ha añadido como campo adicional con la clave "ConnectionName".
Data.ConnectionType additional.fields Se ha añadido como campo adicional con la clave "ConnectionType".
Data.DefinitionId additional.fields Se ha añadido como campo adicional con la clave "DefinitionId".
Data.DeploymentResult additional.fields Se ha añadido como campo adicional con la clave "DeploymentResult".
Data.DisplayName target.resource.name Se asigna a target.resource.name si PipelineName y NamespaceName no están presentes.
Data.EndpointIdList additional.fields Se ha añadido como campo adicional con la clave "EndpointIdList".
Data.EnvironmentName additional.fields Se ha añadido como un campo adicional con la clave "EnvironmentName".
Data.Filter.continuationToken target.resource.attribute.labels Se ha añadido como etiqueta con la clave "continuation_token".
Data.Filter.endTime target.resource.attribute.labels Se ha añadido como etiqueta con la clave "filter_end_time".
Data.Filter.startTime target.resource.attribute.labels Se ha añadido como etiqueta con la clave "filter_start_time".
Data.FinishTime additional.fields Se ha añadido como campo adicional con la clave "FinishTime".
Data.GroupId target.group.product_object_id Se asigna directamente a target.group.product_object_id cuando Data.Updates.0.GroupId no está presente.
Data.GroupName target.group.group_display_name Asignado directamente a target.group.group_display_name.
Data.JobName additional.fields Se ha añadido como campo adicional con la clave "JobName".
Data.MemberId target.user.userid Se asigna directamente a target.user.userid cuando Data.Updates.0.MemberId no está presente.
Data.MemberDisplayName target.user.user_display_name Asignado directamente a target.user.user_display_name.
Data.NamespaceId target.resource.product_object_id Se asigna a target.resource.product_object_id si no están presentes PipelineId, AuthorizationId y AgentId.
Data.NamespaceName target.resource.name Se asigna a target.resource.name si no se incluye PipelineName.
Data.ownerDetails additional.fields Se ha añadido como campo adicional con la clave "OwnerDetails".
Data.OwnerId additional.fields Se ha añadido como campo adicional con la clave "OwnerId".
Data.PipelineId target.resource.product_object_id Asignado directamente a target.resource.product_object_id.
Data.PipelineName target.resource.name Asignado directamente a target.resource.name.
Data.PipelineRevision target.resource.attribute.labels Se ha añadido como etiqueta con la clave "PipelineRevision".
Data.PipelineScope target.resource.attribute.labels Se ha añadido como etiqueta con la clave "PipelineScope".
Data.PlanType additional.fields Se ha añadido como campo adicional con la clave "PlanType".
Data.PreviousAccessLevel target.resource.attribute.labels Se ha añadido como etiqueta con la clave "PreviousAccessLevel".
Data.PublisherName target.resource.attribute.labels Se ha añadido como etiqueta con la clave "PublisherName".
Data.Reason additional.fields Se ha añadido como campo adicional con la clave "Reason".
Data.ReleaseId additional.fields Se ha añadido como campo adicional con la clave "ReleaseId".
Data.ReleaseName additional.fields Se ha añadido como campo adicional con la clave "ReleaseName".
Data.RequesterId additional.fields Se ha añadido como campo adicional con la clave "RequesterId".
Data.RetentionLeaseId additional.fields Se ha añadido como campo adicional con la clave "RetentionLeaseId".
Data.RetentionOwnerId additional.fields Se ha añadido como campo adicional con la clave "RetentionOwnerId".
Data.RunName additional.fields Se ha añadido como campo adicional con la clave "RunName".
Data.Scopes target.resource.attribute.labels Se han añadido como etiquetas con la clave "Scope".
Data.StageName additional.fields Se ha añadido como campo adicional con la clave "StageName".
Data.StartTime additional.fields Se ha añadido como campo adicional con la clave "StartTime".
Data.TargetUser target.user.userid Asignado directamente a target.user.userid.
Data.Timestamp metadata.event_timestamp Analizado y asignado a metadata.event_timestamp.
Data.TokenType target.resource.attribute.labels Se ha añadido como etiqueta con la clave "TokenType".
Data.Updates.0.GroupId target.group.product_object_id Asignado directamente a target.group.product_object_id.
Data.Updates.0.MemberId target.user.userid Asignado directamente a target.user.userid.
Data.ValidFrom target.resource.attribute.labels Se ha añadido como etiqueta con la clave "ValidFrom".
Data.ValidTo target.resource.attribute.labels Se ha añadido como etiqueta con la clave "ValidTo".
DewPoint additional.fields Se ha añadido como campo adicional con la clave "DewPoint".
Details metadata.description Asignado directamente a metadata.description.
Humidity additional.fields Se ha añadido como campo adicional con la clave "Humidity".
Icon additional.fields Se ha añadido como campo adicional con la clave "Icon".
Id metadata.product_log_id Asignado directamente a metadata.product_log_id.
IpAddress principal.ip Asignado directamente a principal.ip.
MoonPhase additional.fields Se ha añadido como campo adicional con la clave "MoonPhase".
Moonrise additional.fields Se ha añadido como campo adicional con la clave "Moonrise".
Moonset additional.fields Se ha añadido como campo adicional con la clave "Moonset".
OperationName metadata.product_event_type Asignado directamente a metadata.product_event_type.
Precipitation additional.fields Se ha añadido como campo adicional con la clave "Precipitation".
Pressure additional.fields Se ha añadido como campo adicional con la clave "Pressure".
ProjectId target.resource_ancestors.product_object_id Se usa para rellenar el campo product_object_id de target.resource_ancestors cuando el elemento antecesor es del tipo CLOUD_PROJECT.
ProjectName target.resource_ancestors.name, target.resource.attribute.labels Se usa para rellenar el campo name de target.resource_ancestors cuando el elemento antecesor es del tipo CLOUD_PROJECT. También se ha añadido como etiqueta a target.resource.attribute.labels con la clave "ProjectName".
RoleLocation target.location.name Asignado directamente a target.location.name.
ScopeDisplayName target.resource_ancestors.name Se usa para rellenar el campo name de target.resource_ancestors cuando el elemento antecesor es del tipo CLOUD_ORGANIZATION.
ScopeId target.resource_ancestors.product_object_id Se usa para rellenar el campo product_object_id de target.resource_ancestors cuando el elemento antecesor es del tipo CLOUD_ORGANIZATION.
ScopeType additional.fields Se ha añadido como campo adicional con la clave "ScopeType".
Sunrise additional.fields Se ha añadido como campo adicional con la clave "Sunrise".
Sunset additional.fields Se ha añadido como campo adicional con la clave "Sunset".
Temperature additional.fields Se ha añadido como campo adicional con la clave "Temperature".
TenantId metadata.product_deployment_id, additional.fields Asignado directamente a metadata.product_deployment_id. También se ha añadido como campo adicional con la clave "TenantId".
TimeGenerated metadata.event_timestamp Analizado y asignado a metadata.event_timestamp.
UserAgent network.http.user_agent, network.http.parsed_user_agent Asignado directamente a network.http.user_agent. También se ha analizado y asignado a network.http.parsed_user_agent.
UVIndex additional.fields Se ha añadido como campo adicional con la clave "UVIndex".
Visibility additional.fields Se ha añadido como campo adicional con la clave "Visibility".
WindDirection additional.fields Se ha añadido como campo adicional con la clave "WindDirection".
WindSpeed additional.fields Se ha añadido como campo adicional con la clave "WindSpeed".
_Internal_WorkspaceResourceId additional.fields Se ha añadido como un campo adicional con la clave "workspace_resource_id".
N/A metadata.event_type Se determina mediante una lógica basada en OperationName y otros campos. Si no se encuentra ningún tipo de evento específico, el valor predeterminado es "GENERIC_EVENT". Entre los valores posibles se incluyen "STATUS_SHUTDOWN", "RESOURCE_CREATION", "STATUS_UPDATE", "USER_RESOURCE_DELETION", "RESOURCE_READ", "RESOURCE_WRITTEN", "RESOURCE_DELETION" y "GROUP_MODIFICATION".
N/A metadata.vendor_name Selecciona "Microsoft".
N/A metadata.product_name Selecciona "Azure DevOps".
N/A metadata.log_type Se ha definido como "AZURE_DEVOPS".
N/A principal.user.account_type Asigna el valor "SERVICE_ACCOUNT_TYPE" si AuthenticationMechanism contiene "ServicePrincipal". De lo contrario, asigna el valor "CLOUD_ACCOUNT_TYPE".
N/A target.asset.attribute.cloud.environment Su valor debe ser MICROSOFT_AZURE.
N/A security_result.action Se asigna el valor "ALLOW" a las operaciones correctas (Succeeded, Created, Modified, executed, updated, removed) y "BLOCK" a las operaciones fallidas (Failed, TimedOut).
N/A extensions.auth.mechanism Se asigna el valor "USERNAME_PASSWORD" si summary es "UserAuthToken".
N/A target.resource.resource_type Se asigna el valor "SETTING" si pipeline_id está presente, "CREDENTIAL" si authorization_id está presente, "DEVICE" si agent_id está presente o "DATABASE" si namespace_id está presente. De lo contrario, en algunos casos se le asigna el valor "STORAGE_BUCKET" en función de operationName.
N/A target.resource.resource_subtype Se asigna el valor "Pipeline" si pipeline_id está presente, "Token" si authorization_id está presente, "Agent" si agent_id está presente o "Namespace" si namespace_id está presente.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.