# Administración de registros

### Habilitar el registro en Azure Monitor

Desde la versión 3.0, SCEPman, así como Certificate Master, utilizarán la API de Ingesta de Registros de Microsoft para escribir registros en Azure Monitor. Esto utiliza el concepto de un Log Analytics Workspace para almacenar los datos y permitir su análisis, así como una Data Collection Rule que actúa como interfaz entre la App Service y el almacenamiento de registros. Esto permite un enfoque más moderno, incluyendo permisos basados en RBAC para que SCEPman acceda al LAW.

La creación del Log Analytics Workspace, así como la configuración de la Data Collection Rule, se realiza automáticamente al ejecutar `Complete-SCEPmanInstallation` del módulo PowerShell de SCEPman.

{% hint style="info" %}
El **retención predeterminada** el período para los datos almacenados en una tabla de Log Analytics es **30 días**. En caso de que se requiera un período de retención diferente, ajuste en consecuencia la configuración de la tabla "SCEPman\_CL".
{% endhint %}

#### Rehabilitación de la API de Data Collector

Si, por cualquier motivo, desea restablecer la API anterior que se utilizará, puede hacerlo eliminando las variables de la App Service relacionadas con Log Ingestion y volviendo a agregar las que se usarán con la API de Data Collector.

Variables que deben **eliminarse**:

* [AppConfig:LoggingConfig:DataCollectionEndpointUri](https://app.gitbook.com/o/-LhPlvZ6dc8XcqY7tdZw/s/-LoGejQeUQcw7lqnQ3WX/~/edit/~/changes/787/scepman-configuration/application-settings/dependencies-azure-services/logging#appconfig-loggingconfig-datacollectionendpointuri)
* [AppConfig:LoggingConfig:RuleId](https://app.gitbook.com/o/-LhPlvZ6dc8XcqY7tdZw/s/-LoGejQeUQcw7lqnQ3WX/~/edit/~/changes/787/scepman-configuration/application-settings/dependencies-azure-services/logging#appconfig-loggingconfig-ruleid)

Variables que deben añadirse:

* [AppConfig:LoggingConfig:WorkspaceId](https://app.gitbook.com/o/-LhPlvZ6dc8XcqY7tdZw/s/-LoGejQeUQcw7lqnQ3WX/~/edit/~/changes/787/scepman-configuration/application-settings/dependencies-azure-services/logging#appconfig-loggingconfig-workspaceid)
* [AppConfig:LoggingConfig:SharedKey](https://app.gitbook.com/o/-LhPlvZ6dc8XcqY7tdZw/s/-LoGejQeUQcw7lqnQ3WX/~/edit/~/changes/787/scepman-configuration/application-settings/dependencies-azure-services/logging#appconfig-loggingconfig-sharedkey)

SCEPman detectará automáticamente la configuración después de reiniciarse y volverá a utilizar la API de Data Collector.

## Ejemplos de consultas KQL

### Ver problemas con su instancia de SCEPman

```kusto
SCEPman_CL
| where Level == "Warn" or Level == "Error" or Level == "Fatal"
```

### Número de certificados emitidos por endpoint en el intervalo de tiempo seleccionado

{% hint style="success" %}
Esta consulta está garantizada para funcionar con SCEPman 3.0 y versiones posteriores cuando se utiliza la API de Log Ingestion para el registro. Los cambios en SCEPman que hagan que esta consulta no sea utilizable se considerarán cambios disruptivos.
{% endhint %}

{% tabs %}
{% tab title="API de Log Ingestion (predeterminada)" %}

```kql
SCEPman_CL
| where Level == "Info" and Message startswith_cs "Issued a certificate with serial number"
| project Message, RequestBase = trim_end('/', replace_string(replace_string(replace_regex(RequestUrl, "(/pkiclient\\.exe)?(\\?operation=PKIOperation(&message=.+)?)?", ""),"certsrv/mscep/mscep.dll","intune"),"step/enrollment","activedirectory"))
| summarize IssuanceCount = count() by Endpoint = extract("/([a-zA-Z]+)$", 1, RequestBase)
```

{% endtab %}

{% tab title="API de Data Collector (antigua)" %}

```kusto
SCEPman_CL
| where Level == "Info" and Message startswith_cs "Issued a certificate with serial number"
| project Message, RequestBase = trim_end('/', replace_string(replace_string(replace_regex(RequestUrl_s, "(/pkiclient\\.exe)?(\\?operation=PKIOperation(&message=.+)?)?", ""),"certsrv/mscep/mscep.dll","intune"),"step/enrollment","activedirectory"))
| summarize IssuanceCount = count() by Endpoint = extract("/([a-zA-Z]+)$", 1, RequestBase)
```

{% endtab %}
{% endtabs %}

A partir de SCEPman 2.8, siempre hay exactamente una entrada de registro de nivel Info cuyo mensaje de registro comienza con "Issued a certificate with serial number " por cada certificado emitido, seguida de su número de serie. Sin embargo, debido al insoluble [Problema de los Dos Ejércitos](https://en.wikipedia.org/wiki/Two_Generals'_Problem), puede ocurrir que el certificado creado nunca llegue al solicitante o que otro tipo de error impida el enrolamiento real. Del mismo modo, en caso de errores graves, puede ocurrir que exista una entrada de registro sin una entrada correspondiente en la base de datos o viceversa.

### Certificados distintos con verificación OCSP

{% tabs %}
{% tab title="API de Log Ingestion (predeterminada)" %}

```kusto
let map_certtype = datatable(serial_start:string, readable:string)
[
  "40", "Intune Device",
  "41", "Intune Device",
  "42", "Intune Incompliant Device",
  "50", "Static",
  "51", "Static",
  "60", "Intune User",
  "61", "Intune User",
  "64", "Jamf User",
  "65", "Jamf User",
  "6C", "Jamf User on Device",
  "6D", "Jamf User on Device",
  "70", "Domain Controller",
  "7C", "Jamf User on Computer",
  "7D", "Jamf User on Computer",
  "54", "Jamf Computer",
  "55", "Jamf Computer",
  "44", "Jamf Device",
  "45", "Jamf Device"
];
SCEPman_CL
| where LogCategory == "Scepman.Server.Controllers.OcspController" and Level == "Info"
| where Message startswith_cs "OCSP Response"
| project serial = extract("Serial Number ([A-F0-9]+)", 1, Message)
| distinct serial
| extend serial_start = substring(serial,0,2)
| join kind=leftouter map_certtype on serial_start
| summarize count() by (readable)
```

{% endtab %}

{% tab title="API de Data Collector (antigua)" %}

```kql
let map_certtype = datatable(serial_start:string, readable:string)
[
  "40", "Intune Device",
  "41", "Intune Device",
  "42", "Intune Incompliant Device",
  "50", "Static",
  "51", "Static",
  "60", "Intune User",
  "61", "Intune User",
  "64", "Jamf User",
  "65", "Jamf User",
  "6C", "Jamf User on Device",
  "6D", "Jamf User on Device",
  "70", "Domain Controller",
  "7C", "Jamf User on Computer",
  "7D", "Jamf User on Computer",
  "54", "Jamf Computer",
  "55", "Jamf Computer",
  "44", "Jamf Device",
  "45", "Jamf Device"
];
SCEPman_CL
| where LogCategory_s == "Scepman.Server.Controllers.OcspController" and Level == "Info"
| where Message startswith_cs "OCSP Response"
| project serial = extract("Serial Number ([A-F0-9]+)", 1, Message)
| distinct serial
| extend serial_start = substring(serial,0,2)
| join kind=leftouter map_certtype on serial_start
| summarize count() by (readable)
```

{% endtab %}
{% endtabs %}
