Съдържание на курса

Vault от нулата (1): проблемът с тайните

От · основател и главен изпълнителен директор на Hábil ·

Обновено на 21 октомври 2026 г.

В петък в 18:04 една стажантка качва файл в GitHub. В 3:17 през нощта някой влиза в базата данни. Защо се случва, защо е толкова често и от какво има нужда една компания, за да не ѝ се случи.

Vault от нулата · сесия 1 от 4

Тази серия има четири сесии, по една на седмица. Научаваш как да пазиш пароли, ключове и други тайни в HashiCorp Vault, как да шифроваш данни, без ключът да е в програмата ти, и как да правиш така, че паролите на базите данни да се сменят сами. Всичко е през терминала: curl, psql, mariadb и Docker Compose. Единствената програма я пишеш накрая и тя е по-къса от 30 реда.

Сесия Какво виждаш Практика
1 — Проблемът с тайните Какво се обърква, когато паролите живеят във файлове, какво е нужно, за да се избегне, и какво е Vault Упражнения 1 до 5, с grep и git
2 — Стартиране на Vault и съхраняване на тайни Vault с Docker Compose, печатът (seal) и ключовете му, запис и четене на тайни с curl, права и одитен журнал Упражнения 6 до 10
3 — Шифроване, без да държиш ключа Механизмът Transit: шифроване, дешифроване и ротация на ключове; съхраняване в PostgreSQL на данни, които никой друг не може да чете Упражнения 11 до 15
4 — Пароли, които се сменят сами Потребители на база данни, които изтичат, пароли, които се ротират сами, и скрипт на Python, който не пази нито една парола Упражнения 16 до 20, самооценка и преговор на серията

Всяка сесия е от около 2 часа: горе-долу един за четене и следване на примера и още един за упражнения. От сесия 2 нататък всяка започва с 3 въпроса за преговор от предишната, на които отговаряш, без да гледаш.

Какво трябва да знаеш предварително: да работиш с терминала (да се движиш между папки, да създаваш файлове, да пускаш команди), основи на git (git add, git commit и git status; да знаеш, че „нов“ файл е такъв, който git още не познава) и основи на Docker (какво е образ и какво е контейнер, и docker compose up). Какво трябва да имаш днес: терминал и git версия 2.28 или по-нова (провери с git --version). Docker използваш от сесия 2.

През цялата серия ще следваш една история. Тя е сценарий: фирмата и хората са измислени. Данните от реалния свят, които се появяват в историята, са верни и всяка е с посочен източник.

Лабораторията на курса е в публичното хранилище github.com/HabilMX/lab-vault. В тази сесия още не ти трябва: в сесия 2 ти я изграждаш, файл по файл, а хранилището ти служи за сравнение. Няма нито една вградена парола; лабораторията ги генерира при стартиране.

Цели на тази сесия

Накрая ще можеш да направиш тези пет неща. До всяко е упражнението, което го доказва.

# Накрая можеш да… Доказва се с
1 Откриеш пароли и ключове, записани в конфигурационен файл, с grep Упражнение 1
2 Назовеш шестте най-често срещани начина, по които тайните изтичат, и свържеш всеки с онова, което го предотвратява Упражнение 2
3 Докажеш с git, че изтриването на файл не изтрива паролата от историята Упражнение 3
4 Защитиш файл .env, така че git да не го качва, и да го провериш Упражнение 4
5 Обясниш какво прави Vault, какво не прави и под какъв лиценз се ползва Упражнение 5

Сценарий (измислица) — Глава 1: петък, 18:04

Гуадалахара. Офисите на Canasta Morada, онлайн магазин за хранителни стоки: четиринайсет души, два буса и приложение, в което поръчваш тортили, яйца и сапун и ти ги носят за час.

Валерия е на 21 и от три месеца е стажантка. Днес завърши първия си истински екран: този на „моите поръчки“. Работи. Отне ѝ две седмици. Горда е.

Часът е 18:04. Има билети за концерт в 20:00. Отваря терминала и пише онова, което е писала сто пъти:

