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
Mga reperensiya:
Source: www.habr.com