ansibleguy.infra_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!
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
- Zależności repozytoriów (minimalne)
- HAProxy
- GeoIP
- ACME
- Zależności
- Nginx do obsługi wyzwań
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
- Tryb HTTP
- Frontend
Domyślne opcje wyłączone:
Stats http listener
Frontend
- ACME/LetsEncrypt
- Wyszukiwanie GeoIP
- Blokowanie znanych botów skryptowych
- Odcisk palca SSL (JA3)
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
ifilter_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 wskazaniesecurity.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:
- IPInfo: Zaloguj/Załóż konto
- MaxMind: Zaloguj/Załóż konto - Ustaw
token
na<KONTO>:<LICENCJA>
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
icountry.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
Provision HAProxy Community (with ACME, GeoIP and some WAF-Features)
ansible-galaxy install ansibleguy.infra_haproxy