Kuinka ExpressVPN pitää verkkopalvelimet paikallaan ja turvallisina

[ware_item id=33][/ware_item]

ExpressVPN-palvelin nousee tuhkasta.


Tässä artikkelissa selitetään ExpressVPN: n lähestymistapa ExpressVPN-verkkosivustoa ylläpitävän infrastruktuurin tietoturvakorjauksen hallinta (ei VPN-palvelimia). Yleensä lähestymistapamme turvallisuuteen on:

  1. Tee järjestelmistä hyvin vaikea hakata.
  2. Minimoi mahdolliset vauriot jos järjestelmä hypoteettisesti hakkeroidaan, ja tunnusta tosiasia, että joitain järjestelmiä ei voida tehdä täysin turvallisiksi. Tyypillisesti tämä alkaa arkkitehtisuunnitteluvaiheessa, jossa minimoimme sovelluksen pääsyn.
  3. Minimoi aika että järjestelmä voi pysyä vaarantuneena.
  4. validate nämä kohdat säännöllisillä penteillä, sekä sisäisillä että ulkoisilla.

Turvallisuus on juurtunut kulttuurimme ja on ensisijainen huolenaihe kaikessa työssämme. On monia muita aiheita, kuten tietoturvaohjelmistojen kehittämiskäytäntömme, sovellusten tietoturva, työntekijöiden prosessit ja koulutus jne., Mutta ne eivät kuulu tämän viestin piiriin.

Tässä selitetään kuinka saavutamme seuraavat:

  1. Varmista, että kaikki palvelimet ovat kunnolla paikoillaan eikä koskaan yli 24 tuntia CVE-julkaisujen takana.
  2. Varmista, että mitään palvelinta ei koskaan käytetä yli 24 tunnin ajan, asettamalla siten ylärajan ajalle, jonka hyökkääjällä voi olla pysyvyys.

Saavutamme molemmat tavoitteet automatisoitu järjestelmä, joka rakentaa palvelimet uudelleen käyttöjärjestelmästä ja kaikista uusimmista korjauksista lähtien ja tuhoaa ne vähintään kerran 24 tunnissa.

Tämän artikkelin tarkoitus on olla hyödyllinen muille kehittäjille, jotka kohtaavat samanlaisia ​​haasteita, ja antaa avoimuuden ExpressVPN: n toiminnalle asiakkaillemme ja tiedotusvälineille.

Kuinka me käytämme mahdollisia selkokopioita ja pilvien muodostumista

ExpressVPN: n verkkoinfrastruktuuri isännöidään AWS: ssä (toisin kuin VPN-palvelimilla, jotka toimivat erillisellä laitteistolla), ja hyödynnämme sen ominaisuuksia voimakkaasti uudelleenrakentamisen mahdollistamiseksi.

Koko verkkoinfrastruktuurimme on varustettu pilviformaation avulla, ja yritämme automatisoida mahdollisimman monta prosessia. Havaitsemme kuitenkin, että käsittelemättömien pilviformaattimallien kanssa työskenteleminen on melko epämiellyttävää toistojen tarpeen, yleisen huonon luettavuuden ja JSON- tai YAML-syntaksin rajoitusten vuoksi.

Tämän lieventämiseksi käytämme DSL-tekniikkaa, nimeltään cloudformation-ruby-dsl, jonka avulla voimme kirjoittaa mallimääritelmiä Rubyssa ja viedä Cloudformation-malleja JSON: iin.

Erityisesti DSL antaa meille mahdollisuuden kirjoittaa käyttäjän dataskriptejä tavallisina skripteinä, jotka muunnetaan automaattisesti JSON: ksi (eikä käy läpi tuskallista prosessia, jossa skriptin jokaisesta rivistä tehdään kelvollinen JSON-merkkijono).

Yleinen Ansible-rooli, nimeltään cloudformation-infrastruktuuri, huolehtii todellisen mallin tekemisestä väliaikaiseksi tiedostoksi, jota sitten käytetään cloudformation Ansible -moduuliin:

- nimi: 'render {{komponentti}} pino pilvi muodossa json'
kuori: 'rubiini "{{mallinimi | oletus (komponentti)}}. rb" laajenna - pino-nimi {{pino}} - alue {{aws_region}} > {{tempfile_path}} '
args:
chdir: ../luettelotiedot / mallit
muutettu: kun väärä

