feat(scripts): T-5.4 Bootstrap Script v2.0 with Smart Selection#5175
feat(scripts): T-5.4 Bootstrap Script v2.0 with Smart Selection#5175obtFusi wants to merge 28 commits intonetbirdio:mainfrom
Conversation
- PR lint workflow (Conventional Commits validation) - Auto-label workflow (Epic/Story/Task + type detection) - Dependabot config (Go, Docker, GitHub Actions) - Issue templates (Bug, Feature, Epic, Story, Task) - PR template with checklist Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ci: add GitHub configuration from network-agent pattern
Implements server-side mTLS authentication infrastructure: - MTLSIdentity extraction from client certificates - SAN DNSName as primary identity (not CN!) - Template OID (v2) and Template Name (v1) parsing - BMPString (UTF-16BE) decoding for AD CS templates - PeerType determination (machine/user/unknown) - Issuer fingerprint via VerifiedChains (strong binding) - gRPC interceptors (unary + stream) with method-based routing Includes: - ADR-001: mTLS Port Strategy - ADR-002: CNG Signer Interface (for T-1.1) - Test certificates for unit tests - Comprehensive test coverage Closes #14 (T-1.2) Closes #15 (T-1.3) Refs #13 (T-1.1 blocked - needs Windows) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Security audit documents should not be committed to public repository. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
T-1.1: CNG crypto.Signer spike (spike/cng-signer/) - Pure Go Windows CNG integration via golang.org/x/sys/windows - Non-exportable private key signing with crypto.Signer interface - Tested on DC01: 1.6ms signing latency, no CGO required - Fixed CertDuplicateCertificateContext bug for context retention T-1.3: SAN/Template parser spike (spike/san-parser/) - Extracts SAN DNSName (primary identity, NOT CN) - Parses AD CS Template OID/Name from extensions - Determines PeerType (machine/user) from template analysis - Tested on DC01: All checks passed Also includes: - scripts/lab/autounattend.xml for Windows VM provisioning Closes #13, #15 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- setup-lab-ca.ps1: Automates AD CS setup, template creation, GPO - verify-lab-ca.ps1: Validates CA configuration (7 checks) - test-client-enrollment.ps1: Tests machine cert enrollment via SYSTEM context Key improvements based on T-2.7 learnings: - Machine cert enrollment requires SYSTEM context (Scheduled Task) - Template created via ADSI with proper flags - RPC port range restriction (5000-5100) for firewall Closes #24 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix regex for CA name parsing (pipe to Out-String) - Cast PropertyValueCollection to int for bitwise ops - Fix GPO link check using Get-ADObject - Fix RPC port range regex Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- RegisterMachinePeer, SyncMachinePeer, GetMachineRoutes, ReportMachineStatus - MachineIdentity, MachineRegisterRequest/Response, MachineSyncRequest/Response - MachineRoutesRequest/Response, MachineStatusRequest/Response - MachineUpdateType enum Refs #27 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements T-3.4: AllowedDomains pro-Account Scoping - Add AccountID and MatchedDomain fields to MTLSIdentity struct - Add MTLSDomainAccountMapping and MTLSAccountAllowedDomains config - Implement getAccountIDFromDomain() for domain-to-account mapping - Implement getAllowedDomainsForAccount() for per-account domain lists - Implement validateDomainForAccount() for cross-tenant prevention - Add checkMultiAccountSpan() for security logging - Update extractMTLSIdentity() to validate against account domains - Add comprehensive unit tests for account mapping Security: Prevents cross-tenant certificate acceptance by validating that certificate SANs match only the mapped account's allowed domains. Fail-safe: No configured domains = reject all. Closes #30 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement gRPC handlers for machine peer registration using mTLS: - RegisterMachinePeer: Register machine peers via certificate auth - SyncMachinePeer: Streaming sync for machine peers (stub) - GetMachineRoutes: Retrieve DC routes for machine peers (stub) - ReportMachineStatus: Machine status reporting Architectural changes: - Create shared/mtls package for Identity type to avoid import cycles - Update mtls_auth.go to use shared Identity via type alias - Remove duplicate GetMTLSIdentity function The handlers extract mTLS identity from context (set by interceptor) and use AccountID from domain-account mapping for multi-tenant isolation. Closes #32 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ll mTLS support Implements all features from Issue #32: 1. validateIssuerCA - CA-Fingerprint validation per account - Added MTLSAccountAllowedIssuers config field - ValidateIssuerCA function in shared/mtls package - Per Security Review: Empty allowlist = DENY (explicit config required) 2. Meta fields for audit trail - Extended PeerSystemMeta with mTLS-specific fields: - PeerType, AuthMethod, CertDNSName, CertDomain - CertIssuerFP, CertSerial, CertTemplate - FirstAuthTime, LastCertAuthTime - extractMachinePeerMeta enriches metadata with mTLS identity 3. Re-registration logic - LoginPeer handles both new and existing peers - Cross-account registration blocked (security check) - mTLS metadata updated on re-registration 4. Security validations - Issuer CA validation in all Machine Tunnel RPCs - Account isolation via MTLSIdentity.AccountID - Fingerprint-based comparison (not DN string matching) 5. Rate-limit/Replay protection: Stubbed for MVP (TODO) Files changed: - config/config.go: Added MTLSAccountAllowedIssuers - mtls_auth.go: Added ValidateIssuerCA, MTLSConfig updated - shared/mtls/identity.go: ValidatorConfig, ValidateIssuerCA - shared/grpc/machine_tunnel.go: Full implementation - server/peer/peer.go: Extended PeerSystemMeta with mTLS fields Closes #32 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements unique DNS label generation for mTLS-authenticated peers to prevent hostname collisions across different domains. Features: - GenerateUniqueDNSLabel: Creates FQDN-hash based labels Example: "win10-pc.customer-a.local" -> "win10-pc-a1b2c3d4" - ValidateDNSLabel: RFC 1123 compliance check - sanitizeForDNS: Hostname sanitization (underscores, spaces -> hyphens) - CheckDNSLabelCollision: Helper for collision detection Technical details: - 32-bit SHA256 hash suffix (8 hex chars) for ~0.001% collision rate - Automatic hostname truncation for labels > 63 chars - Case-insensitive FQDN hashing - Fallback to IP-based label on validation failure Integration: - AddPeer in peer.go now uses hash-based labels for mTLS peers - Detection via peer.Meta.CertDNSName and peer.Meta.CertDomain fields Unit tests: - Uniqueness across domains/hostnames - Truncation for long hostnames - RFC 1123 validation (all edge cases) - Sanitization (underscores, spaces, special chars) Closes #33 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add MTLSServer type with RequireAndVerifyClientCert on port 33074 - Add MTLSPort config option for dedicated mTLS-only server - Integrate mTLS server lifecycle into BaseServer (Start/Stop) - Add GetMTLSServer() for external service registration - Load CA pool from directory (.crt/.pem/.cer) and/or single file - Initialize mTLS validator config with account-issuer mappings - TLS 1.2+ minimum required for mTLS connections Port 33073 (standard): NoClientCert - user auth, setup keys Port 33074 (mTLS): RequireAndVerifyClientCert - machine tunnel only Closes #34 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix duplicate word 'LoginPeer' in comment (machine_tunnel.go) - Convert if-else chains to switch statements (mtls_auth.go, peer.go) - Add nolint directive for deprecated Audience field test (conversion_test.go) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
We had both .github/PULL_REQUEST_TEMPLATE.md (our custom) and .github/pull_request_template.md (upstream). On macOS with its case-insensitive filesystem, this causes git diff failures in CI. Keep the upstream template (lowercase) for compatibility. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
We had both .github/PULL_REQUEST_TEMPLATE.md (our custom) and .github/pull_request_template.md (upstream). On macOS with its case-insensitive filesystem, this causes git diff failures in CI. Keep the upstream template (lowercase) for compatibility. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(server): Complete S-3 Server mTLS Implementation
Adds Dockerfile.multistage that builds the management server binary inside a golang:1.25 container, solving the ar archive issue. Problem: Building with `go build ./management/cmd/` produced an ar archive instead of an ELF executable because cmd/ has `package cmd` (library), not `package main`. Solution: Use `go build ./management/` which contains main.go with `package main` and `func main()`. Benefits: - No cross-compilation issues (builds inside Linux container) - Produces correct ELF binary (~52MB) - Smaller final image (ubuntu:24.04 base) - Build flags: -ldflags="-s -w" for smaller binary Usage: docker build -f management/Dockerfile.multistage -t netbird-fork/management:latest . Relates to: #93 (T-3.9: Deploy Fork to Lab) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…-5.1) Implement Bootstrap() method that supports two-phase authentication: - Phase 1: Setup-Key authentication for initial enrollment (before cert) - Phase 2: mTLS authentication with machine certificate (after AD CS enrollment) Components: - bootstrap.go: Main bootstrap logic with hasMachineCert() check - bootstrap_test.go: Unit tests for all edge cases (15 tests passing) The bootstrap automatically selects the appropriate auth method: - If MachineCertEnabled and valid cert exists: use mTLS via RegisterMachinePeer RPC - Otherwise: fall back to Setup-Key via standard Login/Register RPC Closes #47 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement DC connectivity checks and domain join helpers: - CheckDCConnectivity: Validates LDAP, Kerberos, DNS, SMB, NTP ports - ValidatePreJoinRequirements: Pre-join checklist with all requirements - GenerateDomainJoinScript: Generates PowerShell script for domain join PowerShell bootstrap script (scripts/bootstrap-new-client.ps1): - Full Phase 1 → Domain Join → Cert → Phase 2 workflow - NTP sync with public NTP (pre-tunnel) and DC (pre-join) - DC connectivity verification via tunnel - Certificate enrollment via AD CS (certreq) - Config update for mTLS transition Tests: 18 new tests for DC connectivity and domain join (all passing) Closes #48 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use net.JoinHostPort() for TCP and UDP port checks (IPv6 compatible) - Extract credential prompt to constant with nolint directive - The prompt message is NOT a credential, just UI text Part of T-5.2 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(build): Add multi-stage Dockerfile for management server
…-fallback feat(client): Add machine tunnel bootstrap and domain join (T-5.1, T-5.2)
- Add ValidateMachineCertificate() for machine cert validation - Add GenerateCertEnrollmentScript() for AD CS enrollment via certreq - Add ParseCertificateFile() for cert info extraction - Add NeedsRenewal() for certificate renewal detection - Add WatchCertificateExpiry() for proactive renewal monitoring - Add ExtractIssuerFingerprint() for mTLS issuer verification - 32 tests covering all cert validation scenarios Validates: - SAN DNSNames (not CN!) matching hostname.domain format - Certificate expiry and minimum validity - Renewal threshold (30 days before expiry) - Case-insensitive hostname matching - Certificate chain for issuer fingerprint Closes T-5.3 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add comprehensive PowerShell scripts for test environment management: - reset-netbird-machine.ps1: Safely reset NetBird Machine Tunnel - Stops and removes service - Removes WireGuard interface - SCOPED NRPT cleanup (only NetBird-Machine-* prefix, not all rules!) - SCOPED firewall rule cleanup - Optional config backup - verify-nrpt-cleanup.ps1: Verify NRPT cleanup - Checks both registry paths (Policy and Dnscache) - Checks PowerShell Get-DnsClientNrptRule - Reports any remaining NetBird rules - reinstall-and-test.ps1: Automated reinstall and test cycle - Full reset -> install -> start -> verify workflow - Waits for tunnel establishment - Basic connectivity tests CRITICAL: Uses Registry-based scoped cleanup to avoid removing other NRPT rules (GPO, VPN, etc.) Closes T-5.5 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(scripts): Add reset and test scripts for Windows VM testing (T-5.5)
feat(tunnel): Add certificate enrollment after domain join (T-5.3)
- Update to v2.0.0 with Smart Cert Selection (no thumbprint needed) - Add REVOKE Setup-Key warning at script end (Step 8) - Redact Setup-Key in logs (show only last 4 chars: ****-****-****-****-XXXX) - Add security documentation in .NOTES: - SHA256 checksum verification instructions - Authenticode signing instructions - Setup-Key handling best practices - Step 7 now uses machine_cert_template_name + machine_cert_san_must_match - Remove hardcoded thumbprint requirement Tested on Windows VM in WhatIf mode - all 8 steps execute correctly. Closes #50 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
|
Created in wrong repo, recreating in fork |
|
Caution Review failedThe pull request is closed. 📝 WalkthroughWalkthroughImplements Windows pre-login machine tunnel support via two-phase mTLS authentication. Adds client-side bootstrap logic (Setup-Key Phase 1, mTLS Phase 2), server-side mTLS gRPC infrastructure, certificate enrollment utilities, domain controller connectivity checks, and PowerShell automation scripts for lab setup and deployment. Changes
Sequence Diagram(s)sequenceDiagram
actor Client as Windows Client
participant Phase1 as Bootstrap Phase 1<br/>(Setup-Key)
participant Mgmt as Management Server<br/>(Port 443)
participant CA as Certificate Authority<br/>(AD CS)
participant Phase2 as Bootstrap Phase 2<br/>(mTLS)
participant Tunnel as MTLS Server<br/>(Port 33074)
Client->>Phase1: Bootstrap(cfg) with Setup-Key
Phase1->>Mgmt: Connect via standard mgmt client
Mgmt->>Phase1: Validate Setup-Key & login/register
Phase1->>Client: Return peer config & netbird config
Client->>Client: Store peer config
rect rgba(200, 150, 100, 0.5)
Note over Client,CA: Phase 1 Complete - Tunnel established
Client->>Client: Initiate domain join workflow
Client->>CA: Request machine certificate via certreq
CA->>CA: Validate request (template, auto-enrollment)
CA->>Client: Issue machine certificate
Client->>Client: Store cert in Windows cert store
end
Client->>Phase2: Bootstrap(cfg) with machine cert
Phase2->>Phase2: Validate cert (SAN, expiry, thumbprint)
Phase2->>Tunnel: mTLS connect with client cert
Tunnel->>Tunnel: Verify client certificate
Tunnel->>Tunnel: Extract identity from SAN/Extensions<br/>(hostname, domain, issuer, template)
Phase2->>Tunnel: RegisterMachinePeer(identity + pubkey)
Tunnel->>Mgmt: Validate issuer CA & account mapping
Mgmt->>Tunnel: Account/domain validation result
Tunnel->>Tunnel: Register machine peer with audit metadata
Tunnel->>Phase2: Return bootstrap result<br/>(peer config, DC routes, DNS)
Phase2->>Client: Complete Phase 2 setup
Client->>Client: Update config with mTLS settings
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|




Summary
bootstrap-new-client.ps1for v3.6 Smart Certificate SelectionChanges
machine_cert_template_name+machine_cert_san_must_matchinstead of hardcoded thumbprint****-****-****-****-XXXX(only last 4 chars visible)Test Evidence
DoD Checklist
Closes #50
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Configuration & Infrastructure
✏️ Tip: You can customize this high-level summary in your review settings.