ansibleguy.infra_haproxy

Logo HAProxy

Rola Ansible - HAProxy Community (z ACME, GeoIP i pewnymi funkcjami WAF)

Rola do wdrożenia HAProxy (Skupienie na wersji społecznościowej)

Uważam, że abstrakcja frontend => route => backend zaimplementowana w tej roli jest bardzo wygodna w użyciu. Proszę daj mi znać, co myślisz!

Postaw mi kawę

Molecule Test Status YamlLint Test Status PyLint Test Status Ansible-Lint Test Status Ansible Galaxy

Dzienniki Molecule: Skrócone, Pełne

Testowano na:

  • Debian 12

Instalacja

# najnowsza wersja
ansible-galaxy role install git+https://github.com/ansibleguy/infra_haproxy

# z galaxy
ansible-galaxy install ansibleguy.infra_haproxy

# lub do własnej ścieżki ról
ansible-galaxy install ansibleguy.infra_haproxy --roles-path ./roles

Plan rozwoju

  • Bezpieczeństwo
    • Podstawowe ograniczenie szybkości (osobno dla GET/HEAD i POST/PUT/DELETE)
    • Ogólny odcisk palca klienta
  • 'Interfejs' do tłumaczenia/tworzenia plików map
  • Opcja łatwego pobierania i integrowania list IP (jak węzły wyjściowe Tor)
  • Prosty sposób na nadpisanie domyślnych plików błędów

Użytkowanie

Chcesz prostego interfejsu Ansible? Sprawdź moje Ansible WebUI

Przykłady

Oto kilka szczegółowych przykładów konfiguracji i ich wyniki:

Konfiguracja

Minimalny przykład

haproxy:
  acme:
    enable: true
    email: '[email protected]'

  frontends:
    fe_web:
      bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
      acme:
        enable: true

      routes:
        be_intern:
          domains: ['app.template.ansibleguy.net']

      default_backend: 'be_fallback'

  backends:
    be_intern:
      servers:
        - 'srv-1 192.168.10.11:80'
        - 'srv-2 192.168.10.12:80'

    be_fallback:
      lines: 'http-request redirect code 302 location https://github.com/ansibleguy'

Zdefiniuj konfigurację według potrzeb:

haproxy:
  version: '2.8'
  acme:
    enable: true
    email: '[email protected]'

  # FRONTENDY
  frontends:
    fe_web:
      bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
      acme:
        enable: true
        domains: ['app.template.ansibleguy.net']  # domeny z tras zostaną również dodane

      routes:
        be_app01:
          domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']

      # zdefiniuj sekcje/linie konfiguracji do dodania
      lines:
        section1:
          - ...

      default_backend: 'be_fallback'

    fe_dbs:
      mode: 'tcp'
      default_backend: 'be_db'

    fe_restricted:
      bind: ['[::]:8080 v4v6', '[::]:8443 v4v6 ssl crt /etc/myapp/mycert.pem']

      geoip:
        enable: true

      security:
        restrict_methods: true
        allow_only_methods: ['HEAD', 'GET', 'POST']
        fingerprint_ssl: true  # utwórz i zaloguj odcisk palca SSL klienta

        # bardzo podstawowe filtrowanie złych botów na podstawie dopasowania user-agenta
        block_script_bots: true
        block_bad_crawler_bots: true

      routes:
        be_app02:
          filter_country: ['AT', 'DE', 'CH']
          # filter_ip: ['10.0.0.0/8']
          domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']

      # zdefiniuj sekcje/linie konfiguracji do dodania
      lines:
        section1:
          - ...

      default_backend: 'be_fallback'

  # BACKENDY
  backends:
    be_app01:
      servers:
        - 'app01-1 10.0.1.1:80'
        - 'app01-2 10.0.1.2:80'

      check_uri: '/health'
      check_expect: 'status 200'

    be_app02:
      security:
        # bardzo podstawowe filtrowanie złych botów na podstawie dopasowania user-agenta
        block_script_bots: true
        block_bad_crawler_bots: true

      ssl: true
      ssl_verify: 'none'  # domyślnie; przykład: 'required ca-file /etc/ssl/certs/my_ca.crt verifyhost host01.intern'
      servers:
        - 'app02-1 10.0.1.1:443'
        - 'app02-2 10.0.1.2:443'

    be_db:
      mode: 'tcp'
      balance: 'roundrobin'

      # zdefiniuj sekcje/linie konfiguracji do dodania
      lines:
        section1:
          - 'option mysql-check user haproxy_check'

      servers:
        - 'mysql-1 10.0.0.1:3306'
        - 'mysql-2 10.0.0.2:3306'

    be_fallback:
      lines:
        default: 'http-request redirect code 302 location https://github.com/ansibleguy'

  # OGÓLNE
  stats:
    enable: true  # włącz statystyki http listener
    bind: '127.0.0.1:8404'  # domyślnie

  geoip:
    enable: true
    provider: 'ipinfo'  # lub 'maxmind'
    token: '<TWOJ TOKEN>'

  # zdefiniuj globalne/domyslne jako pary klucz/wartość (możliwe listy wielowartościowe)
  global:
    ca-base: '/etc/ssl/certs'

  defaults:
    mode: 'http'
    'timeout connect': 3000
    'timeout server': 5000
    'timeout client': 5000

Możesz użyć 'ansible-vault' do zaszyfrowania swoich haseł:

ansible-vault encrypt_string

