SMTP DANE og DNSSEC i Microsoft 365

Sådan opsætter du Inbound SMTP DANE og DNSSEC i Microsoft 365 (inkl. test-links)

Kort fortalt: DNSSEC sikrer dine DNS‑opslag mod manipulation, og DANE sørger for, at TLS‑certifikatet på den modtagende mailserver kan valideres via DNS (TLSA‑records). Sammen beskytter de dit indgående mailflow mod DNS‑spoofing, TLS‑downgrade og MTA‑man‑in‑the‑middle. Microsoft har i dag fuld støtte til outbound DANE og ruller inbound DANE/DNSSEC ud i Exchange Online, samtidig med at infrastrukturen bevæger sig fra mail.protection.outlook.com til nye, DNSSEC‑sikrede subdomæner under mx.microsoft. Det påvirker MX/A‑provisioneringen for nye/ migrerede domæner.


Hvad betyder det i praksis?

  • DNSSEC: Kryptografisk signering af DNS‑records forhindrer spoofing og manipulation af dine domæneopslag.
  • SMTP DANE: Afsendende MTA henter TLSA‑records for din MX og validerer, at TLS‑certifikatet matcher, så forbindelsen ikke kan kapres eller nedgraderes.

Forudsætninger

  • Domænet er tilføjet som Accepted Domain og er “Healthy” i Microsoft 365.
  • Du kan forbinde til Exchange Online PowerShell.
  • Under MX‑skiftet må der ikke være fallback/sekundære MX‑records.
  • DNSSEC skal være slået til hos DNS‑registratoren, ellers kan DANE ikke fungere.

Trin‑for‑trin: Fra tjek til fuld validering

1) Bekræft at domænet er DNSSEC‑signeret

Gå til Verisigns DNSSEC Debugger, indtast domænet, og bekræft, at alle felter er grønne:
https://dnssec-debugger.verisignlabs.com/

Hvis DNSSEC ikke er aktivt, skal det aktiveres hos jeres registrator, før du kan fortsætte (ellers kan TLSA/DANE ikke blive “trusted”).


2) Sænk TTL på din eksisterende MX‑record

I DNS‑panelet:
• Sæt TTL: 1 minut
• Sæt Priority: 0 eller 10
Vent evt. den gamle TTL ud for at sikre hurtig propagation under migrationen. Denne best practice er anbefalet i flere implementeringsguides.


3) Forbind til Exchange Online PowerShell

Åbn PowerShell som administrator og kør:
Connect-ExchangeOnline
(Forbindelsen giver adgang til de nødvendige cmdlets til DNSSEC og DANE.)


4) Aktiver DNSSEC for domænet i Microsoft 365

Kør følgende kommando og notér værdien DnssecMxValue i output – den skal bruges i næste trin:
Enable-DnssecForVerifiedDomain -DomainName "ditdomæne.dk"
Denne proces klargør Microsoft‑siden af DNSSEC for dit domæne og udstiller den værdi, som din nye MX skal pege på.


5) Opret den nye DNSSEC‑sikrede MX‑record

I DNS‑zonen opretter du en ny MX‑record:
• Value: (brug DnssecMxValue fra trin 4)
• TTL: 1 minut
• Priority: 20 (så den endnu ikke er primær)
Denne MX peger på Microsofts nye DNSSEC‑sikrede mailinfrastruktur under mx.microsoft.


6) Verificér at den nye MX virker (parallelt med den gamle)

Kør Inbound SMTP‑testen i Microsoft Connectivity Analyzer:
https://testconnectivity.microsoft.com/tests/O365InboundSmtp/input
Begge MX‑hosts – din gamle (.mail.protection.outlook.com) og den nye (.mx.microsoft) – skal give grønne resultater før du går videre.


7) Fjern den gamle MX‑record

Når både gammel og ny MX består testen, slet den gamle MX‑record (typisk der ender på mail.protection.outlook.com). Tag evt. en zone‑export som backup først.


8) Gør den nye MX til primær

Ændr prioriteten på den nye MX til:
0
Nu er den nye, DNSSEC‑sikrede rute aktiv.


9) Valider DNSSEC hos Microsoft

Kør DNSSEC Validation i Connectivity Analyzer (vælg “DNSSEC Validation”):
https://testconnectivity.microsoft.com/tests/O365DaneValidation/input
Fortsæt først, når du har grøn status.


10) Aktivér Inbound SMTP DANE for domænet