- nimi: 'luo / päivitä {{komponentti}} pino'
cloudformation:
pinon_nimi: '{{pino}} - {{xv_env_name}} - {{komponentti}}'
tila: läsnä
alue: '{{aws_region}}'
malli: '{{tempfile_path}}'
malliparametrit: '{{malliparametrit | oletus ({})}} '
stack_policy: '{{stack_policy}}'
rekisteröi: cf_result

Kutsumme pelikirjaan pilviformaation-infrastruktuuriroolia useita kertoja eri komponenttimuuttujilla useiden pilviformaattien muodostamiseksi. Esimerkiksi, meillä on verkkopino, joka määrittelee VPC: n ja siihen liittyvät resurssit, ja sovelluspino, joka määrittelee automaattisen skaalausryhmän, käynnistysasetukset, elinkaarikoukut jne..

Käytämme sitten jonkin verran rumaa, mutta hyödyllistä temppua kääntääksesi pilviformaattimoduulin tulokset mahdollisiksi muuttujiksi seuraaville rooleille. Meidän on käytettävä tätä lähestymistapaa, koska Ansible ei salli dynaamisten nimien muuttujien luomista:

- sisältävät: _tempfile.yml
- kopio:
sisältö: '{{komponentti | regex_replace ("-", "_")}} _ pino: {{cf_result.stack_out output | to_json}} '
dest: '{{tempfile_path}}. json'
no_log: totta
muutettu: kun väärä

- include_vars: '{{tempfile_path}}. json'

Päivitetään EC2-automaattista skaalausryhmää

ExpressVPN-verkkosivustoa ylläpidetään useissa EC2-tapauksissa Auto Scaling -ryhmässä Application Load Balancer -sovelluksen takana, joka antaa meille mahdollisuuden tuhota palvelimia ilman seisokkeja, koska kuormituksen tasapainottaja voi tyhjentää olemassa olevat yhteydet ennen ilmentymän päättymistä.

Pilviformaatiot järjestävät koko uudelleenrakennuksen, ja käynnistämme yllä kuvatun mahdollisen pelikirjan joka 24. tunti kaikkien instanssien uudelleenrakentamiseksi hyödyntämällä AWS :: AutoScaling :: AutoScalingGroup -resurssin AutoScalingRollingUpdate UpdatePolicy -ominaisuutta.

Kun UpdatePolicy-määrite vain laukaistaan ​​toistuvasti ilman muutoksia, sitä ei käytetä - siihen kutsutaan vain erityisissä olosuhteissa, kuten dokumentaatiossa kuvataan. Yksi näistä olosuhteista on päivitys automaattisen skaalauksen käynnistysmääritykseen - malli, jota automaattinen skaalausryhmä käyttää EC2-ilmentymien käynnistämiseen - joka sisältää EC2-käyttäjän tietokomentosarjan, joka luo uuden ilmentymän luomisen:

resurssi 'AppLaunchConfiguration', tyyppi: 'AWS :: AutoScaling :: LaunchConfiguration',
Ominaisuudet: {
KeyName: param ('AppServerKey'),
ImageId: param ('AppServerAMI'),
EsimerkkiTyyppi: param ('AppServerInstanceType'),
SecurityGroups: [
param ( 'SecurityGroupApp'),
],
IamInstanceProfile: param ('RebuildIamInstanceProfile'),
Esimerkkivalvonta: totta,
BlockDeviceMappings: [
{
DeviceName: '/ dev / sda1', # juuren tilavuus
Ebs: {
VolumeSize: param ('AppServerStorageSize'),
VolumeType: param ('AppServerStorageType'),
DeleteOnTermination: totta,
},
},
],
UserData: base64 (interpolointi (tiedosto ('skriptit / app_user_data.sh'))),
}

Jos teemme päivityksiä käyttäjän tietokomentosarjaan, jopa kommentin, käynnistysmääritystä pidetään muuttuneena ja Cloudformation päivittää kaikki automaattisen skaalausryhmän ilmentymät uuden käynnistysmäärityksen mukaiseksi.

Cloudformation-ruby-dsl: n ja sen interpoloidun apuohjelmatoiminnon ansiosta voimme käyttää Cloudformation-viitteitä app_user_data.sh-komentosarjasta:

readonly rebuild_timestamp ="{{param ('RebuildTimestamp')}}"

Tämä menettely varmistaa, että käynnistyskonfiguraatiomme on uusi joka kerta, kun uudelleenrakennus käynnistetään.

Elinkaarikoukut

Käytämme automaattisen skaalauksen elinkaarikoukkuja varmistaaksemme, että tapauksemme ovat täysin varusteltuja ja läpäistämme vaadittavat terveystarkastukset ennen niiden käyttöönottoa.

Elinkaarikoukkujen käyttäminen antaa meille saman ilmentymän elinkaaren sekä käynnistettäessä päivityksen pilviformaation yhteydessä että kun tapahtuu automaattinen skaalaustapahtuma (esimerkiksi kun ilmentymä epäonnistuu EC2: n terveystarkastuksessa ja päättyy). Emme käytä cfn-signaalia ja WaitOnResourceSignals automaattisen skaalauksen päivityskäytäntöä, koska niitä käytetään vain silloin, kun Cloudformation käynnistää päivityksen.

Kun automaattinen skaalausryhmä luo uuden ilmentymän, EC2_INSTANCE_LAUNCHING elinkaaren koukku laukaistaan, ja se asettaa ilmentymän automaattisesti odottamaan: odota -tilaan.

Kun ilmentymä on täysin määritetty, se alkaa lyödä omia terveystarkastuksen päätepisteitä käpristymällä käyttäjän tietokomentosarjasta. Kun terveystarkastukset ilmoittavat sovelluksen olevan terveellinen, suoritamme JATKA-toiminto tälle elinkaaren koukulle, joten ilmentymä kiinnittyy kuorman tasapainottajaan ja alkaa palvella liikennettä.

Jos terveystarkastukset epäonnistuvat, annamme ABANDON-toiminnon, joka lopettaa viallisen ilmentymän, ja automaattinen skaalausryhmä käynnistää toisen.

Terveystarkistusten läpäisemättömyyden lisäksi käyttäjän tietoskriptimme saattaa epäonnistua muissakin kohdissa - esimerkiksi jos väliaikaiset yhteysongelmat estävät ohjelmiston asentamisen.

Haluamme uuden esimerkin luomisen epäonnistuvan heti, kun ymmärrämme, ettei se koskaan tule terveeksi. Tämän saavuttamiseksi asetamme ERR-loukun käyttäjän dataskriptiin yhdessä set -o-virheen kanssa kutsumaan toimintoa, joka lähettää ABANDON-elinkaaren toiminnan, jotta viallinen ilmentymä voi lopettaa mahdollisimman pian.

Käyttäjätietokomentosarjat

Käyttäjätietokomentosarja vastaa kaikkien tarvittavien ohjelmistojen asentamisesta ilmentymään. Olemme onnistuneesti käyttäneet Ansiblea tarjoamaan ilmentymiä ja Capistranoa sovellusten käyttöönottoon jo pitkään, joten käytämme niitä myös täällä, mahdollistaen pienen eron tavallisten asennusten ja uudelleenrakennuksien välillä.

Käyttäjätietokomentosarja tarkistaa sovellusvarastomme Githubista, joka sisältää Ansible-asennuskomentosarjat, suorittaa sitten Ansiblen ja Capistrano osoitti localhostille.

Koodia tarkistettaessa meidän on varmistettava, että sovelluksen nykyinen versio on asennettu uudelleenrakennuksen aikana. Capistrano-käyttöönottokomentosarja sisältää tehtävän, joka päivittää S3: n tiedoston, joka tallentaa parhaillaan käyttöön asetetun komennon SHA. Kun uudelleenrakentaminen tapahtuu, järjestelmä poimi kyseisestä tiedostosta sitoumuksen, jonka on tarkoitus ottaa käyttöön.

Ohjelmistopäivitykset otetaan käyttöön suorittamalla etualalla valvomaton päivitys ilman valvontaa-päivitys -d-komento. Kun valmis, ilmentymä käynnistyy uudelleen ja aloittaa terveystarkastukset.

Salaisuuksien käsittely

Palvelin tarvitsee väliaikaisen pääsyn salaisuuksiin (kuten mahdollinen holvitunnus), jotka noudetaan EC2-parametrikaupasta. Palvelin voi käyttää salaisuuksia vain lyhyen ajan uudelleenrakennuksen aikana. Kun ne on haettu, korvaamme välittömästi alkuperäisen ilmentymän profiilin toisella, jolla on pääsy vain resursseihin, joita tarvitaan sovelluksen suorittamiseen.

Haluamme välttää kaikenlaisten salaisuuksien tallentamisen ilmentymän pysyvään muistiin. Ainoa salaisuus, jonka tallennamme levylle, on Github SSH-avain, mutta ei sen tunnuslause. Emme myöskään tallenna Mahdollinen holvin salasana.

Meidän on kuitenkin välitettävä nämä tunnuslauseet vastaavasti SSH: lle ja Ansiblelle, ja se on mahdollista vain interaktiivisessa tilassa (ts. Apuohjelma kehottaa käyttäjää syöttämään tunnuslauseet manuaalisesti) hyvästä syystä - jos tunnuslause on osa komentoa, se on tallennetaan shell-historiaan ja voivat olla näkyvissä kaikille järjestelmän käyttäjille, jos he käyttävät ps: tä. Käytä odotettua apuohjelmaa automatisoidaksesi vuorovaikutuksen näiden työkalujen kanssa:

odottaa << EOF
cd $ {repo_dir}
spawn make ansible_local env = $ {deploy_env} stack = $ {stack} hostname = $ {server_hostname}
asetettu aikakatkaisu 2
odota 'holvin salasana'
lähettää "$ {Vault_password} \ r"
asetettu aikakatkaisu 900
odottaa {
"saavuttamaton = 0 epäonnistui = 0" {
poistu 0
}
eof {
poistuminen 1
}
Aikalisä {
poistuminen 1
}
}
EOF

Käynnistää jälleenrakennuksen

Koska käynnistämme uudelleenrakentamisen suorittamalla saman Cloudformation-skriptin, jota käytetään infrastruktuurimme luomiseen / päivittämiseen, meidän on varmistettava, että emme vahingossa päivitä jotakin osaa infrastruktuurista, jota ei ole tarkoitus päivittää uudelleenrakennuksen aikana.

Saavutamme tämän asettamalla rajoittavan pinokäytännön pilviformaattimille, joten vain uudelleenrakentamiseen tarvittavat resurssit päivitetään:

{
"selvitys" : [
{
"Vaikutus" : "Sallia",
"Toiminta" : "Päivitys: Muokkaa",
"pääasiallinen": "*",
"Resurssi" : [
"LogicalResourceId / * AutoScalingGroup"
]
},
{
"Vaikutus" : "Sallia",
"Toiminta" : "Päivitä: Korvaa",
"pääasiallinen": "*",
"Resurssi" : [
"LogicalResourceId / * LaunchConfiguration"
]
}
]
}

Kun meidän on tehtävä todellisia infrastruktuurin päivityksiä, meidän on päivitettävä pinokäytäntö manuaalisesti salliaksesi päivitykset näihin resursseihin nimenomaisesti.

Koska palvelimen isäntänimet ja IP muuttuvat päivittäin, meillä on skripti, joka päivittää paikalliset mahdolliset inventaario- ja SSH-kokoonpanomme. Se etsii esiintymät AWS-sovellusliittymän kautta tunnisteilla, tuottaa luettelon ja asetustiedostot ERB-malleista ja lisää uudet IP-osoitteet SSH ismert_hosteihin.

ExpressVPN noudattaa korkeimpia turvallisuusstandardeja

Palvelimien uudelleenrakentaminen suojaa meitä tietyiltä uhilta: hyökkääjät pääsevät palvelimillemme ytimen / ohjelmiston haavoittuvuuden kautta.

Tämä on kuitenkin vain yksi monista tavoista, joilla pidämme infrastruktuurimme turvassa, mukaan lukien, mutta niihin rajoittumatta, säännöllisten turvallisuustarkastuksien suorittaminen ja kriittisten järjestelmien tekeminen saavuttamatta Internetistä.

Lisäksi varmistamme, että kaikki koodi ja sisäiset prosessimme noudattavat korkeimpia turvallisuusstandardeja.

Kuinka ExpressVPN pitää verkkopalvelimet paikallaan ja turvallisina
admin Author
Sorry! The Author has not filled his profile.