31 Jan 2022, 00:00

Permissions des disques VHD/VHDX

Dans Hyper-V, si on crée un disque virtuel, et qu’on l’attribue à une VM dans un 2nd temps, il est possible qu’elle ne puiss pas démarrer avec le message “Erreur d’accès général refusé” concernant le fichier VHD.

Ceci est parce que chaque VM est un objet de sécurité, et qu’il faut lui affecter les autorisation correctes sur le fichier disque. Pour ceci, lancer Powershell, et obtenir le SID de la VM :
Get-VM 'Mon serveur virtuel' | Select-Object VMID (en entrant le nom de la VM).
Puis lui donner les droits sur le fichier :
icacls hard-disk.vhdx /grant %SID%:F (en entrant le SID trouvé ci-dessus).

La VM devrait alors pouvoir démarrer.

Source

27 Jan 2022, 00:00

Gestion des certificats sous Windows

certmgr.msc pour voir les ceertificats de l’utilisateur actuel
certlm.msc pour voir les certificats de la machine elle-même (bureau à distance, etc.)

Pour voir à quel certificat correspond un hachage précis, on peut aller dans Actions -> Rechercher des certificats, choisir “Tous les magasins de certificats”, rechercher dans le champ “Hachage SHA1” et entrer le hash dans le champ “Contenu”.

Les certificats expirés pour l’authentification des clients (Magasin ordinateur -> Personnel -> Certificats) ne semblent pas se supprimer tout seuls après leur expiration, ce qui crée un Evt 64 dans l’observateur d’événement. On peut les supprimer manuellement.

14 Jan 2022, 00:00

Voir date d'expiration d'un certificat

openssl x509 -enddate -noout -in file.crt
Doit fonctionner avec les fichiers crt, pem

12 Jan 2022, 00:00

ID serveur sur Teamviewer

Sous Teamviewer, il y’a un ID attribué à la sesion actuellement ouverte et active (non verrouillée), qui est celui qui s’affiche dans la fenêtre ; c’est l’identifiant utilisateur.
Mais si on veut pouvoir accéder au poste à tout moment, il faut l’ID de serveur ; pour l’obtenir, clic-droit sur l’icône de TV dans la zone de notification, puis À propos de Teamviewer.

05 Jan 2022, 00:00

Autoriser l'accès à un partage réseau sans authentification depuis Windows Server 2019

Depuis Windows Server 2019, l’accès aux dossiers partagés (sur un autre serveur) qui ne nécessitent pas d’authentification est désactivé.
Pour le réactiver, il faut aller dans gpedit.msc, et aller dans Configuration ordinateur -> Modèles d'administration -> Réseau -> Station de travail LANMAN et activer le paramètre Activer les ouvertures de session invité non sécurisées.

Probablement faisable via gpmc.msc dans le cas d’un domaine.

Source

Possible via regedit aussi ?

03 Dec 2021, 00:00

Virtualisation

https://wiki.debian.org/KVM
https://www.how2shout.com/linux/how-to-install-and-configure-kvm-on-debian-11-bullseye-linux/

Pour voir si le processeur possède les extensions matérielles nécessaires pour la virtualisation matérielle :
grep -E --color '(vmx|svm)' /proc/cpuinfo

Qu’est-ce que c’est ?

kvm - QEMU

kvm est un hyperviseur type 1, en espace noyau, sous forme de module noyau pour Linux (intégré au noyau depuis la version 2.6.20). Il permet l’accès aux instructions processeur de virtualisation (Intel-VT ou AMD-V).

QEMU est un émulateur de PC (ou hyperviseur de type 2) : il simule du matériel (disques, RAM etc) pour un système invité. Grâce à kvm, il peut mettre à disposition le processeur physique, pour des performances quasi-natives.

L’un n’a pas besoin de l’autre (kvm peut servir à faire tourner une appli Linux sans OS complet, via containerization, et QEMU peut faire tourner un OS virtuel en émulant complètement un processeur), mais c’est en binôme qu’ils fonctionnent le mieux.

Pour voir si une VM utilise kvm , il faut trouver le PID de la VM, puis entrer la commande strings /proc/<PID>/cmdline|grep kvm. Si oui, on peut y lire “-enable-kvm” ou “accel=kvm”.

