Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

Bidh an t-artaigil seo feumail dhaibhsan a tha:

  • tha fios aige dè a th’ ann an Teisteanas Luchd-dèiligidh agus tha e a’ tuigsinn carson a dh’ fheumas e socaidean-lìn air Safari gluasadach;
  • Bu toil leam seirbheisean lìn fhoillseachadh do chearcall cuibhrichte de dhaoine no dhomh fhìn a-mhàin;
  • a’ smaoineachadh gu bheil a h-uile càil air a dhèanamh le cuideigin mu thràth, agus bu mhath leotha an saoghal a dhèanamh beagan nas goireasaiche agus nas sàbhailte.

Thòisich eachdraidh nan socaidean lìn mu ochd bliadhna air ais. Roimhe seo, chaidh dòighean mar iarrtasan HTTP fada (freagairtean dha-rìribh) a chleachdadh: chuireadh brabhsair an neach-cleachdaidh iarrtas chun an fhrithealaiche agus feitheamh ri freagairt, an uairsin ath-cheangal agus feitheamh às dèidh na freagairt. Ach an uairsin nochd socaidean lìn.

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

O chionn grunn bhliadhnaichean, leasaich sinn ar buileachadh fhèin ann am PHP fìor-ghlan, nach b’ urrainn dèiligeadh ri iarrtasan HTTPS, leis gur e sreath ceangail dàta a th’ ann. O chionn ghoirid, tha cha mhòr a h-uile frithealaiche lìn air ionnsachadh mar a nì iad proxy airson iarrtasan HTTPS agus taic a thoirt do connection:upgrade.

Nuair a thachair seo, thàinig socaidean-lìn gu bhith mar an t-seirbheis bunaiteach airson aplacaidean SPA, leis gu bheil e cho goireasach susbaint a thoirt don neach-cleachdaidh aig iomairt an fhrithealaiche (gus teachdaireachd a chuir air adhart bho neach-cleachdaidh eile no gus dreach ùr de ìomhaigh, sgrìobhainn no taisbeanadh a luchdachadh suas a tha cuideigin eile an-dràsta a’ deasachadh).

Ged a tha Client Cert air a bhith ann airson ùine mhòr, tha e fhathast air a dhroch thaic leis gu bheil e ag adhbhrachadh grunn dhuilgheadasan nuair a thathar a’ feuchainn ri a sheachnadh. Agus (’s dòcha :slightly_smiling_face: ) is e sin as coireach gu bheil brobhsairean iOS (a h-uile brobhsair ach a-mhàin Safari) a’ diùltadh a chleachdadh agus ga iarraidh bhon stòr teisteanasan ionadail. Tha teisteanasan a’ tabhann mòran bhuannachdan thairis air logadh a-steach/pas no iuchraichean SSH no dùnadh nam puirt riatanach tro bhalla-teine. Ach chan e sin a’ phuing.

Air iOS, tha am modh-obrach stàlaidh teisteanas gu math sìmplidh (ged nach eil e às aonais a shònrachaidhean), ach mar as trice bidh e a’ leantainn grunn stiùiridhean air-loidhne a tha rim faighinn a-mhàin airson brabhsair Safari. Gu mì-fhortanach, chan urrainn dha Safari Teisteanasan Luchd-dèiligidh a chleachdadh airson socaidean lìn, ach tha gu leòr stiùiridhean air-loidhne ann air mar a chruthaicheas tu teisteanas mar sin, ach ann an cleachdadh, chan eil e comasach a choileanadh.

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

Gus tuigse fhaighinn air socaidean lìn, chleachd sinn am plana a leanas: duilgheadas/beachd-bharail/fuasgladh.

Problem: Chan eil taic ann airson socaidean lìn nuair a thathar a’ cur iarrtasan gu goireasan a tha fo dhìon teisteanas teachdaiche ann am brabhsair gluasadach Safari airson iOS agus aplacaidean eile aig a bheil taic teisteanas air a chomasachadh.

