64138831a8
Neue Skripte dnssec_check (Bash, dig) und dnssec_check.ps1 (PowerShell, Resolve-DnsName): pruefen fuer hinterlegbare Domains den DNSSEC-Status (aktiv/inaktiv/fail) inkl. Resolver-Selbsttest. README erweitert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
185 lines
5.9 KiB
Markdown
185 lines
5.9 KiB
Markdown
# dig.ps1 — dig-artiger DNS-Lookup für PowerShell
|
|
|
|
Ein PowerShell-Skript, das die wichtigsten `dig`-Aufrufe unter Windows nachbildet.
|
|
Intern wird `Resolve-DnsName` verwendet.
|
|
|
|
## Aufrufe
|
|
|
|
```powershell
|
|
.\dig.ps1 example.com # A-Record (Default)
|
|
.\dig.ps1 MX example.com # type name
|
|
.\dig.ps1 example.com MX # name type (Reihenfolge egal)
|
|
.\dig.ps1 example.com MX -s 1.1.1.1 # gegen bestimmten Server (@-frei)
|
|
.\dig.ps1 example.com MX "@1.1.1.1" # gegen bestimmten Server (@ gequotet)
|
|
.\dig.ps1 -x 8.8.8.8 # Reverse-Lookup (PTR)
|
|
.\dig.ps1 example.com TXT +short # nur die Werte ausgeben
|
|
```
|
|
|
|
Unterstützt: Record-`type`, `name`, `@server` bzw. `-s server`, die Option `+short` sowie `-x` für Reverse-Lookups.
|
|
|
|
### DNS-Server angeben: `@server` muss gequotet werden
|
|
|
|
PowerShell deutet ein Argument mit führendem `@` als **Splatting-Operator** und bricht
|
|
schon beim Parsen ab (`Der Splat-Operator "@" kann nicht … verwendet werden`), bevor das
|
|
Skript überhaupt startet. Für die `@server`-Syntax daher **Anführungszeichen** verwenden:
|
|
|
|
```powershell
|
|
.\dig.ps1 example.com MX "@8.8.8.8"
|
|
```
|
|
|
|
Oder die `@`-freie Alternative `-s` / `-server` nutzen:
|
|
|
|
```powershell
|
|
.\dig.ps1 example.com MX -s 8.8.8.8
|
|
.\dig.ps1 example.com MX -server 8.8.8.8
|
|
```
|
|
|
|
## `dig`-Funktion anlegen
|
|
|
|
Damit sich das Skript wie unter Linux einfach mit `dig …` (statt `.\dig.ps1 …`) aufrufen lässt,
|
|
wird eine Funktion im PowerShell-Profil angelegt.
|
|
|
|
### 1. Skript ablegen
|
|
|
|
Kopiere `dig.ps1` an einen festen Ort, z. B.:
|
|
|
|
```powershell
|
|
C:\Tools\dig.ps1
|
|
```
|
|
|
|
### 2. Profil öffnen (bei Bedarf anlegen)
|
|
|
|
```powershell
|
|
# Existiert das Profil schon?
|
|
Test-Path $PROFILE
|
|
|
|
# Falls nicht: anlegen
|
|
if (-not (Test-Path $PROFILE)) {
|
|
New-Item -ItemType File -Path $PROFILE -Force
|
|
}
|
|
|
|
# Profil im Editor öffnen
|
|
notepad $PROFILE
|
|
```
|
|
|
|
### 3. Funktion eintragen
|
|
|
|
Füge folgende Zeilen in die Profildatei ein und passe den Pfad an:
|
|
|
|
```powershell
|
|
function dig {
|
|
& "C:\Tools\dig.ps1" @args
|
|
}
|
|
```
|
|
|
|
`@args` reicht alle Argumente unverändert an das Skript weiter, sodass die dig-Syntax
|
|
1:1 erhalten bleibt.
|
|
|
|
### 4. Profil neu laden
|
|
|
|
```powershell
|
|
. $PROFILE
|
|
```
|
|
|
|
Danach steht `dig` in jeder neuen PowerShell-Sitzung zur Verfügung:
|
|
|
|
```powershell
|
|
dig example.com MX @1.1.1.1
|
|
dig -x 8.8.8.8 +short
|
|
```
|
|
|
|
## Ausführungsrichtlinie (ExecutionPolicy)
|
|
|
|
Wird die Ausführung von Skripten blockiert, kann sie für den aktuellen Benutzer erlaubt werden:
|
|
|
|
```powershell
|
|
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
|
|
```
|
|
|
|
`RemoteSigned` erlaubt lokal erstellte Skripte; aus dem Internet geladene Skripte müssen signiert sein.
|
|
|
|
### „Das Skript ist nicht digital signiert"
|
|
|
|
Wurde `dig.ps1` aus diesem Git-Repo geladen, markiert Windows die Datei mit einer
|
|
„Mark of the Web" (Herkunft: Internet/Netzwerk). Unter `RemoteSigned` wird die Ausführung
|
|
dann mit dem Hinweis blockiert, dass das Skript nicht digital signiert ist.
|
|
|
|
**Empfohlene Lösung** — die Markierung gezielt bei dieser Datei entfernen (Policy bleibt sicher):
|
|
|
|
```powershell
|
|
Unblock-File -Path C:\Tools\dig.ps1
|
|
```
|
|
|
|
**Einmalig ohne Policy-Änderung ausführen** — umgeht die Prüfung nur für diesen Aufruf:
|
|
|
|
```powershell
|
|
powershell -ExecutionPolicy Bypass -File C:\Tools\dig.ps1 example.com MX
|
|
```
|
|
|
|
## Hinweise
|
|
|
|
- Das Skript benötigt das Modul `DnsClient` (`Resolve-DnsName`), das unter Windows standardmäßig vorhanden ist.
|
|
- Die Standardausgabe orientiert sich am `dig`-Format mit `QUESTION`- und `ANSWER SECTION`.
|
|
- Mit `+short` werden nur die reinen Antwortwerte ausgegeben (eine pro Zeile).
|
|
|
|
---
|
|
|
|
# dnssec_check — DNSSEC-Status prüfen
|
|
|
|
Prüft für eine hinterlegbare Liste von Domains, ob **DNSSEC aktiviert und gültig
|
|
signiert** ist, und testet vorab, ob der abgefragte Resolver überhaupt validiert.
|
|
Es gibt zwei funktionsgleiche Varianten:
|
|
|
|
| Datei | Plattform | Werkzeug |
|
|
|-------|-----------|----------|
|
|
| `dnssec_check` | Linux/macOS (Bash) | `dig` (Paket `bind9-dnsutils`) |
|
|
| `dnssec_check.ps1` | Windows (PowerShell 5.1+) | `Resolve-DnsName` (Modul `DnsClient`) |
|
|
|
|
## Status-Werte
|
|
|
|
| Status | Bedeutung |
|
|
|--------|-----------|
|
|
| `aktiv` | Domain ist DNSSEC-signiert und wird vom validierenden Resolver korrekt ausgeliefert |
|
|
| `inaktiv` | Domain ist **nicht** signiert (kein DNSSEC) |
|
|
| `fail` | DNSSEC vorhanden, aber Validierung schlägt fehl (SERVFAIL) |
|
|
|
|
Der Test ist nur aussagekräftig gegen einen **validierenden** Resolver (z. B. der
|
|
interne BIND mit `dnssec-validation auto;`). Beide Skripte führen daher zuerst
|
|
einen **Selbsttest** aus: `dnssec-failed.org` muss scheitern, `isc.org` muss
|
|
signiert auflösen. Schlägt der Selbsttest fehl, wird gewarnt.
|
|
|
|
## Bash (Linux/macOS)
|
|
|
|
```bash
|
|
sudo apt install bind9-dnsutils # falls dig fehlt
|
|
chmod +x dnssec_check
|
|
./dnssec_check # hinterlegte Liste, Resolver 127.0.0.1
|
|
./dnssec_check -r 192.168.1.10 # anderer Resolver
|
|
./dnssec_check --self-check # nur Resolver-Validierung prüfen
|
|
./dnssec_check isc.org citeq.de # nur diese Domains
|
|
```
|
|
|
|
## PowerShell (Windows)
|
|
|
|
```powershell
|
|
.\dnssec_check.ps1 # hinterlegte Liste, Resolver 127.0.0.1
|
|
.\dnssec_check.ps1 -Resolver 192.168.1.10
|
|
.\dnssec_check.ps1 -SelfCheck # nur Resolver-Validierung prüfen
|
|
.\dnssec_check.ps1 isc.org citeq.de # nur diese Domains
|
|
```
|
|
|
|
> Hinweis: `Resolve-DnsName` liefert das AD-Header-Flag nicht zurück. Die
|
|
> PowerShell-Variante wertet daher das Vorhandensein von **RRSIG-Records** aus.
|
|
> Ob der Resolver wirklich validiert, klärt der Selbsttest.
|
|
|
|
## Domains hinterlegen
|
|
|
|
Die zu prüfenden Domains stehen direkt im Skript:
|
|
- Bash: Array `DOMAINS=( … )` im Kopf
|
|
- PowerShell: `$DefaultDomains = @( … )` im Kopf
|
|
|
|
## Exit-Code (für Monitoring / cron / Scheduled Task)
|
|
|
|
`0` = kein `fail`, `1` = mindestens eine Domain `fail`. Der reine Selbsttest gibt
|
|
`0` (validiert), `1` (validiert nicht) bzw. `2` (Resolver nicht erreichbar) zurück.
|