Kør følgende:
Enable-SmtpDaneInbound -DomainName "ditdomæne.dk"
Vent ca. 15 minutter, mens Microsoft publicerer TLSA‑records i backend (propagation).


11) Sluttest: DANE Validation (inkl. TLSA og DNSSEC)

Gå til samme værktøj, men vælg “DANE Validation including DNSSEC”:
https://testconnectivity.microsoft.com/tests/O365DaneValidation/input
Du skal have grøn status for DNSSEC, TLSA og DANE, før opsætningen anses for fuldført. 


Ekstra: Samlet kvalitetstjek med Internet.nl

Kør en mail‑test hos Internet.nl for at få en samlet procentscore og status for bl.a. DNSSEC, DANE, STARTTLS, DKIM, SPF, DMARC, IPv6 og RPKI:
https://internet.nl/test-mail/
Det er en officiel test fra Dutch Internet Standards Platform og en god “end‑to‑end” sanity check på hele jeres opsætning.


Kendte ændringer i Microsofts infrastruktur (vigtigt for roadmaps)

Microsofts indførelse af DNSSEC‑sikrede zoner betyder, at fremtidige Accepted Domains provisions under subdomæner af .mx.microsoft, som over tid erstatter .mail.protection.outlook.com for hosting af A/MX‑records. Planlæg derfor opdateringer til partnere, smarthosts og connectors—især hvis de peger hårdt på vanity‑domæner/protection‑endpoints.


Hurtig tjekliste (copy‑paste‑venlig)

Connect-ExchangeOnline
Enable-DnssecForVerifiedDomain -DomainName "ditdomæne.dk"
(Opret ny MX i DNS: value = DnssecMxValue, TTL 1 min, priority 20)
Test inbound MX: https://testconnectivity.microsoft.com/tests/O365InboundSmtp/input
(Slet gammel MX)
(Sæt ny MX priority til 0)
Test DNSSEC: https://testconnectivity.microsoft.com/tests/O365DaneValidation/input (DNSSEC Validation)
Enable-SmtpDaneInbound -DomainName "ditdomæne.dk"
Test DANE inkl. TLSA: https://testconnectivity.microsoft.com/tests/O365DaneValidation/input (DANE Validation including DNSSEC)
Samlet kvalitetstjek: https://internet.nl/test-mail/


Konklusion

Ved at aktivere DNSSEC + Inbound SMTP DANE i Microsoft 365, sikrer du dit indgående mailflow mod de mest almindelige angreb på DNS‑ og TLS‑laget, samtidig med at du gør din mailinfrastruktur klar til Microsofts kommende standard med .mx.microsoft. Det er et af de mest effektive, fremtidssikrede tiltag, du kan lave på relativt kort tid—og det kan verificeres løbende med de officielle testværktøjer ovenfor.

 📞 Mobil: +45 2278 2720
📧 E-mail: kc@todo-it.dk
🌐 Website: www.todo-it.dk

 

Windows Update via Powershell

# 5. Set ExecutionPolicy to Unrestricted
Set-ExecutionPolicy Unrestricted

# 2. Install the PSWindowsUpdate module if not already installed

Install-Module -Name PSWindowsUpdate -Force -AllowClobber

# 3. Import the module

Import-Module PSWindowsUpdate

# 4. Check for and install the 25H2 update

# -AcceptAll automatically accepts license agreements
# -IgnoreReboot prevents an immediate reboot, allow it if you are ready
Get-WindowsUpdate -AcceptAll -Install -IgnoreReboot

# 5. Set
ExecutionPolicy to default
Set-ExecutionPolicy Default

Send e-mail fra en aliasadresse i Office 365

Send e-mail fra en aliasadresse i Office 365 – Sådan gør du

Når du bruger en aliasadresse til at sende en mail, bevares denne i "Afsender" og "Svar-til"-felterne for modtageren. Modtageren vil kun se din aliasadresse og ikke din primære e-mailadresse.

Forudsætning: Aktiver "Send fra alias" i Admin Center (Ændringer kan ta op til 60 minutter for at slå igennem)

Funktionen skal aktiveres af din administrator, før den kan bruges. Dette gøres i Exchange Admin Center under Indstillinger > Mailflow ved at aktivere Turn on sending from aliases eller via PowerShell med kommandoen:

powershell
Set-OrganizationConfig -SendFromAliasEnabled $true

Sådan konfigurerer du dine aliasadresser i Outlook (Desktop og Web)

Før du kan vælge en aliasadresse i "Fra"-feltet, skal du aktivere den i Outlooks indstillinger. Denne proces er stort set den samme i både Outlook Desktop og Outlook på nettet.

