Demonstrating the security controls (H-1 to H-5) for the wealth-planning application, on a working live deployment. Prepared for review by Group CEO.
Database connection: connected over private VNet (SSL enforced)
App Service host: app-appsvc-poc-01-btf0a3h0hqehaeet.southeastasia-01.azurewebsites.net
Runtime: Python 3.12 on Linux (App Service Premium V3)
Server time (UTC): 2026-05-28T16:11:04
Build the platform for the wealth-planning app — used by RMs, eventually holding real client data (residency, NRIC/PAN, beneficiary details). Five security controls were specified:
| Control | Status | Evidence / Notes |
|---|---|---|
| H-1 Private Postgres + SSL |
✓ Built | PostgreSQL Flexible Server provisioned with VNet integration (private access only).
No public endpoint exists. SSL required on every connection
(sslmode=require in the connection string).
The "Clients" table below is proof: this page just queried that server. |
| H-2 Key Vault + Fernet secret |
Next step | Not yet built in this POC. Current DB credentials are stored as an App Service environment variable. Next refinement: provision Azure Key Vault, store the DB credential and a Fernet master key, switch the app setting to a Key Vault reference. Standard pattern, ~30 min of work, no architectural change. |
| H-3 Managed Identity + Entra DB auth |
Next step | Not yet built. App Service supports system-assigned Managed Identity natively. Once enabled, the app connects to Postgres using its Azure identity rather than a stored password. Eliminates the credential entirely. Pairs with H-2 in the same refinement step. |
| H-4 Corporate-CA TLS certificate |
Next step | Currently served on Azure's default *.azurewebsites.net certificate.
Binding the LCPL corporate CA certificate is a configuration step in App Service
TLS/SSL settings. Done at the point we assign a friendly hostname
(e.g. wealth.lighthouse-canton.com). |
| H-5 HTTPS-only binding |
✓ Built | App Service serves only HTTPS by default; HTTP requests are auto-redirected.
The URL in your browser is https://. No code in the app accepts plain HTTP. |
| Layer | Technology |
|---|---|
| Frontend / hosting | Azure App Service (Premium V3, Linux, Python 3.12) |
| Backend database | Azure Database for PostgreSQL Flexible Server (private VNet-integrated, SSL enforced) |
| Networking | Dedicated Azure Virtual Network with delegated subnets for App Service and Postgres |
| Source code | Azure Repos (LCPL Azure DevOps tenant) |
| Build & deployment | Azure Pipelines (CI/CD) |
| Runtime auth (today) | App Service environment variable |
| Runtime auth (next step) | Azure Key Vault + system-assigned Managed Identity |
The deployment process leaves a full audit trail. Nobody logs into a server to copy files; nothing is manually edited in production.
main
triggers an automated build (install dependencies, package the app) and release
(deploy to App Service).The table below was just queried from the private PostgreSQL Flexible Server over the VNet.
This is a placeholder schema (a simple clients table); when real wealth-planning
schemas are designed by the dev team, they replace this one. The point here is to demonstrate
that the App Service ↔ private database connection works.
Rows currently in the test table: 2
| ID | Name | Created (UTC) | |
|---|---|---|---|
| 2 | Test Client Beta | beta@example.com | 2026-05-28 12:11:48.591894 |
| 1 | Test Client Alpha | alpha@example.com | 2026-05-28 12:11:48.591894 |