MS Jauh Desktop Gateway, HAProxy jeung sandi brute force

Babaturan, halo!

Aya seueur cara pikeun nyambungkeun ti bumi ka ruang kerja kantor anjeun. Salah sahijina nyaéta ngagunakeun Microsoft Remote Desktop Gateway. Ieu RDP leuwih HTTP. Kuring teu hayang noél dina nyetél RDGW sorangan didieu, Kuring teu hayang ngabahas naha éta alus atawa goréng, hayu urang ngubaran eta salaku salah sahiji parabot aksés jauh. Abdi hoyong ngobrol ngeunaan ngajaga server RDGW anjeun tina Internet jahat. Nalika kuring nyetél server RDGW, kuring langsung prihatin ngeunaan kaamanan, khususna panyalindungan ngalawan gaya kasar sandi. Kuring kaget yén kuring henteu mendakan tulisan dina Internét ngeunaan cara ngalakukeun ieu. Nya, anjeun kedah ngalakukeunana nyalira.

RDGW sorangan henteu ngagaduhan panyalindungan. Sumuhun, éta bisa kakeunaan ku panganteur bulistir ka jaringan bodas tur bakal dianggo hébat. Tapi ieu bakal ngajantenkeun administrator anu leres atanapi spesialis kaamanan inpormasi hariwang. Sajaba ti éta, éta bakal ngidinan Anjeun pikeun nyingkahan kaayaan meungpeuk akun, nalika pagawe cuek inget sandi pikeun akun perusahaan dina komputer imahna, lajeng robah sandi na.

Cara anu saé pikeun ngajagi sumber internal tina lingkungan éksternal nyaéta ngaliwatan sababaraha proxy, sistem penerbitan, sareng WAF anu sanés. Hayu urang inget yen RDGW masih http, mangka ngan begs pikeun nyolok solusi husus antara server internal tur Internét.

Kuring nyaho yén aya F5 tiis, A10, Netscaler (ADC). Salaku pangurus salah sahiji sistem ieu, kuring bakal nyebutkeun yén éta ogé mungkin pikeun nyetél panyalindungan ngalawan gaya BRUTE dina sistem ieu. Sareng enya, sistem ieu ogé bakal ngajagi anjeun tina banjir syn.

Tapi henteu unggal perusahaan tiasa mampuh mésér solusi sapertos kitu (sareng milarian administrator pikeun sistem sapertos kitu :), tapi dina waktos anu sami aranjeunna tiasa ngurus kaamanan!

Ieu sagemblengna mungkin masang versi bébas tina HAProxy dina sistem operasi bébas. Kuring diuji dina Debian 10, versi haproxy 1.8.19 dina gudang stabil. Kuring ogé diuji dina versi 2.0.xx ti Repository nguji.

Kami bakal ngantepkeun nyetél debian sorangan di luar ruang lingkup tulisan ieu. Sakeudeung: dina panganteur bodas, nutup sagalana iwal port 443, dina panganteur abu - nurutkeun kawijakan anjeun, contona, nutup sagalana iwal port 22. Buka ngan naon anu diperlukeun pikeun digawé (VRRP contona, pikeun floating ip).

Anu mimiti, kuring ngonpigurasikeun haproxy dina modeu bridging SSL (aka mode http) sareng dihurungkeun logging pikeun ningali naon anu lumangsung di jero RDP. Jadi mun nyarita, kuring meunang di tengah. Janten, jalur / RDWeb anu ditetepkeun dina "sadayana" tulisan ngeunaan nyetél RDGateway leungit. Sadaya anu aya nyaéta /rpc/rpcproxy.dll sareng /remoteDesktopGateway/. Dina hal ieu, pamenta GET/POST standar henteu dianggo; jinis pamenta sorangan RDG_IN_DATA, RDG_OUT_DATA dianggo.

Teu pira, tapi sahenteuna hal.

Hayu urang nguji.

Kuring ngaluncurkeun mstsc, angkat ka server, tingali opat kasalahan 401 (teu sah) dina log, teras lebetkeun nami pangguna / sandi sareng ningali réspon 200.

Kuring mareuman eta, ngamimitian deui, sarta dina log kuring ningali sarua opat kasalahan 401. Kuring asupkeun salah login / sandi tur tingal deui opat kasalahan 401. Éta naon Abdi peryogi. Ieu naon urang bakal nyekel.