git add .
git commit -m "pantalla de mis pedidos"
git push

Точката след add означава „всичко“. Всичко, което има в папката. Включително един файл на име .env, където приложението пази конфигурацията си. А в този файл има един ред:

DB_PASSWORD=Tamal-Verde-2024

Това е паролата на базата данни на Canasta Morada. Тази на поръчките, клиентите, адресите.

Още една подробност: Валерия не е качила кода в частното хранилище на фирмата. Качила го е в едно копие, което е направила в личния си акаунт в GitHub, за да го показва в портфолиото си. А акаунтът ѝ е публичен.

Затваря лаптопа. Тръгва за концерта.

Никой не забелязва.


Глава 2: събота, 3:17 през нощта

Телефонът на Иван вибрира на нощното шкафче. Иван е единственият опитен разработчик в Canasta Morada; работи там от пет години. Алармата гласи: „Сървър на базата данни: използване на процесора 98%“.

Иван си мисли за някоя голяма поръчка. В събота в три сутринта никой не поръчва хранителни стоки, но кой знае. Заспива отново.

В 7:40 отваря лаптопа с кафе в ръка. Журналът на базата данни казва това:

03:17:02  conexión autorizada: usuario=app_tienda  origen=185.xx.xx.xx
03:17:05  SELECT * FROM clientes
03:21:40  SELECT * FROM pedidos

Потребителят е app_tienda. Това е потребителят на приложението. Паролата е правилната. За базата данни всичко е наред: някой е дошъл с верния ключ и е отворил вратата.

Но този адрес на произход не принадлежи на никой сървър на Canasta Morada.


Глава 3: събота, 9:00. Срещата

Доня Клара, собственичката, идва по анцуг. Там са Иван, Валерия — която почти не е спала и още не знае, че е била тя — и един лаптоп на масата.

— Кой е влязъл? — пита доня Клара.

Иван не знае какво да отговори. А причините, поради които не знае, са темата на тази сесия.

Първа следа. app_tienda не е човек. Това е паролата, която споделят приложението, уебсайтът, програмата, която праща поръчките към бусовете, и макросът в Excel, с който счетоводството извлича отчета за месеца. Четири програми. Освен това я знаят трима души. И Тоньо.

— Кой е Тоньо?

— Този, който беше преди мен. Напусна преди осем месеца.

— И още ли я знае?

— Никога не сме я сменяли.

Втора следа. — Тогава я сменете веднага — казва доня Клара.

Иван обяснява: ако смени паролата сега, и четирите програми спират едновременно. Трябва да се влезе във всяка, да се редактира файлът ѝ, да се рестартира. Събота е и има поръчки. А къде е записана паролата в макроса на Excel, никой не знае.

Трета следа. Валерия тихо пита за CURP. Приложението пази CURP на клиентите, които плащат с ваучери, и би трябвало да са шифровани.

— Да, шифровани са — казва Иван. — Ключът е на сървъра, във файл на име llave.txt.

— На същия сървър, на който са резервните копия?

Мълчание.


Глава 4: събота, 9:26

Иван отваря папката с резервните копия. Всяка нощ в 2:00 сървърът записва пълно копие на базата данни.

Копието от снощи е изтеглено в 3:21.

И съседната папка, тази с llave.txt, също.

В това копие са имената, адресите и CURP на осем хиляди клиенти.

(Продължава в сесия 2.)


Защо е важно: не е преувеличение

