GITHUB

Compatible con:

En este documento, se explica cómo transferir registros de auditoría de GitHub a las Operaciones de seguridad de Google con Amazon S3. El analizador intenta extraer datos del campo "message" con varios patrones de Grok, y controla los formatos JSON y no JSON. Según el "process_type" extraído, aplica una lógica de análisis específica con grok, kv y otros filtros para asignar los datos de registro sin procesar al esquema del modelo de datos unificado (UDM).

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Instancia de Google SecOps.
  • Acceso privilegiado al arrendatario de GitHub Enterprise Cloud con permisos de propietario de la empresa
  • Acceso con privilegios a AWS (S3, IAM).

Recopila los requisitos previos de GitHub Enterprise Cloud (acceso a Enterprise)

  1. Accede a la Consola del administrador de GitHub Enterprise Cloud.
  2. Ve a Configuración de la empresa > Configuración > Registro de auditoría > Transmisión de registros.
  3. Asegúrate de tener permisos de propietario de la empresa para configurar la transmisión de registros de auditoría.
  4. Copia y guarda en una ubicación segura los siguientes detalles:
    • Nombre de la empresa de GitHub
    • Nombres de organizaciones dentro de la empresa

Configura el bucket de S3 de AWS y Identity and Access Management para Google SecOps

  1. Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Crea un bucket
  2. Guarda el Nombre y la Región del bucket para futuras referencias (por ejemplo, github-audit-logs).
  3. Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. Haz clic en Crear clave de acceso en la sección Claves de acceso.
  7. Selecciona Servicio de terceros como Caso de uso.
  8. Haz clic en Siguiente.
  9. Opcional: Agrega una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo .CSV para guardar la clave de acceso y la clave de acceso secreta para consultarlas en el futuro.
  12. Haz clic en Listo.

Configura la política de IAM para la transmisión de S3 de GitHub

  1. En la consola de AWS, ve a IAM > Políticas > Crear política > pestaña JSON.
  2. Copia y pega la siguiente política.
  3. JSON de la política (reemplaza github-audit-logs si ingresaste un nombre de bucket diferente):

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Sid": "AllowPutObjects",
        "Effect": "Allow",
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        }
    ]
    }
    
  4. Haz clic en Siguiente > Crear política.

  5. Asigna el nombre GitHubAuditStreamingPolicy a la política y haz clic en Crear política.

  6. Regresa al usuario de IAM que creaste anteriormente.

  7. Selecciona la pestaña Permisos.

  8. Haz clic en Agregar permisos > Adjuntar políticas directamente.

  9. Busca y selecciona GitHubAuditStreamingPolicy.

  10. Haz clic en Siguiente > Agregar permisos.

Configura la transmisión de registros de auditoría de GitHub Enterprise Cloud

  1. Accede a GitHub Enterprise Cloud como propietario de la empresa.
  2. Haz clic en tu foto de perfil y, luego, en Configuración de la empresa.
  3. En la barra lateral de la cuenta empresarial, haz clic en Configuración > Registro de auditoría > Transmisión de registros.
  4. Selecciona Configurar flujo y haz clic en Amazon S3.
  5. En Authentication, haz clic en Access keys.
  6. Proporciona los siguientes detalles de configuración:
    • Región: Selecciona la región del bucket (por ejemplo, us-east-1).
    • Bucket: Escribe el nombre del bucket al que deseas transmitir (por ejemplo, github-audit-logs).
    • ID de clave de acceso: Ingresa el ID de tu clave de acceso del usuario de IAM.
    • Clave secreta: Ingresa tu clave secreta del usuario de IAM.
  7. Haz clic en Verificar extremo para verificar que GitHub pueda conectarse y escribir en el extremo de Amazon S3.
  8. Después de verificar correctamente el extremo, haz clic en Guardar.

Crea un usuario y claves de IAM de solo lectura para Google SecOps

  1. Ve a Consola de AWS > IAM > Usuarios > Agregar usuarios.
  2. Haz clic en Agregar usuarios.
  3. Proporciona los siguientes detalles de configuración:
    • Usuario: Ingresa secops-reader.
    • Tipo de acceso: Selecciona Clave de acceso: Acceso programático.
  4. Haz clic en Crear usuario.
  5. Adjunta la política de lectura mínima (personalizada): Usuarios > secops-reader > Permisos > Agregar permisos > Adjuntar políticas directamente > Crear política.
  6. JSON:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Action": ["s3:GetObject"],
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        },
        {
        "Effect": "Allow",
        "Action": ["s3:ListBucket"],
        "Resource": "arn:aws:s3:::github-audit-logs"
        }
    ]
    }
    
  7. Nombre = secops-reader-policy.

  8. Haz clic en Crear política > busca o selecciona > Siguiente > Agregar permisos.

  9. Crea una clave de acceso para secops-reader: Credenciales de seguridad > Claves de acceso > Crear clave de acceso > descarga el archivo .CSV (pegarás estos valores en el feed).

Configura un feed en Google SecOps para transferir registros de GitHub

  1. Ve a SIEM Settings > Feeds.
  2. Haz clic en + Agregar feed nuevo.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, GitHub audit logs).
  4. Selecciona Amazon S3 V2 como el Tipo de fuente.
  5. Selecciona GitHub como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:
    • URI de S3: s3://github-audit-logs/
    • Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
    • Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días especificada. El valor predeterminado es de 180 días.
    • ID de clave de acceso: Clave de acceso del usuario con acceso al bucket de S3.
    • Clave de acceso secreta: Clave secreta del usuario con acceso al bucket de S3.
    • Espacio de nombres del recurso: Es el espacio de nombres del recurso.
    • Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
actor principal.user.userid El valor se toma del campo actor.
actor_id principal.user.attribute.labels.value El valor se toma del campo actor_id.
actor_ip principal.ip El valor se toma del campo actor_ip.
actor_location.country_code principal.location.country_or_region El valor se toma del campo actor_location.country_code.
application_name target.application El valor se toma del campo application_name.
business target.user.company_name El valor se toma del campo business.
business_id target.resource.attribute.labels.value El valor se toma del campo business_id.
config.url target.url El valor se toma del campo config.url.
created_at metadata.event_timestamp El valor se convierte de milisegundos de UNIX a una marca de tiempo.
data.cancelled_at extensions.vulns.vulnerabilities.scan_end_time El valor se convierte del formato ISO8601 a una marca de tiempo.
data.email target.email El valor se toma del campo data.email.
data.event security_result.about.labels.value El valor se toma del campo data.event.
data.events security_result.about.labels.value El valor se toma del campo data.events.
data.head_branch security_result.about.labels.value El valor se toma del campo data.head_branch.
data.head_sha target.file.sha256 El valor se toma del campo data.head_sha.
data.hook_id target.resource.attribute.labels.value El valor se toma del campo data.hook_id.
data.started_at extensions.vulns.vulnerabilities.scan_start_time El valor se convierte del formato ISO8601 a una marca de tiempo.
data.team target.user.group_identifiers El valor se toma del campo data.team.
data.trigger_id security_result.about.labels.value El valor se toma del campo data.trigger_id.
data.workflow_id security_result.about.labels.value El valor se toma del campo data.workflow_id.
data.workflow_run_id security_result.about.labels.value El valor se toma del campo data.workflow_run_id.
enterprise.name additional.fields.value.string_value El valor se toma del campo enterprise.name.
external_identity_nameid target.user.email_addresses Si el valor es una dirección de correo electrónico, se agrega al array target.user.email_addresses.
external_identity_nameid target.user.userid El valor se toma del campo external_identity_nameid.
external_identity_username target.user.user_display_name El valor se toma del campo external_identity_username.
hashed_token network.session_id El valor se toma del campo hashed_token.
job_name target.resource.attribute.labels.value El valor se toma del campo job_name.
job_workflow_ref target.resource.attribute.labels.value El valor se toma del campo job_workflow_ref.
org target.administrative_domain El valor se toma del campo org.
org_id additional.fields.value.string_value El valor se toma del campo org_id.
programmatic_access_type additional.fields.value.string_value El valor se toma del campo programmatic_access_type.
public_repo additional.fields.value.string_value El valor se toma del campo public_repo.
public_repo target.location.name Si el valor es "false", se asigna a "PRIVATE". De lo contrario, se asigna a "PUBLIC".
query_string additional.fields.value.string_value El valor se toma del campo query_string.
rate_limit_remaining additional.fields.value.string_value El valor se toma del campo rate_limit_remaining.
repo target.resource.name El valor se toma del campo repo.
repo_id additional.fields.value.string_value El valor se toma del campo repo_id.
repository_public additional.fields.value.string_value El valor se toma del campo repository_public.
request_body additional.fields.value.string_value El valor se toma del campo request_body.
request_method network.http.method El valor se convierte en mayúsculas.
route additional.fields.value.string_value El valor se toma del campo route.
status_code network.http.response_code El valor se convierte en un número entero.
timestamp metadata.event_timestamp El valor se convierte de milisegundos de UNIX a una marca de tiempo.
token_id additional.fields.value.string_value El valor se toma del campo token_id.
token_scopes additional.fields.value.string_value El valor se toma del campo token_scopes.
transport_protocol_name network.application_protocol El valor se convierte en mayúsculas.
url_path target.url El valor se toma del campo url_path.
user target.user.user_display_name El valor se toma del campo user.
user_agent network.http.user_agent El valor se toma del campo user_agent.
user_agent network.http.parsed_user_agent Se analiza el valor.
user_id target.user.userid El valor se toma del campo user_id.
workflow.name security_result.about.labels.value El valor se toma del campo workflow.name.
workflow_run.actor.login principal.user.userid El valor se toma del campo workflow_run.actor.login.
workflow_run.event additional.fields.value.string_value El valor se toma del campo workflow_run.event.
workflow_run.head_branch security_result.about.labels.value El valor se toma del campo workflow_run.head_branch.
workflow_run.head_sha target.file.sha256 El valor se toma del campo workflow_run.head_sha.
workflow_run.id target.resource.attribute.labels.value El valor se toma del campo workflow_run.id.
workflow_run.workflow_id security_result.about.labels.value El valor se toma del campo workflow_run.workflow_id.
N/A metadata.event_type El valor se determina según los campos action y actor. Si el campo action contiene "_member", el valor se establece en "USER_RESOURCE_UPDATE_PERMISSIONS". Si el campo action no está vacío y el campo actor no está vacío, el valor se establece en "USER_RESOURCE_UPDATE_CONTENT". De lo contrario, el valor se establece en "USER_RESOURCE_ACCESS".
N/A metadata.log_type El valor se establece en "GITHUB".
N/A metadata.product_name El valor se establece en "GITHUB".
N/A metadata.vendor_name El valor se establece en "GITHUB".
N/A target.resource.resource_type El valor se establece en "STORAGE_OBJECT".
N/A security_result.about.labels.key El valor se establece en una cadena constante según el campo data correspondiente. Por ejemplo, para data.workflow_id, la clave se establece en "ID de flujo de trabajo".
N/A target.resource.attribute.labels.key El valor se establece en una cadena constante según el campo data correspondiente. Por ejemplo, para data.hook_id, la clave se establece en "ID de gancho".

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.