AWS Infrustructure » History » Version 2
David Leedom, 04/01/2026 07:31 PM
| 1 | 2 | David Leedom | # AWS Infrastructure Context Document |
|---|---|---|---|
| 2 | |||
| 3 | **Owner Account ID:** 256086846830 |
||
| 4 | **Region:** us-east-1 (US East - N. Virginia) |
||
| 5 | **Last Updated:** March 31, 2026 |
||
| 6 | |||
| 7 | --- |
||
| 8 | |||
| 9 | ## VPCs |
||
| 10 | |||
| 11 | ### Catalyst Secure VPC (Primary / Private VPC) |
||
| 12 | |||
| 13 | - **VPC ID:** vpc-07f5fb32f92605bb9 |
||
| 14 | - **IPv4 CIDR:** 10.20.0.0/16 |
||
| 15 | - **Default VPC:** No |
||
| 16 | - **DNS Resolution:** Enabled |
||
| 17 | - **DNS Hostnames:** Enabled |
||
| 18 | |||
| 19 | This is the target VPC for all infrastructure. It contains both public and private subnets. Servers are being migrated here from the Public Default VPC in phases. |
||
| 20 | |||
| 21 | **Subnets:** |
||
| 22 | |||
| 23 | - Public subnet(s) in us-east-1a and us-east-1b — used for internet-facing services (WireGuard VPN, future reverse proxy) |
||
| 24 | - Private subnet(s) in us-east-1a and us-east-1b — used for all application servers, databases, and internal services |
||
| 25 | |||
| 26 | **Networking:** |
||
| 27 | |||
| 28 | - Internet Gateway attached for public subnet internet access |
||
| 29 | - NAT Gateway in the public subnet — provides outbound internet to private subnet servers (for updates, package installs, SMTP, etc.) |
||
| 30 | - Route tables configured per subnet: public routes 0.0.0.0/0 through the Internet Gateway; private routes 0.0.0.0/0 through the NAT Gateway |
||
| 31 | |||
| 32 | ### Public Default VPC (Legacy — Being Migrated Away From) |
||
| 33 | |||
| 34 | - **VPC ID:** vpc-ac30f0cb |
||
| 35 | - **IPv4 CIDR:** 172.31.0.0/16 |
||
| 36 | - **Default VPC:** Yes |
||
| 37 | - **Subnets:** 6 subnets across us-east-1a through us-east-1f |
||
| 38 | - **Route Table:** rtb-ad5e1eca |
||
| 39 | - **Internet Gateway:** igw-50acd934 |
||
| 40 | |||
| 41 | This is the original default VPC where most servers currently run. All servers will eventually be migrated to the Catalyst Secure VPC, after which this VPC and the peering connection can be removed. |
||
| 42 | |||
| 43 | ### Deleted VPC |
||
| 44 | |||
| 45 | - **Catalyst Secure-vpc** (vpc-04cb87f2911b78dd1, CIDR 10.0.0.0/16) — an earlier attempt at a private VPC. Fully deleted including all subnets, route tables, endpoints, internet gateway, and security groups. |
||
| 46 | |||
| 47 | --- |
||
| 48 | |||
| 49 | ## VPC Peering |
||
| 50 | |||
| 51 | - **Connection:** Public Default (vpc-ac30f0cb) ↔ Catalyst Secure VPC (vpc-07f5fb32f92605bb9) |
||
| 52 | - **Name:** Default-to-Catalyst-Peering |
||
| 53 | - **Status:** Active |
||
| 54 | |||
| 55 | **Route table entries:** |
||
| 56 | |||
| 57 | - Public Default route table (rtb-ad5e1eca): Destination 10.20.0.0/16 → Target: peering connection |
||
| 58 | - Catalyst Secure VPC private route table(s): Destination 172.31.0.0/16 → Target: peering connection |
||
| 59 | |||
| 60 | This peering connection allows servers in both VPCs to communicate with each other during the migration period. It will be removed once all servers have been moved to the Catalyst Secure VPC. |
||
| 61 | |||
| 62 | --- |
||
| 63 | |||
| 64 | ## DNS — Route 53 |
||
| 65 | |||
| 66 | - **Private Hosted Zone:** catalyst.internal (Zone ID: Z0333326ZTOIKXJA848C) |
||
| 67 | - **Record Count:** 7 |
||
| 68 | - **Associated VPCs:** Both Catalyst Secure VPC (vpc-07f5fb32f92605bb9) and Public Default (vpc-ac30f0cb) |
||
| 69 | |||
| 70 | **Known records:** |
||
| 71 | |||
| 72 | - wazuh.catalyst.internal → 10.20.137.102 (Wazuh server in private subnet) |
||
| 73 | |||
| 74 | Both VPCs can resolve catalyst.internal hostnames. This allows agents in the Public Default VPC to reach services in the Catalyst Secure VPC by hostname rather than IP address, which makes future IP changes transparent. |
||
| 75 | |||
| 76 | --- |
||
| 77 | |||
| 78 | ## Servers — Catalyst Secure VPC (Private Subnet) |
||
| 79 | |||
| 80 | ### Wazuh Server |
||
| 81 | |||
| 82 | - **Private IP:** 10.20.137.102 |
||
| 83 | - **DNS:** wazuh.catalyst.internal |
||
| 84 | - **Instance Type:** t3.medium (2 vCPU, 4 GB RAM) |
||
| 85 | - **OS:** Ubuntu 22.04 LTS or Ubuntu 24.04 LTS |
||
| 86 | - **Storage:** 100 GB gp3, EBS encrypted at rest (AWS managed KMS key) |
||
| 87 | - **Wazuh Version:** 4.14.4 (all-in-one: manager + indexer + dashboard) |
||
| 88 | - **Security Group:** SG-WAZUH |
||
| 89 | - **Dashboard Access:** https://wazuh.catalyst.internal (via VPN only) |
||
| 90 | - **TLS:** Self-signed certificate; root CA at /etc/wazuh-dashboard/certs/root-ca.pem |
||
| 91 | - **Alert Retention Target:** 1 year |
||
| 92 | - **Wazuh repo disabled** to prevent accidental upgrades |
||
| 93 | |||
| 94 | **SG-WAZUH Inbound Rules:** |
||
| 95 | |||
| 96 | | Port | Protocol | Source | Description | |
||
| 97 | |------|----------|--------|-------------| |
||
| 98 | | 22 | TCP | 10.20.0.0/16 | SSH via VPN | |
||
| 99 | | 443 | TCP | 10.20.0.0/16 | Wazuh dashboard via VPN | |
||
| 100 | | 1514 | TCP | 172.31.0.0/16 | Agent communication from old VPC | |
||
| 101 | | 1514 | UDP | 172.31.0.0/16 | Agent communication from old VPC | |
||
| 102 | | 1514 | TCP | 10.20.0.0/16 | Agent communication within Catalyst VPC | |
||
| 103 | | 1514 | UDP | 10.20.0.0/16 | Agent communication within Catalyst VPC | |
||
| 104 | | 1515 | TCP | 172.31.0.0/16 | Agent registration from old VPC | |
||
| 105 | | 1515 | TCP | 10.20.0.0/16 | Agent registration within Catalyst VPC | |
||
| 106 | |||
| 107 | ### Redmine Server (redmine-tickets) |
||
| 108 | |||
| 109 | - **Private IP:** 10.20.137.102 (or separate IP — referred to as redmine-tickets in Wazuh) |
||
| 110 | - **Purpose:** SOC2 ticketing system |
||
| 111 | - **Database:** Small RDS instance in private subnet |
||
| 112 | - **Wazuh Agent:** v4.14.4, reporting as "redmine-tickets" |
||
| 113 | - **Wazuh repo disabled** |
||
| 114 | |||
| 115 | ### WireGuard VPN Server |
||
| 116 | |||
| 117 | - **Location:** Public subnet of Catalyst Secure VPC |
||
| 118 | - **Has Elastic IP:** Yes (public-facing for VPN clients) |
||
| 119 | - **Purpose:** Provides remote access into the private subnet for management of all internal servers, access to Wazuh dashboard, Gitea, Redmine, SSH, etc. |
||
| 120 | |||
| 121 | --- |
||
| 122 | |||
| 123 | ## Servers — Public Default VPC (Being Migrated) |
||
| 124 | |||
| 125 | All servers below are scheduled to migrate to the Catalyst Secure VPC private subnet. |
||
| 126 | |||
| 127 | ### 1. Production Server (catalystv2) |
||
| 128 | |||
| 129 | - **Private IP:** 172.31.46.77 |
||
| 130 | - **Services:** Apache + PostgreSQL |
||
| 131 | - **Has Public Elastic IP:** Yes |
||
| 132 | - **Wazuh Agent:** v4.12.0 (needs upgrade to 4.14.4), reporting as "catalystv2" |
||
| 133 | - **Notes:** Highest-risk migration. Will be moved last. Elastic IP should eventually be reassigned to the reverse proxy. |
||
| 134 | |||
| 135 | ### 2. Development Server |
||
| 136 | |||
| 137 | - **Private IP:** 172.31.59.250 |
||
| 138 | - **Services:** Near-clone of production, multiple test subdomains and databases |
||
| 139 | - **Wazuh Agent:** v4.14.4, reporting as "development" |
||
| 140 | |||
| 141 | ### 3. Gitea Server |
||
| 142 | |||
| 143 | - **Private IP:** 172.31.61.251 |
||
| 144 | - **Services:** Git hosting (Gitea) |
||
| 145 | - **Wazuh Agent:** v4.12.0 (needs upgrade to 4.14.4), reporting as "gitea" |
||
| 146 | - **Access:** Will be via VPN only after migration |
||
| 147 | |||
| 148 | ### 4. Wazuh Server (OLD — Decommissioned) |
||
| 149 | |||
| 150 | - **Status:** Login broken after updates, not in use |
||
| 151 | - **Action:** Can be terminated. Replaced by new Wazuh server in Catalyst Secure VPC. |
||
| 152 | |||
| 153 | ### 5. Python Platform Dashboard Server |
||
| 154 | |||
| 155 | - **Purpose:** Dashboard application in development, moving to production soon |
||
| 156 | - **Wazuh Agent:** Not yet confirmed in dashboard (may be missing or named differently) |
||
| 157 | |||
| 158 | ### 6. Email Notifications Server |
||
| 159 | |||
| 160 | - **Private IP:** 172.31.12.137 |
||
| 161 | - **Purpose:** Outbound email notifications only |
||
| 162 | - **Wazuh Agent:** v4.12.0 (needs upgrade to 4.14.4), reporting as "emailnotifications" |
||
| 163 | - **Notes:** Needs outbound internet (via NAT Gateway after migration) for SMTP. Uses SES or similar. |
||
| 164 | |||
| 165 | ### 7. WireGuard VPN Server (OLD) |
||
| 166 | |||
| 167 | - **Status:** Replaced by WireGuard server in Catalyst Secure VPC |
||
| 168 | - **Action:** Can be terminated once all clients are migrated to new VPN endpoint. |
||
| 169 | |||
| 170 | --- |
||
| 171 | |||
| 172 | ## Servers — Stopped (Not Running) |
||
| 173 | |||
| 174 | ### Production Clone Server |
||
| 175 | |||
| 176 | - **Purpose:** Intended for future load balancing |
||
| 177 | - **Setup:** Configured like the production server |
||
| 178 | - **Plan:** Will be launched in Catalyst Secure VPC private subnet after production is migrated, then placed behind the reverse proxy alongside production. |
||
| 179 | |||
| 180 | ### PostgreSQL v18 Server |
||
| 181 | |||
| 182 | - **Purpose:** Intended to become the new production database |
||
| 183 | - **Plan:** Will be launched in Catalyst Secure VPC private subnet. Streaming replication from current production PostgreSQL should be set up before the production cutover to minimize downtime. |
||
| 184 | |||
| 185 | --- |
||
| 186 | |||
| 187 | ## Security Group Strategy |
||
| 188 | |||
| 189 | Security groups are named by server role (e.g., SG-WAZUH, SG-PROD, SG-DEV). The plan is to use security group references instead of CIDR-based rules once all servers are in the same VPC. During the migration, CIDR-based rules (172.31.0.0/16 and 10.20.0.0/16) are used for cross-VPC communication. |
||
| 190 | |||
| 191 | **Planned security groups:** |
||
| 192 | |||
| 193 | | Name | Purpose | |
||
| 194 | |------|---------| |
||
| 195 | | SG-PROD | Production server and load balancer | |
||
| 196 | | SG-DEV | Development server | |
||
| 197 | | SG-GITEA | Gitea git hosting | |
||
| 198 | | SG-WAZUH | Wazuh manager/indexer/dashboard (created) | |
||
| 199 | | SG-DB | PostgreSQL v18 and RDS instances | |
||
| 200 | | SG-REDMINE | Redmine ticketing | |
||
| 201 | | SG-EMAIL | Email notifications | |
||
| 202 | | SG-DASHBOARD | Python platform dashboard | |
||
| 203 | | SG-VPN | WireGuard VPN (public subnet) | |
||
| 204 | | SG-PROXY | Reverse proxy (public subnet, future) | |
||
| 205 | |||
| 206 | Once all servers are in the Catalyst Secure VPC, rules should be updated from CIDR ranges to security group references for tighter access control. The 172.31.0.0/16 rules can be removed after migration is complete and the VPC peering connection is deleted. |
||
| 207 | |||
| 208 | --- |
||
| 209 | |||
| 210 | ## Migration Status |
||
| 211 | |||
| 212 | | Phase | Description | Status | |
||
| 213 | |-------|-------------|--------| |
||
| 214 | | 0 | Build VPC, subnets, peering | Complete | |
||
| 215 | | 1 | Deploy Redmine + RDS in private VPC | Complete | |
||
| 216 | | 2 | Move WireGuard to new VPC | Complete | |
||
| 217 | | 3 | Deploy reverse proxy (public subnet) | Not started | |
||
| 218 | | 4.1 | Migrate Wazuh | Complete (fresh install) | |
||
| 219 | | 4.2 | Migrate Gitea | Not started | |
||
| 220 | | 4.3 | Migrate Email Notifications | Not started | |
||
| 221 | | 5 | Migrate Development Server | Not started | |
||
| 222 | | 6 | Migrate Python Dashboard | Not started | |
||
| 223 | | 7 | Migrate Production + DB cutover | Not started | |
||
| 224 | | 8 | Set up Load Balancer | Not started | |
||
| 225 | | 9 | Cleanup old VPC | Not started | |
||
| 226 | |||
| 227 | **Pending tasks:** |
||
| 228 | |||
| 229 | - Upgrade Wazuh agents on emailnotifications, gitea, and catalystv2 from v4.12.0 to v4.14.4 |
||
| 230 | - Confirm Python Dashboard server has a Wazuh agent |
||
| 231 | - Terminate old Wazuh server in Public Default VPC |
||
| 232 | - Terminate old WireGuard server in Public Default VPC |
||
| 233 | - Disable Wazuh apt repository on all agent servers to prevent accidental upgrades |
||
| 234 | |||
| 235 | --- |
||
| 236 | |||
| 237 | ## Target Architecture |
||
| 238 | |||
| 239 | ``` |
||
| 240 | INTERNET |
||
| 241 | │ |
||
| 242 | ┌────────────┼────────────┐ |
||
| 243 | │ PUBLIC SUBNET │ |
||
| 244 | │ │ |
||
| 245 | │ ┌───────────────────┐ │ |
||
| 246 | │ │ Reverse Proxy │ │ ← Elastic IP (future, production traffic) |
||
| 247 | │ │ (Nginx/HAProxy) │ │ |
||
| 248 | │ └────────┬──────────┘ │ |
||
| 249 | │ │ │ |
||
| 250 | │ ┌───────────────────┐ │ |
||
| 251 | │ │ WireGuard VPN │ │ ← Elastic IP (VPN access) |
||
| 252 | │ └────────┬──────────┘ │ |
||
| 253 | │ │ │ |
||
| 254 | │ ┌───────────────────┐ │ |
||
| 255 | │ │ NAT Gateway │ │ ← Outbound internet for private subnet |
||
| 256 | │ └────────┬──────────┘ │ |
||
| 257 | └───────────┼─────────────┘ |
||
| 258 | │ |
||
| 259 | ┌───────────┼─────────────┐ |
||
| 260 | │ PRIVATE SUBNET │ |
||
| 261 | │ │ |
||
| 262 | │ Production Server │ |
||
| 263 | │ Development Server │ |
||
| 264 | │ Gitea Server │ |
||
| 265 | │ Wazuh Server │ |
||
| 266 | │ Redmine (SOC2) │ |
||
| 267 | │ Python Dashboard │ |
||
| 268 | │ Email Notifications │ |
||
| 269 | │ PostgreSQL v18 Server │ |
||
| 270 | │ Load Balancer Server │ |
||
| 271 | │ RDS Instance │ |
||
| 272 | │ │ |
||
| 273 | └─────────────────────────┘ |
||
| 274 | ``` |
||
| 275 | |||
| 276 | --- |
||
| 277 | |||
| 278 | ## Key Design Decisions |
||
| 279 | |||
| 280 | - **Encryption at rest** is handled at the EBS volume level (AWS KMS), not at the application level. The Wazuh server's 100 GB volume is encrypted. All future servers should follow this pattern. |
||
| 281 | - **Internal DNS** uses Route 53 Private Hosted Zone (catalyst.internal) so services can be referenced by name rather than IP. Both VPCs are associated with this zone during migration. |
||
| 282 | - **Wazuh agents point to wazuh.catalyst.internal** rather than a direct IP, so the Wazuh server can be replaced or moved without touching agent configs. |
||
| 283 | - **VPC Peering** is temporary — it bridges the old and new VPCs during migration. It will be removed when all servers are in the Catalyst Secure VPC. |
||
| 284 | - **Wazuh apt repositories are disabled** on all servers after installation to prevent accidental upgrades from breaking the system. |
||
| 285 | - **The production Elastic IP** will eventually be reassigned to the reverse proxy so that the public IP remains stable regardless of which backend server handles traffic. |