এসএনআই এবং বিভিন্ন এসএসএল সেটিংস সহ HAProxy


9

আমার দুটি সাইটগুলির জন্য আমার HAProxy রয়েছে, এর মধ্যে একটি পাবলিক এবং একটি ব্যক্তিগত।

www.mysite.com private.mysite.com

এটিএম, আমি হ্যাপ্রোক্সিটি এর মতো ব্যবহার করছি:

frontend mysite_https
  bind *.443 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3
  mode http
  acl domain_www     hdr_beg(host) -i www.
  acl domain_private hdr_beg(host) -i private.
  acl path_ghost     path_beg         /ghost/
  acl clientcert     ssl_c_used

  redirect location https://www.example.com if path_ghost !clientcert
  redirect location https://www.example.com if !domain_www !clientcert

  use_backend bknd_private if domain_private
  use_backend bknd_www     if domain_www

  default_backend bknd_www

এটি কী করা উচিত তা ক্লায়েন্টের শংসাপত্রের জন্য জিজ্ঞাসা করা (allyচ্ছিকভাবে) এবং এগিয়ে যান। যদি ডোমেনটি www.example.com না থাকে এবং দর্শনার্থী সঠিক শংসাপত্র সরবরাহ করতে না পারে বা পথটি / ভূত / এবং দর্শনার্থী সঠিক শংসাপত্র সরবরাহ করতে না পারে, তবে এটি https://www.example.com এ পুনঃনির্দেশ করা উচিত

এখনও পর্যন্ত, এটি সূক্ষ্ম কাজ করে। তবে ম্যাক ব্যবহারকারীরা আমার সাইটটি সাফারির সাথে ব্রাউজ করে অভিযোগ পেয়েছিলেন যে https://www.example.com/ এ ব্রাউজ করার সময় তারা শংসাপত্রের জন্য জিজ্ঞাসা করতে থাকে যেখানে উদাহরণস্বরূপ ফায়ারফক্স https: //private.example ব্রাউজ করার সময় কেবল জিজ্ঞাসা করে .com / অথবা https://www.example.com/ghost/

সাফারি ঠিক কীভাবে কাজ করে তাই আমি এটি ঠিক করতে পারি না। আমার ধারণাটি ছিল বিভিন্ন প্রান্তের মধ্যে বিভাজন করতে এসএনআই ব্যবহার করা

frontend mysite_https
  bind *.443 ssl crt /etc/mycert.pem no-sslv3

frontend private_https
  bind *.443 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3

অবশ্যই এটি কাজ করে না কারণ

ক। 443 পোর্টে আমি কেবল একটি পাবলিক আইপি খ দিয়ে দুটি অগ্রভাগ শুনতে পাচ্ছি না। আমি "ডোমেইন_উইউউজউই যদি ইউজার_ফ্রন্টএন্ড" বা এর মতো কিছু বলার উপায় খুঁজে পাইনি। (কেবল ব্যবহার_পরিবর্তন বা ব্যবহার-সার্ভার)

আমি তিনটি হ্যাপ্রোক্সি সার্ভার দিয়ে এটি করার চেষ্টাও করেছি

frontend haproxy-sni
bind *:443 ssl crt /etc/mycert.pem no-sslv3
mode tcp

tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }

acl domain_www ssl_fc_sni_end -i www.example.com

use-server server1 haproxy-private.lan  if !domain_www
use-server server2 haproxy-public.lan   if domain_www

এটি কাজ করে, এখানে সমস্যাটি হ্যাপ্রোক্সি-প্রাইভেট ক্লায়েন্টের শংসাপত্রের জন্য জিজ্ঞাসা করে, তবে অনুরোধটি ব্রাউজারে পৌঁছায় না। কোনওভাবে হ্যাপ্রোক্সি-স্নি অনুরোধটি ড্রপ করে।

এছাড়াও, আমার কাছে এখন তিনটি হাইপোক্সি সার্ভার রয়েছে যা কাঙ্ক্ষিত নয় (যদিও এর চেয়ে ভাল সমাধান আমি খুঁজে না পেলাম তবে সম্ভাব্য বিকল্প)।

সাধারণত আমি এই জাতীয় কিছু চাই (তৈরি করা .. আসল বিকল্পগুলি জানেন না)

frontend mysite_https
  bind *.443 ssl crt /etc/mycert.pem no-sslv3
  mode http

  acl domain_www     hdr_beg(host) -i www.
  acl domain_private hdr_beg(host) -i private.
  acl path_ghost     path_beg         /ghost/

  ssl_options ca-file /etc/myca.pem verify optional if !www_domain          # made up!
  ssl_options ca-file /etc/myca.pem verify optional if !path_ghost          # made up!

  acl clientcert     ssl_c_used

  redirect location https://www.example.com if path_ghost !clientcert
  redirect location https://www.example.com if !domain_www !clientcert
  ...

আমি আশা করি কেউ আমাকে এই সাহায্য করতে পারে ...

উত্তর:


13

আমি এই সমস্যার সমাধান খুঁজে পেয়েছি, এর জন্য অতিরিক্ত সার্ভার বা পরিষেবাদির প্রয়োজন নেই। যদিও এটি নতুন সমস্যা উত্সাহিত করে না তা আমি পুরোপুরি নিশ্চিত নই। আমার জন্য এখনই এটি কাজ করে বলে মনে হচ্ছে।

আমি যেভাবে এটি করেছি, তা ছিল প্রতিটি ডোমেনের জন্য একটি ফ্রন্টএন্ড তৈরি করা যাতে বিভিন্ন এসএসএল সেটিংস প্রয়োজন। আমি তখন সেই সীমান্তগুলির বাইন্ড অপশনটি উচ্চ বন্দরগুলিতে সেট করেছি (এগুলি সর্বজনীন থেকে পৌঁছানো যায় না!)।