Trin 1: Åbn Indstillinger og find afsenderadresser

  1. Åbn Outlook (på desktop eller på nettet).

  2. Klik på Indstillinger (tandhjuls-ikonet).

  3. Gå til sektionen Mail > Skriv og svar (på engelsk: Mail > Composes and reply).

  4. Rul ned til Adresser at sende fra (på engelsk: Addresses to send from).

Trin 2: Aktivér og administrer dine aliasadresser

  1. Klik på Aktivér.

  2. Et vindue vil åbne, hvor alle dine godkendte aliasadresser vises.

  3. Her kan du vælge hvilke aliasadresser, der skal være tilgængelige i din "Fra"-menu ved at markere eller fjerne markeringen i afkrydsningsfelterne.

  4. Gem indstillingerne.

Sådan sender du en e-mail fra din aliasadresse

Når dine aliasadresser er aktiveret, er de nemme at bruge.

  1. Opret en ny mail.

  2. Klik på Fra-feltet (hvis det ikke er synligt, skal du aktivere det via "Vis..."-menuens indstillinger).

  3. Vælg den ønskede aliasadresse direkte fra dropdown-menuen. Du behøver ikke at indtaste den manuelt.

Nu vil din e-mail blive sendt fra aliasadressen, og modtageren vil kun se denne som afsender.

Powershell Outlook Signature Local AD

powershell
<#
.SYNOPSIS
    Generate Outlook Signature with data from Local AD
.DESCRIPTION
    This script generates Outlook signatures automatically using Active Directory data.
    It should be run as a logon script. For testing purposes, you can run it with initials.
.NOTES
    Author: Kasper Lundgaard Christensen - TODO-IT
    Date: 01-04-2024
    Version: 1.0
#>

# Parameters
param(
    [string]$UserOverwrite
)

# Getting Active Directory information for current user
$user = (([adsisearcher]"(&(objectCategory=User)(samaccountname=$env:username))").FindOne().Properties)

# Overwrite user for testing purposes
if ($UserOverwrite) {
    $user = (([adsisearcher]"(&(objectCategory=User)(samaccountname=$UserOverwrite))").FindOne().Properties)
    Write-Host "Testing with user: $UserOverwrite"
}

# If the user is not found in Active Directory exit the script
if (!$user) {
    Write-Error "User not found in Active Directory"
    exit 1
}

# Signature configuration
$folderLocation = $Env:APPDATA + '\Microsoft\Signatures'
$filename = "AD Signature"
$file = "$folderLocation\$filename"

# Company information
$companyName = "Company Name"
$logo = "Logo link"
$logoURL = "Logo URL"
$companyPhone = "Phone Number"
$slogan_1 = "Slogan"
$considerPrint = "Please consider the environment before printing this email"

# Create signatures folder if it doesn't exist
if (!(Test-Path -Path $folderLocation)) {
    New-Item -ItemType Directory -Path $folderLocation -Force
}

# Get user properties from Active Directory
$userProperties = @{
    DisplayName  = if ($user.name.Count -gt 0) { $user.name[0] } else { $null }
    JobTitle     = if ($user.title.Count -gt 0) { $user.title[0] } else { $null }
    Email        = if ($user.mail.Count -gt 0) { $user.mail[0] } else { $null }
    Company      = if ($user.company.Count -gt 0) { $user.company[0] } else { $null }
    Mobile       = if ($user.mobile.Count -gt 0) { $user.mobile[0] } else { $null }
    DirectDial   = if ($user.homephone.Count -gt 0) { $user.homephone[0] } else { $null }
    Telephone    = if ($user.telephonenumber.Count -gt 0) { $user.telephonenumber[0] } else { $null }
    Website      = if ($user.wwwhomepage.Count -gt 0) { $user.wwwhomepage[0] } else { $null }
    PoBox        = if ($user.postofficebox.Count -gt 0) { $user.postofficebox[0] } else { $null }
    Office       = if ($user.physicaldeliveryofficename.Count -gt 0) { $user.physicaldeliveryofficename[0] } else { $null }
    Street       = if ($user.streetaddress.Count -gt 0) { $user.streetaddress[0] } else { $null }
    City         = if ($user.l.Count -gt 0) { $user.l[0] } else { $null }
    State        = if ($user.st.Count -gt 0) { $user.st[0] } else { $null }
    ZipCode      = if ($user.postalcode.Count -gt 0) { $user.postalcode[0] } else { $null }
}