Il y’a un module noyau nommé kqemu, qui visait à améliorer les performances de qemu, mais celui-ci a été rendu obsolète par kvm. Son seul avantage potentiel est qu’il fournissait une accélération (logicielle) sur les processeurs ne disposant pas des extensions de virtualisation (mais en ce cas, Virtualbox reste aujourd’hui une solution correcte), si l’invité et l’hôte sont sous la même architecture.

Le paquet qemu-user permet de faire tourner un OS compilé pour une architecure différente du processeur physique ?

libvirt, virsh, virt-install, virt-manager

libvirt est une bibliothèque qui permet de gérer les machines virtuelles. Elle peut aussi se connecter à plusieurs hyperviseurs, dont kvm/QEMU, mais aussi Xen par exemple.

virt-install est une interface en ligne de commande pour simplifier la création de VM.

virsh est une interface en ligne de commande pour interagir avec libvirt, et donc créer, supprimer, modifier, démarrer, arrêter etc. les VMs.

  • un “domaine” équivaut à une machine virtuelle.
  • pour lister les VMs de la session utilisateur : virsh list --all
  • pour lister les VMs de la session système : virsh -c qemu:///system list --all
  • pour démarrer une VM système : ‘virsh -c qemu:///system start nom_de_la_vm’

virt-manager est une interface graphique pour interagir avec libvirt (même rôle que virsh, mais en GUI).

virtio

Il me semble que c’est un protocole/une interface pour mettre le matériel de l’hôte à disposition des invités, avec le moins de latence possible. Ces périphériques virtuels nécessitent des pilotes spécifiques, sans quoi ils ne seront pas disponibles, au moins sous Windows. On peut trouver ces pilotes sur cette page.
En montant l’ISO en tant que lecteur CD lors de l’installation de Windows, on peut installer les pilotes pour le contrôleur de disque, à la volée (il faut choisir le dossier qui contient directement les pilotes, il n’y a pas de récursivité).

Virtualbox

C’est simplement un émulateur. Il est plutôt simple d’utilisation, peut être utilisé par un utilisateur non privilégié, mais n’a pas de performances folles.

Xen

Hyperviseur de type 1.

kvm - QEMU

Installation

kvm est déjà présent dans le noyau par défaut. Pour installer QEMU sous Debian Bullseye : sudo apt install qemu-system-x86.
Pour installer virt-manager : sudo apt install virt-manager. Installera automatiquement qemu.

Connexion system ou session

https://blog.wikichoon.com/2016/01/qemusystem-vs-qemusession.html

QEMU peut être utilisé avec une connexion système, ou avec une connexion session.

La connexion système permet l’accès complet à toutes les ressources ; libvirtd est lancé en tant que root, les VMs en tant qu’utilisateur qemu. L’accès d’un utilisateur simple est géré via polkit. On peut ajouter le user au groupe libvirt pour lui permettre un accès aux ressources sans avoir à s’authentifier en root.
La configuration de libvirt est dans /etc/libvirt/.

La connexion session est spécifique à l’utilisateur. Tout est exécuté par l’utilisateur simple. Les configurations/pools sont stockés dans le $HOME. Cependant le réseau accessible par défaut est lent, et peu flexible (difficile à rendre accessible depuis l’extérieur). À voir avec qemu-bridge-helper pour accéder à un pont réseau (créé au préalable par l’admin) ?
La configuration de libvirt est stockée dans $HOME/.config/libvirt.

Détacher souris/clavier de la VM

Par défaut, c’est la combinaison L-Ctrl + L-Alt.

Connexion via SSH

On peut gérer les VMs d’un serveur distant via ssh. Pour ceci, via virsh : virsh --connect qemu+ssh://root@example.com/system.
Via virt-manager, il faut ajouter une connexion, et entrer l’URI qemu+ssh://root@example/system.

En ce cas, il faudra entrer certains chemins manuellement (par exemple pour définir un chemin vers un ISO ou un fichier qcow2), le bouton “Parcourir” étant grisé.

Processeur

La configuration par défaut est de “Copier la configuration du processeur de l’hôte”. Il me semble que ça donne des performances très moyennes. Il vaut mieux décocher cette case et choisir le mode host-passthrough. De même, la détection automatique de la topologie ne me donnait pas de très bons résultats. En choisissant une topologie manuelle, ça fonctionne bien mieux.
Socket : nombre de processeurs physiques sur la MB (1 dans la plupart des cas)
Coeurs : nombre de core du CPU
Chaînes : nombre de thread de chaque core

Périphériques USB ?

Réseau

https://wiki.qemu.org/Documentation/Networking

Le réseau par défaut est un réseau en NAT, et il ne démarre pas automatiquement.
Si on veut bridger une VM à une carte réseau, il faut d’abord créer le pont au niveau système ; il ne semble pas possible de bridger la VM directement à l’interface physique.

Disques

Si connexion à qemu:///system, les pools de stockage (emplacement des fichiers image de disque dur) sont définis dans /etc/libvirt/storage/ et celui par défaut pointe sur /var/lib/libvirt/images/. Les définitions de VMs (fichier XML) sont rangées dans /etc/libvirt/qemu/.

Si connexion à qemu:///session, les pools de stockage dont définis dans $HOME/.config/libvirt/storage/ et celui par défaut pointe vers $HOME/.local/share/libvirt/images/. Les définitions de VMs sont rangées dans $HOME/.config/libvirt/qemu/.

Les images sont au format qcow2.
Il est possible d’utiliser directement un périphérique de type block. Pour ceci, il faut éditer le fichier XML.

Virtualbox

L’avantage principal que je vois est le fait de pouvoir ponter facilement et à la volée la carte réseau virtuelle et n’importe quelle carte réseau (physique, pont ou virtuelle, genre tap0 ), sans préparer le réseau auparavant.

USB

Pour pouvoir passer les périphériques USB à l’invité, l’utilisateur qui lance VBox doit faire partie du groupe vboxusers :
sudo adduser $(whoami) vboxusers

Pour gérer l’USB2 / USB3 , il faut l’extension pack :
sudo apt install virtualbox-ext-pack

On peut passer les périphériques à la volée, via clic-droit sur l’icône USB en bas à droite de la fenêtre de la VM.

15 Oct 2021, 00:00

Invite de commande Windows

Affecter une variable (y compris avec espaces)

set "myvar=string or something else"
Si on met les guillemets juste autour du contenu à affecter, les guillemets feront partie du contenu de la variable !

Appeler un script depuis un script :

CALL path\to\script.bat
(attend la fin de l’éxecution du script appelé avant de continuer le script principal)

Ajouter une pause

Si on veut attendre un certain nombre de secondes (ici 5) :
timeout 5

Si on veut une interaction de l’utilisateur :
timeout -1
On peut également utiliser
pause
mais dans certains cas, cela ne fonctionne pas dans les scripts.

Création de fichier .bat contenant des accents

Éditer le fichier avec Notepad++, et choisir dans le menu Encodage -> Codage de caractères -> Langues d'Europe occidentale -> OEM 850. Si les accents avaient été entrés avant la conversion, ils ont été remplacés par d’autres caractères, il faut donc les réécrire correctement.

Split d’une commande sur plusieurs lignes pour la lisibilité

Il faut échapper le retour à la ligne par un circonflexe ^ . Il semble qu’il faille faire commencer la ligne suivante par un espace, car le premier caractère ne sera pas pris en compte (non vérifié).

goto

goto :label

:label
echo "This is label"

Fin du label ???

14 Sep 2021, 00:00

Création d'un ISO Windows personnalisé

2 sources qui m’ont aidé :
https://theitbros.com/sysprep-windows-machine/
https://www.ac-nantes.fr/medias/fichier/procedure-image-de-reference-multiplateforme_1433950335218-pdf

Entrer en mode d’audit

Sur une install, rentrer en mode audit :

c:\Windows\System32\sysprep\sysprep.exe /audit

ou Ctrl-Maj-F3 sur l’écran de choix de langue lors de l’OOBE (configuration du hostname, utilisteur etc…)

Ceci redémarre sur une session Administrateur. Sur la fenetre qui s’ouvre, faire Cancel pour personnaliser l’image.

Personnalisation de l’image

  • Install/update des pilotes (si c’est la même machine que la destination)
  • install des logiciels souhaités (navigateur, ccleaner, vlc etc…)
  • Télémetrie :
sc delete DiagTrack
sc delete dmwappushservice
echo ““ > C:\ProgramData\Microsoft\Diagnosis\ETLLogs\AutoLogger\AutoLogger-DiagTrack-Listener.etl
reg add “HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection” /v AllowTelemtery /t REG_DWORD /d 0 /f

