🛡️ Active Directory Health Check v2.6

🇩🇪 Deutsch | 🇬🇧 English
Active Directory 환경의 상태와 보안을 자동으로 점검하기 위한 포괄적인 PowerShell 스크립트입니다. 모범 사례 평가, 색상으로 구분된 HTML 보고서, CSV 내보내기를 제공합니다.
🇩🇪 Deutsch
📑 목차
✨ 기능
- 🎯 54가지 모범 사례 점검 주제별 정렬 (DC 기본, 보안, 구조, 모니터링)
- 🖼️ 최신 WPF GUI (라이트 테마) - 그룹 선택, 스위트 버튼, 출력 경로 선택
- 🎨 색상으로 구분된 HTML 보고서 - 경영진 대시보드 포함 (OK / WARN / 심각 / INFO)
- 📊 CSV 내보내기 - 모든 점검 결과
- 🖥️ 대화형 시작 메뉴 - 콘솔 운영을 위한 대체 수단
- ⚡ 매개변수 기반 실행 - 예약된 작업 / 자동화용
- 📁 자유롭게 선택 가능한 출력 경로 - GUI 또는
-OutputPath 매개변수로 지정
- 🔍 개별 테스트 파싱을 지원하는 DCDiag (DE/EN 언어 독립적)
- 🔄 루프백 감지 - 로컬 DC용 (FQDN 대신
localhost 사용)
- 📡 핑 건너뛰기 로직 - 연결할 수 없는 DC의 경우 WinRM으로 대체
- 🌍 언어 독립적 - Well-Known SID 사용
- 🗣️ 자동 언어 감지 및 DE/EN 언어 전환 – WPF GUI에서 실시간 전환 가능,
-Language de|en 매개변수로 재정의 가능
- 📝 상세 로깅 (
C:\ScriptLog)
- 🔧 모듈식 구조 - 개별 점검을 선택적으로 실행 가능
📋 54가지 점검 항목
🏗️ DC 기본 인프라
| # | 점검 | 설명 |
|---|
| 1 | DC 시스템 정보 | OS, RAM, 가동 시간, 하드웨어 |
| 2 | 서비스 | NTDS, DNS, Netlogon, KDC, W32Time, DFSR |
| 3 | DCDiag 테스트 | 모든 DC 진단 테스트의 상세 파싱 |
| 4 | 복제 (파트너) | DC 파트너별 상태 |
| 4b | 복제 오류 (포리스트) | 포리스트 전체 복제 문제 |
| 5 | FSMO 역할 | 5가지 FSMO 역할 소유자 모두 |
| 6 | DNS 구성 | 영역, AD 통합, 동적 업데이트 |
| 7 | SYSVOL & NETLOGON | 연결 가능성 |
| 8 | NTDS 데이터베이스 | 크기, 여유 디스크 공간 |
🔒 보안: 네트워크 프로토콜
| # | 점검 | 설명 |
|---|
| 9 | TLS 프로토콜 (SCHANNEL) | SSL 2.0/3.0, TLS 1.0/1.1/1.2/1.3 |
| 10 | 암호 및 알고리즘 | RC4, DES, MD5 및 기타 취약한 암호 |
| 11 | SMB1 & SMB 서명 | WannaCry 보호, 서명 강제 |
| 12 | NTLM / LAN Manager 인증 수준 | LmCompatibilityLevel=5 모범 사례 |
| 13 | LLMNR / NetBIOS / WPAD | Responder 공격 보호 |
| 14 | LDAP 보안 | 서명 + 채널 바인딩 (ADV190023) |
| 15 | Windows 방화벽 | 3개 프로필 모두 활성화? |
👥 보안: 계정 & Kerberos
| # | 점검 | 설명 |
|---|
| 16 | 권한 있는 계정 | Domain/Enterprise/Schema Admins 등 |
| 17 | 암호 정책 | 최소 길이, 기록, 최대 사용 기간, 복잡성, 잠금 |
| 18 | Kerberos / krbtgt | 암호 사용 기간 (모범 사례: ≤180일) |
| 19 | Kerberos 비제한 위임 | 도메인 탈취 위험 감지 |
| 20 | Kerberoasting 위험 | SPN이 있는 사용자 계정 분석 |
| 21 | LSA 보호 (RunAsPPL) | 자격 증명 덤프 (Mimikatz) 방지 |
🛡️ 보안: 시스템 강화
| # | 점검 | 설명 |
|---|
| 22 | DC의 Print Spooler | CVE-2021-34527 (PrintNightmare) |
| 23 | Secure Boot 인증서 업데이트 | Windows UEFI CA 2023 배포 상태 |
| 24 | 인증서 | 만료 모니터링, EKU 확인 |
🌐 AD 구조
| # | 점검 | 설명 |
|---|
| 25 | AD 사이트 | 사이트 개요 |
| 26 | AD 서브넷 | 서브넷-사이트 매핑 |
| 27 | 트러스트 | 도메인/포리스트 트러스트 |
| 28 | AD 휴지통 | 기능 활성화 상태 |
| 29 | Tombstone 수명 | 모범 사례 ≥180일 |
| 30 | 포리스트/도메인 수준 | 기능 수준 |
| 31 | GPO 상태 | Sysvol/DS 버전 불일치 |
👤 비활성 계정
| # | 점검 | 설명 |
|---|
| 32a | 비활성 사용자 | 90일 이상 로그인 없음 |
| 32b | 비활성 컴퓨터 | 90일 이상 로그인 없음 |
| 32c | 암호 만료 안 됨 | 플래그 확인 |
📊 모니터링 & 운영
| # | 점검 | 설명 |
|---|
| 33 | 이벤트 로그 평가 | 시스템 / 디렉터리 서비스 / DNS (최근 24시간) |
| 34 | 시간 동기화 | PDC + 도메인 DC |
| 35 | AD 백업 상태 | repadmin /showbackup 사용 |
| 36 | 설치된 프로그램 | DC별 인벤토리 |
| 37 | Windows 업데이트 | 최근 20개 업데이트, 사용 기간 평가 |
| 45 | 설치된 Windows 기능 | DC별 설치된 역할 및 기능 (ServerManager) |
| 46 | SMB 공유 | 모든 공유 (경로, 권한, 암호화 포함) |
🧬 ID & DNS (신규)
| # | 점검 | 설명 |
|---|
| 38 | SPN 중복 | 중복 할당된 SPN 감지 (Kerberos 충돌) |
| 39 | AS-REP Roasting 위험 | Kerberos 사전 인증이 없는 사용자 |
| 40 | AdminSDHolder / AdminCount 드리프트 | 현재 보호 그룹 멤버십 없이 AdminCount=1 |
| 41 | 세분화된 암호 정책 | FGPP 강화, 잠금, 대상 그룹 매핑 |
| 42 | DNS 위생 (Aging / Scavenging) | Aging/Scavenging, 역방향 영역, 동적 업데이트 위험 |
| 43 | LAPS 구성 | Local Admin Password Solution - 활성화 상태, 컴퓨터 적용 범위 (Server 2019부터) |
| 44 | AES 없는 계정 | RC4 전용 또는 AES 암호화가 없는 계정 찾기 (보안 위험) |
🎯 보안: 2025/2026 공격 벡터
| # | 점검 | 설명 |
|---|
| 47 | RC4 → AES 마이그레이션 감사 | 2026년 RC4 비활성화 전 AES 없는 계정 (CVE-2026-20833) + DC의 KDC 레지스트리 |
| 48 | DCSync 권한 | DC 외부의 복제 권한 (암호 해시 추출 위험) |
| 49 | RBCD & 제한된 위임 | msDS-AllowedToActOnBehalfOfOtherIdentity 및 msDS-AllowedToDelegateTo (프로토콜 전환 포함) |
| 50 | dMSA / BadSuccessor | Delegated Managed Service Accounts (Server 2025) 및 Superseding 패턴 |
| 51 | MachineAccountQuota | ms-DS-MachineAccountQuota (모범 사례: 0) |
| 52 | 익명 LDAP 액세스 | PDC에 대한 익명 바인드 테스트 + dSHeuristics |
| 53 | SYSVOL의 GPP/cpassword | GPP XML의 평문 복호화 가능 암호 (MS14-025) |
| 54 | Protected Users 감사 | 모든 권한 있는 계정이 Protected-Users 그룹에 있는가? |
💻 시스템 요구 사항
- Windows Server 2016 이상
- PowerShell 5.1+
- RSAT / AD 도구 설치:
- ActiveDirectory 모듈
- GroupPolicy 모듈
- DnsServer 모듈
- Domain Admin 권한 권장
- 모든 DC에서 WinRM 활성화 (또는 DCOM 대체)
- AD 연결이 가능한 DC 또는 관리 서버에서 실행
🚀 설치
# Repository klonen
git clone https://gitlab.com/RoccoAmmon/Active-Directory-Health-Check.git
cd Active-Directory-Health-Check
# Skript ausführen (interaktiv)
.\AD_Health_Check.ps1
# Oder automatisiert (alle 54 Checks)
.\AD_Health_Check.ps1 -FullRun
⚙️ 사용법
# Interaktive WPF-GUI (Standard)
.\AD_Health_Check.ps1
# Vollständiger Lauf ohne GUI (für Scheduled Tasks)
.\AD_Health_Check.ps1 -FullRun
# Vollständiger Lauf mit englischer Berichtssprache
.\AD_Health_Check.ps1 -FullRun -Language en
# Nur bestimmte Checks ausführen
.\AD_Health_Check.ps1 -OnlyChecks '22_PrintSpooler','19_Unconstrained'
# Ohne Interaktion
.\AD_Health_Check.ps1 -NoInteractive
# Eigenen Ausgabepfad angeben
.\AD_Health_Check.ps1 -OutputPath 'D:\Reports\AD'
🗣️ Sprache / Language
보고서 언어는 시작 시 자동으로 감지되며, 필요 시 매개변수로 재정의할 수 있습니다.
- 자동 언어 감지: 시작 시 운영 체제 언어에서 언어를 결정합니다(
Get-UICulture). 독일어 Windows 인터페이스 → 독일어, 영어 Windows 인터페이스 → 영어, 그 외 → 독일어.
- WPF-GUI의 언어 전환기 DE/EN: 실시간 전환 가능하며, 모든 GUI 텍스트, 검사 제목 및 그룹 이름에 즉시 적용됩니다.
- 매개변수
-Language de|en: 자동 감지를 재정의합니다 – 예: 예약된 작업용.
- 유효한 값:
de, en – 기본값: 운영 체제 언어.
- 출력 매체: HTML 보고서, 콘솔 출력 및 메뉴가 선택한 언어로 표시됩니다. CSV 내보내기의 열 이름은 기술적으로 유지되며 언어와 무관하게 변경되지 않습니다.
# Beispiel: Vollständiger Lauf mit englischer Ausgabe
.\AD_Health_Check.ps1 -FullRun -Language en
📸 스크린샷
HTML 보고서의 스크린샷은 추후 제공됩니다.
⚙️ 구성
모든 임계값은 스크립트 시작 부분의 변수 블록에서 구성할 수 있습니다:
| 변수 | 기본값 | 설명 |
|---|
InactiveDaysUser | 90 | 로그인 없는 일수 → 사용자 비활성 |
InactiveDaysComputer | 90 | 로그인 없는 일수 → 컴퓨터 비활성 |
CertExpiryWarnDays | 60 | 인증서 만료 경고 |
CertExpiryCritDays | 14 | 인증서 만료 심각 |
KrbtgtMaxAgeDays | 180 | 최대 krbtgt 비밀번호 사용 기간 |
BackupMaxAgeDays | 7 | 백업 사용 기간 경고 |
BackupCritAgeDays | 14 | 백업 사용 기간 심각 |
WUMaxAgeDaysWarn | 35 | Windows 업데이트 사용 기간 경고 |
WUMaxAgeDaysCrit | 60 | Windows 업데이트 사용 기간 심각 |
전체 구성 참조: Wiki → 임계값
📄 보고서 출력
결과는 C:\ScriptLog에 저장됩니다:
- HTML 보고서 - 경영진 대시보드 포함 (색상 코드)
- CSV 내보내기 - 검사별 (Excel/Power BI/SIEM용)
- 로그 파일 - 실행 프로토콜 포함
🏗️ 아키텍처
- 개별 호출 가능한 검사 함수를 갖춘 모듈식 구조
- 로컬 DC에 대한 루프백 감지
- Well-Known SID를 통한 언어 독립적 (DE/EN)
- Ping 폴백을 갖춘 WinRM 기반 원격 쿼리
🔧 문제 해결