Day 1 · Landing zone · 03

STEP 3 — Day 1 Action Items: Landing Zone Build (Fully Manual)

Inputs: the Day-1 sections of the customer-answered questionnaire (IAM, Infra & Network, Security, DevOps IaC, BCP & DR sheets) and the ratified Step-1 governance pack. This step is Phase A1 (Prerequisites & Tenancy Bootstrap) followed by the full manual landing-zone build, sequenced as numbered IaC stacks so each stack has a clean state file and an obvious blast radius.

3.1 Phase A1 — Prerequisites & Tenancy Bootstrap (Day 1–3)

  • Access: confirm tenancy admin; create the lz-admins group for the 2–3 build engineers; create the break-glass user with sealed offline credentials (per Step 1.4).
  • Workstations: install OCI CLI (session-token auth via oci session authenticate), OpenTofu/Terraform, tflint, checkov, jq. Confirm versions.
  • State backend: create the versioned, private Object Storage bucket (e.g., tofu-state) in the security/governance area; create Customer Secret Keys for S3-compatible state access; store secrets in the password vault, never in the repo.
  • Git: create the landing-zone repository; protect the main branch (approvals required, no force push); one state file per stack per environment.
  • Rule:From this point forward, every mutating change is IaC through a reviewed merge request, applied by a human after reading the plan. Console mutations are limited to the Day-0 enablements already completed and emergency break-glass procedures.

    3.2 Stack Build Order (proven sequence)

    The build is sequenced into numbered stacks. Stacks 1–2 and 9–10 constitute the landing zone; stacks 3–8 are workload stacks executed in Step 4. Each stack: author tfvars from the design → fmt/validate/tflint/checkov → plan → peer review of the plan line-by-line → MR approval → apply from the protected runner → verify.

    StackContentsKey manual verifications after apply
    Stack 1 — IAM & Security FoundationDefined-tag namespace + keys and tag defaults; groups (mapped to IdP); secondary (workforce) identity domain + federation; compartment tree (top-down: Governance → Shared-Services → Applications per env → SaaS → Analytics → Sandbox); baseline policy catalog (one policy per compartment; root has only security-read + break-glass); Vault master key; secrets; Cloud Guard tenancy target formalizedCompartment tree matches the model; test-login via federated user lands in the right group; a deliberately non-compliant untagged resource creation is rejected by tag default
    Stack 2 — Network (hub & spoke, per prod and non-prod)DRG; hub VCN; spoke VCN(s) per environment; FastConnect (provider-based, e.g., partner/interconnect virtual circuits) and/or Site-to-Site VPN; route tables, gateways (SGW/NAT/IGW per exposure rules); NSGs default-denyCIDRs match the registry exactly; BGP up on both FastConnect virtual circuits; on-prem → hub → spoke reachability test; 0.0.0.0/0 ingress absent on 22/3389
    Stack 9 — Events & Notifications; AlarmsEvents rules (IAM changes, network changes) → Notifications topics (prod and non-prod); hub resource alarmsTrigger a test event (create/delete a test group) and confirm email delivery
    Stack 10 — VCN Flow LogsFlow logs for hub and spoke VCNs (prod and non-prod) into Logging/Log AnalyticsLog entries visible for a synthetic connection; retention per governance

    Identity note (co-tenanted estates): the workforce domain built in Stack 1 is the single meeting point of the two planes — confirm Fusion pods federate to it (or to the agreed dedicated domain) before Step 4 integrations are built.

    3.3 The Manual Quality Loop (every stack, every change)

    cd <stack-dir>
    tofu fmt -recursive && tofu validate
    tflint --recursive
    checkov -d . --framework terraform
    tofu init -backend-config=<env-backend>
    tofu plan -var-file=<env>.tfvars -out=plan.bin
    tofu show plan.bin   # second engineer reads line-by-line vs design

    Reviewer checklist: no public subnets without an approved exception; no 0.0.0.0/0 on management ports; every resource carries the mandatory tags; resource counts match the design; no unexplained destroys/replacements.

    3.4 Exit Criteria — Step 3

    Stacks 1, 2, 9, 10 applied and verified in non-prod and prod trees; federation live; connectivity (FastConnect/VPN) passing end-to-end tests; events/alarms delivering; flow logs flowing; per-compartment budgets and quotas applied; all state files in the versioned backend; verification checklists signed inside the MRs.

    STEP 3 · DOCUMENT 3 OF 6

    Day 1 Landing Zone Build — Option A (Manual) / Option B (Terraform IaC)

    Phase A1 Prerequisites & Tenancy Bootstrap (Day 1–3), then Phases A2–A5: identity & groups · compartments & policies · network · security services · governance guard-rails — executed manually (Option A) or via terraform_lz stacks through OCI Resource Manager with Git-based CI/CD (Option B: Phase 1 GitHub → Phase 2 GitLab)

    Executes only after the Day 0 gate (Doc 2 §9) has passed. Option A: every action requires an executor and a reviewer (four-eyes) recorded in the build log. Option B: PR review + pipeline approval gates provide the equivalent control. Phase A6 (per-workload onboarding) is Doc 4.

    Day 1 Landing Zone Build Runbook

    FieldValue
    Document ID<CUSTOMER>-RUN-D1-003
    Versionv1.1 (Generic Template)
    Execution modelDUAL PATH — Option A: fully manual (OCI Console). Option B: Terraform via OCI Resource Manager, repository + CI/CD (Phase 1 GitHub, Phase 2 GitLab). Select ONE option per engagement in the decision log.
    Customer<CUSTOMER> — replace on engagement start
    Tenancy<TENANCY-NAME> / OCID: <TENANCY-OCID>
    Prepared byCloud Platform Engineering
    Review cyclePer engagement; template annually

    1. Phase Map and Inputs

    PhaseScopeIndicative timingGate
    A1 — Prerequisites & Tenancy BootstrapAccess model, break-glass accounts, identity domains, IdP federation, admin retirement.Day 1–3G-A1: pilot federated user works; break-glass alarm fires.
    A2 — Governance FoundationsTag namespace + defaults, compartment tree.Day 3–5G-A2: tree matches design; untagged create fails.
    A3 — IAM Policy SetGroups completed, all pol-* policies applied.Day 5–7G-A3: negative tests pass (denied where designed).
    A4 — Network & Security ServicesVCNs, subnets, gateways, routing, NSGs, DRG/FastConnect/VPN (if hybrid), Vault, logging, Cloud Guard tuning, Security Zones.Week 2–3G-A4: connectivity matrix passes; no 0.0.0.0/0 ingress; IGW absent TST/PRD.
    A5 — Guard-rails & Operations BasePer-compartment budgets, quota policies, alarms, announcement re-home.Week 3–4G-A5: budget alert simulated; quota blocks GPU in DEV.
    A6 — Workload OnboardingPer-workload (OIC, ATP, buckets, SFTP VM…).Week 5+ — Doc 4Per-workload acceptance.

    1.1 Questionnaire inputs consumed

    Item(s)Feeds
    IAM sheet (IdP product, federation protocol, group sources, MFA policy)A1 federation click-path (<IDP> = Entra ID or Okta branch).
    TF.04 (non-overlapping CIDR list), CT.01 (routable internal networks)A4 VCN CIDR plan — validate no overlap before creating anything.
    CT.03–CT.13 (IPSec), CT.14–CT.22 (FastConnect), DC.04–DC.05 (bastion)A4 hybrid connectivity branch: DRG + IPSec and/or FastConnect.
    AC.01–AC.03 (firewall enforcement, network firewall)A4 firewall pattern decision.
    NR.01–NR.* (DNS management)A4 DNS/resolver design.
    SEC.* + 0C.02/0C.03A4 Security Zones scope; Cloud Guard recipe tuning; Regulated-Workloads.
    0D.01 (budget envelope), O&M contactsA5 budgets, alarm destinations.
    EXECUTION OPTION:Choose per engagement and record in the decision log. OPTION A (fully manual, §2–§6): no Terraform, no Resource Manager stacks, no scripts that mutate state; the OCI CLI may be used read-only for evidence; the build log and CD3 reconciliation are the only drift defense. OPTION B (IaC, §7): Phases A2–A5 execute as terraform_lz stacks through OCI Resource Manager driven from Git CI/CD; Phase A1 (identity bootstrap) remains manual in both options. Do not mix options within a phase — a compartment tree half-built by hand and half by stack1 is unreconcilable.

    2. Phase A1 — Prerequisites & Tenancy Bootstrap (Day 1–3)

    2.1 Access prerequisites

  • Named engineers with assigned roles: executor + reviewer per activity; customer IdP administrator available for federation (their side of SAML/SCIM).
  • Day 0 build log and limits worksheet at hand; Doc 1 adapted and approved.
  • Design references frozen: compartment tree, group list, policy set, CIDR plan (from the customer-adapted HLD/LLD or the defaults in this document).
  • 2.2 Create break-glass accounts (Default domain)

    Console path: Menu > Identity & Security > Identity > Domains > Default > Users > Create user
  • Create local user BG-OCI-ADMIN-01: first/last name "Breakglass Admin-01", username bg-oci-admin-01, e-mail a monitored security mailbox (not a personal address). Uncheck any federation options — this must remain a local credential.
  • Repeat for BG-OCI-ADMIN-02.
  • Create group OCI-BREAKGLASS-ADMIN in the Default domain (Domains > Default > Groups > Create group) and add both users.
  • Create the break-glass policy at root (Identity > Policies > Create Policy, compartment = root): name pol-root-breakglass; statement:
  • Allow group Default/OCI-BREAKGLASS-ADMIN to manage all-resources in tenancy
  • For each BG user: set a generated ≥ 24-char password; enroll MFA (authenticator app on a security-team device, not an engineer’s personal phone).
  • Seal credentials per the customer’s sealed-envelope / vault procedure (two halves held by two officers, or PAM vault with dual control). Record custodians in the build log.
  • Sign in once with BG-OCI-ADMIN-01 to verify the credential works, then sign out. This login will later validate the break-glass alarm (§6.4).
  • WARNING:Break-glass accounts are the only permitted local accounts in the tenancy. Any other local user found during quarterly review is a finding.

    2.3 Create the workforce identity domain

    Console path: Menu > Identity & Security > Identity > Domains > Create domain
  • Click Create domain. Type: choose the license tier that matches customer entitlement (Free / Oracle Apps / Premium — Oracle-apps-adjacent licensing is typical when Fusion is in scope; confirm against the subscription).
  • Name: <CUSTOMER>-WORKFORCE. Compartment: root for now (re-home consideration after A2 — domains are compartment-scoped; placing it in Shared-Services:Identity later requires recreation, so decide NOW where it lives; default: keep at root, record decision).
  • Administrator: the executing engineer (temporary; replaced by federated admins before phase exit).
  • Leave user creation disabled for now; click Create and wait for Active.
  • NOTE:Design rule: Default domain = break-glass + platform bootstrap only. All humans live in <CUSTOMER>-WORKFORCE via federation. This separates admin blast radius from workforce access.

    2.4 Federate the IdP (branch per <IDP>)

    2.4.1 [Entra ID branch]

  • In the workforce domain: Security > Identity providers > Add IdP > Add SAML IdP. Name: ENTRA-SAML. Export the domain’s SP metadata (Download service provider metadata).
  • Customer IdP admin: in Entra admin center, create an Enterprise application (Oracle Cloud Infrastructure Console gallery app or custom SAML app) named OCI-<TENANCY-NAME>; upload/enter the SP metadata (ACS URL, Entity ID); assign the pilot user group; download the Entra federation metadata XML.
  • Back in OCI: import the IdP metadata XML into the SAML IdP config; map NameID = user e-mail (or UPN — must match the attribute SCIM will provision); Save.
  • Enable SCIM provisioning: in the workforce domain create a confidential application for provisioning (or use Entra’s Oracle-provided provisioning template); in Entra, configure the provisioning connector with the domain SCIM endpoint + bearer token; scope it to the OCI-* mapped groups; start provisioning.
  • In the domain Sign-on policy: set the default rule to delegate authentication to ENTRA-SAML; require MFA (satisfied by Entra Conditional Access; re-assert in domain policy per Doc 1 §5).
  • 2.4.2 [Okta branch]

  • In Okta admin: create app from the Oracle Cloud IAM catalog entry (SAML 2.0), named OCI-<TENANCY-NAME>; download Okta IdP metadata.
  • In the OCI workforce domain: Add SAML IdP OKTA-SAML; exchange metadata both directions exactly as the Entra branch; NameID = e-mail.
  • Provisioning: configure Okta SCIM against the domain SCIM endpoint (or use JIT if SCIM is not licensed — JIT creates users at first login; groups must then be pushed or mapped via assertion attribute).
  • Sign-on policy: delegate to OKTA-SAML with MFA required.
  • 2.5 Pilot verification and group mapping chain

  • In the IdP, create pilot group <IDP>-OCI-AUDITOR containing one pilot user; let SCIM push it (or create the domain group and map it).
  • In the workforce domain, confirm the group arrived (Groups list) and map/rename per standard: OCI-AUDITOR.
  • Create a temporary root policy: Allow group <CUSTOMER>-WORKFORCE/OCI-AUDITOR to read all-resources in tenancy (this becomes permanent in A3 as part of pol-root-baseline).
  • Pilot user signs in via the Console using the workforce domain: expect redirect to <IDP>, MFA challenge, and a Console session that can read but not create (test: attempt to create a compartment — must fail).
  • Record the end-to-end chain in the build log: IdP group → SCIM → domain group → policy → observed access.
  • VERIFY:Gate G-A1 evidence: pilot federated login screenshot (with MFA), failed-create screenshot, break-glass login test, SCIM sync log.

    2.6 Retire the temporary tenancy administrator

  • Create IdP group <IDP>-OCI-IAM-ADMIN with the named platform engineers; SCIM-push; map to domain group OCI-IAM-ADMIN.
  • Temporary policy (formalized in A3): Allow group <CUSTOMER>-WORKFORCE/OCI-IAM-ADMIN to manage domains, groups, policies in tenancy.
  • Verify a federated IAM admin can administer identity; then downgrade or disable the Day-0 temporary admin identity (keep the original Oracle-created admin only if Oracle support requires it, with MFA and sealed credentials; otherwise disable).
  • From this point every engineer works under their federated identity — no shared logins, ever.
  • 2.7 [SAAS] Fusion SSO touchpoint

    Associate each Fusion pod with the same IdP application suite so a user moves Fusion → OCI Console → analytics without re-authentication. Pod association is performed in the Fusion environment console per Oracle’s SaaS runbook and is executed by the Fusion admin under the Fusion change process — record only the mapping and date here. [ISOLATED]: federation is configured independently in the SaaS tenancy; repeat §2.4 there.

    3. Phase A2 — Tag Namespace and Compartment Tree

    3.1 Create the tag namespace and keys

    Console path: Menu > Governance & Administration > Tenancy Management > Tag Namespaces > Create Namespace
  • Create namespace <CUSTOMER> in the root compartment (moved to Governance after 3.2 — or create it after the tree exists; either is acceptable, record which).
  • For each key in Doc 1 §9 (BusinessUnit, CostCenter, ApplicationOwner, TechnicalOwner, Environment, Service, Criticality, DataClassification, BackupTier, SupportGroup, RegulatoryScope, DRTier, ChangeWindow, Partner): Create Tag Key Definition; for LOV keys set Validator = A list of values and enter the locked list from Doc 1.
  • Do NOT retire or rename keys after resources carry them — additions are cheap, renames are not.
  • 3.2 Create the compartment tree (top-down)

    Console path: Menu > Identity & Security > Compartments > Create Compartment

    Create parents before children. Reference tree (adapt names per Doc 1 §4; delete branches out of scope):

    root
    ├─ Governance
    ├─ Shared-Services
    │ ├─ Networking ├─ Identity-Integrations
    │ ├─ Shared-Tools └─ Vault-KMS
    ├─ Applications
    │ ├─ DEV1 {PaaS, Internal, Vendor-<NAME>} ├─ DEV2 {…}
    │ ├─ TST {…} └─ PRD {…}
    ├─ SaaS {ERP, HCM, SCM, CX, EPM — per licensed pillars} [CO-TENANTED]
    ├─ Analytics ├─ Regulated-Workloads (if in scope)
    ├─ Sandbox └─ DR (reserved, empty)
  • For each compartment: Create Compartment; Name exactly per the tree (PascalCase); Description = purpose + owner group; Parent = as designed.
  • After creating each top-level compartment, add tag defaults: open the compartment > Tag Defaults > Create: Environment = locked value for env compartments (e.g., Applications:PRD → PRD); CostCenter = required, user must supply value at create time; SupportGroup / BackupTier defaults per Doc 1.
  • Record every compartment OCID in the build log resource register as you go (Doc 6 needs them).
  • VERIFY:Gate G-A2: (a) console tree matches the design tree exactly — capture with a read-only CLI export: oci iam compartment list --compartment-id-in-subtree true; (b) creating any test resource without CostCenter fails on the tag default; (c) tag namespace shows all keys with correct LOVs.

    4. Phase A3 — Groups Completion and IAM Policy Set

    4.1 Complete the group set

  • In the IdP, create the remaining groups per Doc 1 §6 scoped to this engagement (network, security, developer, app-admin, db-admin, support, cost-audit, vendor groups…); assign members; let SCIM push them.
  • In the workforce domain, verify arrival and naming (OCI-*). Vendor guests: use IdP guest accounts in dedicated OCI-VENDOR-<NAME> groups, time-boxed per contract.
  • 4.2 Apply the policy set

    Console path: Menu > Identity & Security > Policies (select target compartment before Create Policy)

    One policy resource per compartment per purpose, named pol-<compartment>-<purpose>. Baseline set (adapt group prefixes to <domain>/<group>):

    pol-root-baseline (compartment: root)

    Allow group OCI-SECURITY-ADMIN to read all-resources in tenancy
    Allow group OCI-AUDITOR to read all-resources in tenancy
    Allow group OCI-AUDITOR to read usage-reports in tenancy
    Allow group OCI-COST-AUDIT to read all-resources in tenancy
    Allow group OCI-COST-AUDIT to read usage-reports in tenancy
    Allow group OCI-SECURITY-ADMIN to manage cloud-guard-family in tenancy
    Allow group OCI-SECURITY-ADMIN to manage security-zone in tenancy
    Allow group OCI-SECURITY-ADMIN to manage tag-namespaces in tenancy
    Allow group OCI-SECURITY-ADMIN to manage tag-defaults in tenancy
    Allow group OCI-IAM-ADMIN to manage domains in tenancy
    Allow group OCI-IAM-ADMIN to manage groups in tenancy
    Allow group OCI-IAM-ADMIN to manage policies in tenancy

    pol-shared-services (compartment: Shared-Services)

    Allow group OCI-NETWORK-ADMIN to manage virtual-network-family in compartment Shared-Services
    Allow group OCI-SECURITY-ADMIN to manage vaults in compartment Shared-Services:Vault-KMS
    Allow group OCI-SECURITY-ADMIN to manage keys in compartment Shared-Services:Vault-KMS
    Allow group OCI-SECURITY-ADMIN to manage secret-family in compartment Shared-Services:Vault-KMS
    Allow group OCI-DEVELOPER to use subnets in compartment Shared-Services where target.vcn.name = 'DEV1-PLATFORM-VCN-CORE-01'
    Allow group OCI-APP-ADMIN to use subnets in compartment Shared-Services where target.vcn.name = 'TST-PLATFORM-VCN-CORE-01'

    pol-applications (compartment: Applications)

    Allow group OCI-DEVELOPER to manage all-resources in compartment Applications:DEV1
    Allow group OCI-DEVELOPER to manage all-resources in compartment Applications:DEV2
    Allow group OCI-APP-ADMIN to manage all-resources in compartment Applications:TST
    Allow group OCI-APP-ADMIN to manage all-resources in compartment Applications:PRD
    Allow group OCI-OIC-ADMIN to manage integration-instance-family in compartment Applications:PRD:PaaS
    Allow group OCI-DB-ADMIN to manage database-family in compartment Applications:PRD
    Allow group OCI-DB-ADMIN to read database-family in compartment Applications:TST
    Allow group OCI-SUPPORT to read all-resources in compartment Applications

    pol-vendors / pol-saas-analytics-regulated-sandbox — replicate the patterns above per Doc 1 §6: vendor groups manage only their Applications:<env>:Vendor-<NAME> compartments and use only the shared integration subnet; OCI-FDI-ADMIN manages Analytics; OCI-REGULATED-OPS manages Regulated-Workloads; OCI-DEVELOPER manages Sandbox; SaaS handles get read-only grants.

  • Create each policy in its target compartment (select the compartment in the left selector first — a policy created in the wrong compartment is the most common manual error in this phase).
  • Reviewer reads every statement against Doc 1 §7 before Save (four-eyes at statement level).
  • Record each policy OCID and statement set in the resource register.
  • VERIFY:Gate G-A3 negative tests: OCI-DEVELOPER member attempts read in Applications:PRD → not authorized. Vendor member lists another vendor’s compartment → not authorized. OCI-SECURITY-ADMIN attempts to create a user → not authorized. OCI-AUDITOR attempts any create → not authorized. Evidence: screenshots per test.

    5. Phase A4 — Network and Security Services

    5.1 CIDR plan validation

    VCNCIDR (example — replace from TF.04)Subnets (/24, all private)
    DEV1-PLATFORM-VCN-CORE-0110.10.0.0/16.1.0 Integration-Shared · .2.0 App-Processing · .3.0 Vendor (opt)
    DEV2-PLATFORM-VCN-CORE-0110.20.0.0/16same layout
    TST-PLATFORM-VCN-CORE-0110.30.0.0/16same layout — PRD-equivalent rules from here up
    PRD-PLATFORM-VCN-CORE-0110.40.0.0/16same + .4.0 Regulated-Subnet (if in scope)
    (DR reserve)10.50.0.0/16allocated on paper, not built
    WARNING:Before creating any VCN, verify no overlap with the customer’s routable internal networks (CT.01) and the confirmed non-overlap answer (TF.04). Overlap discovered after FastConnect/VPN turn-up forces VCN re-creation — in manual mode that is days of rework.

    5.2 Create VCNs, subnets, gateways (repeat per environment)

    Console path: Menu > Networking > Virtual Cloud Networks > Create VCN
  • Compartment: Shared-Services:Networking. Name per table. CIDR per plan. DNS resolution: enabled; DNS label per standard.
  • Create subnets (Create Subnet): name Integration-Shared-Subnet / App-Processing-Subnet (keep names verbatim — IAM policy conditions reference them); type Regional; Private (no public IPs); DHCP options default; security list left default-empty (NSGs carry the rules).
  • Create Service Gateway SGW-<ENV>-01: Services = All <region> Services in Oracle Services Network.
  • Create NAT Gateway NAT-<ENV>-01 (skip in PRD unless a named egress interface is approved — record the decision).
  • Do NOT create an Internet Gateway in TST or PRD, ever. DEV IGW only with an explicit, logged decision (default: none anywhere; OSN + NAT covers Fusion/OIC/Object Storage paths).
  • Create route table RT-<ENV>-PRIVATE-01 with: rule 1 — Destination: All <region> Services in OSN → Target: SGW-<ENV>-01; rule 2 (only where justified) — 0.0.0.0/0 → NAT-<ENV>-01. Associate to both subnets.
  • DNS: create a private zone <env>.<customer>.oci in the VCN’s private view; resolver forwarding rules to customer DNS (NR.01) only if hybrid name resolution is approved.
  • 5.3 NSGs (default-deny; rules per design)

    Console path: VCN detail > Network Security Groups > Create NSG
    NSGDirectionRulePurpose
    NSG-<ENV>-ATP-01IngressTCP 1522 from App-Processing subnet CIDR + NSG-<ENV>-APP-01SQL*Net mTLS from integration path only
    NSG-<ENV>-ATP-01Egress(none)Database initiates nothing
    NSG-<ENV>-APP-01IngressTCP 443 from NSG-<ENV>-LB-01; TCP 22 from bastion NSG only if bastion exists (DC.05)App traffic via LB; no open SSH
    NSG-<ENV>-APP-01EgressTCP 443 to OSN service label; TCP 1522 to NSG-<ENV>-ATP-01Fusion/OIC/Object Storage + DB
    NSG-<ENV>-LB-01IngressTCP 443 from approved partner CIDR list onlyPartner-facing endpoints
    NSG-<ENV>-SFTP-01IngressTCP 22 from named counterparty CIDRs onlySFTP VM (Doc 4)
    NOTE:Create NSGs empty in this phase where the consuming workload does not exist yet — attaching rules happens in Doc 4 when each workload lands. What must exist now is the naming, the default-deny posture, and the LB/ATP patterns for TST/PRD.

    5.4 Hybrid connectivity [execute only if CT.* answers say yes]

    5.4.1 DRG

    Console path: Menu > Networking > Dynamic Routing Gateways > Create DRG
  • Create DRG-CORE-01 in Shared-Services:Networking.
  • Attach each VCN that needs on-prem reachability (DRG Attachments > Create VCN attachment) — typically TST and PRD only; DEV attaches only with a logged reason.
  • Add a route rule to each attached VCN’s route table: customer on-prem CIDRs (CT.01) → DRG-CORE-01.
  • 5.4.2 Site-to-Site VPN (IPSec) — from CT.03–CT.13

    Console path: Menu > Networking > Site-to-Site VPN > Create IPSec Connection
  • Create CPE object: public IP from CT.06; vendor/model from CT.08 (e.g., Palo Alto), firmware from CT.09.
  • Create IPSec connection to DRG-CORE-01: static routes or BGP per CT.05 (BGP preferred; ASN + /30 or /31 from CT.19 pattern).
  • Tunnel 1 and Tunnel 2: record Oracle VPN headend IPs and shared secrets; hand the Phase 1 / Phase 2 parameter sheet (CT.10/CT.11 answers) to the customer network engineer for CPE-side configuration.
  • Verify both tunnels reach UP; test with ping/traceroute from an on-prem host to a private subnet IP (a temporary test VM may be stood up in DEV for this and deleted after — log it).
  • Redundancy: confirm both tunnels on separate CPE devices where CT.04 = yes.
  • 5.4.3 FastConnect — from CT.14–CT.22

  • Choose model per CT.15: partner (e.g., Megaport/Equinix), colocation, or Oracle provider.
  • Create FastConnect (Menu > Networking > FastConnect): virtual circuit bandwidth per CT.02 BOM; private virtual circuit to DRG-CORE-01; BGP peering addresses per CT.19; customer ASN.
  • Coordinate the provider side (partner portal ordering) with the customer WAN provider (CT.17); confirm BGP session Established and routes exchanged.
  • Where both VPN and FastConnect exist: VPN is backup; verify failover by administratively downing the FastConnect BGP session in a maintenance window (record as a test in Doc 5).
  • 5.5 Vault and keys

    Console path: Menu > Identity & Security > Key Management & Secret Management > Vault > Create Vault
  • Create PRD-PLATFORM-VAULT-CORE-01 in Shared-Services:Vault-KMS. Type: Virtual Private (shared HSM partition; choose Private only on documented compliance need — cost differs materially).
  • Create master keys: KEY-MASTER-STORAGE-01 (AES-256, for buckets), KEY-MASTER-DB-01 (ATP), KEY-MASTER-SECRETS-01 (secrets encryption).
  • Secrets are created per workload in Doc 4 (SEC-OIC-<ENV>-FUSION-SVC etc.); today only the vault + keys exist.
  • IRREVERSIBLE:Vault deletion has a mandatory waiting period and destroys all keys and secrets; key deletion renders data encrypted under it unrecoverable. Restrict vault administration to OCI-SECURITY-ADMIN and never schedule deletions without Board-level approval.

    5.6 Logging, audit retention, Cloud Guard tuning

  • Audit retention: Menu > Governance & Administration > Tenancy Management > Audit — set retention to the maximum (365 days).
  • Log groups: Menu > Observability & Management > Logging > Log Groups — create LOG-PLATFORM-01 in Governance.
  • Enable VCN flow logs on every subnet (Logging > Enable service log > Virtual Cloud Network > flow logs → LOG-PLATFORM-01).
  • Create bucket PRD-PLATFORM-BUCKET-LOGARCHIVE-01 in Governance (versioning on; lifecycle: move to Archive tier after 30 days) — the long-term log sink; connect via Service Connector Hub (Logging → Object Storage) if long-term retention beyond Logging limits is required.
  • Cloud Guard tuning: Menu > Identity & Security > Cloud Guard > Recipes — clone the Oracle-managed Configuration and Activity detector recipes into Governance as <CUSTOMER>-CFG-RECIPE-01 / <CUSTOMER>-ACT-RECIPE-01; attach the clones to the tenancy target (Targets > root > edit); keep detect-only posture (no auto-responders) until Doc 5 review; adjust detector risk levels only via the change process.
  • 5.7 Security Zones

    Console path: Menu > Identity & Security > Security Zones > Create Security Zone
  • Create zone SZ-PRD-01 targeting Applications:PRD with the Maximum Security recipe cloned to <CUSTOMER>-SZ-RECIPE-01 (clone first, then relax only the specific statements the design permits — e.g., allow private ATP without customer-managed-key if keys are phased).
  • Create zones for Analytics, Shared-Services:Vault-KMS, and Regulated-Workloads (if present).
  • Test: attempt to create an Internet Gateway inside Applications:PRD → the zone must block it. Screenshot for the gate.
  • WARNING:Security Zones block non-compliant CREATION but do not remediate existing resources. This is why zones come at the end of A4: create them after the network is in its compliant end-state, or the build itself trips the zone.

    6. Phase A5 — Guard-rails and Operations Base

    6.1 Per-compartment budgets

    Console path: Menu > Billing & Cost Management > Budgets > Create Budget
  • Create budgets scoped by compartment: BUD-APPLICATIONS-PRD, BUD-APPLICATIONS-NONPROD, BUD-ANALYTICS, BUD-SHARED, BUD-SANDBOX. Amounts from the customer budget envelope (0D.01) apportioned in the finance workshop; alert rules 70% forecast / 90% actual / 100% actual, recipients = ops DL + cost-audit + approver.
  • Retire or reduce the Day 0 root budget only after the compartment budgets are live (never leave a coverage gap).
  • 6.2 Quota policies (hard stops)

    Console path: Menu > Governance & Administration > Tenancy Management > Quota Policies > Create Quota Policy
    QUO-SANDBOX: zero compute-core-count quotas /gpu.*/ in compartment Sandbox
    zero compute-core-count quotas /hpc.*/ in compartment Sandbox
    set compute-core-count quota standard.* to 8 in compartment Sandbox
    QUO-DEV: zero compute-core-count quotas /gpu.*/ in compartment Applications:DEV1
    zero compute-core-count quotas /gpu.*/ in compartment Applications:DEV2
  • Create the quota policies above (adapt quota family names to current OCI quota vocabulary shown in the console picker; the console validates syntax).
  • Test: attempt to launch a GPU shape in Sandbox → must fail with a quota error. Screenshot.
  • 6.3 Baseline alarms

    Console path: Menu > Observability & Management > Monitoring > Alarms > Create Alarm
    AlarmConditionSeverityDestination
    ALM-BREAKGLASS-LOGINAudit event: successful auth by BG-OCI-ADMIN-* (Events rule → Notifications topic)CriticalSecurity + platform (page)
    ALM-BUDGET-*Budget thresholds (created with budgets §6.1)Info→HighOps DL + cost-audit
    ALM-CLOUDGUARD-CRITICALEvents rule on Cloud Guard problem (risk = Critical) in PRD/Analytics/RegulatedCriticalSecurity, same-day review
    ALM-VPN-TUNNEL-DOWNSite-to-Site VPN tunnel state down (if hybrid)HighInfraOps + network
  • Break-glass alarm: create an Events rule (Menu > Observability > Events Service) matching Identity SignOn events where userName = bg-oci-admin-*, action = deliver to topic TOP-SECURITY-ALERTS-01 (create the topic with the security DL subscribed).
  • Test it: sign in with BG-OCI-ADMIN-01; the alert must arrive within 5 minutes; sign out; record.
  • Re-home the Day 0 announcement subscription/topic into Governance (recreate there and delete the root one — announcements topics cannot be moved across compartments; log both actions).
  • 6.4 Phase gates G-A4/G-A5 — consolidated evidence

    #TestPass criterion
    1Compartment tree CLI export vs designZero drift
    2Untagged resource createFails on tag default
    3Negative IAM tests (§4.2)All denied as designed
    4Connectivity matrix: OSN reachable via SGW from each subnet; ATP pattern port 1522 only from allowed NSG (validated fully in Doc 4)Matches design
    5No 0.0.0.0/0 ingress anywhere; IGW absent in TST/PRDCloud Guard clean on these detectors
    6IGW create attempt in PRDBlocked by Security Zone
    7Break-glass loginAlarm ≤ 5 min
    8GPU launch in SandboxBlocked by quota
    9Budget alert simulationE-mail received by DL
    10Hybrid (if built): tunnels/BGP up; failover testedBoth paths verified

    All ten green + build log complete + CD3 as-built extract reconciled against design (Doc 6 §4) → landing zone is accepted and Doc 4 (workload onboarding) may begin.

    7. OPTION B — Terraform IaC via OCI Resource Manager (Phases A2–A5)

    Option B replaces the manual procedures of §3–§6 with the terraform_lz repository executed as OCI Resource Manager (ORM) stacks, sourced from Git. Phase A1 (§2 — break-glass, identity domains, IdP federation) is ALWAYS executed manually first, in both options: the pipeline’s own identity depends on it. The phase gates G-A2…G-A5 and their evidence requirements are unchanged — only the execution engine changes.

    7.1 Repository standard — terraform_lz

    The landing-zone repository carries one folder per stack, each a self-contained ORM-compatible Terraform configuration (provider.tf without backend block — ORM manages state; schema.yaml drives the ORM variable UI; terraform.tfvars / tfvars.json carry per-environment values).

    StackContentsImplements phase
    stack1compartments · groups · policies · defined_tags · vault · master_key · secrets · cloudguard · security_zone · secondarydomainA2 (tags, tree) + A3 (groups, policies) + A4 security services (Vault, Cloud Guard tuning, Security Zones)
    stack2prod/nonprod hub_vcn · spoke_vcn · drg · megaport_fastconnect · azure_fastconnectA4 network (hub-and-spoke topology, DRG, FastConnect variants)
    stack9prod/nonprod events · notificationsA5 alarms and event rules (incl. break-glass login rule)
    stack10prod/nonprod hub/spoke vcnflowlogA4 logging (VCN flow logs)
  • Repo name: <customer>-oci-terraform-lz. Never fork per environment — prod/nonprod separation lives in the per-stack folders and their tfvars, one branch strategy for all.
  • Branch model: main (protected, deployable) · develop (integration) · feature/* · hotfix/*. No direct pushes to main; PR/MR review mandatory (this is Option B’s four-eyes).
  • Hub-and-spoke note: stack2 implements a hub-spoke topology (hub VCN for shared ingress/egress + firewall, spoke VCNs per environment attached via DRG). Where the engagement uses the simpler one-VCN-per-environment pattern of §5, adapt tfvars accordingly — the CIDR plan of §5.1 still applies verbatim.
  • Change discipline: a resource managed by a stack is NEVER changed in the console. Console hotfixes create drift that ORM will flag and the next apply will revert. Emergencies: break-glass console change + immediate follow-up PR + drift re-sync, all logged.
  • 7.2 ORM prerequisites (one-time, manual)

    Console path: Menu > Developer Services > Resource Manager > Configuration Source Providers

    Create IdP group <IDP>-OCI-IAC-ADMIN → OCI group OCI-IAC-ADMIN (members: platform engineers who may run applies; approvers configured in the Git platform, not here).

    Create policy pol-shared-tools-orm in Shared-Services:Shared-Tools:

    Allow group OCI-IAC-ADMIN to manage orm-stacks in compartment Shared-Services:Shared-Tools
    Allow group OCI-IAC-ADMIN to manage orm-jobs in compartment Shared-Services:Shared-Tools
    Allow group OCI-IAC-ADMIN to manage orm-config-source-providers in compartment Shared-Services:Shared-Tools

    Stack execution identity: ORM jobs run with the permissions of the user who starts them, so applies must be started by OCI-IAC-ADMIN members whose group also holds the grants the stacks need (stack1 requires broad IAM grants — scope a dedicated pol-root-iac policy to OCI-IAC-ADMIN listing exactly the resource families the stacks manage: compartments, groups, policies, tag-namespaces, vaults, keys, secrets, cloud-guard-family, security-zone, virtual-network-family, drgs, alarms, ons-family, log-groups). Review this policy with Security before creation — it is the most privileged non-break-glass grant in the tenancy.

    Create the Configuration Source Provider: Resource Manager > Configuration Source Providers > Create. Phase 1: type GitHub — server URL https://github.com, PAT with repo read scope stored as the provider credential. Phase 2: type GitLab — server URL https://gitlab.com (or self-hosted URL), project access token.

    Create one ORM stack per stack-folder per environment scope: Resource Manager > Stacks > Create Stack > Source: Git configuration source provider; repository <customer>-oci-terraform-lz; branch main; working directory e.g. terraform_lz/stack1/compartments. Name: STK-LZ-<STACK>-<SCOPE> (e.g., STK-LZ-STACK1-COMPARTMENTS, STK-LZ-STACK2-PROD-SPOKE-VCN). Compartment: Shared-Services:Shared-Tools.

    Variables: ORM renders the schema.yaml form — populate from the design tables of §3–§6 (CIDRs from §5.1, group names from Doc 1 §6, tag keys from Doc 1 §9). Save without running.

    7.3 Phase 1 — GitHub repository + Actions pipeline

    Create the GitHub repository <customer>-oci-terraform-lz (private, in the customer org); push the terraform_lz content; enable branch protection on main: require PR, ≥ 1 approving review from CODEOWNERS, no force-push, require status checks.

    Add CODEOWNERS: stack1/* → platform + security reviewers (IAM changes need Security approval per Doc 1 SoD); stack2/* → network reviewers; stack9–10/* → platform.

    Store pipeline credentials as GitHub Actions secrets: OCI CLI API key for a dedicated automation user svc-github-orm (member of OCI-IAC-ADMIN), fingerprint, tenancy/user OCIDs, region. Rotate ≤ 90 days via the Vault-recorded schedule.

    Add the validation workflow (PR): terraform fmt -check and terraform validate per changed stack folder + tflint/checkov static scan. This runs in the GitHub runner and never touches OCI.

    Add the plan workflow (PR): for each changed stack folder, use the OCI CLI to trigger the matching ORM stack — update stack from branch, run a PLAN job (oci resource-manager job create-plan-job), poll, download the plan log, post it as a PR comment. Reviewer reads the plan in the PR — approval of the PR is approval of the plan.

    Add the apply workflow (merge to main): protected by a GitHub Environment (e.g., oci-prod) with required reviewers — the approval gate. On approval: oci resource-manager job create-apply-job with the execution-plan strategy FROM_PLAN_JOB_ID referencing the reviewed plan. Post the apply log back to the merge commit.

    Order of first execution (fresh landing zone): stack1 compartments → defined_tags → groups → policies → vault/master_key/secrets → stack2 network (hub → DRG → spokes → FastConnect) → stack10 flow logs → stack1 cloudguard → stack9 notifications/events → stack1 security_zone LAST (zones block non-compliant creation — apply them after the network reaches its compliant end-state, mirroring §5.7).

    VERIFY:Phase 1 pipeline acceptance: a test PR changing one tag value produces fmt/validate pass + ORM plan comment; merge with approval produces an apply whose log shows only the intended change; an unapproved merge attempt is blocked; the apply job identity and time appear in the OCI Audit log.

    7.4 Phase 2 — GitLab repository + CI/CD migration

    Create the GitLab project (or self-managed instance project) and mirror/import the GitHub repository with full history; freeze GitHub to read-only after cutover (archive; do not delete — audit history).

    Recreate protections: protected branch main (Maintainers merge only), merge request approvals ≥ 1 with Code Owners (same ownership map as §7.3), push rules.

    Create a new Configuration Source Provider of type GitLab in ORM (§7.2) and re-point every STK-LZ-* stack’s source to it (Edit stack > Source). State is untouched — ORM keeps it server-side; only the config source changes.

    Store credentials as GitLab CI/CD variables (masked + protected): the svc-gitlab-orm automation user API key (create a NEW automation user; do not reuse the GitHub one — retire svc-github-orm after cutover).

    Add .gitlab-ci.yml with stages validate → plan → apply: validate = fmt/validate/tflint per changed stack; plan = trigger ORM plan job and expose the plan log as a job artifact + MR note; apply = manual job (when: manual) on main, restricted to protected environment oci-prod with required approvals, triggering the ORM apply job FROM_PLAN_JOB_ID.

    Run one no-change pipeline end-to-end (plan shows zero diff) as the cutover proof; then run one real change through GitLab to confirm the full loop. Record both in the build log; update Doc 6 references (repository URL, pipeline links).

    NOTE:Why two phases: Phase 1 (GitHub) gets IaC governance live early with minimal platform setup; Phase 2 (GitLab) is the customer’s strategic home (self-hosting, compliance, or licensing reasons). If the customer starts on GitLab, skip Phase 1 and apply §7.3’s controls directly in §7.4 — the ORM side is identical either way.

    7.5 Option B phase-gate mapping

    GateOption B evidence (in addition to the §6.4 tests, which run unchanged)
    G-A2stack1 compartments + defined_tags apply logs; ORM state list matches design tree; T-GV-01 CLI export diff = zero.
    G-A3stack1 groups + policies apply logs; negative IAM tests of §4.2 executed against the stack-built policies.
    G-A4stack2 + stack10 + cloudguard + security_zone apply logs; connectivity matrix tests; ORM drift detection run returns NO_DRIFT.
    G-A5stack9 apply logs; budget/quota tests (budgets/quotas remain console-manual unless added to the repo — record which).
    AllEvery apply traceable: PR/MR → approval → plan job ID → apply job ID → audit log entry. CD3 reconciliation (Doc 6) still runs — it now validates the stacks’ view of reality, not just the console’s.

    Revision History

    VersionDateDescription
    1.0<DATE>Generic template — Option A fully manual, console click-path edition.
    1.1<DATE>Added Option B: terraform_lz via OCI Resource Manager with Git CI/CD — Phase 1 GitHub (Actions), Phase 2 GitLab (CI). Dual-path execution model; A1 remains manual in both options.