Barailean:

  1. Tha e comasach eisgeachd mar sin a rèiteachadh gus teisteanasan a chleachdadh (le fios nach bi iad an làthair) airson socaidean lìn de ghoireasan progsaidh a-staigh/a-muigh.
  2. Airson socaidean lìn, faodar ceangal sònraichte, tèarainte agus dìonta a chruthachadh le bhith a’ cleachdadh seiseanan sealach a thèid a chruthachadh le iarrtas brabhsair cunbhalach (nach e socaid lìn a th’ ann).
  3. Faodar seiseanan sealach a chur an gnìomh le bhith a’ cleachdadh aon fhrithealaiche lìn progsaidh (modalan agus gnìomhan togte a-mhàin).
  4. Chaidh comharran seisein sealach a chur an gnìomh mu thràth mar mhodalan Apache deiseil.
  5. Faodar comharran seisein sealach a chur an gnìomh le bhith a’ dealbhadh structar an eadar-obrachaidh gu loidsigeach.

Staid ri fhaicinn às dèidh a chur an gnìomh.

Amas na h-obrach: Bu chòir gum biodh e comasach riaghladh sheirbheisean is bun-structair a dhèanamh bho fhòn-làimhe le iOS gun phrògraman a bharrachd (leithid VPN), ann an dòigh aonaichte is tèarainte.

Amas a bharrachd: A’ sàbhaladh ùine agus ghoireasan/trafaic fòn (bidh cuid de sheirbheisean às aonais socaidean lìn a’ gineadh iarrtasan neo-riatanach) le lìbhrigeadh susbaint nas luaithe air an eadar-lìon gluasadach.

Mar a nì thu sgrùdadh?

1. Duilleagan fosglaidh:

— например, https://teamcity.yourdomain.com в мобильном браузере Safari (доступен также в десктопной версии) — вызывает успешное подключение к веб-сокетам.
— например, https://teamcity.yourdomain.com/admin/admin.html?item=diagnostics&tab=webS…— показывает ping/pong.
— например, https://rancher.yourdomain.com/p/c-84bnv:p-vkszd/workload/deployment:danidb:ph…-> viewlogs — показывает логи контейнера.

2. No ann an consol an leasaiche:

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

Deuchainn barail:

1. Tha e comasach eisgeachd mar sin a rèiteachadh airson teisteanasan a chleachdadh (le fios nach bi iad an làthair) airson socaidean lìn de ghoireasan progsaidh a-staigh/a-muigh.

Chaidh 2 fhuasgladh a lorg an seo:

a) Aig an ìre

<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>

atharraich an ìre ruigsinneachd.

Tha na nuances a leanas aig an dòigh seo:

  • Bidh dearbhadh teisteanais a’ tachairt an dèidh iarrtas chun ghoireas progsaidh, i.e., crathadh-làimhe às dèidh an iarrtais. Tha seo a’ ciallachadh gun luchdaich am progsaidh an t-iarrtas chun na seirbheis fo dhìon an toiseach agus an uairsin gun diùlt e e. Tha seo dona, ach chan eil e deatamach;
  • Anns a’ phròtacal HTTP2. Tha e fhathast ann an cruth dreachd, agus chan eil fios aig luchd-reic bhrabhsairean ciamar a chuireas iad an gnìomh e. #info mu chrathadh-làimhe post http2 tls1.3 (chan eil e ag obair an-dràsta) Cuir RFC 8740 an gnìomh "A’ cleachdadh TLS 1.3 le HTTP/2";
  • Chan eil e soilleir ciamar a thèid an giullachd seo aonachadh.

b) Aig an ìre bhunasach, leig le SSL gun teisteanas.

Tha SSLVerifyClient riatanach => SSLVerifyClient roghainneil, ach tha seo a’ lughdachadh ìre tèarainteachd an fhrithealaiche proxy, leis gun tèid ceangal mar sin a phròiseasadh às aonais teisteanas. Ach, faodaidh tu ruigsinneachd do sheirbheisean proxies a dhiùltadh tuilleadh leis an stiùireadh a leanas:

RewriteEngine        on
RewriteCond     %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteRule     .? - [F]
ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

Airson tuilleadh fiosrachaidh, faic an artaigil mu SSL: Dearbhadh Teisteanas Cliant Frithealaiche Apache

Chaidh an dà roghainn a dhearbhadh, chaidh roghainn "b" a thaghadh air sgàth cho ioma-chruthach 's a bha e agus cho co-chòrdail 's a bha e ris a' phròtacal http2.