et DisableWinTracking

  • Remove buit-in apps (powershell)
Get-AppxPackage *3dbuilder* | Remove-AppxPackage
Get-AppxPackage *windowsalarms* | Remove-AppxPackage
Get-AppxPackage *windowscommunicationsapps* | Remove-AppxPackage
Get-AppxPackage *officehub* | Remove-AppxPackage
Get-AppxPackage *skypeapp* | Remove-AppxPackage
Get-AppxPackage *getstarted* | Remove-AppxPackage
Get-AppxPackage *zunemusic* | Remove-AppxPackage
Get-AppxPackage *windowsmaps* | Remove-AppxPackage
Get-AppxPackage *solitairecollection* | Remove-AppxPackage
Get-AppxPackage *bingfinance* | Remove-AppxPackage
Get-AppxPackage *zunevideo* | Remove-AppxPackage
Get-AppxPackage *bingnews* | Remove-AppxPackage
Get-AppxPackage *onenote* | Remove-AppxPackage
Get-AppxPackage *people* | Remove-AppxPackage
Get-AppxPackage *windowsphone* | Remove-AppxPackage
Get-AppxPackage *bingsports* | Remove-AppxPackage
Get-AppxPackage *bingweather* | Remove-AppxPackage
Get-AppxPackage *xbox* | Remove-AppxPackage
Get-AppxPackage *yourphone* | Remove-AppxPackage
Get-AppxPackage *feedback* | Remove-AppxPackage
Get-AppxPackage *microsoft.wallet* | Remove-AppxPackage
Get-AppxPackage *spotify* | Remove-AppxPackage
C:\Windows\SysWOW64\OneDriveSetup.exe /uninstall
  • Chocolatey pour install office
    choco install office365business

Création de l’image

Exécuter : sysprep
Enter OOBE ; Generalize ; Shutdown
Ceci permet de définir l’action au prochain démarrage du système (rentrer en mode OOBE pour paramétrage des users etc), de généraliser l’image (enlever toutes les informations/pilotes spécifiques au matériel utilisé), et demande à redémarrer immédiatement.

Nous avons donc une installation contenant les logiciels et personnalisations nécessaires, sans information de matériel ou d’utilisateurs, qui rentrera en mode OOBE à son prochain démarrage.
Il faut maintenant créér une image pour pouvoir installer cette image. Pour ceci :

Brancher le disque sur une installation fonctionnelle de Windows. Si aucune disponible, ceci peut se faire depuis le DVD d’install de Windows (Réparer l’ordi -> invite de commande).
Entrer en ligne de commande ; vérifier la lettre du lecteur systeme (par exemple avec diskpart > list vol). Ici c’est D:. Puis lancer :

dism /capture-image /imagefile:D:\win10custom.wim /capturedir:d:\ /name:"Win10 Pro Custom Edition"

À la fin de l’opération, on a un fichier win10custom.wim, qui peut se substituer au fichier install.wim d’une install classique (en le renommant install.wim)

Si besoin, splitter l’image :
Dism /Split-Image /ImageFile:D:\win10custom.wim /SWMFile:D:\win10custom.swm /FileSize:3900

Problèmes

En cas message erreur après sysprep (cant complete installation) ; ce problème vient du fait que le compte Administrateur utilisé pour le mode audit a un mot de passe vide, ce qui est contraire aux exigences de sécurité. Pour le régler :
https://www.urtech.ca/2015/12/solved-windows-could-not-complete-the-installation-windows-10-sysprep/
Maj-F10 -> secpol.msc puis Accout policy -> Password policy -> longueur minimale 0
ou bien on peut changer le mot de passe du compte admin :
Maj-F10 -> net user Administrateur Password1234.
On peut par la suite supprimer ce mot de passe avec la commande
net user Administrateur * puis en validant 2 fois un mdp vide.

Si on a une erreur à la généralisation, on peut vérifier pourquoi dans le log C:\Windows\System32\Sysprep\Panther\setupact.log.
Si c’est une erreur du type Package 123123123.Blablabla_version_editor was installed for a user, but not provisionned for all users, il faut le supprimer. Pour ceci, on vérifie qu’il est trouvé :
get-appxpackage -alluser *Blablabla*
S’il est bien trouvé, on le supprime avec :
get-appxpackage -allusers *Blablabla* | remove-appxpackage -allusers

