WRKLOG-2026-03-12
Summary
EAP-TLS and work prep day. Fix modestus-razer WiFi authentication (missing intermediate CA in client cert chain). Vocera phone 802.1X triage at work.
Today’s Priorities (2026-03-12)
| Priority | Task | Status | Notes |
|---|---|---|---|
P0 |
Fix modestus-razer EAP-TLS |
[x] RESOLVED 03-13 |
Actual root cause: IP conflict + MAC randomization (not cert chain). See RCA-2026-03-13-001 |
P0 |
Vocera EAP-TLS Supplicant Fix (Work) |
[x] DOCUMENTED |
~10 phones failing 802.1X, TAC case for supplicant config |
P1 |
Monad Pipeline Evaluation |
→DEFERRED |
Carried forward - see WRKLOG-2026-03-14 |
P1 |
k3s NAT verification |
→DEFERRED |
Carried forward since 03-09 |
P2 |
Wazuh indexer recovery |
→DEFERRED |
Depends on NAT - carried forward |
Carried Over from 2026-03-11
| Task | Details | Status |
|---|---|---|
modestus-razer EAP-TLS |
Root cause: IP conflict + MAC randomization (not cert chain). ISE auth succeeded but DHCP config failed |
[x] RESOLVED 03-13 |
k3s NAT verification |
NAT rule 170 for 10.42.0.0/16 pod network |
→DEFERRED |
Wazuh indexer recovery |
Restart after NAT confirmed |
→DEFERRED |
Monad Pipeline |
Test pipeline creation, input sources |
→DEFERRED |
PacketFence VM |
Deploy packetfence-01 on kvm-02 for FreeRADIUS learning |
→DEFERRED |
Session Log
Session 1: modestus-razer EAP-TLS Fix
Objective: Fix intermittent WiFi authentication by adding intermediate CA to client cert.
Root cause (from 03-11):
Client cert file contains only leaf cert. ISE expects full chain during EAP-TLS handshake.
Fix commands:
# Create chain file (leaf + intermediate)
cat /etc/ssl/certs/modestus-razer-eaptls.pem \
/etc/ssl/certs/DOMUS-ISSUING-CA.pem \
> /tmp/modestus-razer-chain.pem
# Verify chain has 2 certs
openssl crl2pkcs7 -nocrl -certfile /tmp/modestus-razer-chain.pem | \
openssl pkcs7 -print_certs -noout | grep -c "subject="
# Expected: 2
# Install chain file
sudo cp /tmp/modestus-razer-chain.pem /etc/ssl/certs/modestus-razer-eaptls-chain.pem
# Update NM connection
sudo nmcli con modify "Domus-WiFi-EAP-TLS" \
802-1x.client-cert /etc/ssl/certs/modestus-razer-eaptls-chain.pem
# Reconnect and verify
nmcli con down "Domus-WiFi-EAP-TLS" && nmcli con up "Domus-WiFi-EAP-TLS"
# Check ISE for successful auth
netapi ise dc query "SELECT acs_timestamp, passed, failure_reason
FROM mnt.radius_auth_48_live
WHERE calling_station_id LIKE '%razer%'
ORDER BY acs_timestamp DESC LIMIT 5"
Result: Cert chain fix was applied but issue persisted. Actual root cause identified on 03-13: IP conflict + MAC randomization. See RCA-2026-03-13-001
Session 2: Security Hardening & M-Disc Archival
Objective: Complete all backup tiers and harden workstation in response to elevated threat environment.
Context: Iran/state-sponsored APT activity increasing. Full defense-in-depth audit initiated.
Backup Tiers Completed
| Tier | Description | Status |
|---|---|---|
Tier 1 HOT |
~/.secrets sync |
✓ DONE |
Tier 2 WARM |
Borg → NAS (nas-01) |
✓ DONE |
Tier 3 COLD |
Seagate SSDs (primary + secondary sync) |
✓ DONE |
Tier 4 ARCHIVAL |
M-Disc BD-R (31GB FULL + 14MB P0-CRITICAL) |
✓ VERIFIED |
M-Disc Verification
cd /mnt/cdrom && sha256sum -c SHA256SUMS.txt
# FULL-BACKUP-2026-03-11.tar.age: OK
# P0-CRITICAL-2026-03-11.tar.age: OK
# RECOVERY-README.txt: OK
Disc labeled and stored in fireproof safe.
Workstation Security Audit Findings
| Issue | Finding | Action |
|---|---|---|
Docker exposed |
Redis (6379), PostgreSQL (5432, 5433) on 0.0.0.0 |
✓ FIXED - |
rpcbind exposed |
NFS portmapper on 0.0.0.0:111 |
✓ FIXED - |
No firewall |
nftables/iptables empty |
⚠️ PENDING |
Key Commands Learned
# Show what's listening on all interfaces (exposed to network)
sudo ss -tlnp | grep '0.0.0.0' | awk '{printf "%-20s %s\n", $4, $6}'
# Mask a service permanently (symlink to /dev/null)
sudo systemctl mask rpcbind.service rpcbind.socket
# Verify service is gone
ss -tlnp | grep :111 && echo "STILL RUNNING" || echo "CLEAN"
Optical Disc Operations Learned
# Check disc type and status
dvd+rw-mediainfo /dev/sr0 2>&1 | awk '/Mounted Media|Disc status/'
# BD-R burning (NOT wodim!)
growisofs -dvd-compat -Z /dev/sr0=file.iso
# Large files (>4GB) require -iso-level 3
genisoimage -iso-level 3 -J -r -o backup.iso files/
Key learning: wodim = CD/DVD only. BD-R requires growisofs.
Session 3: CHLA ISE TAC Case - 802.1X Auth Failures
Objective: Open and resolve S1 TAC case for ~500 endpoint authentication failures at work.
Problem: - ~500 endpoints failing 802.1X authentication - Live Logs showing "No data available" when clicking session details - Patient care devices affected (WOWs, Chromebooks)
Root Cause Identified: - Primary MNT (pmnt.ise.chla.org) RabbitMQ service at 109% CPU - Message queue saturated, preventing session data replication - Replication alarms visible on PAN dashboard
Resolution:
# SSH to Primary MNT
ssh pmnt.ise.chla.org
# Stop ISE services
application stop ise
# Reboot node
reload
# Save ade-os: yes
# Post-reboot verification (after ~10 min)
show application status ise
# All services running
# Verify logging restored
show logging application rabbitmq.log tail count 50
Result: Live Logs restored, session details now displaying correctly.
Follow-up Items from TAC:
| Item | Description | Status |
|---|---|---|
ISE Messaging Service |
Enable "Use ISE Messaging Service for UDP syslogs delivery to MnT" |
PENDING |
Upgrade to Patch 9 |
ISE 3.2 Patch 9 addresses known replication issues |
PENDING |
MNT Replication |
Monitor for recurrence, may need node deregister/re-register |
MONITORING |
Documentation Created:
- TAC-2026-03-chla-8021x-auth-failures.adoc - full case notes
- D2 diagram of ISE deployment with problem areas
- ECCRB submission (retroactive emergency change)
- Added MNT diagnostics to ise-tac-case-prep.adoc
Key Learning: RabbitMQ handles inter-node messaging in ISE. When overloaded, session data doesn’t replicate to MNT, causing "no data available" errors in Live Logs.
Session 4: Advanced Bash Training & Student Prep
Objective: Create training materials for advanced bash patterns; prepare Ubuntu installation guide for student migrations.
Documentation Created
| File | Content | Lines |
|---|---|---|
|
Ubuntu 24.04 LUKS install guide with file search appendix |
537 |
|
Process substitution, FIFOs, signals, subshells, coprocesses |
635 |
Skills Practiced
Process substitution:
diff <(grep -E "^ [a-z]" ~/atelier/_bibliotheca/domus-infra-ops/docs/asciidoc/antora.yml | sort) \
<(grep -E "^ [a-z]" ~/atelier/_bibliotheca/domus-captures/docs/antora.yml | sort)
comm for set operations:
comm -3 \
<(find ~/atelier/_bibliotheca/domus-infra-ops -name "*.adoc" -printf "%f\n" | sort -u) \
<(find ~/atelier/_bibliotheca/domus-captures -name "*.adoc" -printf "%f\n" | sort -u) \
| awk '/^\t/{r++} /^[^\t]/{l++} END{print "infra-ops only:", l, "\ncaptures only:", r}'
# Result: infra-ops only: 275, captures only: 437
Skill Assessment
| Level | Status |
|---|---|
Beginner |
PASSED |
Intermediate |
CURRENT - terminal-first, pipelines, find+grep combos |
Advanced |
IN TRAINING - process substitution, FIFOs, signals |
Eyes-closed typing practice initiated - building touch-typing muscle memory.
Session 5: CLI Training - Process Substitution, comm, Git Ranges
Objective: Hands-on practice with advanced CLI patterns.
Process Substitution <()
Creates a temporary file descriptor containing command output. Receiving command sees a path like /dev/fd/63.
# Compare two command outputs without temp files
diff <(command1) <(command2)
# Real example: compare antora.yml attributes across repos
diff <(grep -E "^ [a-z]" ~/atelier/_bibliotheca/domus-infra-ops/docs/asciidoc/antora.yml | sort) \
<(grep -E "^ [a-z]" ~/atelier/_bibliotheca/domus-captures/docs/antora.yml | sort)
# No output = no differences (attributes synchronized)
comm - Set Operations
Compares two sorted files, outputs 3 columns:
| Column | Meaning |
|---|---|
1 (no indent) |
Only in file 1 |
2 (one tab) |
Only in file 2 |
3 (two tabs) |
In both files |
# -3 suppresses column 3 (common lines)
comm -3 <(sort file1) <(sort file2)
# Real example: find .adoc files unique to each repo
comm -3 \
<(find ~/atelier/_bibliotheca/domus-infra-ops -name "*.adoc" -printf "%f\n" | sort -u) \
<(find ~/atelier/_bibliotheca/domus-captures -name "*.adoc" -printf "%f\n" | sort -u) \
| head -20
comm + awk - Count Unique Files
comm -3 \
<(find ~/atelier/_bibliotheca/domus-infra-ops -name "*.adoc" -printf "%f\n" | sort -u) \
<(find ~/atelier/_bibliotheca/domus-captures -name "*.adoc" -printf "%f\n" | sort -u) \
| awk '/^\t/{r++} /^[^\t]/{l++} END{print "infra-ops only:", l, "\ncaptures only:", r}'
# Result: infra-ops only: 275, captures only: 437
awk pattern breakdown:
| Pattern | Meaning |
|---|---|
|
Line starts with tab (captures-only) |
|
Line starts with non-tab (infra-ops-only) |
|
Increment right counter |
|
Increment left counter |
|
Print totals after all lines processed |
Git Log Range Syntax
# Show last N commits
git log HEAD~1..HEAD # Last 1 commit
git log HEAD~2..HEAD # Last 2 commits
git log HEAD~4..HEAD # Last 4 commits
# The .. means "commits reachable from right but NOT from left"
Git Reflog - The Safety Net
Every HEAD movement is recorded. Commits "lost" to reset/rebase live here ~90 days.
git reflog | head -10
Output format:
45163b7 HEAD@{0}: commit: docs(growth): Add CLI Mastery Assessment
a4a04bf HEAD@{1}: commit: docs(worklog): Add Session 4
05153d4 HEAD@{2}: commit: feat(education): Add advanced bash patterns
Recovery pattern:
# Oops, reset too far!
git reset --hard HEAD~5
# Find lost commit in reflog
git reflog
# Recover to before the reset
git reset --hard HEAD@{1}
Training Reference
Full training doc: Advanced Bash Patterns
Covers 5 modules:
-
Process substitution -
diff <() <()patterns -
Named pipes (FIFOs) -
mkfifo, reader/writer IPC -
Signal handling -
trap, cleanup, graceful shutdown -
Subshells vs grouping -
()isolation vs{}current shell -
Coprocesses - bidirectional pipe communication
HA Deployment Queue Status
| Priority | System | Status | Next Action |
|---|---|---|---|
P1 |
BIND |
COMPLETE |
bind-01 + bind-02 (AXFR) |
P2 |
Vault |
COMPLETE |
vault-01/02/03 (Raft HA) |
P3 |
Keycloak |
NEXT |
Rebuild from scratch (corrupted) |
P4 |
FreeIPA |
PLANNED |
ipa-01 + ipa-02 (IPA Replication) |
P5 |
AD DC |
PLANNED |
home-dc01 + home-dc02 (AD Replication) |
P6 |
iPSK |
PLANNED |
ipsk-mgr-01 + ipsk-mgr-02 (MySQL Replication) |
P7 |
ISE |
DEFERRED |
ise-01 reconfigure after ise-02 stable |
Key Learnings from 2026-03-11
EAP-TLS Chain Lesson
| Issue | Solution |
|---|---|
ISE error 5411 "Supplicant stopped responding" |
Client cert file missing intermediate CA - ISE waits 120s for full chain |
"Secrets were required, but not provided" |
Red herring - NM error when wpa_supplicant can’t complete handshake |
Leaf-only cert + 2-tier PKI |
Always include intermediate in client cert file for EAP-TLS |
netapi JSON Output Lesson
| Command Type | JSON Support |
|---|---|
ERS commands ( |
|
|
|
MnT commands ( |
NO JSON - human-readable only |
DataConnect ( |
NO JSON - human-readable only |
Tomorrow (2026-03-13)
Carried Over (If Not Complete Today)
-
k3s NAT verification
-
Wazuh indexer recovery
-
PacketFence VM deployment
HA Queue
-
Keycloak rebuild (P3)
-
FreeIPA ipa-02 replica (P4)
Runbook References
| Runbook | URL |
|---|---|
Vault HA Deployment |
Vault HA Deployment (infra-ops runbook) |
KVM Operations |
KVM Operations (infra-ops runbook) |
ISE EAP-TLS Troubleshooting |
NetworkManager Troubleshooting (TODO: create in ise-linux) |