Историята на Canasta Morada е измислена. Онова, което ѝ се случва, не е. Тези случаи и цифри са реални и публични:

  • Всяка година в публичния GitHub се появяват милиони тайни. Компанията GitGuardian преглежда промените, качвани в публичния GitHub, и преброява паролите и ключовете, които намира. В доклада си за 2026 г. тя е преброила 28,65 милиона нови тайни, качени през 2025 г., с 34% повече от предишната година. И най-лошото: от идентификационните данни, които е намерила за валидни през 2022 г., над 64% още са работели, когато са проверени отново през януари 2026 г. С други думи, според GitGuardian тези данни никога не са били отстранени: изтеклата парола е отваряла вратата и години по-късно. Източник: GitGuardian, The State of Secrets Sprawl 2026.
  • Частното хранилище не те спасява. През 2016 г. нападатели влизат в акаунта в GitHub на инженери на Uber, като използват пароли, повторно ползвани от други течове. В частно хранилище намират ключ за достъп до Amazon Web Services. С него изтеглят данни за около 25,6 милиона имена и имейли и за около 607 000 шофьорски книжки. Случаят е документиран от Федералната търговска комисия на САЩ (FTC): анализ на случая Uber, 2018.
  • Една-едничка връзка може да отвори всичко. През 2023 г. компанията за сигурност Wiz открива в публично хранилище на изследователи на Microsoft връзка с разрешение за достъп до акаунт за съхранение. Разрешението не е било само за четене: било е за пълен контрол, изтичало е през 2051 г. и е позволявало да се виждат 38 терабайта, включително резервни копия на компютри и над 30 000 вътрешни съобщения в Teams. Източник: Wiz, 18 септември 2023 г..

GitGuardian съобщава още, че около 28% от инцидентите, които засича, не започват в кода, а в инструменти като Slack, Jira или Confluence. Паролата, залепена в чата „само за да я копираш“, също се брои.


Шестте начина, по които една тайна изтича

Преди да видим решенията, дай име на всеки проблем. Тайна (secret) е всяка стойност, която дава достъп до нещо: парола, ключ за шифроване, токен на API. Помисли за ключа от дома си: сам по себе си няма стойност, струва заради вратата, която отваря.

1. Паролата, записана в кода или във файл, който се качва

Това направи Валерия. Файлът .env е много полезен навик: отделя конфигурацията от кода. Но ако файлът пътува заедно с кода, отделянето не върши работа. Все едно да залепиш ключа от дома с тиксо за вратата, отвътре, и после да изпратиш снимки на вратата.

И има още един капан: в git изтриването не е изтриване. Git пази историята на всяка промяна. Ако си качил паролата и в следващата промяна я махнеш, тя остава в предишната. Ще го провериш в упражнение 3.

2. Файлът .env, който се предава през WhatsApp

— Ей, дай ми .env-а? — Ето. И там остава: в чата, в резервното копие на телефона и в компютъра на онзи, който е отворил WhatsApp Web в някое кафене. Всяко копие е още една врата, която никой не наблюдава.

3. Една и съща парола за всички и завинаги

В Canasta Morada четири програми и четирима души ползват app_tienda. Все едно катинарът на склада в едно училище, чиято комбинация знаят всички учители от 2019 г. Ако един ден нещо липсва, няма как да се разбере кой е отварял.

А понеже смяната ѝ чупи всичко едновременно, никой не я сменя. „Завинаги“ не е решение: това е, което се получава, когато промяната боли.

4. Никой не знае кой я е използвал

Базата данни е записала „влезе app_tienda“. Не е записала „влезе приложението“, нито „влезе Тоньо“, нито „влезе някой от друга държава с откраднатата парола“. Когато всички ползват една и съща самоличност, журналът помага малко.

5. Който си е тръгнал, още я знае

Тоньо си тръгна преди осем месеца, в добри отношения. Но отнесе в главата си паролата на базата данни, тази на пощенския сървър и тази на платежната сметка. Не е направил нищо лошо. Но и никой не може да гарантира това. А ако старият му лаптоп е продаден в Marketplace с конфигурационен файл вътре, това вече не зависи дори от него.

6. Ключът за шифроване до данните

Шифроването, накратко, е да смесиш една стойност с ключ, така че само който има ключа, да може да я прочете. Canasta Morada шифроваше CURP, да. Но беше сложила ключа в llave.txt, на същия сървър като резервните копия. Все едно да имаш сейф и да оставиш комбинацията на стикер отгоре му. Крадецът си отнесе и двете неща наведнъж.


Какво е необходимо

