Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- This is Google's cache of https://blog.ls42.de/post/postgres-ssl-with-caddy/. It is a snapshot of the page as it appeared on 14 Dec 2018 09:51:16 GMT. The current page could have changed in the meantime. Learn more.
- Full versionText-only versionView source
- Tip: To quickly find your search term on this page, press Ctrl+F or ⌘-F (Mac) and use the find bar.
- PostgreSQL with Let's Encrypt
- Home
- Posts
- About me
- Disclosure | Impressum
- PostgreSQL with Let's Encrypt February 12, 2018
- Summary
- I decided to play around with PostgreSQL and created a setup where it is running inside Docker and Caddy is taking care of generating Let’s Encrypt certificates. I’ll show the necessary steps and post the configuration snippets here.
- Lets assume PostgreSQL will be reachable via the FQDN db.example.com. I also assume that you have Caddy configured and running on your linux server.
- Caddy Configuration
- Caddy is usually delivering websites. What it also does, is automatically generating SSL certificates via the ACME protocol. In Layman’s terms: It asks the Let’s Encrypt institution to give us a SSL certificate that is considered as secure by most current operation systems [citation needed].
- But we can use Caddy for this feature alone: Just get the certificate. It still listens on the ports 80 and 443, but always delivers a 404 error if not further configured. In my current webserver setup this is particularly useful, because it is running already and I know how it works. I don’t need to have another tool like Certbot installed.
- Given DNS is already configured, you have to tell Caddy to handle the ACME request. This is the corresponding /etc/caddy/Caddyfile:
- [...]
- db.example.com
- [...]
- That’s it so far. Restart Caddy, I do it with sudo systemctl caddy restart. Caddy might take a while, but eventually will have the certificates generated and be listening on port 80 and 443 for the hostname db.example.com. When you access those, you’ll receive a 404 error. That’s fine, because were not interested in HTTP(S) traffic at all, we want to secure port 5432, the default port for the PostgreSQL daemon.
- The default location for Caddy certificates is /etc/ssl/caddy. Given our hostname of db.example.com they relevant files can be located here:
- /etc/ssl/caddy/acme/acme-v01.api.letsencrypt.org/sites/db.example.com/db.example.com.crt
- /etc/ssl/caddy/acme/acme-v01.api.letsencrypt.org/sites/db.example.com/db.example.com.key
- Configuration of Caddy has concluded.
- Docker Configuration
- Let me start with a version of a docker-compose.yml that I use for the PostgreSQL container:
- db:
- image: 'postgres:alpine'
- restart: always
- hostname: 'db.example.com'
- container_name: 'db'
- environment:
- POSTGRES_PASSWORD: "hey-ho-lets-go"
- ports:
- - 0.0.0.0:5432:5432
- volumes:
- - db:/var/lib/postgresql/data
- - /etc/ssl/caddy/acme/acme-v01.api.letsencrypt.org/sites/db.example.com:/var/lib/postgresql/data/ssl
- This tells docker to do the following (brief version):
- Create a new container from the postgres:alpine image and name it db
- Create a volume named db and mount it inside the container at /var/lib/postgresql/data
- Mount a host directory inside the container. This is the location of our SSL files and it will be mounted inside the postgres data directory
- Save the file somewhere and run docker-compose up -d in that directory. You can see the new volume and container with the following commands:
- # docker volume ls
- DRIVER VOLUME NAME
- local db
- # docker container ls
- NAMES IMAGE STATUS CONTAINER ID
- db postgres:alpine Up About an hour ca111ecef743
- PostgreSQL Configuration
- Enter the container and change a few settings.
- # docker exec -ti -u postgres -w /var/lib/postgresql/data db /bin/sh
- $ echo "host all all 0.0.0.0/0 trust" >> pg_hba.conf
- $ echo "ssl = on" >> postgresql.conf
- $ echo "ssl_cert_file = 'ssl/db.example.com.crt'" >> postgresql.conf
- $ echo "ssl_key_file = 'ssl/db.example.com.key'" >> postgresql.conf
- Lines starting with $ are inside the container. We did the following:
- Enter the container as the postgres user
- Tell PostgreSQL that connection from all interfaces for all users are okay. You should consider setting up a dedicated user for external access and change the second all in that line to that users name
- Tell PostgreSQL to enable SSL and where it can find the certificate and and the key
- After that leave the container again and restart it:
- $ exit
- # docker restart db
- If all went well you should now be able to connect to your PostgreSQL database from any host, with a valid SSL certificate. I used Postico and it worked flawlessly.
- Conclusion
- Using Docker and Caddy I’m able to run a secure PostgreSQL installation and connect from anywhere without worrying (too much) about security issues. I consider the times where I have to use snakeoil certificates over.
- If you want to talk about this drop me an e-mail or leave a comment on lobste.rs.
- Thanks!
- © All rights reserved. Powered by Hugo and Minimal
Advertisement
Add Comment
Please, Sign In to add comment