MS Remote Desktop Gateway, HAProxy ug password brute force

Mga higala, kumusta!

Adunay daghang mga paagi sa pagkonektar gikan sa balay ngadto sa imong opisina nga workspace. Usa niini mao ang paggamit sa Microsoft Remote Desktop Gateway. Kini mao ang RDP sa HTTP. Dili ko gusto nga magtandog sa pag-set up sa RDGW mismo dinhi, dili ko gusto nga hisgutan kung ngano nga kini maayo o dili maayo, atong tagdon kini isip usa sa mga remote access tool. Gusto kong maghisgot bahin sa pagpanalipod sa imong RDGW server gikan sa daotan nga Internet. Sa dihang akong gi-set up ang RDGW server, nabalaka dayon ko bahin sa seguridad, ilabi na ang proteksyon batok sa password brute force. Natingala ko nga wala koy nakit-an nga mga artikulo sa Internet bahin sa kung giunsa kini buhaton. Aw, kinahanglan nimong buhaton kini sa imong kaugalingon.

Ang RDGW mismo walay bisan unsang proteksyon. Oo, kini mahimong ibutyag sa usa ka hubo nga interface sa usa ka puti nga network ug kini molihok nga maayo. Apan kini maghimo sa husto nga tigdumala o espesyalista sa seguridad sa impormasyon nga dili komportable. Dugang pa, kini magtugot kanimo nga malikayan ang sitwasyon sa pag-block sa account, kung ang usa ka walay pagtagad nga empleyado nahinumdom sa password alang sa usa ka corporate account sa iyang computer sa balay, ug dayon giusab ang iyang password.

Ang usa ka maayong paagi sa pagpanalipod sa internal nga kahinguhaan gikan sa gawas nga palibot mao ang pinaagi sa lainlaing mga proxy, sistema sa pagmantala, ug uban pang mga WAF. Atong hinumdoman nga ang RDGW mao gihapon ang http, unya nagpakiluoy lang kini nga mag-plug sa usa ka espesyal nga solusyon tali sa mga internal nga server ug sa Internet.

Nahibal-an ko nga adunay mga cool F5, A10, Netscaler(ADC). Isip usa ka administrador sa usa niini nga mga sistema, ako moingon nga posible usab nga i-configure ang proteksyon batok sa brute force niini nga mga sistema. Ug oo, kini nga mga sistema manalipod usab kanimo gikan sa bisan unsang pagbaha sa syn.

Apan dili tanan nga kompanya makahimo sa pagpalit sa ingon nga solusyon (ug pangitaa ang usa ka tagdumala alang sa ingon nga sistema :), apan sa parehas nga oras mahimo nila maatiman ang seguridad!

Posible nga mag-install ug libre nga bersyon sa HAProxy sa usa ka libre nga operating system. Gisulayan nako ang Debian 10, haproxy nga bersyon 1.8.19 sa stable nga repositoryo. Gisulayan usab nako kini sa bersyon 2.0.xx gikan sa pagsulay nga repository.

Ibilin namon ang pag-set up sa debian mismo sa gawas sa sakup sa kini nga artikulo. Sa mubo: sa puti nga interface, isira ang tanan gawas sa port 443, sa gray nga interface - sumala sa imong palisiya, pananglitan, isira usab ang tanan gawas sa port 22. Ablihi lamang ang gikinahanglan alang sa trabaho (VRRP pananglitan, alang sa naglutaw nga ip).

Una sa tanan, akong gi-configure ang haproxy sa SSL bridging mode (aka http mode) ug gi-on ang pag-log aron makita kung unsa ang nahitabo sa sulod sa RDP. So to speak, naa ko sa tunga. Busa, ang /RDWeb nga agianan nga gipiho sa "tanan" nga mga artikulo sa pag-set up sa RDGateway nawala. Ang tanan nga anaa mao ang /rpc/rpcproxy.dll ug /remoteDesktopGateway/. Sa kini nga kaso, ang sagad nga GET/POST nga mga hangyo wala gigamit; ang ilang kaugalingon nga tipo sa hangyo RDG_IN_DATA, RDG_OUT_DATA ang gigamit.

