Lango la Eneo-kazi la Mbali la MS, HAProksi na nguvu ya kikatili ya nenosiri

Marafiki, habari!

Kuna njia nyingi za kuunganisha kutoka nyumbani hadi kwa eneo lako la kazi la ofisi. Mmoja wao ni kutumia Microsoft Remote Desktop Gateway. Hii ni RDP juu ya HTTP. Sitaki kugusia kusanidi RDGW yenyewe hapa, sitaki kujadili kwa nini ni nzuri au mbaya, wacha tuichukue kama moja ya zana za ufikiaji wa mbali. Ninataka kuzungumza juu ya kulinda seva yako ya RDGW kutoka kwa Mtandao mbaya. Nilipoanzisha seva ya RDGW, mara moja nilijali kuhusu usalama, hasa ulinzi dhidi ya nguvu ya kikatili ya nenosiri. Nilishangaa kwamba sikupata makala yoyote kwenye mtandao kuhusu jinsi ya kufanya hivyo. Naam, itabidi kufanya hivyo mwenyewe.

RDGW yenyewe haina ulinzi wowote. Ndio, inaweza kufichuliwa na kiolesura wazi kwa mtandao mweupe na itafanya kazi vizuri. Lakini hii itafanya msimamizi sahihi au mtaalamu wa usalama wa habari asiwe na wasiwasi. Kwa kuongeza, itawawezesha kuepuka hali ya kuzuia akaunti, wakati mfanyakazi asiyejali alikumbuka nenosiri kwa akaunti ya ushirika kwenye kompyuta yake ya nyumbani, na kisha akabadilisha nenosiri lake.

Njia nzuri ya kulinda rasilimali za ndani kutoka kwa mazingira ya nje ni kupitia seva mbadala, mifumo ya uchapishaji na WAF zingine. Hebu tukumbuke kwamba RDGW bado ni http, basi inaomba tu kuziba suluhisho maalum kati ya seva za ndani na mtandao.

Ninajua kuwa kuna F5, A10, Netscaler(ADC) nzuri. Kama msimamizi wa mojawapo ya mifumo hii, nitasema kwamba inawezekana pia kuweka ulinzi dhidi ya nguvu za kikatili kwenye mifumo hii. Na ndio, mifumo hii pia itakulinda kutokana na mafuriko yoyote ya syn.

Lakini si kila kampuni inaweza kumudu kununua suluhisho hilo (na kupata msimamizi kwa mfumo huo :), lakini wakati huo huo wanaweza kutunza usalama!

Inawezekana kabisa kufunga toleo la bure la HAProxy kwenye mfumo wa uendeshaji wa bure. Nilijaribu kwenye Debian 10, toleo la haproxy 1.8.19 kwenye hazina thabiti. Pia niliijaribu kwenye toleo la 2.0.xx kutoka kwa hazina ya majaribio.

Tutaacha kusanidi debian yenyewe nje ya wigo wa nakala hii. Kwa kifupi: kwenye kiolesura cheupe, funga kila kitu isipokuwa bandari 443, kwenye kiolesura cha kijivu - kulingana na sera yako, kwa mfano, pia funga kila kitu isipokuwa bandari 22. Fungua tu kile kinachohitajika kwa kazi (VRRP kwa mfano, kwa ip inayoelea).

Kwanza kabisa, nilisanidi haproxy katika modi ya daraja la SSL (aka http mode) na kuwasha ukataji miti ili kuona kinachoendelea ndani ya RDP. Ili kuzungumza, niliingia katikati. Kwa hivyo, njia ya /RDWeb iliyobainishwa katika vifungu "zote" kuhusu kusanidi RDGateway haipo. Kilichopo ni /rpc/rpcproxy.dll na /remoteDesktopGateway/. Katika hali hii, maombi ya kawaida ya GET/POST hayatumiki; aina yao ya ombi RDG_IN_DATA, RDG_OUT_DATA inatumika.

Sio sana, lakini angalau kitu.