Funkcjonalność

  • Instalacja pakietu

  • Konfiguracja

    • Domyślna konfiguracja:

      • Globals/Defaults - jak w standardowych instalacjach
    • Domyślne opcje włączone:

      • Frontend
        • Tryb HTTP
          • Przekierowanie ruchu bez SSL na SSL
          • Logowanie User-Agent
          • Ustawianie podstawowych nagłówków bezpieczeństwa
          • Blokowanie metod TRACE i CONNECT
    • Domyślne opcje wyłączone:

      • Stats http listener

      • Frontend

      • Backend

        • Utrzymywanie sesji
        • Blokowanie metod TRACE i CONNECT

Informacje

  • Uwaga: ta rola obecnie obsługuje tylko systemy oparte na Debianie

  • Uwaga: Większość funkcji roli można włączać lub wyłączać.

    Aby zobaczyć dostępne opcje - sprawdź domyślną konfigurację znajdującą się w głównym pliku!

  • Ostrzeżenie: Nie każda ustawienie/zmienna, którą podasz, zostanie sprawdzona pod kątem ważności. Zła konfiguracja może spowodować awarię roli!

  • Informacja: Możesz łatwo filtrować dostęp do backendów korzystając z ustawień filter i filter_not:

    filter_ip, filter_not_ip, filter_country, filter_not_country, filter_asn, filter_not_asn

  • Informacja: Możesz aktywować podstawowe blokowanie botów typu skryptowego i złych crawlerów na podstawie user-agenta dla frontendów i backendów. Sprawdź domyślne ustawienia dla listy blokowanych botów.

  • Informacja: Możesz łatwo ograniczać dozwolone metody HTTP na konkretnej przestrzeni frontendowej lub backendowej przez ustawienie security.restrict_methods na true oraz wskazanie security.allow_only_methods.

  • Informacja: Zobacz Dokumentację odcisków palców dla szczegółowych informacji na temat śledzenia klientów.

  • Informacja: Jeśli używasz Graylog Server do zbierania i analizy swoich logów - upewnij się, że podzielisz logi HAProxy na pola, używając reguł potokowych. Przykład: Reguła potoku Graylog - HAProxy Community

  • Wskazówka: Możesz zwiększyć liczbę dostępnych track-sc ustawiając globalne ustawienie tune.stick-counters. Może to być przydatne w środowiskach złożonych pod względem ustawień ograniczeń szybkości.

GeoIP

  • Ostrzeżenie: Jeśli korzystasz z automatycznie dostarczanych baz danych GeoIP - upewnij się, że Twój produkt przestrzega umowy licencyjnej:

    • IPinfo: Informacje, Licencja CC4 (pozwala na użycie komercyjne - musisz dodać atrybucję)

      Atrybucja: <p>Dane adresów IP są zasilane przez <a href="https://ipinfo.io">IPinfo</a></p>

    • MaxMind: Informacje, EULA (pozwala na ograniczone użycie komercyjne - musisz dodać atrybucję)

      Atrybucja: Ten produkt zawiera dane GeoLite2 utworzone przez MaxMind, dostępne z <a href="https://www.maxmind.com">https://www.maxmind.com</a>.

  • Informacja: Aby uzyskać tokeny GeoIP, będziesz musiał założyć darmowe konto:

  • Informacja: Jeśli chcesz samodzielnie zarządzać bazami danych GeoIP (niezalecane) - rola zakłada, że są one umieszczone w /var/local/lib/geoip i mają nazwę asn.mmdb i country.mmdb.

  • Informacja: Możesz ręcznie przetestować Usługę wyszukiwania GeoIP używając curl: curl 'http://127.0.0.1:10069/?lookup=country&ip=1.1.1.1'

WAF

  • Uwaga: Zestaw funkcji WAF/bezpieczeństwa, który ta rola zapewnia, nie dorównuje temu, co jest dostępne w HAProxy Enterprise domyślnie. Jeśli masz pieniądze - użyj tego!

  • Wskazówka: Jeśli korzystasz z security.flag_bots, możesz użyć tej podstawowej flagi boolean, aby wzmocnić zasady dotyczące potencjalnych botów.

    Przykłady:

    • Zmniejszenie ograniczenia szybkości dla botów: http-request deny deny_status 429 if !{ var(txn.bot) -m int 0 } { sc_http_req_rate(0) gt 50 }

    • Twarde odrzucenie botów próbujących rejestrować konta: http-request deny deny_status 400 if !{ var(txn.bot) -m int 0 } { method POST } { path_sub -m str -i /register/ }

    • Przekazanie flagi do aplikacji, aby pokazać ładny błąd: http-request add-header X-Bot %[var(txn.bot)]

  • Uwaga: Jeśli chcesz korzystać z security.block_script_kiddies, upewnij się, że sprawdzisz listę blokady w domyślnych ustawieniach i dodasz odpowiednie wyjątki.

TCP

  • Informacja: Jeśli chcesz dynamicznie przechwytywać dane, możesz używać tcp-request content capture.

    Musisz ręcznie włączyć logowanie przechwyconych danych poprzez modyfikację formatu logu: {% raw %}<DEFAULT LOG FORMAT HERE> {%[capture.req.hdr(0)]|%[capture.req.hdr(1)]}{% endraw %}

    Może to być użyte do logowania SNI lub informacji GeoIP.


Wykonanie

Uruchom playbook:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml

Dostępne są również pomocne tagi:

  • install
  • config => tylko aktualizacja konfiguracji i certyfikatów SSL
  • ssl lub acme
  • geoip
  • lua

Aby debugować błędy - możesz ustawić zmienną 'debug' w czasie wykonania:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
O projekcie

Provision HAProxy Community (with ACME, GeoIP and some WAF-Features)

Zainstaluj
ansible-galaxy install ansibleguy.infra_haproxy
Licencja
other
Pobrania
972
Właściciel
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg