Nejaušs ražošanas pārtraukums, noplūdušas API atslēgas vai dzēsta mākoņa infrastruktūra¶
Katrs programmatūras inženieris, sistēmu administrators un tehniskais attālinātais darbinieks galu galā saskaras ar vēdergraizes brīdi, kad komanda, kas paredzēta localhost vai staging izpilda pret production: neindeksēts DELETE bez a WHERE klauzula, a DROP TABLE vai terraform destroy, a git push --force kas pārraksta galveno filiāli vai publisku apņemšanos, kas satur dzīvās AWS vai Stripe slepenās atslēgas. 15 minūšu nelielas žagas no karjeras beigu datu katastrofas atšķir tas, ka nekavējoties tiek apturēta jūsu rokas, tiek apturēta rakstīšanas trafiks, pirms tiek pārrakstīti krātuves bloki, un tiek izpildīts pareizais atkopšanas protokols.
Dariet to tagad¶
- Sasaldējiet rokas un NEpalaidiet pārsteidzīgas "labošanas" komandas, restartējiet datu bāzes serveri un neaizveriet termināļa logu. Jūsu pašreizējais termināļa ritināšanas buferis, čaulas vēsture un lokālais
.git/logsreflog satur precīzus darījumu laikspiedolus, veic SHA jaucējus un resursu ID, kas nepieciešami, lai novērstu bojājumus. Vispirms kopējiet visu termināļa ritināšanu drošā teksta failā. - Paziņojiet par 1. nopietnības (SEV-1) incidentu savas komandas incidentā Slack/Teams kanālā 2 minūšu laikā. Nekad nepavadiet 45 minūtes, mēģinot slepeni salabot bojātu ražošanas datu bāzi, kamēr klienti saskaras ar 500 kļūdām un automatizēti fona darbi sabojā atlikušās tabulas. Nekavējoties meklējiet izsaukuma datu bāzes administratoru (DBA) vai vietnes uzticamības inženieri (SRE).
- Ja nopludinājāt API atslēgu,
.envfailu vai mākoņa noslēpumu publiskam GitHub repo, PIRMS ATSAUKTI atslēgu pakalpojumu sniedzēja informācijas panelī (pirms mēģināt pārrakstīt Git vēsturi). Automatizētie robottīkli nokopj publisko GitHub Firehose API un izpilda nozagtās AWS, OpenAI, Stripe un GCP atslēgas 3 līdz 15 sekunžu laikā.git push. Faila dzēšana, veicot otro apņemšanos vai piespiedu nospiešanu, neaptur uzbrucēju, kurš jau ir klonējis atslēgu. - Ja jūs skrējāt nejauši
DELETE,UPDATE, vaiDROPražošanas datu bāzē nekavējoties izgrieziet lietojumprogrammas WRITE trafiku. Ieslēdziet tīmekļa lietojumprogrammu uzturēšanas režīmā vai atsauciet lietotnes lietotāja rakstīšanas atļaujas, lai jaunie ienākošie darījumi nepārrakstītu nevakuumātos mirušos korešus vai nesarežģītu atkopšanu laikā (PITR). - Nekad neskrien
VACUUM,OPTIMIZE TABLE, vaigit gc --prune=nowpēc nejaušas dzēšanas. Gan relāciju datu bāzes (PostgreSQL MVCC, MySQL InnoDB), gan Git saglabā diskā neskartas dzēstās rindas un bezsaimnieka saistības, līdz atkritumu savākšanas/vakuuma caurlaide fiziski atgūst lapas. - Ja a
terraform destroyvai mākoņa dzēšanas skripts joprojām darbojas jūsu terminālī, nospiedietCtrl + CVIENREIZ (ne divreiz) vai nogaliniet IAM sesijas marķieri. NospiežotCtrl + Cvienreiz aktivizē graciozu stāvokļa skalošanu, tāpēc Terraform saglabā daļēju.tfstatepar to, kas joprojām pastāv; nospiežotCtrl + Cdivreiz piespiež negodīgu pārtraukšanu, kas var sabojāt vai zaudēt jūsu vietējās valsts failu.
Danger
1. nāvējošā kļūda pēc noslēpuma izpaušanas pakalpojumā Git: Nekad nedomājiet, ka esat drošībā, jo skrējāt. git rm .env && git commit -m "remove secret" && git push. Visas Git vēsturiskās saistības paliek publiski lasāmas uz visiem laikiem saistību diagrammā, un pat tad, ja pārrakstāt filiāli ar git push --force, bāreņu apņemšanās SHA joprojām ir pieejama, izmantojot GitHub API un publisko arhīvu rāpuļprogrammas (GHArchive). Jebkurš noslēpums, kas pieskaras attālai krātuvei pat 1 sekundi, ir jāuzskata par 100 procentīgi apdraudētu un nekavējoties jāatsauc/jāpagriež pie izdevēja pakalpojumu sniedzēja.
Ārkārtas šķirošanas darbplūsma: datu bāzes izkrišana, git piespiedu nospiešana vai slepena noplūde¶
Izpildiet šo lēmumu koku, lai veiktu pirmās 5 tehniskās ierobežošanas minūtes.
flowchart TD
A["Ražošanas inženierijas ārkārtas situācija"] --> B{"Kura kļūme tikko notika?"}
B -->|"Nejauši SQL DROP/DELETE/UPDATE prod"| C["Apturēt lietotņu rakstīšanu / uzturēšanas režīmu; NEdarbiniet VAKUUMU"]
B -->|"Noplūda API atslēga / .env / privātā atslēga pakalpojumā Git"| D["Atsauciet un pagrieziet noslēpumu mākoņa informācijas panelī 60 sekunžu laikā"]
B -->|"Nejaušs git push --force / Deleted Branch"| E["Palaist git reflog lokāli; Kopēt Last Good Commit SHA"]
B -->|"Nejaušas terraformas iznīcināšana / dzēsts S3 vai VM"| F["Nogalināt IAM sesiju vai vienreiz nospiediet Ctrl+C; Saglabāt .tfstate"]
C --> G["Ierakstīt precīzu UTC laika zīmogu; Iedarbiniet mākoņa PITR klonu vai Binlog Flashback"]
D --> H["Pārbaudīt CloudTrail/piekļuves žurnālus neatļautiem paplašināšanās gadījumiem; Scrub Repo ar git-filter-repo"]
E --> I["GitHub notikumu vaicājums / Reflog & Restore Branch ar git push , force-with-lease"]
F --> J["Pārbaudiet S3 versiju dzēšanas marķierus, EBS momentuzņēmumus vai mākoņa atkritni"]
1. daļa: Nejaušas ražošanas datu bāze DROP, TRUNCATE, vai DELETE bez WHERE¶
Kad destruktīvs SQL vaicājums sasniedz dzīvu produkcijas datu bāzi, precīzs atkopšanas mehānisms ir atkarīgs no jūsu datu bāzes programmas (PostgreSQL, MySQL/MariaDB, SQL Server, MongoDB vai DynamoDB) un no tā, vai paziņojums bija DML (DELETE / UPDATE) vai DDL (DROP TABLE / TRUNCATE) darbība.
1. darbība: ierakstiet precīzu UTC laikspiedolu līdz sekundei¶
Pirms pieskaraties jebkurai rezerves konsolei, pierakstiet precīzo pašreizējo UTC laiku (date -u Linux/macOS terminālā vai SELECT NOW(); SQL uzvednē) un aprēķiniet precīzu sekundi tieši pirms, kad tika sākta jūsu destruktīvā vaicājuma izpilde. Point-In-Time Recovery (PITR) darbojas, atkārtoti atskaņojot datu bāzes ierakstīšanas žurnālu (WAL PostgreSQL) vai binārajā žurnālā (binlog MySQL) līdz T_minus_1_second tieši pirms sliktā vaicājuma saņemšanas.
2. darbība. Apturiet fona darbus un lietojumprogrammu rakstīšanu (aizsargājiet MVCC kopas)¶
Programmā PostgreSQL, izpilde DELETE FROM users; vai UPDATE orders SET status = 'cancelled'; vai ne faktiski uzreiz neizdzēš nevienu datu baitu no tabulas faila diskā. Tā kā PostgreSQL izmanto Multi-Version Concurrency Control (MVCC), a DELETE vienkārši iestata xmax darījuma ID galvene katrā rindas virknē, lai atzīmētu to kā neredzamu turpmākajiem vaicājumiem, atstājot visus rindas datus neskartus base/ kaudzes failu, līdz parādās autovacuum, lai atzīmētu vietu atkārtoti lietojamu.
- Ja izmantojat pašmitinātu vai VM PostgreSQL un jums nav nesena dublējuma: Nekavējoties izveidojiet savienojumu kā
superuserun atspējot autovakuumu uz šī galda (ALTER TABLE table_name SET (autovacuum_enabled = false);), vai apturiet PostgreSQL pakalpojumu un uzņemiet neapstrādātu bloka līmeņa failu sistēmas momentuzņēmumu (LVM/EBSmomentuzņēmums) no/var/lib/postgresql/datadirektoriju. Specializētie PostgreSQL kriminālistikas paplašinājumi (pg_dirtyread) var nolasīt un dažu minūšu laikā nolasīt un atgūt 100 procentus izdzēsto vai pirms atjaunināšanas rindu tieši no netīrītās kaudzes tabulas.
Datu bāzes atkopšanas matrica pēc dzinēja un mākoņa platformas¶
| Datu bāzes platforma | Ātrākā atkopšanas metode nejaušiem gadījumiem DROP / DELETE |
Soli pa solim tehniskā izpilde |
|---|---|---|
| AWS RDS/Aurora (PostgreSQL/MySQL) | Automatizēta tūlītēja atkopšana (PITR) uz jaunu instanci (atjaunojas jebkurā sekundē 1-35 dienu saglabāšanas logā) | 1. Atveriet AWS RDS konsoli , > ** Automatizēti dublējumkopijas ** , > atlasiet savu Prod DB , > ** Atjaunot uz laiku**. 2. Izvēlieties Pielāgots datums un laiks un ievadiet precīzu UTC laika zīmogu 10-30 sekundes PIRMS jūsu sliktā vaicājuma izpildes. 3. RDS pagriež paralēlu klonu ( prod-db-recovery) 10 līdz 25 minūšu laikā. Izmetiet neskarto galdu (pg_dump -t my_table vai mysqldump) no atkopšanas klona un importējiet to atpakaļ tiešraidē Prod DB (vai nomainiet DNS CNAME/galapunktu uz atkopto klonu). |
| Google Cloud SQL/Azure datu bāze | Noteiktā laika klons | GCP konsolē , > Atlasiet mākoņa SQL gadījumu , > Klons -> Atlasiet Klonēt no iepriekšējā laika punkta (UTC) -> Izņemiet trūkstošās rindas no klona, izmantojot pg_dump / mysqldump vai ārvalstu datu iesaiņotājs (postgres_fdw). |
| Supabāze / Neona / PlanetScale | Instant Branch / Time-Travel Restore | Neons: izveidojiet tūlītēju kopēšanu un rakstīšanu Branch no vēsturiska laikspiedola (Timestamp vai LSN pirms 1 minūtes) 2 sekundēs un kopējiet tabulu atpakaļ.Apakšbāze: Informācijas panelis -> Datu bāze -> Dublējumkopijas -> Atkopšana pēc laika. PlanetScale: izmantojiet shēmas atgriešanas/attīšanas kontrolpunkta pogu izvietošanas pieprasījuma lietotāja saskarnē. |
pašmitinātais MySQL / MariaDB (ar binlog_format = ROW) |
Binlog inversija (binlog2sql / mysqlbinlog --flashback) |
Kad MySQL darbojas ar binlog_format = ROW (noklusējums kopš MySQL 5.7.7), katru DELETE vai UPDATE ieraksta pilnu pirms un pēc katras ietekmētās rindas attēlu binārajā žurnālā (mysql-bin.0000XX). Skrien binlog2sql --flashback (vai MariaDB mysqlbinlog --flashback) konkrētajā žurnāla pozīcijā, lai automātiski ģenerētu precīzu reversu INSERT vai UPDATE SQL skriptu un atskaņojiet to 60 sekunžu laikā, neatjaunojot pilnu dublējumu. |
| Sniegpārsla/BigQuery (Cloud Data Warehouses) | Iebūvēta SQL ceļošana laikā (AT / BEFORE) |
Nepieciešama nulles dublējuma atjaunošana. Vaicājiet tabulu, kāda tā bija pirms 5 minūtēm: Sniegpārsla: CREATE OR REPLACE TABLE my_table AS SELECT * FROM my_table AT(OFFSET => -60*5); (vai UNDROP TABLE my_table;).BigQuery: SELECT * FROM dataset.my_table FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE); |
| MongoDB atlants/reprodukcijas komplekts | Oplog PITR atjaunošana vai aizkavēta sekundārais dalībnieks | Programmā MongoDB Atlas: Dublēt -> Atjaunot -> Laika punkts (atkārto local.oplog.rs savākšana līdz precīzai sekundei pirms kritiena). |
2. daļa: noplūdušas API atslēgas, .env noslēpumus vai privātās atslēgas, kas piešķirtas Git¶
Ja esat nejauši izdarījis .env fails, an id_rsa SSH atslēga, Firebase/GCP pakalpojuma konta JSON fails, Stripe slepenā atslēga (sk_live_...) vai AWS AKIA... Piekļuves atslēga Git, izpildiet tieši šo divu fāžu secību: ** A fāze (nogaliniet atslēgu mākonī)** un ** B fāze (notīriet Git krātuvi)** pēc tam.
A fāze: tūlītēja 60 sekunžu mākoņa akreditācijas datu ierobežošana (dariet to PIRMAIS)¶
1. AWS (AKIA... Piekļuves atslēgas ID + slepenā piekļuves atslēga)¶
Kad roboti nozog AWS atslēgu no GitHub, to automatizētais skripts nonāk jūsu kontā 10 sekunžu laikā, lai izveidotu maksimālā izmēra GPU EC2 gadījumus (p4d.24xlarge / g5.48xlarge) visos 30+ globālajos AWS reģionos (tostarp izvēlētajos reģionos, piemēram, Džakartā, Osakā un Tuvajos Austrumos), lai iegūtu kriptovalūtu vai izveidotu aizmugures IAM lietotāju ar AdministratorAccess pirms sākotnējās atslēgas dzēšanas.
- Nekavējoties deaktivizējiet un izdzēsiet noplūdušo piekļuves atslēgu:
- Atveriet AWS konsole -> IAM -> Lietotāji -> [kompromitēts lietotājs] -> Drošības akreditācijas dati -> Piekļuves atslēgas -> Noklikšķiniet uz Deaktivizēt, pēc tam uz Dzēst (vai izmantojot CLI:
aws iam update-access-key --access-key-id AKIAIOSFODNN7EXAMPLE --status Inactive --user-name MyUser).
- Atveriet AWS konsole -> IAM -> Lietotāji -> [kompromitēts lietotājs] -> Drošības akreditācijas dati -> Piekļuves atslēgas -> Noklikšķiniet uz Deaktivizēt, pēc tam uz Dzēst (vai izmantojot CLI:
- ** Pievienojiet skaidru informāciju
DenyAllpagaidu neitralizācijas politikaaws stssesijas marķieri:**- Kritiskais slazds: pat pēc tam, kad esat izdzēsis
AKIA...IAM piekļuves atslēga, ja uzbrucējs jau ir zvanījissts:GetSessionTokenvaists:AssumeRolepirmo 30 sekunžu laikā tās ir īslaicīgasASIA...sesijas marķieris ir derīgs 1-12 stundas, ja vien nepievienojat skaidru iekļautu Lieguma politiku (piemēram,AWSCompromisedKeyQuarantineV2vai visu aizlieguma politika marķieriem, kas izdoti pirms pašreizējā laikspiedola) lietotājam vai lomai.
- Kritiskais slazds: pat pēc tam, kad esat izdzēsis
- Pārbaudiet AWS CloudTrail, lai nodrošinātu noturību aizmugures durvīm:
- Atveriet sadaļu AWS CloudTrail , > notikumu vēsture un filtrējiet pēc apdraudētā piekļuves atslēgas ID vai lietotāja vārda pēdējo 2 stundu laikā.
- Īpaši pārbaudiet šos 5 noturīgos zvanus:
CreateUser,CreateAccessKey,AttachUserPolicy,AssumeRole, unRunInstances. Pārbaudiet AWS Cost Explorer un EC2 Global View visos visos reģionos, lai pārtrauktu jebkādas negodīgas instances, un nekavējoties atveriet AWS atbalsta lietu (konts un norēķini , > apdraudēts konts). AWS regulāri atsakās no krāpnieciskiem aprēķinu rēķiniem, kad ziņojat par atslēgas noplūdi un nekavējoties pārtraucat gadījumus.
2. Svītra (sk_live_...), OpenAI (sk-...), SendGrid, Twilio un Slack Tokens¶
- Svītra: dodieties uz sadaļu Izstrādātāji -> API atslēgas -> Standarta atslēgas / Ierobežotās atslēgas -> Noklikšķiniet uz trim punktiem (
...) -> Ritināšanas taustiņš. Izvēlieties “Beigties tūlīt” (vai iestatiet 1 stundas pagarinājuma periodu tikai tad, ja pašlaik aktīvi izvietojat jauno atslēgu savos ražošanas vides mainīgajos). - OpenAI/Anthropic: atveriet API atslēgu informācijas paneli un nekavējoties noklikšķiniet uz Atsaukt/Dzēst, lai automātiskie starpniekservera skrāpji nevarētu dažu minūšu laikā iztērēt tūkstošiem dolāru LLM marķiera kredītu.
- GitHub personiskās piekļuves marķieri (PAT), smalki izstrādāti marķieri un izvietošanas atslēgas: dodieties uz GitHub iestatījumi -> Izstrādātāja iestatījumi -> Personiskās piekļuves pilnvaras un noklikšķiniet uz Dzēst/atsaukt uz nopludinātās pilnvaras, pēc tam pārbaudiet savas organizācijas Audita žurnālu (
Settings -> Audit log) priekšrepo.clone,repo.access, vai nesankcionēta tīmekļa aizķeres izveide ekspozīcijas loga laikā. - Datu bāzes savienojuma virknes (
DATABASE_URL/postgres:///mongodb+srv://) un Redis URL: mainiet datu bāzes lietotāja paroli datu bāzes dzinējā (ALTER USER app_user WITH PASSWORD 'new_random_secret';), un pēc tam pārtrauciet visus pašlaik atvērtos aktīvos TCP savienojumus, kas pieder vecajiem akreditācijas datiem (SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'app_user' AND pid <> pg_backend_pid();programmā PostgreSQL), jo, mainot datu bāzes paroli programmā PostgreSQL vai MySQL, tiek bloķēti tikai jauni pieteikumi un uzbrucēja jau atvērts savienojums tiek atstāts dzīvs, līdz tas tiek atspēkots.
B fāze: Git vēstures noslēpuma tīrīšana (git filter-repo & GitHub kešatmiņas izlikšana)¶
Kad noplūdes atslēga ir mirusi un pagriezta ražošanā, notīriet slepeno virkni no Git saistību vēstures, lai drošības skeneri pārtrauktu brīdinājumus:
- Pārrakstiet repozitorija vēsturi, izmantojot
git filter-repo(vai BFG Repo-Cleaner):- Paņemiet jaunu sava krātuves spoguļa klonu un noņemiet noplūdušo failu (piemēram,
.env) no katras vēsturiskās saistības visās nozarēs un tagos:
- Paņemiet jaunu sava krātuves spoguļa klonu un noņemiet noplūdušo failu (piemēram,
- Piespiedu nospiediet notīrīto vēsturi un iztīriet kešatmiņā saglabātos GitHub Pull Request/Commit skatus:
- Pārvietot notīrīto vēsturi atpakaļ uz izcelsmi (
git push origin --force --allungit push origin --force --tags). - Svarīga GitHub kešatmiņas izpildes darbība: pat pēc tam, kad esat piespiedu kārtā nospiedis notīrītu vēsturi, ikviens, kurš zina veco 40 rakstzīmju apņemšanos, veic SHA URL (
github.com/org/repo/commit/abc1234...) joprojām var skatīt veco, neiztīrīto apņemšanos GitHub tīmekļa lietotāja saskarnē, līdz GitHub palaiž servera puses atkritumu savākšanu. Sazinieties ar GitHub atbalsta dienestu (vai izmantojiet repozitorija drošības padomdevēju/atbalsta portālu) ar precīzu veco saistību SHA un palūdziet izlikt no tīmekļa kešatmiņas atsauktās/karājās saistības un palaist.git gcattālajā repozitorijā.
- Pārvietot notīrīto vēsturi atpakaļ uz izcelsmi (
3. daļa: Negadījuma atsaukšana git push --force, git reset --hard, vai dzēsta filiāle¶
Ja nejauši skrējāt git push --force un noslaucīja jūsu komandas biedru saistības main, vai skrēja git reset --hard HEAD-5 un zaudēja pilnu dienu vietējā darba, nekrītiet panikā, jo Git gandrīz nekad neizdzēš apņemtos objektus uzreiz.
Kāpēc jūsu "zaudētās" saistības joprojām ir droši iekšā .git/logs (The Reflog)¶
Ikreiz, kad izveidojat apņemšanos, pārslēdzat zarus, veiciet atkārtotu bāzi vai atiestatiet, Git ieraksta iepriekšējo HEAD un atzara gala norādes SHA-1/SHA-256 vietējā virsgrāmatā, ko sauc par atsauču žurnālu (git reflog) un glabā faktiskos bezsaimnieka saistību objektus diskā vismaz 14 līdz 90 dienas, pirms atkritumu savākšana tos noņem.
Soli pa solim Git ārkārtas atkopšanas receptes¶
1. scenārijs: jūs skrējāt git push --force un pārrakstīja origin/main¶
- Atrodiet precīzu apņemšanās SHA
origin/mainnorādīja tieši pirms jūsu piespiedu grūdiena:- A metode (Pārbaudiet vietējo attālās izsekošanas reflog): Palaidiet šo komandu terminālī, kurā nospiedāt:
Jūs redzēsit šādu izvadi:
Lūk,
a1b2c3d (HEAD -> main, origin/main) refs/remotes/origin/main@{0}: update by push 9f8e7d6 refs/remotes/origin/main@{1}: fetch: fast-forward9f8e7d6(origin/main@{1}) ir precīza apņemšanāsorigin/mainbija ieslēgts tieši pirms jūsu piespiedu nospiešanas to pārrakstīja. - B metode (Pajautājiet jebkuram komandas biedram, kurš nav skrējis
git pullvēl): Jebkurš kolēģis, kurš atnesamainagrāk šodien joprojām ir neskarta apņemšanās vēsture sēž viņu vietējāorigin/mainfiliāle. - C metode (GitHub REST API notikumu žurnāla vaicājums): Ja jūsu lokālajam reflogam nav attālā stāvokļa, vaicājiet GitHub push notikumu API, lai redzētu
"before"Piespiedu nospiešanas notikuma SHA jaucējvārds:
- A metode (Pārbaudiet vietējo attālās izsekošanas reflog): Palaidiet šo komandu terminālī, kurā nospiedāt:
Jūs redzēsit šādu izvadi:
- ** Atjaunot
origin/maindroši uz iepriekšējo apņemšanos SHA:**- Pārbaudiet, vai apņemšanās izskatās pareizi (
git log -n 5 9f8e7d6), pēc tam nospiediet tieši šo SHA atpakaļ uz tālvadības pultimainfiliāle, izmantojot--force-with-lease:
- Pārbaudiet, vai apņemšanās izskatās pareizi (
2. scenārijs: jūs skrējāt git reset --hard vai pirms nosūtīšanas izdzēsa vietējo filiāli¶
- Skrien
git reflogjūsu vietējā repozitorijā: - Atrodiet saistību SHA tieši pirms
reset:ieraksts (piem.,HEAD@{2}: commit: feat: add payment webhook) un izveidojiet jaunu glābšanas atzaru, kas norāda tieši uz šo SHA: - ** Ko darīt, ja esat pazaudējis nesaistītu failu, kuru jūs
git added (iestudēts) un pēc tam noslaucīja argit reset --hard?**- Brīdī, kad tu skrien
git add myfile.ts, Git saspiež un ieraksta visu šī faila saturu.git/objects/kā karājošs lāse, pat ja jūs nekad neesat skrējisgit commit. Atgūstiet to, uzskaitot visus nokarenos punktus, kas sakārtoti pēc modifikācijas laika:
- Brīdī, kad tu skrien
4. daļa: Nejauši terraform destroy vai dzēsta mākoņkrātuve (S3, EBS, virtuālās mašīnas)¶
Ja Infrastructure-as-Code (IaC) konveijera vai manuālā CLI komanda sāk nojaukt ražošanas mākoņa resursus:
- Droši pārtrauciet izpildi:
- Ja terminālī darbojas lokāli, nospiediet
Ctrl + CVIENREIZ tāpēc Terraform pabeidz savu pašreizējo API zvanu un raksta atjaunināto.tfstatefailu tīri. Ja darbojas programmā GitHub Actions, GitLab CI vai Terraform Cloud, noklikšķiniet uz Atcelt palaist un nekavējoties atspējojiet CI skrējēja AWS/GCP IAM lomu mākoņa konsolē, lai API dzēšana lidojuma laikā neizdotos.AccessDenied.
- Ja terminālī darbojas lokāli, nospiediet
- ** Dublējiet strāvu
.tfstatenekavējoties failu:**- Lejupielādējiet attālā stāvokļa faila lokālo kopiju (
terraform state pull > emergency-backup.tfstate) un pārbaudiet S3 segmenta versiju savā Terraform stāvokļa segmentā, lai iegūtu iepriekšējo stāvokļa versiju, kas bija pieejama pirms 10 minūtēm.
- Lejupielādējiet attālā stāvokļa faila lokālo kopiju (
- Pārbaudiet mākoņpakalpojumu sniedzēja "Soft-Delete" un atkritnes drošības tīklus:
- Amazon S3 (ar iespējotu segmenta versiju): failu dzēšana S3 versiju segmentā (
aws s3 rm --recursive) ne neizdzēš vienu objektu; tā tikai ievieto nulles baitu Dzēst marķieri katra objekta augšpusē. Noņemiet dzēšanas marķierus (izmantojot S3 pakešu operācijas vai 5 rindu Pythonboto3skripts), lai nekavējoties atjaunotu 100 procentus failu. - AWS EBS sējumi un RDS momentuzņēmumi (atkritne): Pārbaudiet AWS atkritni konsolē, ja tā ir konfigurēta, un atzīmējiet AWS dublēšanas glabātuves.
- Google Cloud Platform (GCP) un Microsoft Azure: dzēstie GCP projekti un Azure resursu grupas/atslēgas glabātuves/krātuves konti ar iespējotu Soft Delete paliek atkopjami 7 līdz 30 dienas, veicot vienu atjaunošanas klikšķi konsolē.
- Amazon S3 (ar iespējotu segmenta versiju): failu dzēšana S3 versiju segmentā (
Kā atgūt salauztu Terraformu .tfstate valsts failu vai atkārtoti importēt bāreņu infrastruktūru¶
Kad a terraform apply vai nejauši terraform destroy tiek pārtraukta lidojuma laikā vai kad kāds nejauši izdzēš attālā stāvokļa failu S3/GCS, jūsu mākoņa infrastruktūra nonāk bīstamā sadalītā smadzeņu stāvoklī, kurā daži resursi joprojām pastāv AWS/GCP, bet citi trūkst .tfstate:
- Pārrakstītas vai izdzēstas tālvadības pults atkopšana
.tfstatefails no S3/GCS versijas:- Nekad manuāli nerediģējiet JSON
.tfstatefailu ar roku teksta redaktorā, ja vien visas pārējās opcijas nav bijušas neizdevušās, jo viena neatbilstība"serial"vai"lineage"UUID virkne neļaus Terraform vairs pieteikties. - Atveriet savu S3 kopu (vai Google Cloud Storage kopu/Terraform Cloud Workspace States cilni), kurā atrodas attālā aizmugursistēma, noklikšķiniet uz slēdža Rādīt versijas S3 konsoles augšdaļā un atrodiet
terraform.tfstateversijas laikspiedols tieši pirms nepareizas palaišanas, lejupielādējiet to un droši atsūtiet to atpakaļ jaunajā pašreizējā stāvoklī:
- Nekad manuāli nerediģējiet JSON
- Iestrēguša stāvokļa bloķēšanas pārtraukšana (
Error acquiring the state lock):- Kad jūs pārtraucat sliktu
terraform destroyarCtrl + Cvai nogalināt piekārtu CI skrējēju, attālā DynamoDB tabula vai GCS bloķēšanas fails paliek bloķēts ar mirušā procesa ID. - Vispirms savā CI informācijas panelī un kopā ar komandas biedriem pārbaudiet, vai šajā darbvietā joprojām nedarbojas neviens cits Terraform process, un pēc tam atlaidiet bezsaimnieka bloķēšanu, izmantojot kļūdas ziņojumā norādīto bloķēšanas ID UUID:
- Kad jūs pārtraucat sliktu
- Daļēji iznīcinātas vides atjaunošana, neizveidojot no jauna saglabājušās datu bāzes (
terraform import):- Ja a
terraform destroynoslaucīja jūsu bezvalsts lietojumprogrammu slodzes balansētājus (aws_lb) un ECS/EKS darbinieku mezglus, pirms to pārtraucāt, to ir viegli salabot: vienkārši palaidietterraform applyun Terraform 5 minūšu laikā no jauna izveidos visus bezvalstnieku tīklus un aprēķinās slāņus, vienlaikus atstājot neskartu jūsu izdzīvojušo RDS datubāzi. - Ja jūsu statusa fails pazaudēja izdzīvojušo datubāzi vai S3 segmentu, izmantojiet
import {}konfigurācijas bloks (Terraform 1.5+) vaiterraform import aws_db_instance.prod_db my-rds-instance-idlai saistītu esošo mākoņa resursu atpakaļ jūsu stāvokļa failā, to neiznīcinot, un palaistterraform planlai apstiprinātu"0 to destroy"pirms pieteikšanās.
- Ja a
5. daļa. Kā paziņot savam vadītājam par pārtraukumu un vadīt nevainojamu pēcnāves operāciju¶
Ja, strādājot attālināti, izraisāt ražošanas incidentu, jūsu profesionālo reputāciju nosaka nevis pati kļūda, bet gan jūsu caurskatāmības ātrums, mierīga komunikācija un sistemātiska atlīdzināšana.
3 incidentu komunikācijas zelta likumi¶
- Norādiet faktus, ietekmi un ETA, neslēpjot, nekavējot un nevainojot: ziņojiet par kļūdu 2 minūšu laikā pēc atklāšanas.
- Atdaliet "Mitigation" (asiņošanas apturēšana) no "Sākotnējā cēloņa novēršana": Ārkārtas gadījumā jūsu vienīgais mērķis ir pakalpojuma atjaunošana (sliktās izvietošanas atcelšana, pāreja uz PITR datu bāzes klonu vai līdzekļa karoga noņemšana). Saglabājiet dziļo koda pārstrukturēšanu rītdienai.
- Ievietojiet regulārus 15 minūšu sirdsdarbības atjauninājumus incidentu kanālā, lai vadītāji un klientu atbalsts zinātu, ka kāds to kontrolē.
Kopējiet un ielīmējiet Slack / Teams Incident Declaration Script¶
[SEV-1 INCIDENTS] Ražošana [Pakalpojums/Datu bāzes nosaukums] Ietekme - Kas notika: Plkst
[HH:MM UTC], izpildes laikā[brief technical action, e.g., a data migration script], neparedzēts[DELETE / config change / force-push]tika izmantots ražošanā[database / service]. - Pašreizējā ietekme uz klientu:[e.g., Checkout API is returning 500 errors / User profile updates are paused]. - Notiek tūlītēja ietekmes mazināšana: 1. Ierakstiet trafiku uz[table/service]ir apturēta, lai saglabātu datu integritāti. 2. Point-In-Time Recovery (PITR) klons uz[HH:MM:SS UTC](10 sekundes pirms notikuma) pašlaik griežas[AWS RDS / GCP]. - Incidentu komandieris:@[Your Name](palīdzēja@[DBA/On-Call SRE]). - Nākamais atjauninājums: Pēc 15 minūtēm ([HH:MM UTC]) vai tiklīdz atkopšanas klons nonāk tiešsaistē.
Pēcincidenta inženiertehnisko drošības pasākumu kontrolsaraksts (jūsu bezvainīgajai pēcnāves gadījumiem)¶
Katra cilvēka kļūda ražošanā faktiski ir sistēmu projektēšanas nepilnība (ja viena kopēt ielīmēta termināļa komanda var pārtraukt ražošanu bez aizsargmargas, sistēma gaidīja, kad neizdosies). Nākamajā dienā savā pēcnāves dokumentā piedāvājiet un ieviesiet šīs konkrētās tehniskās margas:
- ** Krāsu koda un prefiksu izgatavošanas uzvednes (
kube-ps1,psql.psqlrc):** Konfigurējiet čaulu un SQL klientu tā, lai izveidotu savienojumu arPRODUCTIONparāda spilgti sarkanu krāsu[PROD-DB]uzvedni un sāk katru interaktīvo PostgreSQL sesiju iekšā aBEGIN;transakciju bloks pēc noklusējuma (vai komplektiSET default_transaction_read_only = on;). - Iespējot
safe-updates(--i-am-a-dummy) MySQL/MariaDB klientiem: Pievienotsafe-updatesuz[mysql]iekšā-/.my.cnftāpēc MySQL tieši atsakās izpildīt jebkuruUPDATEvaiDELETEpaziņojums, kurā trūkst aWHEREatslēgas klauzula vai aLIMIT. - Ieslēdziet
DeletionProtection = truevisās ražošanas RDS datu bāzēs, S3 segmentos un Terraform statusa resursos (lifecycle { prevent_destroy = true }). - ** Ieviest Git filiāles aizsardzības noteikumus
main/production:** AtspējotAllow force pushesunAllow deletionsaizsargātās filiālēs GitHub/GitLab, tāpēc pat repozitoriju administratori nevargit push --forceuzmain. - Instalējiet pirmsapstiprināšanas slepenās skenēšanas āķus (
gitleaksvaitrufflehog) un GitHub Push Protection: Bloķējiet saistības, kas saturAKIA,sk_live_, vai.envmodeļi lokāli iepriekšgit commitpat izdodas.
Bieži uzdotie jautājumi¶
Vai mani atlaidīs par nejaušu ražošanas datu bāzes tabulas nomešanu vai vietnes darbības pārtraukumu?¶
Veselīgās inženiertehniskajās organizācijās, kas praktizē nevainojamu drošības kultūru (standarts mūsdienu tehnoloģiju, DevOps un SRE komandās), inženieri netiek atlaisti par godīgām cilvēciskām kļūdām ražošanā, ja vien viņi nekavējoties ziņo par incidentu un palīdz atjaunot pakalpojumu. Inženierzinātņu vadītāji atzīst, ka, ja jaunākajam vai vecākajam izstrādātājam bija neapstrādātas atļaujas un aizsargmargu trūkums, lai nomestu ražošanas tabulu ar vienu nepārskatītu komandu, galvenais iemesls ir piekļuves kontroles un izvietošanas rīku nepilnība, nevis ļaunprātība. Praksē inženieris, kurš tikko piedzīvoja šo pārtraukumu, tagad ir vienīgā drošākā persona komandā attiecībā uz šo sistēmu. Vienīgā rīcība, kas konsekventi noved pie izbeigšanas, ir mēģinājums slēpt datu zuduma notikumu, dzēst audita žurnālus vai melot incidenta izmeklēšanas laikā.
Kāpēc man nevajadzētu nekavējoties pārslēgt savu reāllaika produkcijas trafiku uz nesen atjaunoto Point-In-Time Recovery (PITR) datu bāzes gadījumu?¶
Ja nejauši izdzēsāt rindas no vienas tabulas (piemēram, `user_preferences` tabula) plkst. 14:00 UTC, un ir nepieciešamas 20 minūtes, lai izveidotu PITR klonu, kas atjaunots uz 13:59:50 UTC, iespējams, jūsu reāllaika datu bāze ir turpinājusi apstrādāt tūkstošiem likumīgu jaunu klientu pasūtījumu un maksājumu. `orders` galds laikā no 14:00 līdz 14:20 UTC. Ja visu savu ražošanas DNS galapunktu akli novirzīsit uz 13:59:50 PITR klonu, jūs iznīcināsit šīs 20 minūtes pilnīgi jaunu klientu pasūtījumu. Tā vietā saglabājiet galveno datu bāzi tiešsaistē (ar pauzētu rakstīšanu tikai bojātajā funkcijā) un eksportējiet tikai trūkstošās rindas no 13:59:50 PITR klona atpakaļ tiešā ražošanas tabulā.
Ja es padarīšu publisku GitHub repozitoriju privātu divas minūtes pēc nejaušas nospiešanas .env failu, vai man joprojām ir jāpagriež visas API atslēgas?¶
Jā, 100 procenti no šīm atslēgām joprojām ir nekavējoties jāatsauc un jāpagriež. Katra publiskajā GitHub repozitorijā nosūtītā apņemšanās tiek pārraidīta reāllaikā, izmantojot publisko GitHub Events API (“Firehose”), un dažu sekunžu laikā to indeksē gan likumīgi drošības arhīva pakalpojumi (piemēram, GHArchive), gan ļaunprātīgi automatizēti akreditācijas datu savākšanas roboti, kas darbojas 24/7 mākoņtīklos. Pārvēršot repozitorija redzamību no Publisks uz Privāts divas minūtes vēlāk, netiek dzēsta kopija, kuru jau ir lejupielādējuši automatizētie skrāpji.
Kā dara git push --force-with-lease novērstu pārtraukumus salīdzinājumā ar git push --force?¶
Kad jūs palaist standarta `git push --force`, Git bez nosacījumiem pārraksta attālo filiāli ar jūsu vietējo filiāli, klusībā iznīcinot visas saistības, ko komandas biedrs tikmēr ir novirzījis uz šo filiāli. Kad lietojat `git push --force-with-lease` (un vēl labāk, `--force-if-includes`), Git vispirms pārbauda attālo serveri, lai pārbaudītu, vai attālās filiāles gals joprojām atbilst precīzai commit SHA, ko jūsu vietējā mašīna pēdējo reizi ienesa. Ja kolēģis vai CI konveijers ir nosūtījis jaunu saistību attālajai filiālei kopš pēdējās ieneses, `--force-with-lease` droši pārtrauc ar "novecojušas informācijas" brīdinājumu, nevis noslauka savu darbu.
Pārbaudīti avoti¶
- Nacionālais standartu un tehnoloģiju institūts (NIST, Amerikas Savienotās Valstis): NIST SP 800-61 Rev. 2 / Rev. 3 Datoru drošības incidentu apstrādes rokasgrāmata un akreditācijas datu kompromisa ierobežojums.
- Amazon Web Services (AWS), Google Cloud Platform (GCP) un Microsoft Azure dokumentācija (Amerikas Savienotās Valstis): RDS automatizētā punkta atkopšanas (PITR) arhitektūra, AWS IAM apdraudētas galvenās karantīnas politikas (
AWSCompromisedKeyQuarantineV2) un S3 versijas dzēšanas marķiera atkopšana. - PostgreSQL globālās izstrādes grupa un MySQL/Oracle dokumentācija (starptautiskā): PostgreSQL rakstīšana uz priekšu (WAL), MVCC kopu redzamība un MySQL rindu bāzes binārā žurnāla zibatmiņas atkopšana.
- Git SCM oficiālā dokumentācija un GitHub drošības laboratorija (starptautiska): Git Reflog (
git-reflog), Karājošo objektu atkopšana (git-fsck), Vēstures pārrakstīšana (git-filter-repo) un Slepenās skenēšanas Push Protection. - USENIX asociācija / SREcon un Google vietņu uzticamības inženierijas (SRE) grāmatas (starptautiskas): Incidentu pārvaldība, ārkārtas atcelšanas šķirošana un nevainojama pēcnāves kultūra.