ansibleguy.infra_haproxy

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


HAProxyのロゴ

Ansibleロール - HAProxyコミュニティ(ACME、GeoIP、いくつかのWAF機能付き)

HAProxyをデプロイするためのロール(コミュニティ版に焦点を当てています

このロールによって実装されたfrontend => route => backendの抽象化は、とても使いやすいと思います。フィードバックをください

コーヒーを買ってください

Moleculeテストステータス YamlLintテストステータス PyLintテストステータス Ansible-Lintテストステータス Ansible Galaxy

Moleculeログ: 短い, 完全

テスト済み:

  • 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

機能

  • パッケージインストール

  • 設定

    • デフォルト設定:

      • グローバル/デフォルト - デフォルトインストールと同様
    • デフォルトのオプトイン:

      • フロントエンド
        • HTTPモード
          • 非SSLトラフィックをSSLにリダイレクト
          • ユーザーエージェントのロギング
          • 基本的なセキュリティヘッダの設定
          • TRACE & CONNECTメソッドのブロック
    • デフォルトのオプトアウト:

      • スタッツ http リスナー

      • フロントエンド

      • バックエンド

        • スティッキーセッション
        • 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データベースを使用する場合は、製品がライセンス契約に準拠していることを確認してください:

    • IPinfo情報CC4ライセンス商用利用を許可します - 表示が必要です

      表示<p>IPアドレスデータは<a href="https://ipinfo.io">IPinfo</a>によって提供されています</p>

    • MaxMind情報EULA限られた商用利用を許可します - 表示が必要です

      表示この製品にはMaxMindが作成したGeoLite2データが含まれています。詳細は<a href="https://www.maxmind.com">https://www.maxmind.com</a>をご覧ください。

  • 情報: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
ライセンス
other
ダウンロード
972
所有者
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg