GITHUB
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)
- Accede a la Consola del administrador de GitHub Enterprise Cloud.
- Ve a Configuración de la empresa > Configuración > Registro de auditoría > Transmisión de registros.
- Asegúrate de tener permisos de propietario de la empresa para configurar la transmisión de registros de auditoría.
- 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
- Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Crea un bucket
- Guarda el Nombre y la Región del bucket para futuras referencias (por ejemplo,
github-audit-logs
). - Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
- Selecciona el usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- Haz clic en Crear clave de acceso en la sección Claves de acceso.
- Selecciona Servicio de terceros como Caso de uso.
- Haz clic en Siguiente.
- Opcional: Agrega una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo .CSV para guardar la clave de acceso y la clave de acceso secreta para consultarlas en el futuro.
- Haz clic en Listo.
Configura la política de IAM para la transmisión de S3 de GitHub
- En la consola de AWS, ve a IAM > Políticas > Crear política > pestaña JSON.
- Copia y pega la siguiente política.
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/*" } ] }
Haz clic en Siguiente > Crear política.
Asigna el nombre
GitHubAuditStreamingPolicy
a la política y haz clic en Crear política.Regresa al usuario de IAM que creaste anteriormente.
Selecciona la pestaña Permisos.
Haz clic en Agregar permisos > Adjuntar políticas directamente.
Busca y selecciona
GitHubAuditStreamingPolicy
.Haz clic en Siguiente > Agregar permisos.
Configura la transmisión de registros de auditoría de GitHub Enterprise Cloud
- Accede a GitHub Enterprise Cloud como propietario de la empresa.
- Haz clic en tu foto de perfil y, luego, en Configuración de la empresa.
- En la barra lateral de la cuenta empresarial, haz clic en Configuración > Registro de auditoría > Transmisión de registros.
- Selecciona Configurar flujo y haz clic en Amazon S3.
- En Authentication, haz clic en Access keys.
- 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.
- Región: Selecciona la región del bucket (por ejemplo,
- Haz clic en Verificar extremo para verificar que GitHub pueda conectarse y escribir en el extremo de Amazon S3.
- Después de verificar correctamente el extremo, haz clic en Guardar.
Crea un usuario y claves de IAM de solo lectura para Google SecOps
- Ve a Consola de AWS > IAM > Usuarios > Agregar usuarios.
- Haz clic en Agregar usuarios.
- Proporciona los siguientes detalles de configuración:
- Usuario: Ingresa
secops-reader
. - Tipo de acceso: Selecciona Clave de acceso: Acceso programático.
- Usuario: Ingresa
- Haz clic en Crear usuario.
- Adjunta la política de lectura mínima (personalizada): Usuarios > secops-reader > Permisos > Agregar permisos > Adjuntar políticas directamente > Crear política.
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" } ] }
Nombre =
secops-reader-policy
.Haz clic en Crear política > busca o selecciona > Siguiente > Agregar permisos.
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
- Ve a SIEM Settings > Feeds.
- Haz clic en + Agregar feed nuevo.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
GitHub audit logs
). - Selecciona Amazon S3 V2 como el Tipo de fuente.
- Selecciona GitHub como el Tipo de registro.
- Haz clic en Siguiente.
- 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.
- URI de S3:
- Haz clic en Siguiente.
- 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.