Il est possible que Windows retourne l’erreur “Windows n’a pas pu valider votre installation”. Vérifier l’état de Bitlocker avec manage-bde -status. Il faut désactiver bitlocker pour pouvoir généraliser l’image. pour ceci, sous Powershell : Disable-Bitlocker –MountPoint ‘C:'.
https://theitbros.com/sysprep-was-not-able-to-validate-your-windows-installation/

Sortir du mode Audit

Si on souhaite sortir du mode Audit, il faut entrer la commande sysprep et choisir “Enter OOBE”. On aura l’obligation de créer un nouvel utilisateur admin, mais les utilisateurs existants ne sont pas affectés. On peut ensuite se logger avec un ancien utilisateur et suprimer l’utilisateur nouvellement créé.

07 Jun 2021, 00:00

Envoi d'un mail d'avertissement lorsque le mot passe AD est proche de l'expiration

Préambule

Le but est d’avertir les utilisateurs d’un domaine Active Directory lorsque leur mot de passe est proche de l’expiration, pour leur permettre de le renouveler avant l’expiration.

Le renouvellemnt se fait sans problème lorsque l’on est connecté directement au réseau, mais dans le cas d’un accès via OpenVPN avec authentification auprès de l’AD, la connexion VPN sera bloquée lorsque le mot de passe est expiré. D’où la procédure ici-présente.

Stockage du mot de passe de manière chiffrée

Source

Le but, si je comprends bien, est d’enregistrer une empreinte du mot de passe (ou le mot de passe chiffré) dans un fichier, pour qu’il soit utilisable sans interaction humaine, sans pour autant être exposé en clair sur le disque.

Le fichier obtenu sera spécifique à ce compte utilisateur, et cette machine. Il devra être recréé si l’opération doit être effectuée depuis un autre compte, ou le même compte sur une autre machine.

Lancer powershell, puis les commandes suivantes (adapter le chemin de fichier si besoin) :

$credential = Get-Credential # entrer identifiant et mot de passe à conserver
$credential.Password | ConvertFrom-SecureString | Set-Content D:\encrypted_password.txt

Le fichier D:\encrypted_password.txt contient le hash qui nous intéresse.

À noter que ceci a été réalisé en utilisant un utilisateur qui possède une licence valide auprès d’Office 365. Non testé auprès d’autres fournisseurs SMTP.

Script pour générer et envoyer les mails

Il s’agit du script de Robert Pearman que j’ai légèrement modifié, et francisé.

Le script en question, qui doit être enregistré avec l’extension .ps1 (penser à modifier les variables de début de script) :

#################################################################################################################
#
# Version 1.4 February 2016
# Robert Pearman (WSSMB MVP)
# TitleRequired.com
# Script to Automated Email Reminders when Users Passwords due to Expire.
#
# Requires: Windows PowerShell Module for Active Directory
#
# For assistance and ideas, visit the TechNet Gallery Q&A Page. http://gallery.technet.microsoft.com/Password-Expiry-Email-177c3e27/view/Discussions#content
# Or Checkout my Youtube Channel - https://www.youtube.com/user/robtitlerequired
#
##################################################################################################################
# Please Configure the following variables....

$smtpServer="smtp.office365.com"
$expireindays = 14
$mailfrom = "expediteur@example.com"
$passwordFile = "D:\encrypted_password.txt"
$from = "Mot de passe <$mailfrom>"

$logging = "Enabled" # Set to Disabled to Disable Logging
$logFile = "C:\log_mail.csv" # ie. c:\mylog.csv

$testing = "Enabled" # Set to Disabled to Email Users
$testRecipient = "debug@example.com"

#
###################################################################################################################


# Force TLS1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# get password from file
$encryptedPassword = Get-Content $passwordFile | ConvertTo-SecureString
$Credential = New-Object System.Management.Automation.PsCredential($mailfrom, $encryptedPassword)

# Check Logging Settings
if (($logging) -eq "Enabled")
{
    # Test Log File Path
    $logfilePath = (Test-Path $logFile)
    if (($logFilePath) -ne "True")
    {
        # Create CSV File and Headers
        New-Item $logfile -ItemType File
        Add-Content $logfile "Date,Name,EmailAddress,DaystoExpire,ExpiresOn,Notified"
    }
} # End Logging Check

# System Settings
$textEncoding = [System.Text.Encoding]::UTF8
$date = Get-Date -format ddMMyyyy
# End System Settings

# Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired
Import-Module ActiveDirectory
$users = get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
$DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

# Process Each User for Password Expiry
foreach ($user in $users)
{
    $Name = $user.Name
    $emailaddress = $user.emailaddress
    $passwordSetDate = $user.PasswordLastSet
    $PasswordPol = (Get-AduserResultantPasswordPolicy $user)
    $sent = "" # Reset Sent Flag
    # Check for Fine Grained Password
    if (($PasswordPol) -ne $null)
    {
        $maxPasswordAge = ($PasswordPol).MaxPasswordAge
    }
    else
    {
        # No FGP set to Domain Default
        $maxPasswordAge = $DefaultmaxPasswordAge
    }


    $expireson = $passwordsetdate + $maxPasswordAge
    $today = (get-date)
    $daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days

    # Set Greeting based on Number of Days to Expiry.

    # Check Number of Days to Expiry
    $messageDays = $daystoexpire

    if (($messageDays) -gt "1")
    {
        $messageDays = "dans " + "$daystoexpire" + " jours."
    }
    else
    {
        $messageDays = "aujourd'hui."
    }

    # Email Subject Set Here
    $subject="Votre mot de passe ESCDA expire $messageDays"

    # Email Body Set Here, Note You can use HTML, including Images.
    $body ="
    $name,
    <p> Votre mot de passe va expirer $messageDays<br>
    Pour changer votre mot de passe, appuyer sur Ctrl+Alt+Suppr et choisir Modifier un mot de passe <br>
    <p>Merci, <br>
    </P>"


    # If Testing Is Enabled - Email Administrator
    if (($testing) -eq "Enabled")
    {
        $emailaddress = $testRecipient
    } # End Testing

    # If a user has no email address listed
    if (($emailaddress) -eq $null)
    {
        $emailaddress = $testRecipient
    }# End No Valid Email

    # Send Email Message
    if (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays))
    {
        $sent = "Yes"
        # If Logging is Enabled Log Details
        if (($logging) -eq "Enabled")
        {
            Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent"
        }
        # Send Email Message
        Send-Mailmessage -Credential $Credential -smtpServer $smtpServer -from $from -to $emailaddress -Port "587" -useSsl -subject $subject -body $body -bodyasHTML -priority High -Encoding $textEncoding

    } # End Send Message
    else # Log Non Expiring Password
    {
        $sent = "No"
        # If Logging is Enabled Log Details
        if (($logging) -eq "Enabled")
        {
            Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent"
        }
    }

} # End User Processing


# End

Ce script va parcourir les utilisateurs et isoler chaque utilisateur dont le mot de passe :

  • possède une date d’expiration
  • n’est pas encore expiré

et pour chacun d’eux, envoie un mail à l’adresse mail spécifiée dans leur profil AD, ou à l’adresse “$testRecipient” si aucune adresse n’est spécifiée.
(Note : en l’état, le script est en mode de test, et n’écrit donc qu’à l’adresse $testRecipient. pour activer l’envoi réel des mails aux utilisateurs, il faut passer $testing à Disabled dans les variables de début de script)

On retrouve la liste des utilisateurs traités (que leur adresse expire bientôt ou non) dans le fichier de log, par défaut C:\log_mail.csv. Ceci peut se désactiver en passant $logging à Disabled.

Tâche planifiée

Enfin, il faut activer l’éxécution automatique de ce script. Pour ceci, dans taskschd.msc, créer une tâche de base, mettre en programme/script powershell et en argument -windowstyle hidden -File "C:\chemin\vers\le\script\password_notification.ps1"

Lister les dates d’expiration de mot de passe

En powershell :
get-aduser -filter * -properties passwordlastset, passwordneverexpires |ft Name, passwordlastset, Passwordneverexpires

Source

31 May 2021, 00:00

Gestion des disques OPAL 2.0

(OPAL 1 est un peu différent et n’est pas analysé ici)

Généralités

La norme OPAL 2.0 est une norme qui définit notamment un standard pour qu’un péripĥérique de stockage (disque dur, ssd etc) auto-protège ses données par du chiffrement. C’est un SED, un Self-Encrypting Disk.
C’est donc une puce dans le disque lui-même qui s’occupe de chiffrer et déchiffrer les données (libérant ainsi le CPU de ces tâches, et réduisant la surface d’attaque concernant les failles CPU/RAM ; d’autres attaques concernant ce type de chiffrement sont toutefois existantes).

