# Gestion des journaux

### Activer la journalisation vers Azure Monitor

Depuis la version 3.0, SCEPman, ainsi que Certificate Master, utiliseront l’API d’ingestion de journaux de Microsoft pour écrire les journaux dans Azure Monitor. Cela utilise le concept d’un Log Analytics Workspace pour conserver les données et permettre leur analyse, ainsi qu’une Data Collection Rule qui fait l’interface entre l’App Service et le stockage des journaux. Cela permet une approche plus moderne, incluant des autorisations basées sur RBAC pour que SCEPman accède au LAW.

La création du Log Analytics Workspace ainsi que la configuration de la Data Collection Rule sont effectuées automatiquement en exécutant `Complete-SCEPmanInstallation` du module PowerShell SCEPman.

{% hint style="info" %}
Le **rétention par défaut** la période pendant laquelle les données stockées dans une Log Analytics Table sont conservées est **30 jours**. Si une autre période de rétention est requise, ajustez en conséquence la configuration de la table "SCEPman\_CL".
{% endhint %}

#### Réactivation de l’API Data Collector

Si, pour une raison quelconque, vous souhaitez rétablir l’utilisation de l’ancienne API, vous pouvez le faire en supprimant les variables d’application liées à Log Ingestion et en ajoutant à nouveau celles utilisées par l’API Data Collector.

Variables à **supprimer**:

* [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 à ajouter :

* [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 récupérera automatiquement les paramètres après un redémarrage et utilisera à nouveau l’API Data Collector.

## Exemples de requêtes KQL

### Voir les problèmes avec votre instance SCEPman

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

### Nombre de certificats émis par point de terminaison dans la période sélectionnée

{% hint style="success" %}
Cette requête est garantie de fonctionner avec SCEPman 3.0 et les versions ultérieures lors de l’utilisation de l’API Log Ingestion pour la journalisation. Les modifications apportées à SCEPman qui rendraient cette requête inutilisable seront considérées comme des Breaking Changes.
{% endhint %}

{% tabs %}
{% tab title="API Log Ingestion (par défaut)" %}

```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 Data Collector (ancien)" %}

```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 %}

À partir de SCEPman 2.8, il existe toujours exactement une entrée de journal de niveau Info dont le message commence par "Issued a certificate with serial number " par certificat émis, suivie de son numéro de série. Cependant, en raison du problème insoluble [du problème des deux armées](https://en.wikipedia.org/wiki/Two_Generals'_Problem), il peut arriver que le certificat créé n’atteigne jamais le demandeur ou qu’un autre type d’erreur empêche l’inscription effective. De même, en cas d’erreurs graves, il peut arriver qu’une entrée de journal existe sans entrée correspondante dans la base de données, ou inversement.

### Certificats distincts avec vérification OCSP

{% tabs %}
{% tab title="API Log Ingestion (par défaut)" %}

```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 Data Collector (ancien)" %}

```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 %}