Gus dearbhadh a dhèanamh air a’ bharail seo, bha feum air mòran dheuchainnean leis an rèiteachadh; chaidh na dealbhaidhean a leanas a dhearbhadh:

ma tha = feum = ath-sgrìobh

B’ e seo an dealbhadh bunaiteach a thàinig às:

SSLVerifyClient optional
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule     .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

#websocket for safari without cert auth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
...
    #замещаем авторизацию по владельцу сертификата на авторизацию по номеру протокола
    SSLUserName SSl_PROTOCOL
</If>
</If>

Leis an ùghdarras a th’ ann mar-thà leis an t-sealbhadair teisteanais, ach le teisteanas a dhìth, b’ fheudar sealbhadair teisteanais nach robh ann a chur ris ann an cruth aon de na caochladairean SSl_PROTOCOL a bha rim faighinn (an àite SSL_CLIENT_S_DN_CN), barrachd fiosrachaidh anns na sgrìobhainnean:

Modúl Apache mod_ssl

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

2. Airson socaidean lìn, faodaidh tu ceangal sònraichte, tèarainte agus dìonta a chruthachadh le bhith a’ cleachdadh seiseanan sealach a thèid a chruthachadh rè iarrtas brabhsair cunbhalach (nach e socaid lìn a th’ ann).

Stèidhichte air eòlas a bh’ ann roimhe, tha e riatanach earrann a bharrachd a chur ris an rèiteachadh gus am bi comharran sealach airson ceanglaichean socaid lìn air an ullachadh airson iarrtas cunbhalach (nach eil mar socaid lìn).

#подготовка передача себе Сookie через пользовательский браузер
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
Header set Set-Cookie "websocket-allowed=true; path=/; Max-Age=100"
</If>
</If>

#проверка Cookie для установления веб-сокет соединения
<source lang="javascript">
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
#check for exists cookie

#get and check
SetEnvIf Cookie "websocket-allowed=(.*)" env-var-name=$1

#or rewrite rule
RewriteCond %{HTTP_COOKIE} !^.*mycookie.*$

#or if
<If "%{HTTP_COOKIE} =~ /(^|; )cookie-names*=s*some-val(;|$)/ >
</If

</If>
</If>

Sheall deuchainnean gu bheil seo ag obair. Tha e comasach briosgaidean a thar-chur gu brabhsair an neach-cleachdaidh.

3. Faodar seiseanan sealach a chur an gnìomh le bhith a’ cleachdadh aon fhrithealaiche lìn progsaidh (modalan agus gnìomhan togte a-mhàin).

Mar a dh’ionnsaich sinn roimhe, tha tòrr phrìomh ghnìomhan aig Apache a leigeas leinn bun-bheachdan cumhach a chruthachadh. Ach, feumaidh sinn ar fiosrachadh a dhìon fhad ‘s a tha e ann am brabhsair an neach-cleachdaidh, agus mar sin bidh sinn a’ mìneachadh dè a stòras sinn agus airson dè an adhbhar, agus dè na gnìomhan togte a chleachdas sinn:

  • Feumaidh sinn comharra nach gabh a dhì-chòdachadh gu furasta.
  • Feumaidh sinn comharra aig a bheil crìoch-ama togte a-steach dha agus a’ chomas sgrùdadh a dhèanamh air an fhrithealaiche airson crìoch-ama.
  • Feumaidh sinn comharra a bhios co-cheangailte ri sealbhadair an teisteanais.

Feumaidh seo gnìomh hashing, salann, agus ceann-latha crìochnachaidh comharra. A rèir an sgrìobhainneachd, Abairtean ann am Frithealaiche HTTP Apache Tha a h-uile rud againn a-mach às a’ bhogsa sha1 agus %{TIME}.

B’ e seo an dealbhadh a thàinig às:

#нет сертификата, и обращение к websocket
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
    SetEnvIf Cookie "zt-cert-sha1=([^;]+)" zt-cert-sha1=$1
    SetEnvIf Cookie "zt-cert-uid=([^;]+)" zt-cert-uid=$1
    SetEnvIf Cookie "zt-cert-date=([^;]+)" zt-cert-date=$1

