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
Rujukan:
sumber: www.habr.com