Saltar al contenido
Microsoft scripts

Scripts de Purview

Crear política DLP de CURP en modo prueba

Crea una política DLP en modo prueba, sin notificaciones ni bloqueo, que busca CURP en Exchange, SharePoint y OneDrive. Sirve para medir antes de decidir.

Antes de correrloAntes de pasar de modo prueba a activo revisa: 1) la simulación, que corre hasta 15 días y conserva datos 30, y en Exchange solo evalúa correo nuevo; 2) los falsos positivos, porque CURP no tiene suma de verificación y basta el patrón para confianza media; 3) en SharePoint y OneDrive la lista muestra hasta 100 elementos por sitio y regla, así que puede no incluir todo; 4) la regla no tiene acciones de bloqueo: activar la política sin agregarlas no protege nada; 5) pasa antes por modo prueba con notificaciones para avisar a los usuarios. Si la regla falla, la política queda sin reglas y el script te lo dice. Security & Compliance PowerShell no respeta -WhatIf; aquí lo aplica el propio script al no llamar los cmdlets. No detecta RFC, INE ni CLABE.

Ejemplo en México

Manufactura en Querétaro, 800 personas

Recursos Humanos envía archivos con CURP a proveedores de nómina. Quieren medir el volumen sin frenar los turnos de la planta.

.\new-politica-dlp-mexico.ps1 -RutaCsv .\politica-dlp.csv

Queda una política en simulación que no bloquea ni avisa a nadie. El resultado les ayuda a documentar medidas de seguridad y a decidir qué controlar.

Cómo implementarlo

  1. Instala el módulo si no lo tienes: Install-Module ExchangeOnlineManagement -Scope CurrentUser.
  2. Ejecuta primero con -WhatIf y lee lo que crearía.
  3. Ejecútalo sin -WhatIf, confirma cada cambio y guarda el CSV con -RutaCsv.
  4. Deja correr la simulación y revisa los elementos en el panel de simulación y en el Explorador de actividad.
  5. Con los resultados, decide en el portal de Microsoft Purview si ajustas, agregas acciones o pasas a modo activo.
Ver el código completo de new-politica-dlp-mexico.ps1
<#
.SYNOPSIS
    Crea una política DLP en modo prueba que detecta CURP en Exchange, SharePoint y OneDrive.

.DESCRIPTION
    Crea la política con el modo fijo TestWithoutNotifications y una regla sin acciones de bloqueo. Usa el único
    tipo integrado específico de México documentado: Mexico Unique Population Registry Code (CURP). No hay
    parámetro para cambiar el modo: pasarla a activa es una decisión aparte, después de revisar la simulación.
    Si ya existe una política con ese nombre, se detiene y no toca nada.

.PARAMETER Nombre
    Nombre de la política. La regla se llama igual, con el sufijo " - Regla CURP".

.PARAMETER RutaCsv
    Ruta del CSV con el resultado. Si se omite, solo se muestra en pantalla.

.EXAMPLE
    .\new-politica-dlp-mexico.ps1 -WhatIf

.EXAMPLE
    .\new-politica-dlp-mexico.ps1 -RutaCsv .\politica-dlp.csv

.NOTES
    Permisos: ninguno de Graph; usa ExchangeOnlineManagement.
    Rol mínimo: rol DLP Compliance Management en un grupo de roles, o grupo Compliance Data Administrator.
    Licencia: Microsoft 365 E5/A5/G5/E3/A3/G3, Microsoft 365 Business Premium u Office 365 E5/A5/G5/E3/A3/G3.
    Licencia del código: MIT. Se entrega TAL CUAL, sin garantía. Pruébalo primero en un tenant de pruebas.
#>
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
param(
    [ValidateNotNullOrEmpty()]
    [string]$Nombre = 'Mexico CURP - Modo prueba',
    [string]$RutaCsv
)

$ErrorActionPreference = 'Stop'
$modo = 'TestWithoutNotifications'
$nombreRegla = "$Nombre - Regla CURP"
$tipoCurp = 'Mexico Unique Population Registry Code (CURP)'
$idCurp = 'e905ad4d-5a74-406d-bf36-b1efca798af4'  # Id de la definición publicada en Microsoft Learn.

if (-not (Get-Command Connect-IPPSSession -ErrorAction SilentlyContinue)) {
    throw 'Falta el módulo. Instálalo con: Install-Module ExchangeOnlineManagement -Scope CurrentUser'
}

# -WhatIf simula la creación, no la conexión. Security & Compliance PowerShell no respeta -WhatIf: lo aplica ShouldProcess.
$simular = $WhatIfPreference
$WhatIfPreference = $false
Connect-IPPSSession -ShowBanner:$false
$WhatIfPreference = $simular

try {
    $curp = @(Get-DlpSensitiveInformationType | Where-Object { "$($_.Id)" -eq $idCurp -or $_.Name -eq $tipoCurp }) | Select-Object -First 1
    if (-not $curp) { throw "El tipo '$tipoCurp' no aparece en este tenant. No se creó nada." }
    if (@(Get-DlpCompliancePolicy | Where-Object Name -eq $Nombre).Count) { throw "Ya existe una política llamada '$Nombre'. No se cambió nada." }

    $politica = $null
    $regla = $null
    if ($PSCmdlet.ShouldProcess($Nombre, "Crear política DLP en modo $modo para Exchange, SharePoint y OneDrive")) {
        $politica = New-DlpCompliancePolicy -Name $Nombre -Comment 'Detección de CURP en modo prueba. Revisa la simulación antes de activarla.' `
            -ExchangeLocation All -SharePointLocation All -OneDriveLocation All -Mode $modo
    }
    if (($politica -or $simular) -and $PSCmdlet.ShouldProcess($nombreRegla, "Crear regla DLP que detecta '$($curp.Name)' sin bloquear")) {
        try {
            $regla = New-DlpComplianceRule -Name $nombreRegla -Policy $Nombre -ContentContainsSensitiveInformation @(@{ Name = $curp.Name; minCount = '1' })
        } catch {
            throw "La política '$Nombre' se creó, pero la regla falló y quedó sin reglas: $_"
        }
    }
} finally {
    Disconnect-ExchangeOnline -Confirm:$false
}

$resultado = [pscustomobject]@{
    Politica    = if ($politica) { $politica.Name } else { $Nombre }
    Regla       = if ($regla) { $regla.Name } else { $nombreRegla }
    Modo        = if ($politica.Mode) { $politica.Mode } else { $modo }
    Ubicaciones = 'Exchange, SharePoint, OneDrive'
    Tipo        = $curp.Name
    Resultado   = if ($regla) { 'Creada en modo prueba' } elseif ($politica) { 'Política creada sin regla' } elseif ($simular) { 'Simulada con -WhatIf: no se creó nada' } else { 'Cancelada: no se creó nada' }
}

Write-Host "$($resultado.Politica): $($resultado.Resultado)"
if ($RutaCsv) {
    # El CSV es local y describe el resultado: se escribe también con -WhatIf. UTF-8 con BOM para Excel en español.
    $resultado | Export-Csv -Path $RutaCsv -NoTypeInformation -Encoding utf8BOM -WhatIf:$false -Confirm:$false
    Write-Host "CSV guardado en $RutaCsv"
} else {
    $resultado | Format-List
}

Relacionados