-
Notifications
You must be signed in to change notification settings - Fork 95
Security Operations
Chris Panagiotidis edited this page Jun 13, 2026
·
1 revision
This page turns the Security Model into operational procedures. It is intended for day-to-day lab use, pull request review, and incident response.
Review every Terraform pull request with this sequence:
- Check whether a public IP, public network access, RDP rule, Load Balancer NAT rule, Application Gateway, VPN Gateway, Firewall, or AKS cluster is being added.
- Confirm the selected profile is intentional.
- Confirm
allowed_jumpbox_source_ipsdoes not include0.0.0.0/0. - Confirm
enable_lb_rdp_nat_rules = falseunless there is a documented temporary exception. - Confirm Key Vault, SQL, and Storage remain private-first.
- Confirm diagnostics are attached to new durable resources.
- Confirm cost impact is acceptable.
- Confirm no secret-like values are included in tfvars, examples, docs, or workflow logs.
Public RDP should be avoided. If it is temporarily required:
| Requirement | Rule |
|---|---|
| Scope | Use a single trusted CIDR, not 0.0.0.0/0
|
| Duration | Keep the window short and remove after the test |
| Approval | Document reason, owner, and expected end time |
| Controls | Enable logging and verify NSG rule scope |
| Cleanup | Revert the variable change and run a new plan |
Do not keep allow_public_rdp_from_internet = true in a reusable profile.
If a secret is found in the repo, workflow logs, issue, or wiki:
- Revoke or rotate the exposed secret immediately.
- Remove the value from the current branch.
- Check GitHub secret scanning and Gitleaks output.
- Review Azure sign-in logs and resource activity.
- Replace automation credentials with OIDC where possible.
- Update docs so the same mistake is harder to repeat.
Do not treat deleting a file or force-pushing history as sufficient; rotation is the important step.
For each shared service:
| Service | Review question | Expected answer |
|---|---|---|
| Key Vault | Is public access still needed? | No, prefer Private Endpoint |
| SQL | Is public network access enabled? | No |
| SQL | Is Allow Azure Services enabled? | No |
| Storage | Are blobs publicly readable? | No |
| Storage | Is HTTPS required? | Yes |
| Private DNS | Are zones linked to the right VNets? | Yes |
After apply, confirm:
- Log Analytics workspace exists.
- Diagnostic settings exist for Key Vault, SQL, Storage, NSGs, AKS, Firewall, App Gateway, and VPN where deployed.
- Alerts target real deployed resource IDs.
- Flow logs are intentional because they can add cost.
- Action groups have correct receivers.
For a meaningful lab record, keep:
- GitHub Actions run URL.
- Terraform plan summary.
- Cost estimate.
- Security scan output.
- OPA policy output.
- Resource inventory artifact.
- Manual validation notes for private DNS and public exposure.
Stop and redesign instead of applying if:
- A plan adds broad public management access.
- The plan destroys shared state, identity, or networking unexpectedly.
- A profile enables multiple expensive edge services without a cost reason.
- Policy gates are bypassed to make a risky plan pass.
- A data-plane service becomes public while Private Endpoints are enabled.
- Architecture Overview
- Full Environment Inventory
- Network Topology
- Shared Services
- Workloads
- Module Reference
- Security Model
- Security Operations
- Identity and Access
- Governance and Policy
- Production Readiness Review
- Monitoring and Diagnostics
- Operations Runbooks
- Azure Portal Validation Evidence
- Cost Management
- Disaster Recovery and Resilience