Адзін VPN-эндпоінт праз Squid: вузкае выключэнне CONNECT
Дазвольце аднаму ўзгодненаму пункту крыніцы дасягнуць аднаго VPN-шлюза на порце 1194 праз Squid, захавайце глабальныя ахоўнікі партоў і дакажыце, што больш нічога не адкрылася.
Squid адказвае на запыт CONNECT першым радком http_access, які супадае, і гэты радок можа быць адмовай. Гэты адзіны факт тлумачыць, чаму выключэнне для VPN-эндпоінта звычайна не спраўджваецца з першай спробы, бо запыт ніколі не дасягае дазволу, які хтосьці дадаў унізе. Вузкае выпраўленне захоўвае існуючыя ахоўнікі партоў і вучыць іх пра адну правераную крыніцу, прызначэнне і порт. Усё астатняе на проксі паводзіць сябе дакладна так, як раней.
Як Squid вырашае запыт CONNECT
Запыт CONNECT называе хост і порт, і Squid перабірае радкі http_access па парадку, пакуль адзін з іх не супадзе. Супадзенне адмовы неадкладна спыняе ацэнку, і кліент атрымлівае 403 ад проксі. Вось чаму месца правіла важнейшае за яго фармулёўку. Перамяшчэнне таго ж радка на адзін крок уверх можа цалкам змяніць вынік.
Звычайныя ахоўнікі адмаўляюць усё па-за Safe_ports і адмаўляюць CONNECT па-за SSL_ports. Гэтыя імёны — гэта ACL, вызначаныя ў вашай уласнай канфігурацыі, таму іх змест належыць вам, а не пратаколу. Дыстрыбутыў можа дазваляць шырокі дыяпазон партоў як Safe_ports, асобна абмяжоўваючы CONNECT. Прачытайце жывыя значэнні, перш чым меркаваць, што порт заблакаваны па задуме.
Пераканайцеся, што менавіта проксі адмаўляе запыт. 403, створаны Squid, зусім не падобны на папярэджанне TLS ад VPN-сервера, і зліццё двух у адну праблему каштуе першай гадзіны. Праверце радок журнала доступу для запыту, бо ён фіксуе і дзеянне, і правіла, якое яго выклікала.
Пабудуйце адно сумеснае супадзенне замест трох асобных ACL
Будуйце выключэнне з трох фактаў: узгоднены дыяпазон крыніцы, адзін узгоджаны адрас прызначэння і адзіны порт, на якім слухае эндпоінт. Два асобныя ACL і адно сумеснае супадзенне даюць вельмі розную палітыку, бо ацэньваецца менавіта камбінацыя. Называйце сумесны ACL па тым, што ён дазваляе, а не па метадзе, які ён нясе.
Форма ніжэй выкарыстоўвае дакументацыйныя дыяпазоны, якія трэба замяніць праверанымі значэннямі. Squid не пакідае сабе ніводнага з гэтых імёнаў, таму выбіраць іх і трымаць узгодненымі — ваша справа. Гэты рэцэпт абмежаваны Squid 6 і 7, чыя дакументаваная канфігурацыя падтрымлівае групу all-of. Бягучы даведнік пазначае гэтыя дырэктывы як недаступныя ў Squid 8, таму ўспрымайце гэта як рэцэпт, прывязаны да версіі, а не як шлях міграцыі, і зверце дырэктыву з даведнікам вашай уласнай версіі перад ужываннем.
acl pvpn_src src 192.0.2.128/25
acl pvpn_dst dst 198.51.100.77/32
acl pvpn_port port 1194
acl pvpn_ok all-of CONNECT pvpn_port pvpn_dst pvpn_srcГрупа all-of супадае толькі тады, калі супадае кожны член, гэта значыць крыніца, прызначэнне і порт правяраюцца ў адным радку. Група сама па сабе нічога не дае, і запыт, які супадае толькі з двума з трох фактаў, не можа яе задаволіць. Гэтая ўласцівасць трымае выключэнне вузкім, калі хтосьці пазней дадае другі шлюз. Або новае прызначэнне дадаецца наўмысна, або запыт вяртаецца да першапачатковых ахоўнікаў.
Сагніце ахоўнікі партоў, не выдаляючы іх
На іх цяперашніх месцах два звычайныя ахоўныя радкі выглядаюць так. Звычайна яны стаяць пасля аўтэнтыфікацыі і перад радкамі палітыкі, якія ўсё дазваляюць.
http_access deny !Safe_ports
http_access deny CONNECT !SSL_portsДадайце адмоўленае сумеснае супадзенне да кожнага, каб супадальнае выключэнне перажыло ахоўнік, які інакш адмовіў бы яму. Змяняюцца толькі ахоўныя радкі, і толькі на адзін дадатковы тэрмін кожны.
http_access deny CONNECT !SSL_ports !pvpn_ok
http_access deny !Safe_ports !pvpn_okТэрміны ў адным радку доступу аб’ядноўваюцца, таму радок цяпер адмаўляе толькі запыты, якія не праходзяць і першапачатковую праверку, і выключэнне. Запыт да ўзгодненага эндпоінта праходзіць, а ўсе астатнія запыты захоўваюць старое паводзіны партоў. Гэта вузей, чым дадаць порт у глабальны спіс SSL_ports, які дазволіў бы гэты порт для кожнага прызначэння. Калі порт ужо ёсць у гэтым спісе, гэты ACL нічога не звужвае, і старое, шырэйшае дазвол па-ранейшаму дзейнічае для іншых прызначэнняў, таму прачытайце жывы спіс, перш чым сцвярджаць, што выключэнне адкрыла порт. Яно таксама зваротнае, бо два радкі вяртаюцца ў ранейшую форму. Даведнік па кантролі доступу дакументуе парадак і звычайныя ахоўнікі, ад якіх залежыць гэта змяненне.
Дзе выключэнне нельга размяшчаць
Спакуса — паставіць дазвол над ахоўнікамі і скончыць. Такое размяшчэнне таксама прапускае ахову аўтэнтыфікацыі і лакальнага прызначэння, якая звычайна стаіць каля верху працоўнай канфігурацыі. Вынік — не вузкае выключэнне, а дзірка з каментаром над ёй. Трымайце любы новы дазвол на тым жа правераным этапе, што і астатняя палітыка кліентаў.
Праверце, што запыту яшчэ патрэбна пасля ахоўнікаў партоў. Аўтэнтыфікаваны ўліковы запіс, дазволены адрас кліента і палітыка прызначэння ўсё яшчэ дзейнічаюць, і выключэнне не змяняе ніводнага з іх. Калі ваш проксі ўжо дазваляе ўзгодненаму ўліковаму запісу дасягаць адвольных прызначэнняў, ахоўнік порта ніколі не быў сапраўдным кантролем.
Падумайце, ці эндпоінт наогул TCP. Выключэнне CONNECT перадае TCP-патокі, і профіль OpenVPN, які выкарыстоўвае UDP, не стане дасягальным праз яго. Змяняйце профіль на TCP толькі тады, калі сервер так слухае і аператар прымае розніцу ў паводзінах.
Праверце мяжу парсерам і рэальным запытам
Разбярыце канфігурацыю перад перазагрузкай і трымайце другую сесію адкрытай, пакуль робіце гэта. Сінтаксічная памылка падчас перазагрузкі можа пакінуць проксі на старой канфігурацыі або цалкам адхіліць новую. Парсер паведамляе адхілены радок, а гэта больш, чым скажа памылка кліента.
Затым перазагрузіце і адпраўце адзін рэальны CONNECT праз проксі з узгодненай крыніцы. Запуск парсера ідзе першым, бо перазагрузка з памылкай друку нічога не навучыць вас пра палітыку.
squid -k parse
squid -k reconfigure
curl -v -p -x http://proxy.lab.internal:3128 https://vpn.lab.internal:1194/ --max-time 5Праверце тры выпадкі: узгоджаная крыніца і ўліковы запіс, неўзгодненая крыніца і іншае прызначэнне на тым жа порце. Трэці выпадак — той, што даказвае вузкасць выключэння, бо ён выкарыстоўвае порт без супадзення прызначэння. Чытайце журнал доступу для ўсіх трох замест таго, каб давяраць паведамленню кліента. Паспяховы CONNECT усталёўвае TCP-паток і нічога больш, таму рукапоціск VPN застаецца асобным тэстам.