ansibleguy.infra_haproxy
以下は簡単でわかりやすい日本語訳です。

Ansibleロール - HAProxyコミュニティ(ACME、GeoIP、いくつかのWAF機能付き)
HAProxyをデプロイするためのロール(コミュニティ版に焦点を当てています)
このロールによって実装されたfrontend
=> route
=> backend
の抽象化は、とても使いやすいと思います。フィードバックをください!
テスト済み:
- Debian 12
インストール
# 最新版
ansible-galaxy role install git+https://github.com/ansibleguy/infra_haproxy
# Galaxyから
ansible-galaxy install ansibleguy.infra_haproxy
# またはカスタムロールパスへ
ansible-galaxy install ansibleguy.infra_haproxy --roles-path ./roles
ロードマップ
- セキュリティ
- 基本的なレート制限(GET/HEADとPOST/PUT/DELETEを分ける)
- 一般的なクライアントフィンガープリンティング
- 辞書からマップファイルへの変換/作成のための「インターフェース」
- IPリストの簡単なダウンロードと統合のオプション(Torの出口ノードのように)
- デフォルトのエラーファイルを簡単に上書きする方法
使い方
シンプルなAnsible GUIが必要ですか?私のAnsible WebUIをチェックしてください。
例
ここでは、いくつかの詳細な設定例とその結果を示します。
設定
最小限の例
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'
設定を必要に応じて定義します:
haproxy:
version: '2.8'
acme:
enable: true
email: '[email protected]'
# フロントエンド
frontends:
fe_web:
bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
acme:
enable: true
domains: ['app.template.ansibleguy.net'] # routesのドメインも追加される
routes:
be_app01:
domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']
# 設定セクション/行を追加
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 # クライアントのJA3 SSLフィンガープリンとを作成してログに記録
# 悪いボットの基本フィルタリング
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']
# 設定セクション/行を追加
lines:
section1:
- ...
default_backend: 'be_fallback'
# バックエンド
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:
# 悪いボットの基本フィルタリング
block_script_bots: true
block_bad_crawler_bots: true
ssl: true
ssl_verify: 'none' # デフォルト;例:'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'
# 設定セクション/行を追加
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'
# 全般設定
stats:
enable: true # スタッツ http リスナーを有効にする
bind: '127.0.0.1:8404' # デフォルト
geoip:
enable: true
provider: 'ipinfo' # または 'maxmind'
token: '<YOUR-TOKEN>'
# グローバル/デフォルトの定義(キー/値ペアとして)
global:
ca-base: '/etc/ssl/certs'
defaults:
mode: 'http'
'timeout connect': 3000
'timeout server': 5000
'timeout client': 5000
パスワードを暗号化するために「ansible-vault」を使うことをお勧めします:
ansible-vault encrypt_string
機能
パッケージインストール
- リポジトリ依存関係(最小限)
- HAProxy
- GeoIP
- ACME
- 依存関係
- チャレンジレスポンス処理用のNginxライト
設定
デフォルト設定:
- グローバル/デフォルト - デフォルトインストールと同様
デフォルトのオプトイン:
- フロントエンド
- HTTPモード
- 非SSLトラフィックをSSLにリダイレクト
- ユーザーエージェントのロギング
- 基本的なセキュリティヘッダの設定
- TRACE & CONNECTメソッドのブロック
- HTTPモード
- フロントエンド
デフォルトのオプトアウト:
スタッツ http リスナー
フロントエンド
- ACME/LetsEncrypt
- GeoIPのルックアップ
- よく知られたスクリプトボットのブロック
- SSLフィンガープリンティング(JA3)
バックエンド
- スティッキーセッション
- TRACE & CONNECTメソッドのブロック
情報
注意:このロールは現在Debianベースのシステムのみをサポートしています。
注意:ロールのほとんどの機能はオプトインまたはオプトアウトが可能です。
利用可能なオプションはすべて、メインのデフォルトファイルにあるデフォルト設定を参照してください!
警告:提供されたすべての設定/変数が有効性をチェックされるわけではありません。不適切な設定はロールを壊す可能性があります!
情報:
filter
およびfilter_not
設定を使用してバックエンドへのアクセスを簡単にフィルタリングできます:filter_ip
,filter_not_ip
,filter_country
,filter_not_country
,filter_asn
,filter_not_asn
情報:非常に基本的なユーザーエージェントに基づくスクリプトおよび悪いクローラーボットのブロック機能をフロントエンドおよびバックエンドで有効にできます。ブロックされるボットのリストはデフォルト設定を確認してください。
情報:
security.restrict_methods
をtrueに設定して特定のフロントエンドまたはバックエンドで許可されるHTTPメソッドを簡単に制限できます。またsecurity.allow_only_methods
を指定します。情報:フィンガープリンティングのドキュメントを確認して、クライアントを追跡する方法についての詳細情報を得てください。
情報:Graylog Serverを使用してログを収集および分析している場合は、パイプラインルールを使用してHAProxyログをフィールドに分割してください。例:HAProxyコミュニティ - Graylogパイプラインルール
ヒント:グローバル設定tune.stick-countersを設定することで、利用可能な
track-sc
の数を増やすことができます。これは複雑なレート制限の環境で利用できます。
GeoIP
警告:自動プロビジョニングされたGeoIPデータベースを使用する場合は、製品がライセンス契約に準拠していることを確認してください:
情報:GeoIPトークンを作成するには、無料アカウントを作成する必要があります:
情報:GeoIPデータベースを自分で管理したい場合(推奨しません)は、ロールは
/var/local/lib/geoip
に配置され、asn.mmdb
およびcountry.mmdb
という名前であると仮定します。情報:GeoIPルックアップマイクロサービスを手動でテストできます:
curl 'http://127.0.0.1:10069/?lookup=country&ip=1.1.1.1'
WAF
注意:このロールが提供するWAF/セキュリティ機能セットは、HAProxyエンタープライズのデフォルトで利用可能なものには及びません。予算がある場合はそちらを検討してください。
ヒント:
security.flag_bots
を使用している場合は、この基本的なブール値フラグを使用して、ボット用のルールを強化できます。例:
ボットのレート制限を下げる:
http-request deny deny_status 429 if !{ var(txn.bot) -m int 0 } { sc_http_req_rate(0) gt 50 }
ボットがアカウントを登録するのを完全に拒否する:
http-request deny deny_status 400 if !{ var(txn.bot) -m int 0 } { method POST } { path_sub -m str -i /register/ }
アプリケーションにフラグを渡して、適切なエラーを表示:
http-request add-header X-Bot %[var(txn.bot)]
注意:
security.block_script_kiddies
を使用する場合は、デフォルトで提供されるブロックリストを確認し、必要に応じて除外を追加してください。
TCP
情報:動的にデータをキャプチャしたい場合は、
tcp-request content capture
を使用できます。キャプチャされたデータのロギングを手動で有効にするためには、ログフォーマットを変更する必要があります:
{<DEFAULT LOG FORMAT HERE> {%[capture.req.hdr(0)]|%[capture.req.hdr(1)]}}
これを使用してSNIやGeoIP情報をログに記録できます。
実行
プレイブックを実行します:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml
いくつかの便利なタグも利用できます:
- install
- config => 設定とSSL証明書のみ更新
- sslまたはacme
- geoip
- lua
エラーのデバッグには、実行時に'debug'変数を設定できます:
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