Le chiffrement du disque se fait un peu à la manière de LUKS : la clé qui va réellement chiffrer les données (Data Encryption Key, DEK) est elle-même chiffrée par le mot de passe utilisateur (Authentication Key, AK).
Ainsi, il est facile de changer le mot de passe du disque sans tout rechiffrer (la DEK ne change pas, mais est rechiffrée avec la nouvelle AK).
Il est également instantané et simple d’effacer de manière sécurisée et intégralement un disque, simplement en regénérant une nouvelle DEK. Ainsi, le reste du contenu n’a pas besoin d’être effacé, puisqu’il est indéchiffrable, la clé ayant été supprimée. C’est le Secure Disk Erasure.

Sur un disque OPAL, les données sont TOUJOURS chiffrées par une DEK, mais en l’absence de AK, la DEK est lisible en clair et donc utilisée de manière transparente (voir MSID).

Spécifications d’OPAL sur le site du TCG : https://www.trustedcomputinggroup.org/wp-content/uploads/TCGandNVMe_Joint_White_Paper-TCG_Storage_Opal_and_NVMe_FINAL.pdf

Un diaporama qui schématise bien OPAL et différentes attaques

USB

La disponibilité de l’interface OPAL via un adaptateur USB va dépendre de l’adaptateur en question. Ce fil mentionne un adaptateur qui semble fonctionner avec les disques M.2 SATA et NVMe.

Doc chez ArchLinux

Terminologie

  • SD : Storage Device : le support de stockage (disque, SSD, clé USB etc)
  • MEK (ou DEK) : Media (ou Data) Encryption key : la clé qui chiffre les données sur le disque ; chiffrée par la KEK
  • AC : Authentication Credentials : le mot de passe utilisateur (“password”)
  • AK : Authentication Key (ou PIN) : dérivée de l’AC
  • KEK : Key-Encryption-Key : dérivée de l’AK, chiffre la DEK
  • TPer : Trusted Peripheral
  • MSID : Manufacturer Secure ID : une clé fixe, lisible par tout le monde directement sur le disque, qui fait office de AK par défaut.
  • PSID : Physical Security ID : présent physiquement sur le disque (ou la boîte), permet de réinitiliser le disque (avec PERTE de données). Il est optionnel pour OPAL v2.00, et obligatoire pour OPAL v2.01
  • Verrouillage (Locking) : Création/suppression de la MEK (déchiffrée) dans la RAM du disque. Lorsqu’elle est absente, le disque est verrouillé. Une fois la MEK accessible grâce au password, elle est stockée dans la RAM du disque jusqu’à la prochaine coupure d’alimentation (ou verrouillage manuel ?). Le disque est alors déverrouillé.

Locking Range

Les intervalles de verrouillage sont des sections continues sur le disque, exprimées en LBA, qui peuvent être verrouillées de manière indépendantes les unes des autres. Chaque intervalle a sa propre MEK.
Ceci permet, il me semble, de partager un disque entre plusieurs utilisateurs, en ne laissant chacun accéder qu’aux données qui lui sont autorisées.
Ceci permet également d’avoir certains intervalles qui ne sont PAS chiffrés.

Le Global Range représente l’ensemble des intervales qui ne sont pas définis explicitement (les Local Ranges). C’est le range 0.

Lorsqu’on définit un nouvel intervalle, les données déjà présentes dessus sont détruites.

On peut lister les LockingRange ainsi :
sudo ./sedutil-cli --listLockingRanges mYpAsSwOrD /dev/sdX

Authentification pré-boot

La Preboot-Authentication (PBA) est un MBR particulier (shadow MBR) qui contient une instance de sedutil permettant de déverrouiller le disque, pour ensuite pouvoir le démarrer.
Selon cette discussion, MBREnable = Y dit au disque de présenter ce shadow MBR lors du boot, alors que MBRDone = Y dit au disque de ne PLUS présenter ce shadow MBR.

Sous Debian

La gestion d’un disque OPAL sous Linux se fait avec l’utilitaire sedutil. C’est un utilitaire open-source, développée par la Drive Trust Alliance.
Il n’est, en 2021, pas disponible dans les dépôts Debian, et doit donc être téléchargé ou compilé depuis le lien ci-dessus.