Dili daghan, apan labing menos usa ka butang.

Testingan ta.

Gilunsad nako ang mstsc, adto sa server, tan-awa ang upat ka 401 (dili awtorisado) nga mga sayup sa mga log, dayon isulod ang akong username/password ug tan-awa ang tubag 200.

Gipatay nako kini, gisugdan kini pag-usab, ug sa mga troso akong nakita ang parehas nga upat ka mga sayup nga 401. Gisulod nako ang sayup nga pag-login / password ug nakita pag-usab ang upat nga mga sayup sa 401. Mao kana ang akong kinahanglan. Mao ni atong dakpon.

Tungod kay dili posible nga mahibal-an ang url sa pag-login, ug labut pa, wala ko mahibal-an kung giunsa pagdakop ang 401 nga sayup sa haproxy, akong madakpan (dili gyud makuha, apan ihap) ang tanan nga mga sayup sa 4xx. Angayan usab sa pagsulbad sa problema.

Ang diwa sa proteksyon mao nga atong ihap ang gidaghanon sa 4xx nga mga sayup (sa backend) matag yunit sa oras ug kung kini molapas sa gitakda nga limitasyon, unya isalikway (sa frontend) ang tanan nga dugang nga koneksyon gikan niini nga ip alang sa piho nga oras .

Sa teknikal nga paagi, dili kini proteksyon batok sa brute force sa password, kini mahimong proteksyon batok sa mga sayup sa 4xx. Pananglitan, kung kanunay ka nga mangayo usa ka wala nga url (404), nan ang proteksyon magamit usab.

Ang pinakayano ug labing epektibo nga paagi mao ang pag-ihap sa backend ug pagreport balik kung adunay dugang nga makita:

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

Dili ang labing maayo nga kapilian, atong komplikado kini. Mag-ihap kami sa backend ug block sa frontend.

Among trataron ang tig-atake nga dili maayo ug ihulog ang iyang koneksyon sa TCP.

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

parehas nga butang, apan matinahuron, among ibalik ang sayup nga http 429 (Daghang Gihangyo)

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
    ...

Gisusi nako: Gilusad nako ang mstsc ug nagsugod sa random nga pagsulod sa mga password. Pagkahuman sa ikatulo nga pagsulay, sulod sa 10 segundos gisipa ko kini balik, ug ang mstsc naghatag usa ka sayup. Ingon sa makita sa mga troso.

Mga katin-awan. Layo ko sa haproxy master. Wala ko kasabot ngano, pananglitan
http-hangyo dumilian deny_status 429 kon {sc_http_err_rate(0) gt 4 }
nagtugot kanimo sa paghimo sa mga 10 ka mga sayup sa dili pa kini molihok.

Naglibog ko bahin sa mga numero sa counter. Mga masters sa haproxy, malipay ko kung mokomplemento ka nako, correct me, make me better.

Sa mga komento mahimo nimong isugyot ang ubang mga paagi aron mapanalipdan ang RD Gateway, makapaikag nga tun-an.

Mahitungod sa Windows Remote Desktop Client (mstsc), angay nga hinumdoman nga wala kini nagsuporta sa TLS1.2 (labing menos sa Windows 7), busa kinahanglan kong mobiya sa TLS1; wala nagsuporta sa kasamtangan nga cipher, mao nga kinahanglan ko usab nga biyaan ang mga daan.

Para sa mga wala makasabot sa bisan unsa, nagkat-on pa lang, ug gusto na nga mobuhat og maayo, ihatag nako ang tibuok 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

Nganong duha ka server sa backend? Tungod kay kini ang paagi nga mahimo nimo ang pagtugot sa sayup. Ang Haproxy makahimo usab og duha nga adunay naglutaw nga puti nga ip.

Mga kapanguhaan sa pag-compute: mahimo ka magsugod sa "duha ka gig, duha ka core, gaming PC." Sumala sa Wikipedia kini igo na nga maluwas.

Mga reperensiya:

Pag-set up sa rdp-gateway gikan sa HAProxy
Ang bugtong artikulo nga akong nakit-an diin sila naghasol sa pagpugos sa password

Source: www.habr.com

Idugang sa usa ka comment