„Jenkins“ galima atidaryti per VPN ir vis tiek matyti, kad „GitHub“ praneša apie nepavykusį webhook, nes tai dvi skirtingos jungtys su dviem skirtingais savininkais. Naršyklė keliauja tuneliu, kurį suderino jūsų nešiojamasis kompiuteris; „GitHub“ pristatymo tarnyba prasideda viešajame internete ir neturi kelio į privatų tinklą. Prieiga prie saugyklos to nekeičia, nors pats „Jenkins“ gali be vargo imti iš tos pačios saugyklos. Pasirinkite įėjimą, relę arba apklausą, tada patikrinkite kelią, kuriuo įvykis iš tikrųjų eina.

Naršyklės sesija įrodo tik vieną kryptį

VPN jungtis atsako į vieną klausimą: ar šis nešiojamasis kompiuteris pasiekia vidinį serverį. Webhook pristatymas klausia kito: ar išorinė tarnyba gali atidaryti jungtį į tą serverį. Tai, kad „Jenkins“ ima iš saugyklos, yra išeinantis srautas ir nieko nesako apie įeinančią pasiekiamumą. Laikykite abi kryptis atskirose diagramos eilutėse, įskaitant tai, kuri pusė kiekvieną pradeda.

Prieš ką nors keisdami perskaitykite pristatymo įrašą. Skirtasis laikas, jungties atstatymas ir priimta užklausa, kuri neatitiko jokios užduoties, turi tris skirtingus savininkus: tinklą, tarpinį serverį ir trigerio konfigūraciją.

A variantas: atidarykite siaurą prieigą

Jei organizacija jau skelbia patvirtintą įėjimą, atidarykite webhook kelią, o ne valdymo skydelį. Paprastai tai reiškia atvirkštinio tarpinio serverio taisyklę, kuri priima POST į kablio URL ir perduoda juos „Jenkins“, o administravimo sąsaja lieka nepasiekiama iš išorės.

curl -sS -o /dev/null -w "%{http_code}\n" -X POST https://jenkins.example.com/github-webhook/

Atlikite šį bandymą iš tinklo be VPN prieigos, nes sėkmė tunelio viduje nieko neįrodo. Prieiga turėtų atmesti užklausas be bendros paslapties, kurią „GitHub“ siunčia kaip parašo antraštę, ir priimti tik tą vieną kelią bei metodą, kuriuos paskelbėte. Vieša „Jenkins“ konsolė nėra webhook sprendimas; tai incidentas, laukiantis kito skaitytuvo. Apribokite taisyklę pakankamai siaurai, kad likusi programos dalis išlaikytų ankstesnes prieigos kontrolės priemones.

B variantas: apverskite kryptį rele

Kai įeinantis atvėrimas nebus patvirtintas, mažas klientas tinkle gali palaikyti išeinančią jungtį su rele ir gauti persiųstus įvykius. Tada relė tampa pristatymo kelio dalimi, todėl jos prieinamumas ir autentifikavimas yra tokie pat svarbūs kaip kūrimo užduotis.

ssh -N -R 9000:localhost:8080 relay.example.net

„Jenkins“ gairės apie webhook už ugniasienių aprašo šią formą, ir verta jas perskaityti prieš rašant savo persiuntėją. Užbaikite TLS releje, patikrinkite parašą prieš įvykiui pasiekiant užduotį ir stebėkite išeinančią jungtį, nes nutrūkęs tunelis atrodo lygiai taip pat kaip niekada neišsiųstas įvykis. Taip pat patvirtinkite, kad relė išsaugo užklausos turinį baitas po baito, nes parašo patikros nepavyksta su JSON, kuris kelyje buvo išanalizuotas ir iš naujo užkoduotas.

C variantas: užklauskite saugyklą

Apklausa keičia delsą į paprastumą ir visai nereikalauja įeinančio kelio. „Jenkins“ gali apklausti pagal grafiką, arba maža užduotis gali paklausti API ir pradėti kūrimą, kai pamato nepažįstamą versiją.

curl -sS -u "$USER:$TOKEN" "https://api.github.com/repos/OWNER/REPO/commits?per_page=1"

Kiekviena apklausa eikvoja API iškvietimus ir prideda delsą tarp push ir kūrimo, o tai pastebima užimtose saugyklose ir bendruose greičio limituose. Jai taip pat reikia prisijungimo duomenų, saugomų ten, kur veikia apklausėjas, todėl apribokite prieigos raktą tik skaitymo prieiga prie saugyklos ir keiskite jį kaip bet kurią kitą paslaptį. Rinkitės tai, kai įvykių apimtis maža arba kai įėjimas niekada nebus patvirtintas, ir parašykite tai užduoties aprašyme, kad vėliau niekas nesistebėtų, kodėl kūrimai vėluoja.

Priimkite tikrą pristatymą, o ne puslapio įkėlimą

Kad ir kokį variantą pasirinktumėte, priėmimo testas yra šaltinio platformos siunčiamas įvykis, o ne naršyklės skirtukas, atidarytas iš privilegijuoto nešiojamojo kompiuterio. Nusiųskite tuščią commit į laikiną šaką ir perskaitykite pristatymo atsakymo kodą, relės žurnalą arba apklausos užduoties išvestį, būtent tokia tvarka. 200 iš prieigos be kūrimo reiškia, kad trigerio filtras neteisingas; skirtasis laikas reiškia, kad kelias vis dar uždarytas. Užrašykite, kuris iš trijų sprendimų naudojamas, nes kitaip kitas derintojas pakartos naršyklės testą ir pateks į tą pačią aklavietę.

Taikykite tą pačią logiką mokėjimų atgaliniams iškvietimams ir kitiems išoriniams pranešimams: kiekvienam reikia savo kelio į privačią programą, net kai kiekvienas žmogus jau turi VPN sesiją. Pristatymo kelias priklauso programos dizainui, o ne išnašai apie tinklus.

Susiję straipsniai