Како ЕкпрессВПН држи своје веб сервере закрпљеним и сигурним

ЕкпрессВПН сервер издиже се из пепела.

Овај чланак објашњава ЕкпрессВПН-ов приступ управљање сигурносном закрпом за инфраструктуру која покреће ЕкпрессВПН веб локацију (а не ВПН сервери). Генерално, наш приступ безбедности је:

  1. Направите системе веома тешко за хаковање.
  2. Минимизирајте потенцијалну штету ако се систем хипотетски поквари и призна чињеницу да се неки системи не могу учинити савршено безбедним. Обично ово почиње у фази архитектонског дизајна, где минимизирамо приступ апликацији.
  3. Смањите количину времена да систем може остати угрожен.
  4. Провјерите ове тачке са редовним пентестима, унутрашњим и спољашњим.

Сигурност је уграђена у нашу културу и главна је брига која води наш сав рад. Постоје и многе друге теме као што су праксе развоја софтверског софтвера, безбедност апликација, процеси и обука запослених итд., Али оне су ван овог оквира за овај пост.

Овде објашњавамо како постижемо следеће:

  1. Осигурајте да су сви сервери у потпуности закрпани и никада више од 24 сата иза објављивања ЦВЕ-а.
  2. Осигурајте да се ниједан сервер никада не користи дуже од 24 сата, на тај начин се поставља горња граница времена које нападач може да истраје.

Оба циља остварујемо путем анкете аутоматизовани систем који обнавља сервере, почевши од ОС-а и свих најновијих закрпа, и уништава их најмање једном у 24 сата.

Намјера овог чланка је да буде корисна другим програмерима који се суочавају са сличним изазовима и дајемо транспарентност у пословању ЕкпрессВПН-а нашим купцима и медијима..

Како користимо Ансибле плаибоокс и Цлоудформатион

Веб инфраструктура ЕкпрессВПН-а хостирана је на АВС-у (за разлику од наших ВПН сервера који раде на наменском хардверу) и ми користимо његове функције да бисмо омогућили поновну изградњу.

Читава наша веб инфраструктура опремљена је Цлоудформатион-ом и трудимо се да аутоматизујемо што више процеса. Међутим, сматрамо да је рад са сировим шаблонима Цлоудформације прилично непријатан због потребе за понављањем, опћенито лошом читљивошћу и ограничењима ЈСОН или ИАМЛ синтаксе.

Да бисмо то ублажили, користимо ДСЛ зван цлоудформатион-руби-ДСЛ који нам омогућава писање дефиниција шаблона у Руби и извоз шаблона Цлоудформатион у ЈСОН.

Конкретно, ДСЛ нам омогућава да записујемо корисничке скрипте као редовне скрипте које се аутоматски претварају у ЈСОН (а не пролазе кроз болни процес прављења сваког ретка скрипте у ваљани ЈСОН низ).

Генеричка улога Ансибле која се зове цлоудформатион-инфраструктура брине се да стварни предложак постане привремена датотека, коју потом користи модул облачења одговора:

– наме: ‘рендер {{компонента}} стак облак информација јсон’
љуска: ‘рубин "{{темплате_наме | подразумевано (компонента)}}. рб" проширивање –стацк-наме {{стацк}} – регија {{авс_регион}} > {{темпфиле_патх}} ‘
аргс:
цхдир: ../цлоудформатион/темплатес
цханге_вхен: фалсе

– наме: ‘цреате / упдате {{компонента}} стог’ ‘
цлоудформатион:
стацк_наме: ‘{{стацк}} – {{кв_енв_наме}} – {{компонента}}’
стање: присутан
регион: ‘{{авс_регион}}’
темплате: ‘{{темпфиле_патх}}’
темплате_параметерс: ‘{{темплате_параметерс | Уобичајено({}) }}’
стацк_полици: ‘{{стацк_полици}}’
регистер: цф_ресулт

У књизи плаибоок-а неколико пута зовемо облачно-инфраструктурну улогу са различитим компонентама променљивих да створимо неколико ЦлоудФОРМ-ова. На пример, имамо мрежни низ који дефинише ВПЦ и сродне ресурсе и стацк апликације који дефинише групу за аутоматско скалирање, конфигурацију покретања, куке за животни циклус итд..

Затим користимо помало ружан, али користан трик да излаз модула облачења претворимо у варијабле Ансибле за наредне улоге. Морамо да користимо овај приступ јер Ансибле не дозвољава стварање променљивих са динамичким именима:

– укључују: _темпфиле.имл
– копија:
садржај: ‘{{компонента | регек_реплаце ("-", "_")}} _ стог: {{цф_ресулт.стацк_оутпутс | то_јсон}} ‘
дест: ‘{{темпфиле_патх}}. јсон’
но_лог: истина
цханге_вхен: фалсе

– инцлуде_варс: ‘{{темпфиле_патх}}. јсон’

Ажурирање ЕЦ2 групе за аутоматско скалирање

Веб локација ЕкпрессВПН хостирана је на више ЕЦ2 инстанци у групи за аутоматско скалирање иза апликационог балансатора који омогућава да уништимо сервере без икаквог застоја јер балансирање оптерећења може да испразни постојеће везе пре него што инстанца престане.

Цлоудформатион оркестрира цјелокупну обнову и покрећемо горе описану књигу Ансибле свака 24 сата да обновимо све инстанце користећи аутоСцалингРоллингУпдате УпдатеПолици атрибут АВС :: АутоСцалинг :: АутоСцалингГроуп ресурс.

Када се једноставно оперише више пута без икаквих промена, атрибут УпдатеПолици се не користи – позива се само у посебним околностима као што је описано у документацији. Једна од тих околности је ажурирање конфигурације покретања аутоматског скалирања – предложак који група за аутоматско скалирање користи за покретање ЕЦ2 инстанци – која укључује скрипту корисничких података ЕЦ2 која ради на креирању нове инстанце:

ресурс ‘АппЛаунцхЦонфигуратион’, Тип: ‘АВС :: Аутоматско скалирање: ЛаунцхЦонфигуратион’,
Својства: {
КеиНаме: парам (‘АппСерверКеи’),
ИмагеИд: парам (‘АппСерверАМИ’),
ИнстанцеТипе: парам (‘АппСерверИнстанцеТипе’),
СецуритиГроупс: [
парам (‘СецуритиГроупАпп’),
],
ИамИнстанцеПрофиле: парам (‘ОбновиИамИнстанцеПрофиле’),
ИнстанцеМониторинг: тачно,
БлоцкДевицеМаппингс: [
{
ДевицеНаме: ‘/ дев / сда1’, # коријенска запремина
Ебс: {
ВолумеСизе: парам (‘АппСерверСторагеСизе’),
ВолумеТипе: парам (‘АппСерверСторагеТипе’),
ДелетеОнТерминација: тачно,
},
},
],
УсерДата: басе64 (интерполат (датотека (‘скрипте / апп_усер_дата.сх’))),
}

Ако извршимо било какво ажурирање скрипте корисничких података, чак и коментар, конфигурација покретања ће се сматрати измењеном, а Цлоудформатион ће ажурирати све инстанце у групи за аутоматско скалирање у складу са новом конфигурацијом покретања..

Захваљујући цлоудформатион-руби-ДСЛ и његовој интерполацијској услужној функцији, можемо користити референце Цлоудформатион у скрипти апп_усер_дата.сх:

реадонли ребуилд_тиместамп ="{{парам (‘РебуилдТиместамп’)}}"

Овај поступак осигурава да нова конфигурација покретања буде нова када се покрене поновна инсталација.

Куке за животни циклус

Користимо куке за животни циклус аутоматског скалирања како бисмо били сигурни да су наши примери у потпуности предвиђени и прошли потребне здравствене прегледе пре него што крену уживо.

Кориштење кука за животни циклус омогућава нам да имамо исти животни циклус инстанције и када покренемо ажурирање помоћу Цлоудформатион-а и када се догоди догађај аутоматског скалирања (на примјер, када инстанца не успије проверити здравствени преглед ЕЦ2 и престане с радом). Не користимо цфн-сигнал и ВаитОнРесоурцеСигналс смернице за ажурирање аутоматског скалирања јер се примењују само када Цлоудформатион активира ажурирање.

Када група за аутоматско скалирање створи нову инстанцу, активира се ЕЦ2_ИНСТАНЦЕ_ЛАУНЦХИНГ кука за животни циклус и аутоматски ставља инстанцу у стање чекања: Чекајте.

Након што је инстанца у потпуности конфигурирана, започиње ударање властитих крајњих тачака здравствене провјере увијањем из скрипте корисничких података. Једном када здравствени прегледи пријаве да је апликација здрава, издајемо НАСТАВУ радњу за овај кук за животни циклус, тако да се инстанца везује за баланс терета и почиње да служи за саобраћај.

Ако здравствени прегледи не успију, издајемо АБАНДОН радњу којом се укида неисправна инстанца, а група за аутоматско скалирање покреће још једну.

Поред тога што не успева да прође здравствене провере, наша скрипта корисничких података можда неће успети у другим тачкама – на пример, ако привремени проблеми са повезивањем спречавају инсталацију софтвера.

Желимо да стварање нове инстанце пропадне чим схватимо да то никада неће постати здраво. Да бисмо то постигли, поставили смо замку ЕРР-а у скрипту корисничких података заједно са сет -о ерртраце да позовемо функцију која шаље радњу АБАНДОН-овог животног циклуса тако да се неисправна инстанца може што пре окончати..