Ако беше на мястото на Иван и трябваше да проектираш как да работи Canasta Morada в понеделник, какво би поискал? Ето списъка, който съставя почти всеки екип по сигурност. Всяка точка се занимава с един или няколко от шестте проблема.

# Изискване Решава проблем Със думите на доня Клара
R1 Да се пазят тайните на едно място, шифровани, а не пръснати по файлове 1, 2 „Ключовете да живеят в сейф, а не в чекмеджетата“
R2 Достъп по самоличност и по право: всяка програма и всеки човек има собствени идентификационни данни и може да чете само онова, което му се полага 3, 4 „Всеки да си има ключ, а този на кухнята да не отваря сейфа“
R3 Одитен журнал: кой коя тайна е поискал, кога и дали са му я дали 4 „Да се записва кой е отварял“
R4 Идентификационни данни, които изтичат сами 3, 5 „Ключовете да се топят след известно време“
R5 Автоматична ротация: паролите да се сменят, без никой да редактира файлове 3, 5 „Смяната на ключалката да не налага затваряне на магазина“
R6 Отнемане наведнъж: ако нещо изтече, да се анулират всички засегнати идентификационни данни с една команда 5 „Бутон за паника“
R7 Шифроване като услуга: програмите искат „шифровай ми това“ и получават шифрованата стойност, но никога нямат ключа 6 „Ключът на сейфа никога да не излиза от банката“

Обърни внимание на нещо: никое от тези изисквания не казва „хората да са по-внимателни“. Валерия не е небрежна; тя е уморен човек в петък в шест вечерта. Добрият дизайн не зависи от това никой никога да не греши. Зависи от това, когато някой сгреши, вредата да е малка.


Какво е Vault

HashiCorp Vault е програма, която прави точно този списък. Работи като сървър; програмите и хората говорят с него по HTTP (например с curl) или с командата му vault.

Представи си Vault като трезор на банка с гише:

  • Ти не влизаш в трезора. Чакаш на гишето и искаш.
  • Касиерката проверява документа ти за самоличност (твоя token) и какво ти е позволено (твоята политика, policy).
  • Ако ти се полага, ти дава каквото си поискал. Ако не, казва ти „не“: 403.
  • Ако банката е включила журнала — във Vault го включваш ти —, всичко се записва.
  • А някои неща дори не ти ги връчва: даваш ѝ документа си, касиерката го запечатва в трезора и ти го връща запечатан. Печатът никога не излиза от банката. Това е шифроването като услуга.
Изискване Как го покрива Vault Къде го упражняваш
R1 Централизирано и шифровано съхранение Механизъм KV (от key-value, ключ-стойност): пази шифровани тайни; с KV v2 освен това пази версии Сесия 2
R2 Достъп по самоличност и политика Tokens и политики: всеки token прави само онова, което политиката му позволява; всичко останало е забранено Сесия 2
R3 Одит Одитни устройства (audit devices): след като ги включиш, почти всяка заявка и всеки отговор се записват в журнал, като чувствителните стойности са защитени Сесия 2
R4 Данни, които изтичат Lease (срок на валидност) с време на живот (TTL); механизъм Database с динамични потребители Сесия 4
R5 Автоматична ротация Статични роли на механизма Database с rotation_period (ротират се сами през определен период); и rotate-root за незабавна смяна на административната парола, с която Vault се свързва към базата Сесия 4
R6 Отнемане наведнъж Отнемане на един lease или на всички, които започват с даден префикс Сесия 4
R7 Шифроване като услуга Механизъм Transit: шифрова и дешифрова, ротира ключове и не пази твоите данни Сесия 3

Механизъм (secrets engine) е част от Vault, специализирана в един вид тайни, като гишетата на банката: едно за депозити, друго за чекове. Включваш онези, от които имаш нужда.


Какво Vault не е (и бележка за лиценза)

