This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Public Cloud

    Overview

    %%{
        init: {
            "flowchart": {
                "wrappingWidth": "300"
            }
        }
    }%%
    
    flowchart TB
        cloudflare["Cloudflare"]
        loadBalancer["HTTP(s) Load Balancer"]
        vault["Hashicorp Vault"]
        lbsink["Load Balancer Sink Service"]
        machineMgmt["Machine Management Service"]
        objectStore["Object Storage"]
    
        cloudflare -->|machine.example.com| loadBalancer
    
        loadBalancer -->|Unknown Route| lbsink
        loadBalancer --> machineMgmt
        loadBalancer --> vault
    
        machineMgmt --> objectStore

    The above diagram documents the high level architecture deployed on Google Cloud. All services are a part of the network boot process for the home lab physical infrastracture.

    mTLS

    flowchart LR
        clientCA["Client CA"]
        serverCA["Server CA"]
        clientCert["Client Certificate"]
        serverCert["Server Certificate"]
        client["Client"]
        server["Server"]
    
        subgraph Client Side
            direction TB
            clientCA --> clientCert --> client
        end
    
        subgraph Server Side
            direction TB
            serverCA --> serverCert --> server
        end
    
        client <-->|exchange certs| server
    
        server -->|verify client certificate| clientCA
        client -->|verify server certificate| serverCA

    The above diagram gives a high level overview of the mTLS certificate verification flow. It begins by the client and server exchange certificates during the TLS handshake process. Next, both the client and server verify the certificate chain against the respective trust anchor(s) i.e. client verifies against server CA trush anchor and vice versa.

    Due to the added cost of running a private CA in GCP, the decision was made to leverage offerings from Cloudflare for generating the server side certificate and trust anchor(s), specifically:

    The below diagram shows the high level mTLS certificate verification flow again but with the Cloudflare solutions substituted in.

    flowchart
        originPullsCA["Cloudflare Authenticated Origin Pulls CA"]
        clientCert["Client Certificate"]
        originCA["Cloudflare Origin CA"]
        originCert["Cloudflare Origin Certificate"]
        cloudflareProxy["Cloudflare Proxy"]
        loadBalancer["HTTP(s) Load Balancer"]
    
        subgraph Cloudflare
            originPullsCA --> clientCert --> cloudflareProxy
            originCA --> originCert
        end
    
        originCert -->|use as server side cert| loadBalancer
    
        subgraph GCP
            loadBalancer
        end
    
        cloudflareProxy <-->|exchange certs| loadBalancer
    
        cloudflareProxy -->|verify server certificate| originCA
        loadBalancer -->|verify client certificate| originPullsCA

    Google Cloud Products

    Below is a possibly exhaustive list of Google Cloud products used:

    HTTP(s) Load Balancer

    %%{
        init: {
            "flowchart": {
                "wrappingWidth": "350"
            }
        }
    }%%
    
    flowchart TB
        ipv6["Global External IPv6 Address"]
        forwarding["Global Forwarding Rule"]
        httpsProxy["HTTP(s) Proxy Target"]
        urlMap["URL map"]
        sslCerts["SSL Certificates"]
        secret["Secret"]
        tlsPolicy["Server TLS Policy"]
        trustConfig["Certificate Manager Trust Config"]
        trustAnchor["Trust Anchor aka Root Client CA"]
        hostRule["Host Rule"]
        pathMatcher["Path Matcher"]
        backendService["Backend Service"]
        neg["Serverless Network Endpoint Group (NEG)"]
        cloudRun["Cloud Run"]
    
        forwarding --> ipv6
        forwarding --> httpsProxy
    
        httpsProxy --> urlMap
        httpsProxy --> sslCerts
        httpsProxy --> tlsPolicy
    
        sslCerts --> secret
    
        tlsPolicy --> trustConfig
    
        trustConfig --> trustAnchor
        trustAnchor --> secret
    
        urlMap --> hostRule
    
        hostRule --> pathMatcher
    
        pathMatcher --> backendService
    
        backendService --> neg
    
        neg --> cloudRun

    SSL Certificates

    The SSL certificates will be generated by Cloudflare, uploaded to Secret Manager. Then, while deploying the HTTP(s) Load Balancer the certificate will be extracted from the secret and a ssl certificate resource will be created.

    flowchart TB
        originCA["Cloudflare Origin CA"]
        originCert["Cloudflare Origin Certificate"]
        secret["Secret"]
        sslCertificate["SSL Certificate"]
    
        originCA --> originCert --> secret
        sslCertificate --> secret

    Forwarding Rule

    The forwarding rule is what connects the external IP address to an actual HTTP(s) reverse proxy. Thus, making the load balancer callable from the internet.

    HTTP(s) Proxy Target

    The reverse proxy target is made up of 3 key components:

    • Server TLS Policy: Defines client certificate validation for mTLS support.
    • SSL certificates: The certificates that the load balancer hands out to clients for TLS connections.
    • URL map: Relates HTTP hosts and paths to backend services.

    URL map

    The URL map allows for multi-host, multi-path configurations where each path can map to a distinct backend service.

    For each path matcher, a default service is also required to handle unmatched paths. That’s where the Load Balancer Sink Service comes in to play.

    Load Balancer Sink Service

    flowchart TB
        sa["Service Account"]
        artifactRegistry["Artifact Registry"]
        cloudRun["Cloud Run"]
        cloudTrace["Cloud Trace"]
        cloudLogging["Cloud Logging"]
    
        sa --> cloudRun
    
        artifactRegistry --> cloudRun
    
        cloudRun --> cloudTrace
        cloudRun --> cloudLogging

    This service is needed as part of deployment process for an HTTP/HTTP(s) Load Balancer on Google Cloud. Its role is to receive any requests which do not match any of the patterns defined in the URL map for the Load Balancer. Upon receiving the request, the service simply responds with a 503 Service Unavailable HTTP status code.

    Machine Management Service

    flowchart TB
        sa["Service Account"]
        artifactRegistry["Artifact Registry"]
        cloudRun["Cloud Run"]
        cloudTrace["Cloud Trace"]
        cloudLogging["Cloud Logging"]
        cloudStorage["Cloud Storage"]
    
        sa --> cloudRun
    
        artifactRegistry --> cloudRun
    
        cloudRun --> cloudTrace
        cloudRun --> cloudLogging
        cloudRun --> cloudStorage

    This is core of the network boot procedure for the homelab physical infrastructure. It is responsible for serving the appropriate boot scripts and images from Cloud Storage based on unique machine requests.