Kusabab teu mungkin pikeun nangtukeun url login, jeung sajaba ti, Kuring henteu weruh kumaha carana nyekel 401 kasalahan dina haproxy, Kuring baris nyekel (teu sabenerna nyekel, tapi cacah) sagala 4xx kasalahan. Ogé cocog pikeun ngarengsekeun masalah.

Intina panyalindungan nyaéta yén urang bakal ngitung jumlah kasalahan 4xx (dina backend) per unit waktos sareng upami ngaleuwihan wates anu ditangtukeun, teras nampik (dina frontend) sadaya sambungan salajengna ti ip ieu kanggo waktos anu ditangtukeun. .

Téhnisna, ieu moal panyalindungan ngalawan sandi brute force, éta bakal panyalindungan ngalawan kasalahan 4xx. Contona, upami anjeun sering menta hiji url non-existent (404), mangka panyalindungan ogé bakal jalan.

Cara pangbasajanna sareng paling efektif nyaéta cacah dina tonggong sareng ngalaporkeun deui upami aya tambahan anu muncul:

frontend fe_rdp_tsc
    bind *:443 ssl crt /etc/haproxy/cert/desktop.example.com.pem
    mode http
    ...
    default_backend be_rdp_tsc


backend be_rdp_tsc
    ...
    mode http
    ...

    #создать таблицу, строковую, 1000 элементов, протухает через 15 сек, записать кол-во ошибок за последние 10 сек
    stick-table type string len 128 size 1k expire 15s store http_err_rate(10s)
    #запомнить ip
    http-request track-sc0 src
    #запретить с http ошибкой 429, если за последние 10 сек больше 4 ошибок
    http-request deny deny_status 429 if { sc_http_err_rate(0) gt 4 }
	
	...
    server rdgw01 192.168.1.33:443 maxconn 1000 weight 10 ssl check cookie rdgw01
    server rdgw02 192.168.2.33:443 maxconn 1000 weight 10 ssl check cookie rdgw02

Teu pilihan pangalusna, hayu urang ngahesekeun eta. Urang bakal cacah dina backend jeung blok on frontend nu.

Kami bakal ngubaran panyerang sacara kasar sareng ngahapus sambungan TCP na.

frontend fe_rdp_tsc
    bind *:443 ssl crt /etc/haproxy/cert/ertelecom_ru_2020_06_11.pem
    mode http
    ...
    #создать таблицу ip адресов, 1000 элементов, протухнет через 15 сек, сохрянять из глобального счётчика
    stick-table type ip size 1k expire 15s store gpc0
    #взять источник
    tcp-request connection track-sc0 src
    #отклонить tcp соединение, если глобальный счётчик >0
    tcp-request connection reject if { sc0_get_gpc0 gt 0 }
	
    ...
    default_backend be_rdp_tsc


backend be_rdp_tsc
    ...
    mode http
    ...
	
    #создать таблицу ip адресов, 1000 элементов, протухнет через 15 сек, сохранять кол-во ошибок за 10 сек
    stick-table type ip size 1k expire 15s store http_err_rate(10s)
    #много ошибок, если кол-во ошибок за 10 сек превысило 8
    acl errors_too_fast sc1_http_err_rate gt 8
    #пометить атаку в глобальном счётчике (увеличить счётчик)
    acl mark_as_abuser sc0_inc_gpc0(fe_rdp_tsc) gt 0
    #обнулить глобальный счётчик
    acl clear_as_abuser sc0_clr_gpc0(fe_rdp_tsc) ge 0
    #взять источник
    tcp-request content track-sc1 src
    #отклонить, пометить, что атака
    tcp-request content reject if errors_too_fast mark_as_abuser
    #разрешить, сбросить флажок атаки
    tcp-request content accept if !errors_too_fast clear_as_abuser
	
    ...
    server rdgw01 192.168.1.33:443 maxconn 1000 weight 10 ssl check cookie rdgw01
    server rdgw02 192.168.2.33:443 maxconn 1000 weight 10 ssl check cookie rdgw02

hal anu sarua, tapi sopan, urang bakal balik kasalahan http 429 (Loba teuing Requests)

frontend fe_rdp_tsc
    ...
    stick-table type ip size 1k expire 15s store gpc0
    http-request track-sc0 src
    http-request deny deny_status 429 if { sc0_get_gpc0 gt 0 }
    ...
    default_backend be_rdp_tsc