Pour pouvoir gérer les disques SATA, il faut activer le paramètre allow_tpm du module libata. Pour le faire de manière permanente, il faut ajouter libata.allow_tpm=1 à /etc/default/grub (ligne GRUB_CMDLINE_LINUX_DEFAULT=), mettre à jour la config de GRUB et redémarrer.
Pour le faire de manière temporaire sans redémarrage du système, il semble qu’il faille écrire 1 dans le fichier /sys/module/libata/parameters/allow_tpm, mais je n’arrive pas à obtenir l’accès en écriture sur mon système.

Ceci ne semble pas nécessaire pour les disques NVMe. Par contre, il semble qu’il faille être root.

Utilisation de sedutil

Cet utilitaire nécessite souvent les droits root pour agir directement sur le périphérique.

Syntaxe

Codes d’erreur :

  • NOT_AUTHORIZED : mauvais mot de passe
  • AUTHORITY_LOCKED_OUT : trop d’essais infructueux, il faut éteindre/rallumer le disque

Lister les disques et leur support d’OPAL :

sudo sedutil-cli --scan
/dev/sda No -> Pas de support d’OPAL
/dev/sda 12 -> Support d’OPAL (“12” pour support de OPAL 1 et 2, “2” pour support d’OPAL 2 uniquement, il me semble)

Lister les détails d’un périphérique :

sudo ./sedutil-cli --query /dev/nvme0
On y voit notamment le statut de verrouillage (LockingEnabled) et de shadowing du MBR (MBREnabled) :

Locking function (0x0002)
    Locked = N, LockingEnabled = Y, LockingSupported = Y, MBRDone = N, MBREnabled = Y, MediaEncrypt = Y

PSID revert - DÉTRUIT TOUTES LES DONNÉES SI VERROUILLAGE ACTIVÉ

Ceci va réinitialiser https://www.reddit.com/r/sysadmin/comments/9ogdnk/psid_revert_of_encrypted_ssd_not_possible/
sudo ./sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID PSIDPASSWORD /dev/sdX
sudo ./sedutil-cli --PSIDrevert PSIDPASSWORD /dev/sdX
Si le constructeur a mis des tirets dans le PSID, il faut les enlever (sinon on aura l’erreur “One or more header fields have 0 length”). Il doit faire 32 caractères de long.

Initialisation du chiffrement

sudo sedutil-cli --initialSetup mYpAsSwOrD /dev/sdX
Définit les mot de passe SID et Admin1 (avec le password fourni) (c’est le takeownership).
Active le shadowing de MBR.

Ceci équivaut aux suites de commandes (à vérifier) :

sudo ./sedutil-cli --takeOwnership mYpAsSwOrD /dev/sdX
# définit les password SID et Admin1

sudo ./sedutil-cli --activateLockingSP mYpAsSwOrD /dev/sdX
# active la possibilité de chiffrement ? (LockingEnabled)

sudo ./sedutil-cli --setMBREnable on mYpAsSwOrD /dev/sdX
#

On peut ensuite effectivement chiffrer le disque :
sudo ./sedutil-cli --enablelockingrange 0 mYpAsSwOrD /dev/sdX

Le disque devient ainsi non-lisible sans le mot de passe (y compris le MBR, il n’apparaîtra pas dans fdisk).
On voit “Locked = Y” lorsqu’on lance query

Déverrouillage d’un disque chiffré

sudo ./sedutil-cli --setlockingrange 0 rw mYpAsSwOrD /dev/sdX
Il redevient ainsi libible, y compris le MBR.
On peut également définir le volume en lecture seule :
sudo ./sedutil-cli --setlockingrange 0 ro mYpAsSwOrD /dev/sdX
ou le verrouiller :
sudo ./sedutil-cli --setlockingrange 0 lk mYpAsSwOrD /dev/sdX

Suppression du chiffrement

https://github.com/Drive-Trust-Alliance/sedutil/wiki/Remove-OPAL

On peut désactiver le chiffrement SANS suppresion des données avec :
sudo ./sedutil-cli --revertnoerase mYpAsSwOrD /dev/sdX
(il faut avoir deverrouillé le disque avant, en RX ou RO, sinon erreur FAIL)