Загрузить файлы в «haproxy»
This commit is contained in:
1 parent
c374fff4ca
commit
7c0a85f00f
2 files changed
+122
No files matched your search
@@ -0,0 +1,12 @@
|
||||
# Формат: <префикс пути> <backend в haproxy.cfg>
|
||||
# Путь сопоставляется как path_beg (начало пути), поэтому важно указывать
|
||||
# завершающий "/". adminusergroup — реальное имя AD-группы (cn из LDAP).
|
||||
#
|
||||
# Файл читается HAProxy из /etc/haproxy/group_map.cfg — после правки
|
||||
# перечитывать конфиг: systemctl reload haproxy
|
||||
|
||||
/admins-network/resource1/ be_admin_resource1
|
||||
/admins-network/resource2/ be_admin_resource2
|
||||
|
||||
# Пример добавления новой группы/ресурса:
|
||||
# /admins-storage/ceph-dashboard/ be_admin_storage_ceph
|
||||
@@ -0,0 +1,110 @@
|
||||
#---------------------------------------------------------------------
|
||||
# HAProxy: единая точка входа для портала администрирования
|
||||
# Устанавливается штатно из пакета дистрибутива, этот файл заменяет
|
||||
# /etc/haproxy/haproxy.cfg (см. README.md, шаг 6).
|
||||
#---------------------------------------------------------------------
|
||||
global
|
||||
log /dev/log local0 info
|
||||
maxconn 20000
|
||||
user haproxy
|
||||
group haproxy
|
||||
tune.ssl.default-dh-param 2048
|
||||
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
|
||||
ssl-default-bind-ciphers ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
option httplog
|
||||
option dontlognull
|
||||
option forwardfor
|
||||
timeout connect 5s
|
||||
timeout client 30s
|
||||
timeout server 30s
|
||||
timeout http-request 10s
|
||||
errorfile 400 /etc/haproxy/errors/400.http
|
||||
errorfile 403 /etc/haproxy/errors/403.http
|
||||
errorfile 500 /etc/haproxy/errors/500.http
|
||||
errorfile 502 /etc/haproxy/errors/502.http
|
||||
errorfile 503 /etc/haproxy/errors/503.http
|
||||
errorfile 504 /etc/haproxy/errors/504.http
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Статистика (в проде — ограничить отдельным ACL по внутренней сети)
|
||||
#---------------------------------------------------------------------
|
||||
listen stats
|
||||
bind 127.0.0.1:8404
|
||||
stats enable
|
||||
stats uri /haproxy?stats
|
||||
stats refresh 15s
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# HTTP -> HTTPS редирект
|
||||
#---------------------------------------------------------------------
|
||||
frontend fe_http
|
||||
bind *:80
|
||||
http-request redirect scheme https unless { ssl_fc }
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Основной вход
|
||||
#---------------------------------------------------------------------
|
||||
frontend fe_https
|
||||
bind *:443 ssl crt /etc/haproxy/certs/fqdn.pem alpn h2,http/1.1
|
||||
|
||||
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||
|
||||
# Простейшая защита от брутфорса логина
|
||||
stick-table type ip size 100k expire 10m store http_req_rate(1m)
|
||||
http-request track-sc0 src
|
||||
http-request deny deny_status 429 if { path_beg /login/ } { sc_http_req_rate(0) gt 20 }
|
||||
|
||||
# Путь вида /<adminusergroup>/<resource>/... считаем "ресурсным"
|
||||
acl is_resource_path path_reg ^/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+(/.*)?$
|
||||
# Служебные префиксы портала — всегда на Django, даже если совпали с regex выше
|
||||
acl is_portal_path path_beg /login/ /logout/ /static/ /django-admin/ /healthz
|
||||
|
||||
# Признак для роутинга на реальный backend — короткоживущий resource_token,
|
||||
# который Django выпускает ПОСЛЕ проверки прав на конкретный ресурс
|
||||
# (см. docs/architecture.md, раздел 5). Сессия портала (sessionid) в
|
||||
# backend'ы никогда не передаётся.
|
||||
acl has_resource_token cook(resource_token) -m found
|
||||
|
||||
use_backend be_django if !is_resource_path
|
||||
use_backend be_django if is_portal_path
|
||||
use_backend be_django if is_resource_path !has_resource_token !is_portal_path
|
||||
|
||||
use_backend %[path,map_beg(/etc/haproxy/group_map.cfg,be_django)] \
|
||||
if is_resource_path has_resource_token !is_portal_path
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Backend: Django frontend (портал), работает через Gunicorn на localhost
|
||||
#---------------------------------------------------------------------
|
||||
backend be_django
|
||||
balance roundrobin
|
||||
option httpchk GET /healthz
|
||||
http-check expect status 200
|
||||
http-request set-header X-Forwarded-Proto https
|
||||
server django1 127.0.0.1:8000 check
|
||||
# server django2 10.0.0.11:8000 check # вторая ВМ с Django — для горизонтального масштабирования
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Backends реальных admin panel — по одной секции на систему.
|
||||
# Ниже — 2 демонстрационных backend'а (см. backend_demo/, работают на
|
||||
# localhost через Nginx на отдельных портах). По этому шаблону добавляются
|
||||
# последующие продуктовые системы (обычно они на других хостах в сети).
|
||||
#---------------------------------------------------------------------
|
||||
backend be_admin_resource1
|
||||
balance roundrobin
|
||||
option httpchk GET /
|
||||
http-request set-header X-Forwarded-Proto https
|
||||
http-request set-header X-Resource-Token %[cook(resource_token)]
|
||||
http-request del-header Cookie
|
||||
server resource1 127.0.0.1:8081 check
|
||||
|
||||
backend be_admin_resource2
|
||||
balance roundrobin
|
||||
option httpchk GET /
|
||||
http-request set-header X-Forwarded-Proto https
|
||||
http-request set-header X-Resource-Token %[cook(resource_token)]
|
||||
http-request del-header Cookie
|
||||
server resource2 127.0.0.1:8082 check
|
||||
Reference in new issue
Block a user