Hebu tujaribu.

Ninazindua mstsc, nenda kwa seva, angalia makosa manne 401 (yasiyoidhinishwa) kwenye magogo, kisha ingiza jina langu la mtumiaji / nenosiri na uone majibu 200.

Ninaizima, nianze tena, na katika magogo ninaona makosa manne sawa 401. Ninaingiza kuingia vibaya / nenosiri na kuona tena makosa manne 401. Hiyo ndiyo ninayohitaji. Hii ndio tutakamata.

Kwa kuwa haikuwezekana kuamua url ya kuingia, na zaidi ya hayo, sijui jinsi ya kupata hitilafu 401 kwenye haproxy, nitashika (sio kukamata, lakini kuhesabu) makosa yote ya 4xx. Pia yanafaa kwa ajili ya kutatua tatizo.

Kiini cha ulinzi kitakuwa kwamba tutahesabu idadi ya makosa 4xx (kwenye sehemu ya nyuma) kwa kila kitengo cha wakati na ikiwa inazidi kikomo kilichowekwa, basi kukataa (kwenye mstari wa mbele) miunganisho yote zaidi kutoka kwa ip hii kwa muda uliowekwa. .

Kitaalam, hii haitakuwa ulinzi dhidi ya nguvu ya kikatili ya nenosiri, itakuwa ulinzi dhidi ya makosa ya 4xx. Kwa mfano, ikiwa mara nyingi unaomba url isiyopo (404), basi ulinzi pia utafanya kazi.

Njia rahisi na nzuri zaidi ni kutegemea nyuma na kuripoti ikiwa kitu chochote cha ziada kitaonekana:

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

Sio chaguo bora, wacha tuifanye ngumu. Tutahesabu backend na kuzuia kwenye frontend.

Tutamtendea mshambulizi kwa jeuri na kuacha muunganisho wake wa 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

kitu kimoja, lakini kwa heshima, tutarudisha kosa http 429 (Maombi Mengi Sana)

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

Ninaangalia: Ninazindua mstsc na kuanza kuingiza nywila bila mpangilio. Baada ya jaribio la tatu, ndani ya sekunde 10 inanirudisha nyuma, na mstsc inatoa makosa. Kama inavyoonekana kwenye magogo.

Maelezo. Mimi ni mbali na bwana haproxy. Sielewi kwa nini, kwa mfano
http-ombi kataa kukataa_hali 429 ikiwa { sc_http_err_rate(0) gt 4}
hukuruhusu kufanya makosa kama 10 kabla ya kufanya kazi.

Nimechanganyikiwa kuhusu hesabu za kaunta. Mabwana wa haproxy, nitafurahi ikiwa utanisaidia, unisahihishe, unifanye bora.

Katika maoni unaweza kupendekeza njia zingine za kulinda RD Gateway, itakuwa ya kuvutia kusoma.

Kuhusu Mteja wa Desktop ya Mbali ya Windows (mstsc), ni muhimu kuzingatia kwamba haiungi mkono TLS1.2 (angalau katika Windows 7), kwa hiyo nililazimika kuondoka TLS1; haiauni cipher ya sasa, kwa hivyo ilinibidi pia kuacha zile za zamani.

Kwa wale ambao hawaelewi chochote, wanajifunza tu, na tayari wanataka kufanya vizuri, nitakupa usanidi mzima.

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

Kwa nini seva mbili kwenye backend? Kwa sababu hivi ndivyo unavyoweza kufanya uvumilivu wa makosa. Haproksi pia inaweza kutengeneza mbili kwa ip nyeupe inayoelea.

Rasilimali za kompyuta: unaweza kuanza na "gigi mbili, cores mbili, PC ya michezo ya kubahatisha." Kulingana na wikipedia hii itatosha kuokoa.

Marejeo:

Kuweka rdp-lango kutoka HAProxy
Nakala pekee nilipata ambapo walijisumbua kulazimisha nenosiri

Chanzo: mapenzi.com

Kuongeza maoni