Vault не е HSM. HSM (hardware security module) е физическо устройство, което пази ключове и извършва операциите по шифроване вътре в себе си, със защита срещу злоупотреба. В зависимост от модела и конфигурацията ключовете може да е невъзможно да бъдат изнесени, а устройството може да изтрие съдържанието си, ако някой се опита да го отвори със сила. Банките ги използват например за PIN кодовете на картите.

Механизмът Transit на Vault прилича на това по начина на работа: ти изпращаш данни и получаваш шифровани данни, а ключът остава във Vault. Официалната документация го описва като „шифроване като услуга“ и уточнява, че Vault не пази данните, които му изпращаш (Transit, документация на Vault). Но Vault е софтуер, който работи на сървър, а не хардуер. А Transit позволява, ако го настроиш така, да създаваш ключове, които могат да се изнасят, или да внасяш собствени ключове; по подразбиране не позволява да се изнасят (ще го провериш в сесия 3).

Онова, което съществува: Vault Enterprise, платената версия, може да използва истински HSM, за да защити собствения си главен ключ и за да се отваря сам при стартиране, с оборудване, съвместимо със стандарта PKCS#11 (Vault HSM support). В тази серия ползваме общностната версия, която няма вградена такава възможност.

За лиценза. Дълги години Vault беше свободен софтуер с лиценз MPL 2.0. На 10 август 2023 г. HashiCorp обяви, че новите му версии преминават към Business Source License (BSL) 1.1 (съобщение на HashiCorp). Накратко: можеш да ползваш Vault безплатно във фирмата си, но има ограничения, ако искаш да предлагаш продукт, който конкурира HashiCorp. През февруари 2025 г. IBM завърши покупката на HashiCorp (съобщение на IBM).

Като отговор на смяната на лиценза част от общността взе последния отворен код и продължи по свой път: OpenBao, който днес е проект на OpenSSF, към Linux Foundation, с лиценз MPL 2.0 (openbao.org). Това се нарича fork, разклонение: като семейна рецепта, която се разделя, и всеки клон на семейството продължава да я прави по своему. Почти всичко, което научиш в тази серия, важи и за OpenBao; каретата по-долу казва какво се променя.

Vault и OpenBao: един и същ сейф, двама собственици

OpenBao тръгна от последния Vault със свободен лиценз, 1.14: BSL покрива „Vault Version 1.15.0 or later“ (лиценз на Vault). Оттам всеки върви по своя път:

HashiCorp Vault OpenBao
Лиценз BSL 1.1: позволява вътрешна употреба и в продукция; ограничава предлагането му като продукт, конкуриращ платената оферта на IBM MPL 2.0, свободен (лиценз на OpenBao)
Кой го поддържа IBM, собственикът на HashiCorp Общността, като проект на OpenSSF, към Linux Foundation (openbao.org)
Команда vault bao
Променливи VAULT_ADDR, VAULT_TOKEN BAO_ADDR, BAO_TOKEN; ако ги няма, чете VAULT_ (команди)
Образ hashicorp/vault openbao/openbao, в Docker Hub, Quay и регистъра за контейнери на GitHub (инсталиране); към 20 октомври 2026 г. най-новата е 2.7.1, от 1 октомври (версии)
Отделени пространства за всяка фирма (namespaces) Само в платената версия (Vault) Включени от 2.3, от 2025 г. (OpenBao)

В Hábil избрахме OpenBao, свободната версия, за да шифроваме документите на нашите системи: съвместим API, отворен лиценз и никаква зависимост от един-единствен доставчик.

Тази серия ползва официалния образ на HashiCorp Vault 2.2.0, с който е изпробвана всяка команда. В OpenBao извикванията с curl не се променят: пътищата започват с /v1/, а token-ът пътува в същата заглавна част X-Vault-Token (API на OpenBao). В командите vault се заменя с bao. Но смяната на имената не стига, заради три подробности:

  • Лабораторията пази данните със storage "file", а OpenBao 2.7 премахна тази опция (бележки към 2.7.0); там се ползва друга, например вграденото хранилище raft (хранилище).
  • Вътре в контейнера папките са /openbao/config, /openbao/file и /openbao/logs, а не /vault/... (Dockerfile на OpenBao).
  • Днес token-ите започват със s., b. или r., а не с hvs.; OpenBao предупреждава, че този формат може да се промени, така че не изграждай нищо, което зависи от префикса (tokens): търсенето на hvs., което ще видиш по-нататък, нямаше да ги намери.