# Group Check for custom logo
$Group = [ADSI]"LDAP://CN=Signature_CompanyLogo,OU=Signature,OU=Security Groups,OU=Users,DC=contoso,DC=dk"
$Group.Member | ForEach-Object {
    if ($user.distinguishedname -match $_) {
        $logo = "Alternative Logo Link"
    }
}

# CSS Styles
$style = @"
<style>
    p, table, td, tr, a, span {
        font-family: Calibri, Helvetica, sans-serif;
        font-size: 11pt;
        color: #000000;
    }

    span.blue {
        color: #000000;
    }

    table {
        margin: 0;
        padding: 0;
    }

    a {
        text-decoration: none;
    }

    hr {
        border: none;
        height: 1px;
        background-color: #000000;
        color: #000000;
        width: 700px;
    }

    .Contact {
        width: 150px;
    }

    table.main {
        /* Main table styles */
    }
</style>
"@

# HTML Signature
$htmlSignature = @"
<span>Med venlig hilsen/Kind regards/Mit freundlichen Grüssen</span><br />
$(if ($userProperties.DisplayName) { "<span><b>$($userProperties.DisplayName)</b></span><br />" })
$(if ($userProperties.JobTitle) { "<span>$($userProperties.JobTitle)</span><br /><br />" })

<p>
<table class='main'>
    <tr>
        <td colspan='2' style='padding-right: 75px;'>
            $(if ($logo) { "<a href='$logoURL'><img src='$logo' /></a>" })
        </td>
    </tr>
    <tr>
        <table>
            $(if ($userProperties.Telephone) { "<tr><td class='Contact'>Hovednummer: </td><td><a href='tel:$companyPhone'>$companyPhone</a></td></tr>" })
            $(if ($userProperties.Mobile) { "<tr><td class='Contact'>Mobil: </td><td><a href='tel:+45 $($userProperties.Mobile)'>+45 $($userProperties.Mobile)</a></td></tr>" })
            $(if ($userProperties.Email) { "<tr><td class='Contact'>Email: </td><td><a href='mailto:$($userProperties.Email)'>$($userProperties.Email)</a></td></tr>" })
            $(if ($userProperties.Website) { "<tr><td class='Contact'>Website: </td><td><a href='https://$($userProperties.Website)'>$($userProperties.Website)</a></td></tr>" })
        </table>
        <table>
            <tr>
                <br/>
                <br/>
                <br/>
            </tr>
            <tr>
                <td colspan='2' style='padding-bottom: 10px;'>
                    $(if ($companyName) { "<b>$companyName</b><br/>" })
                    $(if ($userProperties.Street) { "$($userProperties.Street)<br/>" })
                    $(if ($userProperties.ZipCode) { "$($userProperties.ZipCode) " })
                    $(if ($userProperties.City) { $userProperties.City })
                </td>
            </tr>
            <tr>
                <td colspan='2'>
                    <p>$slogan_1</p>
                </td>
            </tr>
        </table>
    </tr>
</table>
</p>
<br />
"@

# Save HTML signature
$style + $htmlSignature | Out-File "$file.htm" -Encoding UTF8

# Text signature for plain text emails
$textSignature = @"
Med venlig hilsen/Kind regards/Mit freundlichen Grüssen
$(if ($userProperties.DisplayName) { $userProperties.DisplayName })
$(if ($userProperties.JobTitle) { $userProperties.JobTitle })

$(if ($userProperties.Telephone) { "Hovednummer: $companyPhone" })
$(if ($userProperties.Mobile) { "Mobil: +45 $($userProperties.Mobile)" })
$(if ($userProperties.Email) { "Email: $($userProperties.Email)" })

$(if ($companyName) { $companyName })
$(if ($userProperties.Street) { $userProperties.Street })
$(if ($userProperties.ZipCode) { $userProperties.ZipCode }) $(if ($userProperties.City) { $userProperties.City })
"@

# Save text signature
$textSignature | Out-File "$file.txt" -Encoding Default

# Configure Outlook signatures in registry
$outlookVersions = @(
    @{ Version = "16.0"; Path = "HKCU:\Software\Microsoft\Office\16.0" },
    @{ Version = "14.0"; Path = "HKCU:\Software\Microsoft\Office\14.0" }
)

