ЁЯзн рдзрдбрд╛ 15 тАФ Delivery line рдЪреЗ threat modelling: рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдПрдХ рд░рдХреНрд╖рдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 16 рдкреИрдХреА рдзрдбрд╛ 15 ┬╖ рдорд╛рдЧреАрд▓: lesson-14-artifacts ┬╖ рдкреБрдвреАрд▓: lesson-16-ai-security
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ14, рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдЬреЛрдбрдгрд╛рд░реА рд╕рд╡рдп: threat modelling. рддреБрдореНрд╣реА delivery line рд╡рд░реВрди рдЪрд╛рд▓рддрд╛ тАФ laptop тЖТ git тЖТ dependencies тЖТ CI build тЖТ container image тЖТ registry тЖТ deployment тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рд╕рд╣рд╛ STRIDE рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛. рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рд▓рд╛ рдирд╛рд╡ рджрд┐рд▓реЗрд▓рд╛ рдПрдХ рд░рдХреНрд╖рдХ рдорд┐рд│рддреЛ. рдордЧ рддреА рдШрдЯрдирд╛ рдЬреА рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдХрдзреА рдирд╛ рдХрдзреА рднреЗрдЯрддреЗ: public commit рдордзреНрдпреЗ secret leak рд╣реЛрддреЗ, рдЖрдгрд┐ рдкрд╣рд┐рд▓реНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛рдВрдЪрд╛ рдХреНрд░рдо (рдЖрдзреА rotate).
- sec/supply.py тАФ
stride_pipeline()(7 рдЯрдкреНрдкреЗ, рдзреЛрдХрд╛ тЖТ рд░рдХреНрд╖рдХ) рдЖрдгрд┐leak_response()(6 рдкрд╛рдпрд▒реНрдпрд╛) - sec/cloud.py тАФ рдзрдбрд╛ 07 рдордзрд▓реЗ
find_secrets(), рдЗрдереЗ pre-commit рд░рдХреНрд╖рдХ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ - sec/demo.py тАФ
python3 sec/demo.py pipeline - sec/test_sec.py тАФ рдзрдбреЗ 07, 13 рдЖрдгрд┐ 14 рдЪреНрдпрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛ рдЗрдереЗ рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рд░рдХреНрд╖рдХрд╛рдВрдирд╛ cover рдХрд░рддрд╛рдд
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╕реНрд╡рдпрдВрдкрд╛рдХреА рдХрд╛рдо рд╕реБрд░реВ рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛рдкрд╛рд╕реВрди рдбрдмрд╛ рд╡рд░реНрдЧрд╛рдд рдкреЛрд╣реЛрдЪреЗрдкрд░реНрдпрдВрдд рджреАрдкрд┐рдХрд╛ рдПрдХрд╛ рдбрдмреНрдпрд╛рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдЬрд╛рддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд░реАрд╡рд░ рддреА рд╡рд┐рдЪрд╛рд░рддреЗ: "рдЗрдереЗ рдХрд╛рдп рдЪреБрдХреВ рд╢рдХрддреЗ, рдЖрдгрд┐ рддреЗ рдХреЛрдг рдерд╛рдВрдмрд╡рддреЗ?"
- ЁЯзСтАНЁЯН│ рд╕реНрд╡рдпрдВрдкрд╛рдХреНрдпрд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░ тАФ рдХреЛрдгреАрддрд░реА рд╕реНрд╡рдпрдВрдкрд╛рдХреНрдпрд╛рдЪреА рдЪрд╛рд╡реА рдЪреЛрд░рддреЛ. тЖТ рдЪрд╛рд╡реАрд▓рд╛ рдмреЛрдЯрд╛рдЪрд╛ рдард╕рд╛рд╣реА рд▓рд╛рдЧрддреЛ (MFA, hardware keys).
- ЁЯУЦ рдкрд╛рдХрдХреГрддреАрдВрдЪреЗ рдкреБрд╕реНрддрдХ тАФ рдХреЛрдгреА рдПрдХ рдкрд╛рди рдлрд╛рдбреВрди рдирд╡реЗ рд▓рд┐рд╣рд┐рддреЛ. тЖТ рдмрджрд▓рд╛рдВрд╡рд░ рджреБрд╕рд▒реНрдпрд╛ рд╕реНрд╡рдпрдВрдкрд╛рдХреНрдпрд╛рдЪреА рд╕рд╣реА рд▓рд╛рдЧрддреЗ (branch protection, reviews).
- ЁЯел рд╕рд╛рд╣рд┐рддреНрдп тАФ рдПрдХ рдЦрд░рд╛рдм рдмрд░рдгреА. тЖТ рдкрд░рдд рдорд╛рдЧрд╡рдгреНрдпрд╛рдЪреА рдпрд╛рджреА рдЖрдгрд┐ рд╕реАрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдмрд░рдгреНрдпрд╛ (рдзрдбрд╛ 13).
- ЁЯПЧя╕П рдореЛрдареЗ рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░ тАФ рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░рд╛рддрд▓рд╛ рдЕрдиреЛрд│рдЦреА рдорд╛рдгреВрд╕ рдореАрда рдмрджрд▓рддреЛ. тЖТ рдкреНрд░рддреНрдпреЗрдХ batch рд╕рд╛рдареА рд╕реНрд╡рдЪреНрдЫ, рдХреБрд▓реВрдкрдмрдВрдж рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░, рдЖрдгрд┐ рдХреБрдареЗрд╣реА рдкрдбрд▓реЗрд▓реА master рдЪрд╛рд╡реА рдирд╛рд╣реА (isolated CI, OIDC).
- ЁЯУж рдбрдмрд╛ тАФ рддреНрдпрд╛рдд рдХрд╛рдп рдЖрд╣реЗ рддреЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдорд╛рд╣реАрдд рдирд╛рд╣реА. тЖТ рд╕рд╛рдорд╛рдирд╛рдЪреА рдпрд╛рджреА (SBOM, рдзрдбрд╛ 14).
- ЁЯЪЪ рдЧрд╛рдбреА тАФ рд╡рд╛рдЯреЗрдд рдбрдмрд╛ рдмрджрд▓рд▓рд╛ рдЬрд╛рддреЛ. тЖТ рд╕реАрд▓ (signature, рдзрдбрд╛ 14).
- ЁЯЪк рд╡рд░реНрдЧрд╛рдЪреЗ рджрд╛рд░ тАФ рд╕реАрд▓ рдирд╕рд▓реЗрд▓рд╛ рдбрдмрд╛ рдпреЗрддреЛ. тЖТ рд╕реАрд▓ рдирд╛рд╣реА, рдЬреЗрд╡рдг рдирд╛рд╣реА (admission).
рдордЧ рдПрдХреЗ рджрд┐рд╡рд╢реА рдРрд╢реНрд╡рд░реНрдпрд╛рд▓рд╛ рд╢рд╛рд│реЗрдЪреНрдпрд╛ рд╡рд░реНрддрдорд╛рдирдкрддреНрд░рд╛рдд рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░рд╛рдЪреНрдпрд╛ рдЪрд╛рд╡реАрдЪрд╛ рдлреЛрдЯреЛ рджрд┐рд╕рддреЛ. рдЖрдзреА рдХрд╛рдп? "рд╡рд░реНрддрдорд╛рдирдкрддреНрд░ рдкрд░рдд рдШреНрдпрд╛" рдирд╛рд╣реА. рдХреБрд▓реВрдк рдмрджрд▓рд╛, рдЖрддреНрддрд╛рдЪ. рдордЧ рдХреЛрдг рдЖрдд рдЖрд▓реЗ рддреЗ рдкрд╛рд╣рд╛, рдордЧ рдлреЛрдЯреЛ рдХрд╛рдвреВрди рдЯрд╛рдХрд╛, рдордЧ рд╣реЗ рдХрд╕реЗ рдШрдбрд▓реЗ рддреЗ рджреБрд░реБрд╕реНрдд рдХрд░рд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
l["ЁЯТ╗ laptop<br/>MFA ┬╖ hardware keys"] --> g["ЁЯУЦ git<br/>branch protection ┬╖ secret scanning"]
g --> d["ЁЯел dependencies<br/>lockfiles ┬╖ audit"]
d --> b["ЁЯПЧя╕П CI build<br/>OIDC ┬╖ isolated runners"]
b --> i["ЁЯУж image<br/>minimal base ┬╖ SBOM"]
i --> r["ЁЯЧДя╕П registry<br/>signed digests"]
r --> k["тШ╕я╕П deploy<br/>admission checks signature + provenance"]
leak["ЁЯЪи secret leaked<br/>1 rotate ┬╖ 2 find uses ┬╖ 3 purge history<br/>4 contain ┬╖ 5 fix cause ┬╖ 6 postmortem"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/security/lesson-diagrams.html#l15
тЭУ рдХрд╛рдп
Threat model тАФ рдЪрд╛рд░ рдкреНрд░рд╢реНрдирд╛рдВрдЪреЗ рд▓рд┐рдЦрд┐рдд рдЙрддреНрддрд░ (Adam Shostack рдЪреА рдЖрд╡реГрддреНрддреА): рдЖрдкрдг рдХрд╛рдп рдмрдирд╡рдд рдЖрд╣реЛрдд? рдХрд╛рдп рдЪреБрдХреВ рд╢рдХрддреЗ? рддреНрдпрд╛рдмрджреНрджрд▓ рдЖрдкрдг рдХрд╛рдп рдХрд░рдгрд╛рд░? рдЖрдкрдг рдЪрд╛рдВрдЧрд▓реЗ рдХрд╛рдо рдХреЗрд▓реЗ рдХрд╛? рд╣реЗ team рд╕реЛрдмрдд, system рдЪреНрдпрд╛ рдЖрдХреГрддреАрд╡рд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЖрдгрд┐ рдЕрджреНрдпрдпрд╛рд╡рдд рдареЗрд╡рд▓реЗ рдЬрд╛рддреЗ.
STRIDE тАФ "рдХрд╛рдп рдЪреБрдХреВ рд╢рдХрддреЗ" рдЪреЗ рд╕рд╣рд╛ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖рд░рд╛рд╕рд╛рдареА рдПрдХ, рдкреНрд░рддреНрдпреЗрдХ рдПрдЦрд╛рджреНрдпрд╛ security рдЧреБрдгрдзрд░реНрдорд╛рдЪреНрдпрд╛ рд╡рд┐рд░реБрджреНрдз:
рдЕрдХреНрд╖рд░ рдзреЛрдХрд╛ рддреЛ рдХреЛрдгрддрд╛ рдЧреБрдгрдзрд░реНрдо рддреЛрдбрддреЛ Delivery-line рдЙрджрд╛рд╣рд░рдг S Spoofing authentication рдЪреЛрд░рд▓реЗрд▓рд╛ CI token "pipeline" рдореНрд╣рдгреВрди push рдХрд░рддреЛ T Tampering integrity registry рдордзреНрдпреЗ рдмрджрд▓рд▓реЗрд▓реА image R Repudiation non-repudiation force-push рдореБрд│реЗ рдХреЛрдгреА рдХрд╛рдп рдмрджрд▓рд▓реЗ рддреЗ рдкреБрд╕рд▓реЗ рдЬрд╛рддреЗ I Information disclosure confidentiality CI log рдордзреНрдпреЗ print рдЭрд╛рд▓реЗрд▓реЗ secret D Denial of service availability рдЦрд░рд╛рдм build рдиреЗ рднрд░рд▓реЗрд▓рд╛ runner E Elevation of privilege authorization CI рдЪрд╛ cloud role IAM рдмрджрд▓реВ рд╢рдХрддреЛ Trust boundary тАФ рдЕрд╢реА рд░реЗрд╖рд╛ рдЬрд┐рдереЗ data рдХрд┐рдВрд╡рд╛ рдирд┐рдпрдВрддреНрд░рдг рдПрдХрдореЗрдХрд╛рдВрд╡рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рдгрд╛рд▒реНрдпрд╛ рдкрдХреНрд╖рд╛рдВрдордзреНрдпреЗ рдЬрд╛рддреЗ (fork рдЪрд╛ pull request тЖТ рддреБрдордЪрд╛ CI; CI тЖТ рддреБрдордЪреЗ AWS account). рдмрд╣реБрддреЗрдХ рдзреЛрдХреЗ рдпрд╛рдЪ рд░реЗрд╖рд╛рдВрд╡рд░ рдЕрд╕рддрд╛рдд.
Delivery line рд╡рд░рдЪреЗ рд░рдХреНрд╖рдХ:
- laptop тАФ hardware keys рд╕рд╣ MFA, рдЕрд▓реНрдкрд╛рдпреБрд╖реА credentials, disk encryption;
- git тАФ branch protection рдХрд┐рдВрд╡рд╛ rulesets (reviews, рдЖрд╡рд╢реНрдпрдХ checks, force-push рдирд╛рд╣реА), signed commits, push protection рд╕рд╣ secret scanning;
- dependencies тАФ рдзрдбрд╛ 13;
- CI тАФ рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ keys рдРрд╡рдЬреА cloud рдХрдбреЗ OIDC, рдХрд┐рдорд╛рди-рдЕрдзрд┐рдХрд╛рд░
permissions:, commit SHA рд▓рд╛ pin рдХреЗрд▓реЗрд▓реЗ actions, forks рдордзреВрди рдЖрд▓реЗрд▓реНрдпрд╛ workflows рдирд╛ secrets рдирд╛рд╣реАрдд, isolated runners; - image тАФ minimal base, scan, SBOM (рдзрдбрд╛ 14);
- registry тАФ digest рдиреЗ sign рдХрд░рд╛, push рдХреЛрдг рдХрд░реВ рд╢рдХрддреЛ рддреЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рд╛;
- deploy тАФ admission signature рдЖрдгрд┐ provenance рддрдкрд╛рд╕рддреЗ (рдзрдбреЗ 12 рдЖрдгрд┐ 14).
Secret leak рдкреНрд░рддрд┐рд╕рд╛рдж тАФ рдХреНрд░рдо рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдЖрд╣реЗ:
- рдЖрдзреА secret revoke / rotate рдХрд░рд╛ тАФ рдорд┐рдирд┐рдЯрд╛рдВрдд, рджрд┐рд╡рд╕рд╛рдВрдд рдирд╛рд╣реА. Automated scanners push рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░ рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрддрдЪ public keys рд╢реЛрдзрддрд╛рдд;
- рддреЗ leak рдЭрд╛рд▓реНрдпрд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдкрд╛рд╕реВрди рддреНрдпрд╛рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдкрд░ рд╢реЛрдзрд╛ (CloudTrail, access logs);
- рддреЗ code рдЖрдгрд┐ history рдордзреВрди рдХрд╛рдврд╛ тАФ рдкрдг forks, clones рдЖрдгрд┐ caches рдХрдбреЗ рддреЗ рдЖрдзреАрдЪ рдЖрд╣реЗ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд╛; рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ рдореНрд╣рдгрдЬреЗ рд╕рд╛рдлрд╕рдлрд╛рдИ, рдЙрдкрд╛рдп рдирд╛рд╣реА;
- рддреНрдпрд╛рдиреЗ рдХрд╛рдп рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рддреЗ рд╢реЛрдзрд╛, рдЖрдгрд┐ рд░реЛрдЦрд╛ (contain) (рддреНрдпрд╛рдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдХрд╛рд╣реАрд╣реА рдХрд╛рдврд╛);
- рдХрд╛рд░рдг рджреБрд░реБрд╕реНрдд рдХрд░рд╛ тАФ pre-commit рдЖрдгрд┐ CI рдордзреНрдпреЗ secret scanning, рдЕрд▓реНрдкрд╛рдпреБрд╖реА credentials рдореНрд╣рдгрдЬреЗ leak рд╣реЛрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рджреАрд░реНрдШрд╛рдпреБрд╖реА рдХрд╛рд╣реАрдЪ рдЙрд░рдд рдирд╛рд╣реА;
- рджреЛрд╖рд╛рд░реЛрдкрд╡рд┐рд░рд╣рд┐рдд postmortem рд▓рд┐рд╣рд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рддреБрдореНрд╣реА рдХрд╛рдп рдкрд╛рдард╡рддрд╛ рддреЗрдЪ рд╣рд▓реНрд▓реЗрдЦреЛрд░ рдмрджрд▓реВ рд╢рдХрдд рдЕрд╕реЗрд▓, рддрд░ рддреНрдпрд╛рдВрдирд╛ рддреБрдордЪреЗ app рдлреЛрдбрд╛рдпрдЪреА рдЧрд░рдЬрдЪ рдирд╛рд╣реА. рд╡рд┐рд╖рд╛рд░реА dependency, рдЪреЛрд░рд▓реЗрд▓рд╛ CI token рдХрд┐рдВрд╡рд╛ рдмрджрд▓рд▓реЗрд▓реА image production рдЪреНрдпрд╛ рдкреВрд░реНрдг рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд╕рд╣ production рдордзреНрдпреЗ рдкреЛрд╣реЛрдЪрддреЗ. рдзрдбреЗ 07тАУ14 рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рд▓рд╛ рдПрдХ tool рджрд┐рд▓реЗ; threat model рдЦрд╛рддреНрд░реА рдХрд░рддреЛ рдХреА рдХреЛрдгрддрд╛рд╣реА рдЯрдкреНрдкрд╛ рд╡рд┐рд╕рд░рд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ tool рдЪрд╛рд▓реВ рдЖрд╣реЗ. рдЖрдгрд┐ leak рд╣реА рд╢рд░реНрдпрдд рдЕрд╕рддреЗ: рдЬрд┐рд╡рдВрдд key рдЬрд┐рддрдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдирд┐рдЯ public рдЕрд╕рддреЗ, рддрд┐рддрдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдирд┐рдЯ рдХреЛрдгреАрддрд░реА рддреА рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ тАФ рдореНрд╣рдгреВрди рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдиреЗрд╣рдореА рддреА рдирд┐рд░реБрдкрдпреЛрдЧреА рдХрд░рдгреЗ рдЕрд╕рддреЗ, рд▓рдкрд╡рдгреЗ рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sec/supply.py рдордзреНрдпреЗ, stride_pipeline() рд╕рд╛рдд рдЯрдкреНрдкреЗ
(stage, "threats тЖТ guards") рдЕрд╕реЗ рдкрд░рдд рджреЗрддреЗ, рдЖрдгрд┐ leak_response() рд╕рд╣рд╛ рдкрд╛рдпрд▒реНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдкрд░рдд
рджреЗрддреЗ. sec/demo.py рдордзрд▓реЗ pipeline() рджреЛрдиреНрд╣реА print рдХрд░рддреЗ.
Snippet рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рд╕рд╛рдареА STRIDE рдЕрдХреНрд╖рд░реЗ рдЬреЛрдбрддреЛ (рдпрд╛рджреАрддрд▓реНрдпрд╛ рдзреЛрдХреНрдпрд╛рдВрдЪреЗ рдЖрдкрд▓реЗ рд╕реНрд╡рддрдГрдЪреЗ
рд╡рд╛рдЪрди), рдЖрдгрд┐ рдзрдбрд╛ 07 рдЪреЗ find_secrets() рдПрдХрд╛ commit рд╡рд░ pre-commit рд░рдХреНрд╖рдХ рдореНрд╣рдгреВрди рдЪрд╛рд▓рд╡рддреЛ рдЬреНрдпрд╛рдд
рдПрдХ key рдЖрдгрд┐ database URL рдордзреНрдпреЗ рдПрдХ password рдЖрд╣реЗ тАФ рджреЛрдиреНрд╣реА рдмрдирд╛рд╡рдЯ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sec/demo.py pipeline
python3 - <<'EOF'
import sys; sys.path.insert(0, "sec"); from supply import stride_pipeline, leak_response; from cloud import find_secrets
STRIDE = {"developer laptop": "S E", "git": "T R I", "dependencies": "T", "build (CI)": "S T I E",
"container image": "T I", "registry": "T", "deployment": "T E"}
for stage, line in stride_pipeline():
print(f"{stage:<17} {STRIDE[stage]:<8} guard: {line.split(' тЖТ ')[1]}")
commit = {"deploy.sh": "export AWS_KEY=AKIAEXAMPLE0123456789", "README.md": "run make deploy",
"ci.yml": "db: postgres://app:Winter2026pw@db.school.example/grades"}
found = find_secrets(commit)
print(f"pre-commit scan of {len(commit)} files тЖТ {found}")
print("тЖТ commit blocked" if found else "тЖТ commit allowed")
print("if a secret gets past the scan, step 1 is:", leak_response()[0])
EOF
python3 sec/test_sec.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
pipeline рд╣реЗ print рдХрд░рддреЗ:
тХРтХРтХР pipeline тХРтХРтХР
тФАтФА STRIDE along the delivery line, one guard per stage:
developer laptop stolen token, malware тЖТ hardware keys, MFA, short-lived credentials
git force-push, secret committed тЖТ branch protection, reviews, secret scanning
dependencies malicious or vulnerable package тЖТ lockfiles, audit, allow-list, pinned versions
build (CI) poisoned runner, stolen CI secret тЖТ OIDC to the cloud, isolated runners, least privilege
container image vulnerable base, unknown content тЖТ minimal base, scan, SBOM
registry image swapped тЖТ sign images, verify digests on deploy
deployment unsigned or unreviewed artifact тЖТ admission policy that checks signature and provenance
тФАтФА a secret leaked in a public commit тАФ in this order:
1. revoke / rotate the secret first (minutes, not days)
2. find every place it was used (logs, CloudTrail)
3. remove it from the code AND the git history; assume forks and caches already have it
4. look for what the attacker did with it; contain
5. fix the cause: secret scanning in pre-commit and CI, short-lived credentials
6. write the blameless postmortem
тЬЕ done тАФ every door checked
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
developer laptop S E guard: hardware keys, MFA, short-lived credentials
git T R I guard: branch protection, reviews, secret scanning
dependencies T guard: lockfiles, audit, allow-list, pinned versions
build (CI) S T I E guard: OIDC to the cloud, isolated runners, least privilege
container image T I guard: minimal base, scan, SBOM
registry T guard: sign images, verify digests on deploy
deployment T E guard: admission policy that checks signature and provenance
pre-commit scan of 3 files тЖТ [('deploy.sh', 'AWS access key id'), ('ci.yml', 'password in a URL')]
тЖТ commit blocked
if a secret gets past the scan, step 1 is: revoke / rotate the secret first (minutes, not days)
Tests рд╢реЗрд╡рдЯреА 16/16 passed рджрд╛рдЦрд╡рддрд╛рдд. рдзрдбрд╛ 15 рдЪреА рд╕реНрд╡рддрдГрдЪреА рддрдкрд╛рд╕рдгреА рдирд╛рд╣реА: рддреНрдпрд╛рдЪреЗ рд░рдХреНрд╖рдХ рдореНрд╣рдгрдЬреЗ рдзрдбреЗ
07 (find_secrets), 13 рдЖрдгрд┐ 14 рдЪреНрдпрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
T (tampering) рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рджрд┐рд╕рддреЛ тАФ delivery line рд╣реА рд╕рдЧрд│реНрдпрд╛рдд рдЖрдзреА рдЕрд╢реА рдЬрд╛рдЧрд╛ рдЖрд╣реЗ рдЬрд┐рдереЗ рд╡рд╛рдЯреЗрдд рдЧреЛрд╖реНрдЯреА рдмрджрд▓рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдореНрд╣рдгреВрдирдЪ signatures рдЖрдгрд┐ digests (рдзрдбрд╛ 14) рдЗрддрдХреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗрдд. CI рдХрдбреЗ рд╕рд░реНрд╡рд╛рдзрд┐рдХ рдЕрдХреНрд╖рд░реЗ рдЖрд╣реЗрдд: рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ credentials рдЕрд╕рддрд╛рдд, рддреЛ рдЕрдиреЗрдХ рдард┐рдХрд╛рдгрдЪрд╛ code рдЪрд╛рд▓рд╡рддреЛ рдЖрдгрд┐ production рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрддреЛ. рдЖрдгрд┐ scanner рдиреЗ рджреЛрди secrets git рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЖрдзреАрдЪ рдерд╛рдВрдмрд╡рд▓реА тАФ рд╕рдЧрд│реНрдпрд╛рдд рд╕реНрд╡рд╕реНрдд leak рдкреНрд░рддрд┐рд╕рд╛рдж. Scan рдЪреБрдХрд▓рд╛, рддрд░ рдпрд╛рджреА commit рд╣рдЯрд╡рдгреНрдпрд╛рдиреЗ рдирд╛рд╣реА, рддрд░ rotation рдиреЗ рд╕реБрд░реВ рд╣реЛрддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- commit рд╣рдЯрд╡рдгреЗ рдХрд┐рдВрд╡рд╛ repo private рдХрд░рдгреЗ рдЖрдгрд┐ рдХрд╛рдо рдЭрд╛рд▓реЗ рдЕрд╕реЗ рдорд╛рдирдгреЗ тАФ key рддрд░реАрд╣реА рдЪрд╛рд▓рддреЗ
- key rotate рдХрд░рдгреЗ рдкрдг рдЬреБрдиреА "рдПрдХ рджрд┐рд╡рд╕, рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрд╕рд╛рдареА" active рдареЗрд╡рдгреЗ
- audit рд╕рд╛рдареА рдПрдХрджрд╛ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рдХрдзреАрдЪ рди рдЙрдШрдбрд▓реЗрд▓реЗ threat model
permissions: write-allрдЕрд╕рд▓реЗрд▓реЗ CI workflows рдЖрдгрд┐ repository secrets рдордзреНрдпреЗ рджреАрд░реНрдШрд╛рдпреБрд╖реА cloud keys- fork рдЪрд╛ code secrets рд╕рд╣ checkout рдХрд░реВрди рдЪрд╛рд▓рд╡рдгрд╛рд░реЗ
pull_request_targetworkflows - commit SHA рдРрд╡рдЬреА рд╣рд▓рддреНрдпрд╛ tag рд▓рд╛ (
@v1,@main) pin рдХреЗрд▓реЗрд▓реЗ third-party actions - admins рдЯрд╛рд│реВ рд╢рдХрддрд╛рдд рдЕрд╕реЗ branch protection, рдЕрд╢рд╛ repo рд╡рд░ рдЬрд┐рдереЗ рдкреНрд░рддреНрдпреЗрдХрдЬрдг admin рдЖрд╣реЗ
- leak рд╣реЛрддреЗ рддреЗрд╡реНрд╣рд╛ CloudTrail рдирд╛рд╣реА (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдд search рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгреА рдирд╛рд╣реА)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ GitHub OIDC рддреЗ AWS: workflow рд▓рд╛ рдЕрд▓реНрдкрд╛рдпреБрд╖реА credentials рдорд┐рд│рддрд╛рдд, рдЖрдгрд┐ рдХреЛрдгрддреАрд╣реА AWS key рдХреБрдареЗрд╣реА рд╕рд╛рдард╡рд▓реЗрд▓реА рдирд╕рддреЗ. IAM role рдлрдХреНрдд рдпрд╛рдЪ repo рдЪреНрдпрд╛ main branch рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рддреЛ:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/token.actions.githubusercontent.com" },
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:BaluRaut/school-app:ref:refs/heads/main"
}
}
}]
}
name: deploy
on:
push:
branches: [main]
permissions:
contents: read
id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # pin third-party actions to a full commit SHA
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::111122223333:role/school-deploy
aws-region: ap-south-1
- run: aws sts get-caller-identity
main рд╡рд░ Branch protection тАФ reviews, рдПрдХ рдЖрд╡рд╢реНрдпрдХ check, force-push рдирд╛рд╣реА, deletion рдирд╛рд╣реА,
admins рд╕реБрджреНрдзрд╛ рдпрд╛рдд рдпреЗрддрд╛рдд:
gh api -X PUT repos/BaluRaut/school-app/branches/main/protection --input - <<'EOF'
{
"required_status_checks": { "strict": true, "contexts": ["test", "dependency-review"] },
"enforce_admins": true,
"required_pull_request_reviews": { "required_approving_review_count": 1, "dismiss_stale_reviews": true },
"restrictions": null,
"allow_force_pushes": false,
"allow_deletions": false
}
EOF
Push protection рд╕рд╣ secret scanning (рдУрд│рдЦреАрдЪреНрдпрд╛ key format рдЕрд╕рд▓реЗрд▓рд╛ push GitHub рдирд╛рдХрд╛рд░рддреЗ), рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ laptop рд╡рд░ рдПрдХ pre-commit hook:
gh api -X PATCH repos/BaluRaut/school-app \
-f 'security_and_analysis[secret_scanning][status]=enabled' \
-f 'security_and_analysis[secret_scanning_push_protection][status]=enabled'
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.21.2
hooks:
- id: gitleaks
AWS key leak рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░рдЪрд╛ рдкрд╣рд┐рд▓рд╛ рддрд╛рд╕ тАФ рдпрд╛ рдХреНрд░рдорд╛рдиреЗ:
# 1. make it useless тАФ now
aws iam update-access-key --user-name ci-deploy --access-key-id AKIAEXAMPLE0123456789 --status Inactive
# 2. what did it do? (CloudTrail event history covers the last 90 days)
aws cloudtrail lookup-events --lookup-attributes AttributeKey=AccessKeyId,AttributeValue=AKIAEXAMPLE0123456789 \
--max-results 50 --query 'Events[].{time:EventTime,name:EventName,source:EventSource}'
# 3. after the investigation тАФ delete it, and move the job to OIDC so there is no key to replace
aws iam delete-access-key --user-name ci-deploy --access-key-id AKIAEXAMPLE0123456789
# 4. clean the history (then force-push, and ask GitHub support to clear cached views)
git filter-repo --replace-text <(echo 'AKIAEXAMPLE0123456789==>REMOVED')
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: test account рдордзреНрдпреЗ рдПрдХрд╛ рдмрдирд╛рд╡рдЯ key рдиреЗ рджрд░ рддрд┐рдорд╛рд╣реАрдд рдПрдХрджрд╛ leak runbook рдЪрд╛ рд╕рд░рд╛рд╡ рдХрд░рд╛: рдкрд╛рдпрд░реА 1 рд▓рд╛ рдХрд┐рддреА рд╡реЗрд│ рд▓рд╛рдЧрддреЛ рддреЗ рдореЛрдЬрд╛. рд░рд╛рддреНрд░реА 11 рд╡рд╛рдЬрддрд╛ database password рдХреЛрдг rotate рдХрд░реВ рд╢рдХрддреЛ рд╣реЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдорд╛рд╣реАрдд рдирд╕реЗрд▓, рддрд░ рд╣рд▓реНрд▓реЗрдЦреЛрд░рд╛рдЖрдзреА рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд░реА рдлрдЯ рд╕рд╛рдкрдбрд▓реА рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдПрдХ рдЦрд┐рдбрдХреА рдЙрд░рд▓реА рдЖрд╣реЗ, рдЖрдгрд┐ рддреА рд╕рдЧрд│реНрдпрд╛рдд рдирд╡реА рдЖрд╣реЗ: рд╢рд╛рд│реЗрдЪрд╛ AI assistant, рдЬреЛ рд╕реВрдЪрдирд╛, web pages рдЖрдгрд┐ upload рдХреЗрд▓реЗрд▓реНрдпрд╛ files рд╡рд╛рдЪрддреЛ тАФ рдЖрдгрд┐ tools рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ. рдкреБрдвреЗ: рдорд┐рд│рд╡рд▓реЗрд▓рд╛ text рдореНрд╣рдгрдЬреЗ data, рдЖрджреЗрд╢ рдирд╛рд╣реАрдд.
git checkout lesson-16-ai-security