আমি এসএনআই ভিত্তিক ট্র্যাফিক বিভক্ত করতে 443 পোর্টে আরও একটি ফ্রন্টএন্ড শ্রবণ তৈরি করেছি এবং ব্যাকএন্ড সার্ভারগুলিকে 127.0.0.1: হাই -পোর্টে সেট করেছি।

এইভাবে, আমি হ্যাপ্রোক্সির মধ্যে একটি লুপ তৈরি করেছি

[incoming]->[haproxy:443]->[haproxy:7000]->[www.intern.lan]
[incoming]->[haproxy:443]->[haproxy:8000]->[private.intern.lan]

এখানে কনফিগার অংশ রয়েছে।

frontend frnd_snipt                                             # Frontend_SNI-PassThrough (snipt)
  bind *:443                                                    # Do not use bind *:8443 ssl crt etc....!
  option tcplog
  mode tcp 

  tcp-request inspect-delay 5s
  tcp-request content accept if { req_ssl_hello_type 1 } 

  acl subdomain_is_www   req_ssl_sni -i www.example.com
  acl subdomain_is_www   req_ssl_sni -i example.com
  acl subdomain_is_private req_ssl_sni -i private.example.com

  use_backend bknd_snipt_private if subdomain_is_private
  use_backend bknd_snipt_www  if subdomain_is_www

backend bknd_snipt_www
  mode tcp                                              # tcp mode must match the frontend mode - already set as default in [global]
  server snipt-www 127.0.0.1:7000                       # run without "check", otherwise haproxy checks itself all the time!

backend bknd_snipt_private
  mode tcp     
  server snipt-private 127.0.0.1:8000                   # also, don't add "ssl" when in tcp mode. "ssl" is an http mode option (result in "NO-SRV" when set in tcp)

##### NORMAL HAPROXY PART #####
frontend www_example_com                                # this frontend can be in tcp or http mode...
  bind *:7000 ssl crt /etc/mycert.pem no-sslv3          # www. frontend with normal https
  mode http
  option httplog


frontend private_example_com
  bind *:8000 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3        # private. frontend with client certificate request.
  mode http
  option httplog
  ... # whatever you have in your frontend

কারও যদি এই নিয়ে চিন্তাভাবনা থাকে বা কেন এটি খারাপ ধারণা হতে পারে এমন কোনও ধারণা দয়া করে আমাকে জানান। এটি কার্যকর হয় তবে আমি ভাবছি কেন ব্যবহার_ফ্রন্টটিড কোনও বিকল্প নয়। হতে পারে কারণ এটি এমন কিছু যা কোনও কারণেই করা উচিত নয়।


ভাল ধারণা. আমি এই সেটআপে ডকুমেন্টেশনও খুঁজে পাইনি। এই HAProxy লুপের সাথে পারফরম্যান্স কি একই রকম?
জেবি। মনিকার সাথে।

স্যার, আমি জানি না যে এটি কতটা পারফরম্যান্ট কারণ এ: দীর্ঘকাল এটি ব্যবহার করেনি (সোর্স আইপি ফিল্টারগুলির কারণে), বি: একটি হাইট ট্র্যাফিক সাইট নেই, যেখানে পারফরম্যান্স অপটিমাইজেশন আরও আকর্ষণীয় হবে ...
মোহারফিয়াম

আমি হ্যাপ্রোক্সিটির সামনে কেবল অ্যাপাচি 2 রেখেছি, যা কাজ করে তবে নির্বোধ, কারণ হ্যাপিওসি ক্লাস্টারের সামনে সিঙ্গেল পয়েন্ট-অফ-ব্যর্থতা এবং (আমি মনে করি) পারফরম্যান্স বাধা (আমার মনে হয় এপি 2 এর চেয়ে দ্রুত গতিযুক্ত, কোনও সত্যিকারের ডেটা পাওয়া যায় নি) যদিও যদিও।)
মোহরফিয়াম

3

হ্যাপ্রোক্সির সাম্প্রতিক সংস্করণগুলি এমন একটি সেটিংস সমর্থন করে crt-listযা আপনাকে ম্যাচ করা শংসাপত্রের ভিত্তিতে বিভিন্ন টিএলএস সেটিংস নির্দিষ্ট করতে দেয়

আপনি এটি এর মতো ব্যবহার করতে পারেন:

haproxy.conf:

frontend https
    mode http
    bind *:443 ssl crt-list /etc/haproxy/crt-list.conf ca-file ca.pem

    use_backend test if { ssl_fc_sni -i test.area.example.org }
    use_backend private if { ssl_fc_sni -i private.example.org }
    default_backend www

সিআরটি-list.conf:

www.pem [verify none]
www.pem [verify required] *.area.example.org
private.pem [verify required]

আরও তথ্য: https://cbonte.github.io/haproxy-dconv/1.9/configration.html#5.1-crt-list

সুরক্ষায় নোট করুন: সর্বদা আপনার (সংবেদনশীল) হোস্টনামের সাথে এসএনআইয়ের সাথে মিল করুন ssl_fc_sni, HTTP হোস্ট-নেম নয়। অন্যথায় কোনও আক্রমণকারী সম্ভবত TLS SNI এর প্রেরণ করে আপনার ক্লায়েন্ট শংসাপত্রের প্রমাণকে বাইপাস করতে পারে www.example.orgতবে HTTP হোস্টনামটি এতে সেট করে private.example.org!


ওপি উভয়ের জন্য একই শংসাপত্র ব্যবহার করছে। প্রশ্নটি বিভিন্ন ca-fileসেটিং সম্পর্কে আরও ছিল ।
গ্রে_গোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.