foreach ($outlook in $outlookVersions) {
    $commonPath = $outlook.Path + "\Common"
    
    if (Test-Path $commonPath) {
        # Set signature path
        if (Test-Path "$commonPath\General") {
            Set-ItemProperty -Path "$commonPath\General" -Name "Signatures" -Value "Signatures" -Force
        }
        
        # Set default signatures
        if (Test-Path "$commonPath\MailSettings") {
            Set-ItemProperty -Path "$commonPath\MailSettings" -Name "NewSignature" -Value $filename -Force
            Set-ItemProperty -Path "$commonPath\MailSettings" -Name "ReplySignature" -Value $filename -Force
        }
        
        # Remove First-Run flag
        $setupPath = $outlook.Path + "\Outlook\Setup"
        if (Test-Path $setupPath) {
            Remove-ItemProperty -Path $setupPath -Name "First-Run" -ErrorAction SilentlyContinue
        }
    }
}

Write-Host "Signature generated successfully for $($userProperties.DisplayName)"

Brugsanvisning:

Normal brug (som logonscript):

  • Deploy scriptet som logonscript via Group Policy

Test kørsel:

powershell
.\Script.ps1 -UserOverwrite "Initialer"

Funktioner:

  • Henter brugerinformation automatisk fra Active Directory

  • Genererer både HTML og tekst-version af signaturen

  • Understøtter flere Outlook-versioner (2010, 2016, Office365)

  • Mulighed for at teste med specifikke brugere

  • Dynamisk logo baseret på AD-gruppemedlemskab

  • Automatisk opsætning af Outlook-signatur

Bemærk: Husk at tilpasse AD-stier, company information og logo-stier til din organisation før brug.

Sådan forbinder du sikkert til Exchange Online PowerShell

Sådan forbinder du til Exchange Online PowerShell - Den komplette guide

Er du træt af at rode med Exchange Online PowerShell-forbindelser? Skal du sikre dig, at dine scripts er opdaterede og sikre? Så er du kommet til det rette sted!

🚀 Kom i gang på få minutter

Forbindelse til Exchange Online er blevet nemmere og mere sikker end nogensinde før. Her er hvordan du kommer i gang:

Installation af modulet

powershell
# Installer modulet (kun første gang)
Install-Module -Name ExchangeOnlineManagement

# Opdater til nyeste version (anbefales)
Update-Module -Name ExchangeOnlineManagement

Grundlæggende forbindelse

powershell
# Simpel forbindelse - åbner login-vindue
Connect-ExchangeOnline

# Med specifik bruger
Connect-ExchangeOnline -UserPrincipalName "din.email@firma.dk"

💡 Eksempler fra den virkelige verden

Her er hvordan du bruger forbindelsen i praksis:

powershell
# Tjek mailboks-størrelse
Get-MailboxStatistics -Identity "bruger@firma.dk" | 
Select-Object DisplayName, TotalItemSize

# Se brugeres mailbokse
Get-Mailbox -ResultSize Unlimited | 
Where-Object {$_.UserPrincipalName -like "*@firma.dk"}

🔒 Sikkerhedsbestemmelser du skal kende

powershell
# Vigtigt: Altid log ud efter brug!
Disconnect-ExchangeOnline -Confirm:$false

# Til automatisering - brug certificat-baseret auth
Connect-ExchangeOnline -CertificateThumbprint "XYZ123" -AppId "GUID" -Organization "contoso.onmicrosoft.com"

🛠️ Troubleshooting tips

Fejler forbindelsen? Prøv disse løsninger:

  • Kør Import-Module ExchangeOnlineManagement

  • Tjek at du har nyeste PowerShell-version

  • Prøv at køre som administrator

  • Sikr internetforbindelse til Office 365 endpoints

Husk at tjekke din session:

powershell
# Bekræft at du er forbundet
Get-ConnectionInformation

# Se tilgængelige kommandoer
Get-Command -Module ExchangeOnlineManagement

📈 Pro-tips til avanceret brug

  • Brug -ShowProgress $true ved store datasæt

  • -Verbose giver detaljeret output til fejlfinding

  • Gem dine scripts i VS Code med syntax highlighting

  • Brug variabler til gentagne elementer

🎯 Opsummering

Exchange Online PowerShell er et kraftfuldt værktøj, og med de rigtige forbindelsesmetoder får du:

  • Hurtigere arbejdsgang - automatisér gentagne opgaver

  • Bedre oversight - få fuld kontrol over din Exchange-miljø

  • Øget sikkerhed - moderne authentication som standard

Klar til at automatisere dine Exchange-opgaver? Hvad vil du gerne optimere i din hverdag? Del dine spørgsmål og erfaringer nedenfor! 👇

Har du brug for hjælp til specifikke scenarier? Spørg away - vi hjælper gerne!