Traefik behind the Firewall

Kevin Wittek

Software Developer @ GDATA Advanced Analytics

 

Freelancer @ Styracosoft GbR

 

 

 

 

http://groovy-coder.com/

         @Kiview

 

          https://github.com/kiview

Constraints in an Enterprise

  • Certificates signed by company CA
  • No wildcard certificates (not even subdomain)
  • Secrets need to be secure (private key) 
  • Internal services not reachable via Internet

Infrastructure as Code

Text

source: https://oliverveits.wordpress.com/2015/11/09/it-automation-a-hello-world-example-using-ansible-on-docker/

Traefik compose


version: '2'
services:

  traefik:
    image: traefik:v1.0.3
    restart: always
    ports:
      - "443:443"
      - "8080:8080"
    volumes:
      - ./traefik.toml:/etc/traefik/traefik.toml
      - ./certs:/etc/traefik/certs/
      - /var/run/docker.sock:/var/run/docker.sock

Traefik role (tasks)

---
# tasks file for traefik
- name: create project directory
  file: path=/docker/traefik state=directory

- name: copy docker-compose to host
  copy: src=docker-compose.yml dest=/docker/traefik

- name: copy toml template
  template: src=traefik.toml.j2 dest=/docker/traefik/traefik.toml

- name: create cert directory
  file: path=/docker/traefik/certs state=directory

- name: Copy certs
  copy: src={{ item }} dest=/docker/traefik/certs
  with_fileglob:
    - "{{ playbook_dir }}/*.crt"

- name: Write SSL keys
  copy: content={{ item.ssl_key }} dest="/docker/traefik/certs/{{ item.name }}.key"
  no_log: True
  with_items: "{{ domains }}"

- name: start traefik
  docker_service:
    project_src: /docker/traefik
    state: present
    restarted: yes

Traefik config (SSL SNI)

# To redirect an http entrypoint to an https entrypoint (with SNI support):
[entryPoints]
   [entryPoints.http]
   address = ":80"
     [entryPoints.http.redirect]
       entryPoint = "https"
   [entryPoints.https]
   address = ":443"
     [entryPoints.https.tls]
       [[entryPoints.https.tls.certificates]]
       CertFile = "integration/fixtures/https/snitest.com.cert"
       KeyFile = "integration/fixtures/https/snitest.com.key"
       [[entryPoints.https.tls.certificates]]
       CertFile = "integration/fixtures/https/snitest.org.cert"
       KeyFile = "integration/fixtures/https/snitest.org.key"

Traefik role (template)

 [entryPoints]
   [entryPoints.https]
   address = ":443"
   [entryPoints.https.tls]
      {% for domain in domains %}
      [[entryPoints.https.tls.certificates]]
      certFile = "/etc/traefik/certs/{{domain.name}}.crt"
      keyFile = "/etc/traefik/certs/{{domain.name}}.key"
      {% endfor %}

Playbook

---
- hosts: ubuntu.hyperv.de
  become: true
  
  pre_tasks:
    - include_vars: ssl_keys.yml

  roles:
    - role: traefik
      domain_name: "{{ ansible_host }}"
      tags:
        - traefik
      domains:
        - {name: confluence.ubuntu.hyperv.de, ssl_key: "{{confluence_key}}"}
        - {name: jira.ubuntu.hyperv.de, ssl_key: "{{jira_key}}"}
    - role: jira
      domain_name: "{{ ansible_host }}"
    - role: confluence 
      domain_name: "{{ ansible_host }}" 
      tags:
        - confluence

Secrets

  • Ansible Vault
  • Hashicorp Vault
  • Square KeyWhiz
ansible-vault encrypt ssl_keys.yml

ansible-playbook site.yml --ask-vault-pass

Demo?

Traefik behind the Firewall

By Kevin Wittek

Traefik behind the Firewall

  • 3,429