#только так можно работать с переменными, полученными в env-ах в этот момент времени, более они нигде не доступны для функции хеширования (по отдельности можно, но не вместе, да и ещё с хешированием)
    <RequireAll>
        Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
        Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
    </RequireAll>
</If>
</If>

#есть сертификат, запрашивается не websocket
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
    SetEnvIf Cookie "zt-cert-sha1=([^;]+)" HAVE_zt-cert-sha1=$1

    SetEnv zt_cert "path=/; HttpOnly;Secure;SameSite=Strict"
#Новые куки ставятся, если старых нет
    Header add Set-Cookie "expr=zt-cert-sha1=%{sha1:salt1%{TIME}salt3%{SSL_CLIENT_S_DN_CN}salt2};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
    Header add Set-Cookie "expr=zt-cert-uid=%{SSL_CLIENT_S_DN_CN};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
    Header add Set-Cookie "expr=zt-cert-date=%{TIME};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
</If>
</If>

Chaidh an amas a choileanadh, ach tha cùisean ann le aois an fhrithealaiche (faodaidh tu briosgaid bliadhna a dh'aois a chleachdadh), a tha a’ ciallachadh, ged a tha comharran sàbhailte airson an cleachdadh a-staigh, nach eil iad sàbhailte airson an cleachdadh gu gnìomhachais (mòr-chleachdadh).

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

4. Tha comharran seisein sealach air an cur an gnìomh mu thràth mar mhodalan Apache deiseil.

Tha aon dhuilgheadas mòr ann fhathast bhon dreach roimhe: an neo-chomas smachd a chumail air crìoch nan comharran.

Tha sinn a’ coimhead airson modúl deiseil a nì seo, a rèir an leanas: apache token json two-factor auth

Seadh, tha modalan deiseil ann, ach tha iad uile ceangailte ri gnìomhan sònraichte agus tha nithean neo-àbhaisteach aca leithid toiseach seisein agus briosgaidean a bharrachd. ’S e sin, chan eil iad sealach.
Thug e còig uairean a thìde dhuinn a bhith a’ lorg, ach cha d’ fhuair sinn toradh cinnteach sam bith.

5. Faodar comharran seisein sealach a chur an gnìomh le bhith a’ dealbhadh structar an eadar-obrachaidh gu loidsigeach.

Tha na modalan deiseil ro iom-fhillte, oir chan eil feum againn ach air dà ghnìomh.

Is e an duilgheadas leis a’ cheann-latha nach eil gnìomhan togte Apache a’ leigeil le ceann-latha a chruthachadh bhon àm ri teachd, agus chan eil cur-ris/toirt-air-falbh matamataigeach ann nuair a thathar a’ sgrùdadh airson crìochnachaidh anns na gnìomhan togte.

'S e sin, chan urrainn dhut sgrìobhadh:

(%{env:zt-cert-date} + 30) > %{DATE}

Chan urrainnear ach dà àireamh a choimeas.

Fhad ’s a bha mi a’ lorg fuasgladh airson duilgheadas Safari, lorg mi an artaigil inntinneach seo: A’ dìon HomeAssistant le teisteanasan teachdaiche (ag obair le Safari/iOS)
Tha e a’ toirt cunntas air còd sampall ann an Lua airson Nginx, agus a tha, mar a tha e a’ tionndadh a-mach, a’ leantainn gu dlùth ri loidsig a’ phàirt den rèiteachadh a bha sinn air a chur an gnìomh mu thràth, ach a-mhàin a bhith a’ cleachdadh an dòigh hmac airson salann a shuidheachadh airson hashing (cha deach seo a lorg ann an Apache).

Dh’fhàs e soilleir gur e cànan le loidsig shoilleir a th’ ann an Lua, agus gu bheil e comasach rudeigin sìmplidh a chruthachadh airson Apache:

Às dèidh sgrùdadh a dhèanamh air na h-eadar-dhealachaidhean eadar Nginx agus Apache:

Agus na gnìomhan a tha rim faighinn bhon riochdaire cànain Lua:
22.1 – Ceann-latha agus Àm

Chaidh dòigh a lorg airson caochladairean env a shuidheachadh ann am faidhle beag Lua gus ceann-latha san àm ri teachd a shuidheachadh airson coimeas a dhèanamh ris an fhear làithreach.

Seo mar a tha sgriobt Lua sìmplidh a’ coimhead:

require 'apache2'

function handler(r)
    local fmt = '%Y%m%d%H%M%S'
    local timeout = 3600 -- 1 hour

    r.notes['zt-cert-timeout'] = timeout
    r.notes['zt-cert-date-next'] = os.date(fmt,os.time()+timeout)
    r.notes['zt-cert-date-halfnext'] = os.date(fmt,os.time()+ (timeout/2))
    r.notes['zt-cert-date-now'] = os.date(fmt,os.time())

    return apache2.OK
end

Agus seo mar a tha e uile ag obair còmhla, le bhith a’ leasachadh àireamh nam briosgaidean agus a’ cur an àite an tòcan nuair a thachras leth na h-ùine mus tig crìoch air a’ bhriosgaid (tòcan) a bh’ ann roimhe:

SSLVerifyClient optional

#LuaScope thread
#generate event variables zt-cert-date-next
LuaHookAccessChecker /usr/local/etc/apache24/sslincludes/websocket_token.lua handler early

#запрещаем без сертификата что-то ещё, кроме webscoket
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule     .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

#websocket for safari without certauth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
    SetEnvIf Cookie "zt-cert=([^,;]+),([^,;]+),[^,;]+,([^,;]+)" zt-cert-sha1=$1 zt-cert-date=$2 zt-cert-uid=$3

    <RequireAll>
        Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
        Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
        Require expr %{env:zt-cert-date} -ge %{env:zt-cert-date-now}
    </RequireAll>
   
    #замещаем авторизацию по владельцу сертификата на авторизацию по номеру протокола
    SSLUserName SSl_PROTOCOL
    SSLOptions -FakeBasicAuth
</If>
</If>

<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
    SetEnvIf Cookie "zt-cert=([^,;]+),[^,;]+,([^,;]+)" HAVE_zt-cert-sha1=$1 HAVE_zt-cert-date-halfnow=$2
    SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1

    Define zt-cert "path=/;Max-Age=%{env:zt-cert-timeout};HttpOnly;Secure;SameSite=Strict"
    Define dates_user "%{env:zt-cert-date-next},%{env:zt-cert-date-halfnext},%{SSL_CLIENT_S_DN_CN}"
    Header set Set-Cookie "expr=zt-cert=%{sha1:salt1%{env:zt-cert-date-next}sal3%{SSL_CLIENT_S_DN_CN}salt2},${dates_user};${zt-cert}" env=!HAVE_zt-cert-sha1-found
</If>
</If>

SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1
работает,

а так работать не будет
SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge  env('zt-cert-date-now') && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1 

Leis nach tèid LuaHookAccessChecker a ghnìomhachadh ach an dèidh sgrùdaidhean ruigsinneachd stèidhichte air an fhiosrachadh seo bho Nginx.

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

Ceangal stòrais image.

Aon phuing eile.

San fharsaingeachd, chan eil e gu diofar dè an òrdugh anns a bheil na stiùiridhean air an sgrìobhadh ann an rèiteachadh Apache (agus is dòcha Nginx cuideachd), leis gun tèid a h-uile càil a sheòrsachadh mu dheireadh a rèir an òrdugh anns a bheil iarrtas an neach-cleachdaidh air a phròiseasadh, a tha a’ freagairt ris an sgeama airson sgriobtaichean Lua a phròiseasadh.

Crìochnachadh:

Staid ri fhaicinn às dèidh a chur an gnìomh (targaid):
Tha riaghladh seirbheis is bun-structair ri fhaighinn bho fhòn-làimhe iOS gun bathar-bog a bharrachd (VPN), aonaichte agus tèarainte.

Chaidh an amas a choileanadh, tha socaidean lìn ag obair agus chan eil ìre tèarainteachd nas ìsle aca na teisteanas.

Mar a cheangail sinn aig ZeroTech Apple Safari agus teisteanasan teachdaiche le websockets

Source: www.habr.com

Ceannaich aoigheachd earbsach airson làraich le dìon DDoS, frithealaichean VPS VDS 🔥 Ceannaich aoigheachd làrach-lìn earbsach le dìon DDoS, frithealaichean VPS VDS | ProHoster