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
Marejeo:
Chanzo: mapenzi.com