Лабораторията не я пуснахме с OpenBao.


👉 Ако идваш от бизнес администрацията: шестте проблема в тази сесия са проблеми на вътрешния контрол, а не на програмирането. „Една и съща парола за всички“ е същото като „всички се подписват с един и същ печат“: ако излезе странен чек, няма към кого да се обърнеш. „Който си е тръгнал, още я знае“ е напускане на служител, което не е приключило докрай: отнел си му пропуска за сградата, но не и ключа от малката каса. Когато одитират системите във фирмата ти, въпросите от таблицата с изискванията (кой има достъп? записва ли се? изтича ли? може ли да се анулира наведнъж?) са същите, които би задал за подписите на една банкова сметка.


Упражнения към сесия 1

Решенията са в края на този брой. Всяко упражнение ти казва как да провериш сам дали ти е излязло.

Упражнение 1 — Лов на тайни с grep. Създай файл config-tienda.yaml с това съдържание (всички стойности са измислени):

# Configuración de la app de la tienda
app:
  nombre: tienda-en-linea
  puerto: 8080
base_de_datos:
  servidor: db.ejemplo.local
  usuario: app_tienda
  password: Tamal-Verde-2024
pagos:
  url: https://pagos.ejemplo.local/v1
  api_key: pk_prueba_51HcXyZ-esto-es-inventado
correo:
  servidor: smtp.ejemplo.local
  conexion: smtp://avisos:Churro99@smtp.ejemplo.local:587
cifrado:
  llave_aes: MDEyMzQ1Njc4OUFCQ0RFRg==
reportes:
  hora: "06:00"
  clave_sms: Elote-2023

Първо на око: колко тайни виждаш? Запиши го на хартия. След това пусни това търсене. grep търси текст във файлове; -n показва номера на реда, -i пренебрегва главните и малките букви, а -E позволява да ползваш |, за да кажеш „това или онова“:

grep -niE 'pass|key|llave|secret|token|://[^/ ]+:[^@ ]+@' config-tienda.yaml

Последната част, ://[^/ ]+:[^@ ]+@, търси адреси, които носят вътре потребител и парола, като smtp://usuario:contraseña@servidor.

а) Колко реда намери grep? Съвпада ли с броя на око? б) Има една тайна, която grep не намери. Коя? Промени шаблона така, че да я намира и нея.

Как проверяваш: с оригиналния шаблон grep -c (който брои редовете, вместо да ги показва) трябва да даде 4. С поправения шаблон трябва да даде 5.

Упражнение 2 — Свържи. За всяка ситуация запиши кой от шестте проблема е и кое изискване (R1 до R7) го предотвратява. Може да има повече от едно изискване.

а) Един стажант приключва стажа си. Три месеца по-късно потребителят му в базата данни още работи. б) Ключът за дешифриране на картите на клиентите е в променлива на същата програма, която ги пази. в) Някой е изтрил таблица. Журналът казва, че е бил admin, а потребителят admin се ползва от петима души. г) За да е „по-бързо“, ръководителят залепя паролата на сървъра в общия канал на Slack.

Как проверяваш: сравни с решенията. Ако някъде си посочил друго изискване, провери дали наистина го предотвратява, или само го прави по-малко тежко.

Упражнение 3 — В git изтриването не е изтриване. В нова празна папка изпълни това ред по ред. Двата реда с git config казват на git кой си; без тях на току-що купен компютър git commit отказва да работи. Важат само за тази папка:

git init -b main .
git config user.name "Estudiante"
git config user.email "estudiante@ejemplo.invalid"
echo "DB_PASSWORD=Tamal-Verde-2024" > .env
echo 'print("hola")' > app.py
git add .
git commit -m "primera version"
git rm .env
git commit -m "quito el .env"

Файлът вече го няма в папката. Сега потърси паролата в историята. -S търси промените, в които даден текст се е появил или е изчезнал, а -p показва пълната промяна:

git log -p -S Tamal-Verde-2024 --oneline

Как проверяваш: изходът съдържа пълния патч на всяка промяна; сред редовете трябва да видиш двете промени, тази, която е добавила реда (+DB_PASSWORD=...), и тази, която го е махнала (-DB_PASSWORD=...). Ако някой клонира хранилището ти, ще има и двете. Запиши с едно изречение какво трябва да направиш с тази парола освен да я изтриеш.

Упражнение 4 — Git да дори не я вижда. В същата папка като в упражнение 3 създай отново .env с друга парола и виж какво казва git:

echo "DB_PASSWORD=Pozole-Rojo-2025" > .env
git status --short

Сега направи така, че git да го пренебрегва. Създай файл .gitignore с един-единствен ред, .env, и пусни отново git status --short.

Как проверяваш: преди да създадеш .gitignore, git показва ?? .env (нов файл, който може да бъде качен). След това .env вече не се появява; само ?? .gitignore. За да си сигурен кое правило го пренебрегва, пусни git check-ignore -v .env; трябва да отговори с името на файла и реда на правилото.

Упражнение 5 — Обясни го на доня Клара. Напиши абзац от най-много 90 думи, без неразяснени технически думи, който отговаря на: какво е Vault? Кой проблем на Canasta Morada би решил първо? Същото ли е като HSM? Свободен софтуер ли е?

Как проверяваш: първо се самооцени: абзацът ти трябва да казва (1) че Vault пази тайните на едно място и контролира кой ги иска; (2) кой проблем на Canasta Morada би атакувал първо; (3) че не е HSM; и (4) че сегашните версии на Vault ползват лиценза BSL 1.1, който може да се ползва безплатно, но не е свободен софтуер, и че OpenBao ползва MPL 2.0. После го дай на някой, който не учи информатика: ако може да отговори на четирите въпроса със свои думи, добре е.


Често срещани грешки (и как да ги забележиш)

Грешка Как изглежда Как да я забележиш Какво да направиш
Да вярваш, че изтриването на файла оправя теча „Махнах го от хранилището, готово“ git log -p -S <текст> още го намира Смятай паролата за компрометирана: смени я. Почистването на историята помага, но копията, които вече са изтеглени, не се изтриват
Да добавиш .env към .gitignore, след като вече е качен git status вече не го показва, но си стои в хранилището git ls-files още го изброява .gitignore засяга само нови файлове. Махни го от индекса с git rm --cached .env и смени паролата
Да вярваш, че grep е намерил всичко Броят излиза верен… за имената, които са ти хрумнали Упражнение 1: clave_sms се изплъзва Ползвай grep за бърза проверка, а не като гаранция. Има инструменти, създадени за това, които търсят стотици формати
Да мислиш, че частното хранилище е сигурно „Никой не го вижда, частно е“ Случаят Uber: хранилището беше частно Частното намалява риска, не го премахва. Тайните не се пазят в кода, точка
Да споделиш .env по чата „само този път“ Файлът се появява на три телефона и в облака Потърси в чата си думата PASSWORD Всяко копие е още една врата. От сесия 2 всеки иска своето от Vault

Преговор за следващата сесия

Сесия 2 започва с тези три въпроса. Отговори им, без да гледаш урока:

  1. Назови четири от шестте начина, по които една тайна изтича.
  2. Защо смяната на паролата след теч е задължителна, дори вече да си я изтрил от git?
  3. В какво Transit на Vault прилича на HSM и в какво се различава?

🔁 Следващата седмица: Иван решава да построи сейфа. Стартираш Vault с Docker Compose, отваряш го с три от петте ключа, записваш първите си тайни с curl и виждаш как Vault казва „не“ на този, който иска онова, което не му се полага. А в одитния журнал се появява нещо, което никой не е очаквал.


