postgres envoy ssl termination - ghdrako/doc_snipets GitHub Wiki
Envoy
- https://academy.tetrate.io/courses/envoy-fundamentals
- https://www.envoyproxy.io/docs/envoy/v1.22.0/configuration/best_practices/best_practices
- https://codilime.com/blog/envoy-configuration/
- https://www.envoyproxy.io/docs/envoy/latest/operations/cli
- https://www.envoyproxy.io/
- https://www.envoyproxy.io/docs/envoy/latest/start/install#install-envoy-on-rpm-based-distros
- https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_protocols/postgres
Evvoy postgres filters features:
- Decode non SSL traffic, ignore SSL traffic
- Decode session information
- Capture transaction information, including commits and rollbacks
- Expose counters for different types of statements (INSERTs, SELECTs, DELETEs, UPDATEs, etc.)
- Count frontend, backend, and unknown messages
- Identify errors and backend responses
Envoy as systemd service
quick sample based on upstream hot-restarter wrapper will be like:
[Unit]
Description=Envoy Proxy
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
# ExecStart=/usr/local/bin/envoy-hot-restarter.py /usr/local/bin/start-envoy.sh
ExecStart=python3 /usr/local/bin/envoy-hot-restarter.py /usr/local/bin/start-envoy.sh
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
Where envoy-hot-restarter.py and start-envoy.sh can found from this doc: https://www.envoyproxy.io/docs/envoy/latest/operations/hot_restarter
We're trying to simplify this a bit with the package and release with right wrappers.
Create Linux Service
Create the file named envoy.serviceunder the path /etc/systemd/system
[Unit]
Description=Envoy[Service]
ExecStart=/usr/bin/envoy -c /etc/envoy/envoy.yaml
Restart=always
RestartSec=5
KillMode=mixed
SyslogIdentifier=envoy
LimitNOFILE=640000[Install]
WantedBy=multi-user.target
envoy.yaml
file is an entry point for Envoy. As seen on ExecStart command above. Envoy never tracking the changes on the file after it started.
Postgres SSL Termintion
- https://www.reddit.com/r/PostgreSQL/comments/p2dsu0/ssl_termination_before_postgres_is_it_possible/
- https://stackoverflow.com/questions/77642200/configure-envoy-postgres-filter-with-upstream
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 5432 # Frontend port
filter_chains:
- filters:
- name: envoy.filters.network.postgres_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.postgres_proxy.v3alpha.PostgresProxy
stat_prefix: imperva
terminate_ssl: true
upstream_ssl: REQUIRE
- name: envoy.filters.network.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: tcp
cluster: backend_cluster
transport_socket:
name: envoy.transport_sockets.starttls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.starttls.v3.StartTlsConfig
tls_socket_config:
common_tls_context:
tls_certificates:
certificate_chain:
filename: "/etc/envoy/certs/cert.pem" # Path to SSL certificate
private_key:
filename: "/etc/envoy/certs/key.pem" # Path to SSL private key
clusters:
- name: backend_cluster
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: backend_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: psql-demo-db.com
port_value: 5432
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.starttls.v3.UpstreamStartTlsConfig
tls_socket_config: {}
admin:
access_log_path: /dev/null
address:
socket_address:
address: 0.0.0.0
port_value: 8000
static_resources:
clusters:
- name: postgres_cluster
connect_timeout: 1s
type: STRICT_DNS
load_assignment:
cluster_name: postgres_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 0.0.0.0
port_value: 5432
listeners:
- name: listener
address:
socket_address:
address: 0.0.0.0
port_value: 54322
filter_chains:
- filters:
- name: envoy.filters.network.postgres_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.postgres_proxy.v3alpha.PostgresProxy
stat_prefix: egress_postgres
enable_sql_parsing: false
terminate_ssl: true
- name: envoy.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: tcp_postgres
cluster: postgres_cluster
idle_timeout: 10s
transport_socket:
name: "starttls"
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.starttls.v3.StartTlsConfig
tls_socket_config:
common_tls_context:
tls_certificates:
certificate_chain:
filename: "/d/fabrizio/ongres/etc/.creds/ssl/server.crt"
private_key:
filename: "/d/fabrizio/ongres/etc/.creds/ssl/server.key"