Кориснички скрипти података

Скрипта корисничких података одговорна је за инсталирање свих потребних софтвера на инстанцу. Успјешно смо користили инстанце Ансибле до пружања и Цапистрано да распоређујемо апликације дуго времена, тако да их и ми овде користимо, омогућавајући минималну разлику између обичних расположивих и поновних изградњи.

Скрипта корисничких података провјерава наше спремиште апликација из Гитхуб-а, које укључује скрипте за пружање одговора, затим покреће Ансибле и Цапистрано је указао на лоцалхост.

Приликом провјере кода, морамо бити сигурни да је тренутно имплементирана верзија апликације имплементирана током поновне обнове. Скрипта Цапистрано имплементације укључује задатак који ажурира датотеку у С3 која чува тренутно имплементирану СХА команду. Када се поновна обнова догоди, систем преузима везу која би требала бити распоређена из те датотеке.

Ажурирања софтвера примењују се покретањем без надзора надградње у првом плану помоћу наредбе без надзора надградње -д. Након завршетка, инстанца се поново покреће и започиње здравствене провере.

Суочавање са тајнама

Серверу је потребан привремени приступ тајнама (попут лозинке Ансибле трезора) које су преузете из трговине ЕЦ2 Параметер. Послужитељ може да приступи тајнама само кратко време током поновне обнове. Након дохваћања, одмах заменимо почетни профил инстанце другим, који има приступ ресурсима који су потребни за покретање апликације.

Желимо да избегнемо чување било какве тајне у трајној меморији инстанције. Једина тајна коју спремамо на диск је Гитхуб ССХ кључ, али не и његова лозинка. Ни лозинку за трезор Ансибле не чувамо.

Међутим, ове лозинке морамо да проследимо ССХ-у и Ансибле-у, а то је могуће само у интерактивном режиму (тј. Услужни програм од корисника тражи да унесе лозинке ручно) из доброг разлога – ако је лозинка део наредбе, сачувани у историји љуске и могу бити видљиви свим корисницима у систему ако покрећу пс. Користимо услужни програм за очекивање да аутоматизујемо интеракцију са тим алатима:

оцекујем << ЕОФ
цд $ {репо_дир}
спавн маке ансибле_лоцал енв = $ {имплементирати} стацк = $ {стацк} хостнаме = $ {сервер_хостнаме}
подесите временски период 2
очекујте „Лозинку трезора“
пошаљи "$ {ваулт_пассворд} \ р"
поставити временски прекид 900
оцекујем {
"недоступно = 0 није успело = 0" {
излаз 0
}
еоф {
излаз 1
}
пауза у утакмици {
излаз 1
}
}
ЕОФ

Покретање обнове

Будући да покрећемо обнову покретањем исте скрипте Цлоудформатион која се користи за креирање / ажурирање наше инфраструктуре, морамо се побринути да случајно не ажурирамо део инфраструктуре који не би требало да се ажурира током обнове.

То постижемо постављањем рестриктивне политике за слагање на наше столове Цлоудформатион, тако да се ажурирају само ресурси потребни за обнову:

{
"Изјава" : [
{
"Ефекат" : "Дозволи",
"поступак" : "Ажурирање: Измените",
"Директор": "*",
"Ресурс" : [
"ЛогицалРесоурцеИд / * АутоСцалингГроуп"
] },
{
"Ефекат" : "Дозволи",
"поступак" : "Ажурирање: Замените",
"Директор": "*",
"Ресурс" : [
"ЛогицалРесоурцеИд / * ЛаунцхЦонфигуратион"
] }
] }

Кад требамо извршити стварна ажурирања инфраструктуре, морамо ручно ажурирати политику слагања да бисмо експлицитно омогућили ажурирања тих ресурса.

Будући да се наша имена хостова и ИП адресе сваког дана мењају, имамо скрипту која ажурира наше локалне инвентарне јединице и ССХ конфигурације. Открива инстанције путем АВС АПИ-а по ознакама, враћа инвентар и конфигурише датотеке из ЕРБ предложака и додаје нове ИП-ове ССХ-овим познатим_хостима.

ЕкпрессВПН слиједи највише стандарде сигурности

Обнова сервера нас штити од специфичне претње: нападачи добијају приступ нашим серверима преко рањивости кернел / софтвера.

Међутим, ово је само један од многих начина за очување наше инфраструктуре, укључујући, али не ограничавајући се на редовне ревизије безбедности и чинећи критичне системе недоступним са интернета.

Уз то, осигуравамо да сви наши кодекси и унутрашњи процеси слиједе највише стандарде сигурности.

Kim Martin
Kim Martin Administrator
Sorry! The Author has not filled his profile.
follow me