MS Remote Desktop Gateway, HAProxy เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ brute force

เป€เบžเบทเปˆเบญเบ™, เบชเบฐเบšเบฒเบเบ”เบต!

เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบˆเบฒเบเป€เบฎเบทเบญเบ™เป„เบ›เบซเบฒเบšเปˆเบญเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบซเป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Microsoft Remote Desktop Gateway. เบ™เบตเป‰เปเบกเปˆเบ™ RDP เบœเปˆเบฒเบ™ HTTP. เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเปเบฒเบœเบฑเบ”เบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ RDGW เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เบ‚เป‰เบญเบเบšเปเปˆเบขเบฒเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบกเบฑเบ™เบ”เบตเบซเบผเบทเบšเปเปˆเบ”เบต, เปƒเบซเป‰เบ–เบทเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ. เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ RDGW เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฒเบเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบ—เบตเปˆเบŠเบปเปˆเบงเบฎเป‰เบฒเบ. เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ RDGW, เบ‚เป‰เบญเบเบ—เบฑเบ™เบ—เบตเบ—เบฑเบ™เปƒเบ”เบเบฑเบ‡เบงเบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ brute force. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ›เบฐโ€‹เบซเบฅเบฒเบ”โ€‹เปƒเบˆโ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เปƒเบ™โ€‹เบญเบดเบ™โ€‹เป€เบ•เบตโ€‹เป€เบ™เบฑเบ”โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เปเบ™เบงโ€‹เบ™เบตเป‰โ€‹. เปเบฅเป‰เบง, เป€เบˆเบปเป‰เบฒเบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบกเบฑเบ™เป€เบญเบ‡.

RDGW เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบšเปเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เปƒเบ”เป†. เปเบกเปˆเบ™เปเบฅเป‰เบง, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เป€เบœเบตเบเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบ›เบปเปˆเบฒเบเบฑเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบชเบตเบ‚เบฒเบงเปเบฅเบฐเบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบต. เปเบ•เปˆเบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบซเบผเบทเบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™เบ”เป‰เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเบชเบฐเบšเบฒเบ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบดเบ”เบšเบฑเบ™เบŠเบต, เป€เบกเบทเปˆเบญเบžเบฐเบ™เบฑเบเบ‡เบฒเบ™เบ—เบตเปˆเบšเปเปˆเบชเบปเบ™เปƒเบˆเบˆเบทเปˆเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบšเปเบฅเบดเบชเบฑเบ”เปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบขเบนเปˆเป€เบฎเบทเบญเบ™, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบฅเบฒเบง.

เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเปƒเบ™เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบžเบฒเบเปƒเบ™เบˆเบฒเบเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบžเบฒเบเบ™เบญเบเปเบกเปˆเบ™เบœเปˆเบฒเบ™เบ•เบปเบงเปเบ—เบ™เบ•เปˆเบฒเบ‡เป†, เบฅเบฐเบšเบปเบšเบเบฒเบ™เป€เบœเบตเบเปเบœเปˆ, เปเบฅเบฐ WAFs เบญเบทเปˆเบ™เป†. เบ‚เปเปƒเบซเป‰เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒ RDGW เบเบฑเบ‡เป€เบ›เบฑเบ™ http, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบ‚เปเป€เบญเบปเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบžเบดเป€เบชเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบžเบฒเบเปƒเบ™เปเบฅเบฐเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”.

เบ‚เป‰เบญเบเบฎเบนเป‰เบงเปˆเบฒเบกเบต F5, A10, Netscaler (ADC). เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เบœเบนเป‰เป€เบšเบดเปˆเบ‡เปเบเบ‡เบฅเบฐเบšเบปเบšเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบกเบฑเบ™เบเปเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบ•เป‰เบฒเบ™เบเบฑเบš brute force เปƒเบ™เบฅเบฐเบšเบปเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เปเบฅเบฐเปเบกเปˆเบ™เปเบฅเป‰เบง, เบฅเบฐเบšเบปเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบเบฑเบ‡เบˆเบฐเบ›เบปเบเบ›เป‰เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฒเบเป„เบžเบ™เปเป‰เบฒเบ–เป‰เบงเบกเปƒเบ”เป†.

เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบ—เบธเบเป†เบšเปเบฅเบดเบชเบฑเบ”เบชเบฒเบกเบฒเบ”เบŠเบทเป‰เบเบฒเบ™เปเบเป‰เป„เบ‚เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง (เปเบฅเบฐเบŠเบญเบเบซเบฒเบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง :), เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ”เบนเปเบฅเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป„เบ”เป‰!

เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ HAProxy เบชเบฐเบšเบฑเบšเบŸเบฃเบตเปƒเบ™เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบŸเบฃเบต. เบ‚เป‰เบญเบเป„เบ”เป‰เบ—เบปเบ”เบชเบญเบšเปƒเบ™ Debian 10, haproxy version 1.8.19 เปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบตเปˆเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบเบฑเบ‡โ€‹เป„เบ”เป‰โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบกเบฑเบ™โ€‹เปƒเบ™โ€‹เบชเบฐโ€‹เบšเบฑเบš 2.0.xx เบˆเบฒเบ repository เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเบญเบเบˆเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ debian เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบขเบนเปˆเบ™เบญเบเบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰. เป‚เบ”เบเบซเบเปเป‰: เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบŸเบ”เบชเบตเบ‚เบฒเบง, เบ›เบดเบ”เบ—เบธเบเบขเปˆเบฒเบ‡เบเบปเบเป€เบงเบฑเป‰เบ™เบžเบญเบ” 443, เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบŸเบ”เบชเบตเบ‚เบตเป‰เป€เบ–เบปเปˆเบฒ - เบญเบตเบ‡เบ•เบฒเบกเบ™เบฐเป‚เบเบšเบฒเบเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ›เบดเบ”เบ—เบธเบเบขเปˆเบฒเบ‡เบเบปเบเป€เบงเบฑเป‰เบ™เบžเบญเบ” 22. เป€เบ›เบตเบ”เบžเบฝเบ‡เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ (VRRP เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเปเบฒเบฅเบฑเบš ip เบฅเบญเบ).

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ‚เป‰เบญเบเป„เบ”เป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ haproxy เปƒเบ™เบฎเบนเบšเปเบšเบš SSL bridging (aka http mode) เปเบฅเบฐเป€เบ›เบตเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบžเบฒเบเปƒเบ™ RDP. เบชเบฐเบ™เบฑเป‰เบ™เป€เบžเบทเปˆเบญเป€เบงเบปเป‰เบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบเบฒเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ /RDWeb เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบก "เบ—เบฑเบ‡เบซเบกเบปเบ”" เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ RDGateway เปเบกเปˆเบ™เบซเบฒเบเป„เบ›. เบ—เบฑเบ‡เปเบปเบ”เบ™เบฑเป‰เบ™เปเบกเปˆเบ™ /rpc/rpcproxy.dll เปเบฅเบฐ /remoteDesktopGateway/. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰, เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ GET/POST เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰; เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบ‚เบญเบ‡โ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ RDG_IN_DATA, RDG_OUT_DATA เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰.

เบšเปเปˆเบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”, เปเบ•เปˆเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡.

เปƒเบซเป‰เบ—เบปเบ”เบชเบญเบš.

เบ‚เป‰เบญเบเป€เบ›เบตเบ” mstsc, เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เป€เบšเบดเปˆเบ‡เบชเบตเปˆเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” 401 (เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”) เปƒเบ™เบšเบฑเบ™เบ—เบถเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบชเปˆเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰ / เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบ„เปเบฒเบ•เบญเบš 200.

เบ‚เป‰เบญเบเบ›เบดเบ”เบกเบฑเบ™, เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบฑเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เปเบฅเบฐเปƒเบ™เบšเบฑเบ™เบ—เบถเบเบ‚เป‰เบญเบเป€เบซเบฑเบ™เบชเบตเปˆเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” 401 เบ”เบฝเบงเบเบฑเบ™. เบ‚เป‰เบญเบเปƒเบชเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš / เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบœเบดเบ”เปเบฅเบฐเป€เบซเบฑเบ™เบชเบตเปˆเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” 401 เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบˆเบฑเบš.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ” url เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš, เปเบฅเบฐเบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบˆเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” 401 เปƒเบ™ haproxy, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบˆเบฑเบš (เบšเปเปˆเบˆเบฑเบšเบ•เบปเบงเบˆเบดเบ‡, เปเบ•เปˆเบ™เบฑเบš) เบ—เบฑเบ‡เบซเบกเบปเบ” 4xx เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ.

เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบˆเบฐเป€เบ›เบฑเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เบฑเบšเบˆเปเบฒเบ™เบงเบ™ 4xx เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” (เปƒเบ™ backend) เบ•เปเปˆเบซเบ™เปˆเบงเบเป€เบงเบฅเบฒเปเบฅเบฐเบ–เป‰เบฒเบกเบฑเบ™เป€เบเบตเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เบฐเบ•เบดเป€เบชเบ” (เบขเบนเปˆเบ”เป‰เบฒเบ™เบซเบ™เป‰เบฒ) เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบ ip เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰. .

เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เป€เบ—เบเบ™เบดเบ, เบ™เบตเป‰เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ brute force, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” 4xx. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบฑเบเบˆเบฐเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบกเบต url เบ—เบตเปˆเบšเปเปˆเบกเบตเบขเบนเปˆ (404), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบเบฑเบ‡เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบ.

เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ” เปเบฅเบฐเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบชเบธเบ”เบ„เบทเบเบฒเบ™เบ™เบฑเบšเบขเบนเปˆเปƒเบ™ backend เปเบฅเบฐเบฅเบฒเบเบ‡เบฒเบ™เบ„เบทเบ™เบ–เป‰เบฒเบกเบตเบญเบฑเบ™เปƒเบ”เบญเบฑเบ™เบžเบดเป€เบชเบ”เบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™:

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

เบšเปเปˆเปเบกเปˆเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”, เปƒเบซเป‰เบกเบฑเบ™เบชเบฑเบšเบชเบปเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เบฑเบšเบขเบนเปˆเปƒเบ™ backend เปเบฅเบฐเบ•เบฑเบ™เปƒเบ™ frontend.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เปเปˆเบœเบนเป‰เป‚เบˆเบกเบ•เบตเบขเปˆเบฒเบ‡เบซเบเบฒเบšเบ„เบฒเบเปเบฅเบฐเบฅเบธเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ 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

เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™, เปเบ•เปˆเบขเปˆเบฒเบ‡เบชเบธเบžเบฒเบš, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” http 429 (เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›)

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

เบ‚เป‰เบญเบเบเบงเบ”เป€เบšเบดเปˆเบ‡: เบ‚เป‰เบญเบเป€เบ›เบตเบ” mstsc เปเบฅเบฐเป€เบฅเบตเปˆเบกเปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เปเบšเบšเบชเบธเปˆเบก. เบซเบผเบฑเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ„เบฑเป‰เบ‡เบ—เบตเบชเบฒเบก, เบžเบฒเบเปƒเบ™ 10 เบงเบดเบ™เบฒเบ—เบตเบกเบฑเบ™เป€เบ•เบฐเบ‚เป‰เบญเบเบ„เบทเบ™, เปเบฅเบฐ mstsc เปƒเบซเป‰เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เบšเบฑเบ™เบ—เบถเบ.

เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบ. เบ‚เป‰เบญเบเบขเบนเปˆเป„เบเบˆเบฒเบเปเบกเปˆเปเบšเบš haproxy. เบ‚เป‰เบญเบเบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡, เบ•เบปเบงเบขเปˆเบฒเบ‡
http-request deny deny_status 429 เบ–เป‰เบฒ { sc_http_err_rate(0) gt 4 }
เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบ›เบฐเบกเบฒเบ™ 10 เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบ.

เบ‚เป‰เบญเบเบชเบฑเบšเบชเบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ™เบฑเบšเบ•เบปเบงเป€เบฅเบ. เบญเบฒเบˆเบฒเบ™เบ‚เบญเบ‡ haproxy, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบ”เบตเปƒเบˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ›เบฐเบเบญเบšเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เปเบเป‰เป„เบ‚เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ”เบตเบ‚เบถเป‰เบ™.

เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบ™เบฐเบ™เปเบฒเบงเบดเบ—เบตเบญเบทเปˆเบ™เป€เบžเบทเปˆเบญเบ›เบปเบเบ›เป‰เบญเบ‡ RD Gateway, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบชเบถเบเบชเบฒ.

เบเปˆเบฝเบงเบเบฑเบš Windows Remote Desktop Client (mstsc), เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ TLS1.2 (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเปƒเบ™ Windows 7), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบญเบญเบเบˆเบฒเบ TLS1; เบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบฐเบซเบฑเบ”เบ›เบฐเบˆเบธเบšเบฑเบ™, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบญเบญเบเบˆเบฒเบเบญเบฑเบ™เป€เบเบปเปˆเบฒ.

เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบซเบเบฑเบ‡, เบžเบฝเบ‡เปเบ•เปˆเบฎเบฝเบ™เบฎเบนเป‰, เปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เบต, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเปƒเบซเป‰เบ—เปˆเบฒเบ™ 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

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบชเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™ backend? เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”. Haproxy เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบชเบญเบ‡เบ”เป‰เบงเบ ip เบชเบตเบ‚เบฒเบงเบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป„เบ”เป‰.

เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบต: เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ "เบชเบญเบ‡ gig, เบชเบญเบ‡เปเบเบ™, เป€เบเบก PC." เบญเบตเบ‡โ€‹เบ•เบฒเบก เบงเบดเบเบดเบžเบตเป€เบ”เบ เบ™เบตเป‰เบˆเบฐเบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐ spare.

เป€เบญเบเบฐเบชเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡:

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ rdp-gateway เบˆเบฒเบ HAProxy
เบšเบปเบ”เบ„เบงเบฒเบกเบ”เบฝเบงเบ—เบตเปˆเบ‚เป‰เบญเบเบžเบปเบšเบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเป€เบšเบทเปˆเบญเบเบฑเบš brute-force เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™