backend be_rdp_tsc
    ...
    stick-table type ip size 1k expire 15s store http_err_rate(10s)
    acl errors_too_fast sc1_http_err_rate gt 8
    acl mark_as_abuser sc0_inc_gpc0(fe_rdp_tsc) gt 0
    acl clear_as_abuser sc0_clr_gpc0(fe_rdp_tsc) ge 0
    http-request track-sc1 src
    http-request allow if !errors_too_fast clear_as_abuser
    http-request deny deny_status 429 if errors_too_fast mark_as_abuser
    ...

Kuring pariksa: Kuring ngajalankeun mstsc tur mimitian acak nuliskeun kecap akses. Saatos usaha katilu, dina 10 detik najong kuring deui, sarta mstsc méré kasalahan. Salaku bisa ditempo dina log.

Katerangan. Abdi tebih ti master haproxy. Abdi henteu ngartos naha, contona
http-pamundut mungkir deny_status 429 lamun {sc_http_err_rate(0) gt 4}
ngidinan Anjeun pikeun nyieun ngeunaan 10 kasalahan saméméh gawéna.

Abdi bingung ngeunaan nomer loket. Masters of haproxy, kuring bakal bungah upami anjeun ngalengkepan kuring, ngabenerkeun kuring, ngajantenkeun kuring langkung saé.

Dina koméntar anjeun tiasa nyarankeun cara anu sanés pikeun ngajagaan RD Gateway, éta bakal pikaresepeun pikeun diajar.

Ngeunaan Windows Remote Desktop Client (mstsc), éta patut dicatet yén éta henteu ngadukung TLS1.2 (sahenteuna dina Windows 7), janten kuring kedah ngantunkeun TLS1; henteu ngadukung cipher ayeuna, janten kuring ogé kedah ngantunkeun anu lami.

Pikeun maranéhanana anu teu ngarti nanaon, ngan diajar, sarta geus hayang ngalakukeun ogé, Kuring gé masihan anjeun sakabéh config.

haproxy.conf

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        #ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE
-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        #ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
        ssl-default-bind-options no-sslv3
        ssl-server-verify none


defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  15m
        timeout server  15m
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.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


frontend fe_rdp_tsc
    bind *:443 ssl crt /etc/haproxy/cert/dektop.example.com.pem
    mode http
    capture request header Host len 32
    log global
    option httplog
    timeout client 300s
    maxconn 1000

    stick-table type ip size 1k expire 15s store gpc0
    tcp-request connection track-sc0 src
    tcp-request connection reject if { sc0_get_gpc0 gt 0 }

    acl rdweb_domain hdr(host) -i beg dektop.example.com
    http-request deny deny_status 400 if !rdweb_domain
    default_backend be_rdp_tsc


backend be_rdp_tsc
    balance source
    mode http
    log global

    stick-table type ip size 1k expire 15s store http_err_rate(10s)
    acl errors_too_fast sc1_http_err_rate gt 8
    acl mark_as_abuser sc0_inc_gpc0(fe_rdp_tsc) gt 0
    acl clear_as_abuser sc0_clr_gpc0(fe_rdp_tsc) ge 0
    tcp-request content track-sc1 src
    tcp-request content reject if errors_too_fast mark_as_abuser
    tcp-request content accept if !errors_too_fast clear_as_abuser

    option forwardfor
    http-request add-header X-CLIENT-IP %[src]

    option httpchk GET /
    cookie RDPWEB insert nocache
    default-server inter 3s    rise 2  fall 3
    server rdgw01 192.168.1.33:443 maxconn 1000 weight 10 ssl check cookie rdgw01
    server rdgw02 192.168.2.33:443 maxconn 1000 weight 10 ssl check cookie rdgw02


frontend fe_stats
    mode http
    bind *:8080
    acl ip_allow_admin src 192.168.66.66
    stats enable
    stats uri /stats
    stats refresh 30s
    #stats admin if LOCALHOST
    stats admin if ip_allow_admin

Naha dua server on backend nu? Kusabab ieu kumaha anjeun tiasa ngadamel toleransi sesar. Haproxy ogé tiasa ngadamel dua sareng ip bodas ngambang.

Sumber daya komputasi: anjeun tiasa mimitian ku "dua manggung, dua inti, PC kaulinan." Numutkeun kana Wikipedia ieu bakal cukup keur luang.

Rujukan:

Nyetél rdp-gateway ti HAProxy
Hiji-hijina tulisan anu kuring mendakan dimana aranjeunna ngaganggu pikeun maksakeun kecap konci

sumber: www.habr.com

Tambahkeun komentar