Решения (не ги гледай, преди да опиташ)

Упражнение 1. С оригиналния шаблон изходът е:

8:  password: Tamal-Verde-2024
11:  api_key: pk_prueba_51HcXyZ-esto-es-inventado
14:  conexion: smtp://avisos:Churro99@smtp.ejemplo.local:587
16:  llave_aes: MDEyMzQ1Njc4OUFCQ0RFRg==

а) Четири реда. Ако на око си преброил пет, прав си бил: има пет тайни.

б) Изплъзва се clave_sms: Elote-2023, защото „clave“ не беше в шаблона. Добави го:

grep -niE 'pass|key|llave|clave|secret|token|://[^/ ]+:[^@ ]+@' config-tienda.yaml

Сега се появява и редът 19: clave_sms: Elote-2023. Урокът не е „добави още думи“; той е, че търсенето на текст намира само онова, което ти е хрумнало да потърсиш.

Упражнение 2.

а) Проблем 5 (който си е тръгнал, още я знае). Предотвратяват го R4 (данни, които изтичат) и R6 (отнемане наведнъж). R2 помага, защото при идентификационни данни за всеки човек знаеш кои да анулираш.

б) Проблем 6 (ключът до данните). Предотвратява го R7 (шифроване като услуга): програмата иска да шифрова и дешифрова, но никога няма ключа.

в) Проблеми 3 и 4 (една и съща за всички; никой не знае кой). Предотвратяват ги R2 (собствена самоличност за всеки) и R3 (журнал).

г) Проблем 2 (тайната, която пътува по чата). Предотвратяват го R1 (едно място) и R2 (всеки иска своето). А понеже вече е изтекла, идва ред на R5: да се смени.

Упражнение 3. Пълният изход включва за всяка промяна заглавните части на патча (diff --git ..., index ...). Редовете, които имат значение, са тези:

cbe77a9 quito el .env
-DB_PASSWORD=Tamal-Verde-2024
250264c primera version
+DB_PASSWORD=Tamal-Verde-2024

Идентификаторите на твоите промени (първите седем знака) ще са други; това е нормално. Изречението, което търсехме: трябва да се смени паролата в базата данни, защото всеки, който е клонирал хранилището, я има.

Упражнение 4. Преди .gitignore:

?? .env

След това:

?? .gitignore

А git check-ignore -v .env отговаря:

.gitignore:1:.env	.env

Това значи: „пренебрегвам го заради ред 1 на файла .gitignore, който казва .env“. В сесия 2 ще видиш скрипт за стартиране, който отказва да създава пароли, ако това правило не съществува.

Упражнение 5. Възможен отговор: „Vault е сейф с гише за паролите и ключовете на системите. Всяка програма и всеки човек има своя самоличност и получава само онова, което му се полага, а всичко се записва. Първото, което бих решил в Canasta Morada, е това, че четири програми и четирима души споделят една и съща парола. Не е HSM: HSM е физическо устройство; Vault е програма, макар да може да шифрова, без да предава ключа. Може да се ползва безплатно, с лиценз, който налага ограничения на този, който иска да конкурира производителя му; има негова сестринска версия със свободен лиценз, която се казва OpenBao.“


Какво следва

В сесия 2 ползваш Docker Compose. Преди да стигнеш дотам, провери, че имаш тези инструменти, с docker compose version, curl --version, jq --version и openssl version. Ако ти липсва jq, който служи за четене на отговорите във формат JSON, инсталирай го така: в Debian или Ubuntu — sudo apt-get install jq; във Fedora — sudo dnf install jq; в Arch — sudo pacman -S jq; в macOS с инсталиран Homebrew — brew install jq. Трябва ти jq 1.6 или по-нов.


Пиша от онова, което виждаме всеки ден в Hábil, където изграждаме системи за банки, застрахователи и компании в Мексико. Ако в работата си или в семейния бизнес се сблъскате с такъв проблем, нека си поговорим: habil.mx

Да обсъдим вашия проект

Предпочитате имейл? Пишете ни на hola@habil.mx