ЁЯФТ рдзрдбрд╛ 09 тАФ рдкреНрд░рд╡рд╛рд╕рд╛рддрд▓реЗ рдЖрдгрд┐ рд╕рд╛рдард╡рд▓реЗрд▓реЗ encryption: рд╕реАрд▓ рдХреЗрд▓реЗрд▓реА рдкрд╛рдХрд┐рдЯреЗ рдЖрдгрд┐ рдХреБрд▓реВрдкрдмрдВрдж рдХрдкрд╛рдЯреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 16 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреАрд▓: lesson-08-iam-network ┬╖ рдкреБрдвреАрд▓: lesson-10-k8s-rbac
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ рд╢реЗрд╡рдЯрдЪреЗ cloud рдирд┐рдпрдВрддреНрд░рдг: encryption. рдЬреЛ data рдлрд┐рд░рддреЛ (browser рдЖрдгрд┐ рд╢рд╛рд│реЗрдЪреА website рдпрд╛рдВрдЪреНрдпрд╛рдд, app рдЖрдгрд┐ database рдпрд╛рдВрдЪреНрдпрд╛рдд) рддреЛ TLS рдЪреНрдпрд╛ рдЖрдд рдкреНрд░рд╡рд╛рд╕ рдХрд░рддреЛ. рдЬреЛ data рдкрдбреВрди рд░рд╛рд╣рддреЛ (disks, buckets, database files, backups) рддреЛ KMS key рдиреЗ encrypt рдХрд░реВрди рд╕рд╛рдард╡рд▓рд╛ рдЬрд╛рддреЛ. рдХреЛрдгрддреНрдпрд╛ TLS versions рдирд╛ рдкрд░рд╡рд╛рдирдЧреА рджреНрдпрд╛рдпрдЪреА, certificate рдХрд╛рдп рд╕рд┐рджреНрдз рдХрд░рддреЗ, рддреЗ рдирд╛рд╡рд╛рд╢реА рдХрд╛ рдЬреБрд│рд╛рдпрд▓рд╛ рд╣рд╡реЗ рдЖрдгрд┐ expire рдХрд╛ рд╡реНрд╣рд╛рдпрд▓рд╛ рдирдХреЛ, HSTS рдХрд╛рдп рднрд░ рдШрд╛рд▓рддреЗ, рдЖрдгрд┐ KMS рд╕реЛрдмрдд encryption at rest рдХрд╕реЗ рдЪрд╛рд▓рддреЗ, рд╣реЗ рддреБрдореНрд╣реА рд╢рд┐рдХрддрд╛.
- sec/cloud.py тАФ
tls_ok(cfg): TLS configuration рдЪреА рддрдкрд╛рд╕рдгреА (version, certificate expiry, certificate рдЪреЗ рдирд╛рд╡) - sec/demo.py тАФ
python3 sec/demo.py tls - sec/test_sec.py тАФ check
L09
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рдкрд╛рд▓рдХрд╛рдВрдирд╛ рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ рдкрд╛рдард╡рддреЗ. рджреЛрди рдзреЛрдХреЗ:
- рд░рд╕реНрддреНрдпрд╛рд╡рд░. рд╡рд╛рдЯреЗрдд рдкрддреНрд░ рд╣рд╛рддрд╛рдд рдзрд░рдгрд╛рд░рд╛ рдХреЛрдгреАрд╣реА рддреЗ рдЙрдШрдбреВ рд╢рдХрддреЛ. рдореНрд╣рдгреВрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрд░ рдПрдХрд╛ рд╕реАрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрд╛рдХрд┐рдЯрд╛рдд ЁЯФТ рдШрд╛рд▓рддреЗ рдЬреЗ рдлрдХреНрдд рдкрд╛рд▓рдХрдЪ рдЙрдШрдбреВ рд╢рдХрддрд╛рдд. рд╣реЗрдЪ encryption in transit (TLS).
- рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдд. рд░рд╛рддреНрд░реА рдХреЛрдгреАрддрд░реА рдлрд╛рдпрд▓реАрдВрдЪреЗ рдХрдкрд╛рдЯ рдЙрдШрдбреВ рд╢рдХрддреЗ. рдореНрд╣рдгреВрди рдХрдкрд╛рдЯ рдХреБрд▓реВрдкрдмрдВрдж рдЕрд╕рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдЪрд╛рд╡реА рдПрдХрд╛ рдЪрд╛рд╡реА-рддрд┐рдЬреЛрд░реАрдд ЁЯЧЭя╕П рдЕрд╕рддреЗ (рдзрдбрд╛ 07). рд╣реЗрдЪ encryption at rest (KMS).
рдЖрдгрд┐ рдкрд╛рдХреАрдЯ рдЖрдгрдгрд╛рд░рд╛ рдХреБрд░рд┐рдпрд░ рдПрдХ рдУрд│рдЦрдкрддреНрд░ рдмрд┐рд▓реНрд▓рд╛ рджрд╛рдЦрд╡рддреЛ. рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рддрд▓реА рджреАрдкрд┐рдХрд╛ рдмрд┐рд▓реНрд▓реНрдпрд╛рд╡рд░рдЪреНрдпрд╛ рддреАрди рдЧреЛрд╖реНрдЯреА рддрдкрд╛рд╕рддреЗ:
- рдмрд┐рд▓реНрд▓реНрдпрд╛рд╡рд░рдЪреЗ рдирд╛рд╡ рд╣реЗ рдкрд╛рд▓рдХрд╛рдВрдирд╛ рд╣рд╡реНрдпрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╢рд╛рд│реЗрдЪреЗрдЪ рдирд╛рд╡ рдЖрд╣реЗ;
- рдмрд┐рд▓реНрд▓рд╛ рдореБрджрдд рд╕рдВрдкрд▓реЗрд▓рд╛ рдирд╛рд╣реА;
- рдмрд┐рд▓реНрд▓рд╛ рдкрд╛рд▓рдХрд╛рдВрдЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдиреЗ рджрд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ.
1990 рдЪреНрдпрд╛ рджрд╢рдХрд╛рддрд▓реНрдпрд╛ рдЬреБрдиреНрдпрд╛ рдкрд╛рдХрд┐рдЯрд╛рдВрдЪреЗ рд╕реАрд▓ рдХрдордХреБрд╡рдд рдЕрд╕рддрд╛рдд. рдореНрд╣рдгреВрди рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪрд╛ рдЖрдгрдЦреА рдПрдХ рдирд┐рдпрдо рдЖрд╣реЗ: "рдлрдХреНрдд рдирд╡реА рдкрд╛рдХрд┐рдЯреЗ тАФ TLS 1.2 рдХрд┐рдВрд╡рд╛ 1.3." рдЖрдгрд┐ рдкреБрдврдЪреНрдпрд╛ рджрд╛рд░рд╛рд╡рд░ рдПрдХ рдкрд╛рдЯреА рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдЕрд╕рддреЗ: "рдиреЗрд╣рдореА рд╕реАрд▓-рдкрд╛рдХрд┐рдЯрд╛рдЪреЗ рджрд╛рд░ рд╡рд╛рдкрд░рд╛, рдЙрдШрдбреЗ рджрд╛рд░ рдХрдзреАрдЪ рдирд╛рд╣реА." рддреА рдкрд╛рдЯреА рдореНрд╣рдгрдЬреЗ HSTS.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
p["ЁЯСк parent's browser"] -->|"ЁЯФТ TLS 1.2 / 1.3<br/>certificate: name тЬУ ┬╖ expiry тЬУ ┬╖ issuer тЬУ"| lb["тЪЦя╕П load balancer / CloudFront<br/>ACM certificate ┬╖ HSTS"]
lb -->|"ЁЯФТ TLS again inside the VPC"| app["ЁЯН│ results API"]
app -->|"ЁЯФТ TLS (rds.force_ssl)"| db["ЁЯУТ database<br/>ЁЯЧДя╕П encrypted at rest"]
db --- k["ЁЯЧЭя╕П KMS key<br/>disks ┬╖ buckets ┬╖ backups"]
bad["тЭМ api.school.example<br/>TLS 1.0 ┬╖ 6 days left ┬╖ wrong name"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/security/lesson-diagrams.html#l09
тЭУ рдХрд╛рдп
- Encryption in transit тАФ data network рд╡рд░реВрди рдлрд┐рд░рдд рдЕрд╕рддрд╛рдирд╛ encrypted рдЕрд╕рддреЛ. Web рд╡рд░ рд╣реЗ TLS рдЖрд╣реЗ (HTTPS рдордзрд▓рд╛ "S"). TLS рддреАрди рдЧреЛрд╖реНрдЯреА рджреЗрддреЗ: рдЧреЛрдкрдиреАрдпрддрд╛ (рд╡рд╛рдЯреЗрд╡рд░рдЪрд╛ рдХреЛрдгреАрд╣реА рд╡рд╛рдЪреВ рд╢рдХрдд рдирд╛рд╣реА), рдЕрдЦрдВрдбрддрд╛ (рдХреЛрдгреАрд╣реА рдирдХрд│рдд рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА) рдЖрдгрд┐ рдУрд│рдЦ (certificate рдореБрд│реЗ рддреБрдореНрд╣реА рдЦрд▒реНрдпрд╛ server рд╢реАрдЪ рдмреЛрд▓рддрд╛).
- TLS versions тАФ SSL 2, SSL 3, TLS 1.0 рдЖрдгрд┐ TLS 1.1 рдирд┐рд╡реГрддреНрдд рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд (RFC 8996 рдиреЗ 2021 рдордзреНрдпреЗ 1.0 рдЖрдгрд┐ 1.1 deprecated рдХреЗрд▓реЗ). TLS 1.2 рдЖрдгрд┐ 1.3 рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреНрдпрд╛; 1.3 рд▓рд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреНрдпрд╛ (рдЬрд▓рдж handshake, рдлрдХреНрдд рдордЬрдмреВрдд ciphers). рдЬреБрдиреНрдпрд╛ clients рд╕рд╛рдареА 1.2 рдареЗрд╡рд╛, рдлрдХреНрдд рдЖрдзреБрдирд┐рдХ cipher suites рд╕рд╣.
- Certificate тАФ "рд╣реА public key
school.exampleрдЪреА рдЖрд╣реЗ" рдЕрд╕реЗ рд╕рд╛рдВрдЧрдгрд╛рд░реА file, рдЬрд┐рдЪреНрдпрд╛рд╡рд░ browser рдЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ certificate authority (CA) рдЪреА рд╕рд╣реА рдЕрд╕рддреЗ. Browser connection рдирд╛рдХрд╛рд░рддреЛ рдЬреЗрд╡реНрд╣рд╛:- рдирд╛рд╡ рдЬреБрд│рдд рдирд╛рд╣реА (host рд╣рд╛ certificate рдЪреНрдпрд╛
Subject Alternative Names рдордзреНрдпреЗ рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛; wildcard
*.school.exampleрдиреЗрдордХреА рдПрдХ рдкрд╛рддрд│реА рдХрд╡реНрд╣рд░ рдХрд░рддреЛ, рдЬрд╕реЗapi.school.example, рдкрдгa.b.school.exampleрдирд╛рд╣реА); - рддреЗ expire рдЭрд╛рд▓реЗ рдЖрд╣реЗ (рдХрд┐рдВрд╡рд╛ рдЕрдЬреВрди рд╡реИрдз рдЭрд╛рд▓реЗрд▓реЗ рдирд╛рд╣реА);
- рджреЗрдгрд╛рд░рд╛ (issuer) рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдирд╛рд╣реА.
- рдирд╛рд╡ рдЬреБрд│рдд рдирд╛рд╣реА (host рд╣рд╛ certificate рдЪреНрдпрд╛
Subject Alternative Names рдордзреНрдпреЗ рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛; wildcard
- Certificate expiry тАФ public certificates рдЖрддрд╛ рд╕рд╛рдзрд╛рд░рдг рдПрдХ рд╡рд░реНрд╖ рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рд╣реВрди рдХрдореА рдЯрд┐рдХрддрд╛рдд, рдЖрдгрд┐ рдХрдорд╛рд▓ рдореБрджрдд рдЖрдгрдЦреА рдХрдореА рд╣реЛрдд рдЖрд╣реЗ. рдореНрд╣рдгреВрди renewal рдЖрдкреЛрдЖрдк рд╡реНрд╣рд╛рдпрд▓рд╛ рд╣рд╡реЗ: AWS Certificate Manager (ACM) рд╡рд╛рдкрд░рд╛рдд рдЕрд╕рд▓реЗрд▓реА DNS-validated certificates renew рдХрд░рддреЛ; Kubernetes рдордзреНрдпреЗ Let's Encrypt рдЖрдгрд┐ cert-manager рд╣реЗ рдХрд░рддрд╛рдд. рддрд░реАрд╣реА рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рддрд╛рд░рдЦреЗрдЪреНрдпрд╛ рдмрд▒реНрдпрд╛рдЪ рдЖрдзреА alert рдареЗрд╡рд╛.
- HSTS (HTTP Strict Transport Security) тАФ рдПрдХ response header:
Strict-Transport-Security: max-age=31536000; includeSubDomains. рдкрд╣рд┐рд▓реНрдпрд╛ рднреЗрдЯреАрдирдВрддрд░ browser рдпрд╛ site рд╕рд╛рдареА рд╡рд░реНрд╖рднрд░ рдлрдХреНрдд HTTPS рд╡рд╛рдкрд░рддреЛ тАФ рдХреЛрдгреАhttp://рдЯрд╛рдЗрдк рдХреЗрд▓реЗ рддрд░реА, рдХрд┐рдВрд╡рд╛ рдПрдЦрд╛рджреНрдпрд╛ network рдиреЗ connection downgrade рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рддрд░реА. - Encryption at rest тАФ data рдЬрд┐рдереЗ рд╕рд╛рдард╡рд▓рд╛ рдЖрд╣реЗ рддрд┐рдереЗрдЪ encrypted рдЕрд╕рддреЛ: EBS disks, S3 objects, RDS databases рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ snapshots, backups. AWS рд╡рд░ рдпрд╛рд╕рд╛рдареА KMS keys рдЖрдгрд┐ envelope encryption рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ (рдзрдбрд╛ 07): data key data encrypt рдХрд░рддреЗ, KMS key data key encrypt рдХрд░рддреЗ.
- AWS-managed key рд╡рд┐рд░реБрджреНрдз customer-managed key тАФ рджреЛрдиреНрд╣реА encrypt рдХрд░рддрд╛рдд. Customer-managed key рдордзреНрдпреЗ key policy (рдХреЛрдг decrypt рдХрд░реВ рд╢рдХрддреЛ) рддреБрдореНрд╣реА рд▓рд┐рд╣рд┐рддрд╛, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдкрд░ CloudTrail рдордзреНрдпреЗ рдкрд╛рд╣рддрд╛, automatic rotation рдЪрд╛рд▓реВ рдХрд░рддрд╛, рдЖрдгрд┐ рдЖрдгреАрдмрд╛рдгреАрдд key disable рдХрд░рддрд╛.
- Key rotation тАФ KMS рдард░рд╛рд╡рд┐рдХ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреЗ (default рдиреЗ рджрд░рд╡рд░реНрд╖реА) рдирд╡реЗ key material рдмрдирд╡рддреЛ рдЖрдгрд┐ рдЬреБрдиреЗ material рдареЗрд╡рддреЛ, рдореНрд╣рдгрдЬреЗ рдЬреБрдирд╛ data рдЕрдЬреВрдирд╣реА decrypt рд╣реЛрддреЛ. рддреБрдордЪрд╛ data рдкреБрдиреНрд╣рд╛ encrypt рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрдд рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рджреЛрди computers рдордзрд▓реЗ network рдЗрддрд░ рд▓реЛрдХрд╛рдВрдЪреЗ рдЕрд╕рддреЗ: caf├й рдордзрд▓реЗ Wi-Fi, рдПрдЦрд╛рджрд╛ internet provider, рд╡рд╛рдЯреВрди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ data centre. TLS рдирд╕реЗрд▓ рддрд░ password рдХрд┐рдВрд╡рд╛ grade рд╡рд╛рдЯреЗрдд рд╡рд╛рдЪрд▓рд╛ рдХрд┐рдВрд╡рд╛ рдмрджрд▓рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЖрдгрд┐ рдЪреЛрд░рд▓реЗрд▓реА disk, public snapshot рдХрд┐рдВрд╡рд╛ leak рдЭрд╛рд▓реЗрд▓рд╛ backup рд╣реА рд╕рдорд╕реНрдпрд╛ рддреЗрд╡реНрд╣рд╛рдЪ рдЕрд╕рддреЗ рдЬреЗрд╡реНрд╣рд╛ рдЖрддрд▓рд╛ data рд╡рд╛рдЪрддрд╛ рдпреЗрдгреНрдпрд╛рдЬреЛрдЧрд╛ рдЕрд╕рддреЛ. рддреБрдордЪреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдгрд╛рддрд▓реНрдпрд╛ key рдиреЗ рдХреЗрд▓реЗрд▓реЗ encryption at rest "рдХреЛрдгреАрддрд░реА disk copy рдХреЗрд▓реА" рдпрд╛рдЪреЗ рд░реВрдкрд╛рдВрддрд░ "рдХреЛрдгреАрддрд░реА рдирд┐рд░рд░реНрдердХ рдЧреЛрдВрдЧрд╛рдЯ copy рдХреЗрд▓рд╛" рдпрд╛рдд рдХрд░рддреЗ. рдЪреБрдХреАрдЪреЗ certificate рдирд╛рд╡ рдХрд┐рдВрд╡рд╛ expire рдЭрд╛рд▓реЗрд▓реЗ certificate рд╣реА рдЫреЛрдЯреА рд╕реВрдЪрдирд╛ рджреЗрдЦреАрд▓ рдирд╛рд╣реА: рддреНрдпрд╛рдореБрд│реЗ рд▓реЛрдХрд╛рдВрдирд╛ "рддрд░реАрд╣реА рдкреБрдвреЗ рдЬрд╛" рд╡рд░ click рдХрд░рдгреНрдпрд╛рдЪреА рд╕рд╡рдп рд▓рд╛рдЧрддреЗ, рдЖрдгрд┐ attacker рд▓рд╛ рдиреЗрдордХреЗ рддреЗрдЪ рд╣рд╡реЗ рдЕрд╕рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sec/cloud.py рдордзрд▓реЗ tls_ok(cfg) host,
cert_names, min_version рдЖрдгрд┐ days_to_expiry рдЕрд╕рд▓реЗрд▓реА configuration рдШреЗрддреЗ, рдЖрдгрд┐ (ok, problems) рдкрд░рдд рдХрд░рддреЗ. рддреЗ flag рдХрд░рддреЗ:
- 1.2 рдкреЗрдХреНрд╖рд╛ рдХрдореА рдХрд┐рдорд╛рди version;
- 14 рджрд┐рд╡рд╕рд╛рдВрдкреЗрдХреНрд╖рд╛ рдХрдореА рдЙрд░рд▓реЗрд▓реЗ certificate;
- certificate рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдВрдордзреНрдпреЗ рдирд╕рд▓реЗрд▓рд╛ host.
sec/demo.py рдордзрд▓реЗ tls() рджреЛрди sites рддрдкрд╛рд╕рддреЗ: school.example (рдЪрд╛рдВрдЧрд▓реА) рдЖрдгрд┐
api.school.example (рдПрдХрд╛рдЪ рд╡реЗрд│реА рддреАрди рд╕рдорд╕реНрдпрд╛). рд╣реЗ model рдирд╛рд╡реЗ рдиреЗрдордХреА рдЬреБрд│рд╡рддреЗ тАФ рддреНрдпрд╛рд▓рд╛ wildcard
рдирд┐рдпрдо рдорд╛рд╣реАрдд рдирд╛рд╣реАрдд. рдЦрд░рд╛ browser results.school.example рд╕рд╛рдареА *.school.example рд╕реНрд╡реАрдХрд╛рд░реЗрд▓.
рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ snippet рдордзреНрдпреЗ рджрд┐рд╕реЗрд▓.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sec/demo.py tls
python3 - <<'EOF'
import sys; sys.path.insert(0, "sec"); from cloud import tls_ok
base = dict(host="results.school.example", cert_names=["results.school.example"], min_version=1.2, days_to_expiry=60)
for label, change in (("as set up", {}), ("TLS 1.3 only", dict(min_version=1.3)), ("TLS 1.1 allowed", dict(min_version=1.1)),
("expires in 14 days", dict(days_to_expiry=14)), ("expires in 13 days", dict(days_to_expiry=13)),
("wildcard certificate", dict(cert_names=["*.school.example"]))):
ok, problems = tls_ok({**base, **change})
print(f"{label:<22} тЖТ {'ok' if ok else problems}")
EOF
python3 sec/test_sec.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
tls рд╣реЗ рдЫрд╛рдкрддреЗ:
тХРтХРтХР tls тХРтХРтХР
тФАтФА school.example тЖТ ok
тФАтФА api.school.example тЖТ TLS 1.0 allowed тАФ require 1.2+; certificate expires in 6 days; certificate name does not match the host
in transit: TLS 1.2+ everywhere, HSTS ┬╖ at rest: encrypt disks, buckets, backups with KMS keys ┬╖ rotate certificates automatically
тЬЕ done тАФ every door checked
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
as set up тЖТ ok
TLS 1.3 only тЖТ ok
TLS 1.1 allowed тЖТ ['TLS 1.1 allowed тАФ require 1.2+']
expires in 14 days тЖТ ok
expires in 13 days тЖТ ['certificate expires in 13 days']
wildcard certificate тЖТ ['certificate name does not match the host']
рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдУрд│реАрдд model browser рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдХрдбрдХ рдЖрд╣реЗ: рдЦрд░рд╛ client
results.school.example рд╕рд╛рдареА *.school.example рд╕реНрд╡реАрдХрд╛рд░рддреЛ. Tests рдордзреНрдпреЗ
тЬЕ L09 old TLS and near-expiry certificates are flagged рдЖрд╣реЗ рдЖрдгрд┐ рд╢реЗрд╡рдЯ 16/16 passed рдиреЗ рд╣реЛрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдХрд╛ site рдордзреНрдпреЗ рддреАрди рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ TLS рд╕рдорд╕реНрдпрд╛ рдЕрд╕реВ рд╢рдХрддрд╛рдд, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╡рд┐рд╢реНрд╡рд╛рд╕ рддреЛрдбрд╛рдпрд▓рд╛ рдкреБрд░реЗрд╢реА рдЖрд╣реЗ: рдЬреБрдирд╛ protocol, рд▓рд╡рдХрд░рдЪ expire рд╣реЛрдгрд╛рд░реЗ certificate, рдЖрдгрд┐ рди рдЬреБрд│рдгрд╛рд░реЗ рдирд╛рд╡. рд╣реА рддрдкрд╛рд╕рдгреА рдЫреЛрдЯреА рдЖрдгрд┐ рдЬрд▓рдж рдЖрд╣реЗ, рдореНрд╣рдгреВрди рддреА рдкреНрд░рддреНрдпреЗрдХ public endpoint рдкрд╛рд╣рдгрд╛рд▒реНрдпрд╛ scheduled job рдордзреНрдпреЗ рд╣рд╡реА, рдХреЛрдгрд╛рдЪреНрдпрд╛ рддрд░реА рдЖрдард╡рдгреАрдд рдирд╛рд╣реА. Model рд╕рд╛рдареА рдлрдХреНрдд 1.3 рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдгреЗ рдареАрдХ рдЖрд╣реЗ; рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдкреНрд░рддреНрдпреЗрдХ client 1.3 support рдХрд░рддреЛ рд╣реЗ рдХрд│реЗрдкрд░реНрдпрдВрдд 1.2 рд╕реБрджреНрдзрд╛ рдареЗрд╡рд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рддреЗ clients рдЧреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╡рд░реНрд╖рд╛рдиреБрд╡рд░реНрд╖реЗ "рдЬреБрдиреНрдпрд╛ clients рд╕рд╛рдареА" TLS 1.0 / 1.1 рдЪрд╛рд▓реВ рдареЗрд╡рдгреЗ
- рдлрдХреНрдд load balancer рд╡рд░ TLS, рдЖрдгрд┐ load balancer рдкрд╛рд╕реВрди app рдкрд░реНрдпрдВрдд рд╡ app рдкрд╛рд╕реВрди database рдкрд░реНрдпрдВрдд рд╕рд╛рдзреЗ HTTP ("рдЖрддрд▓реА рдмрд╛рдЬреВ рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ")
- calendar reminder рд╡рд░реВрди рд╣рд╛рддрд╛рдиреЗ renew рдХреЗрд▓реЗрд▓реЗ certificate тАФ рдПрдХ рдЪреБрдХрд▓реЗрд▓рд╛ reminder рдореНрд╣рдгрдЬреЗ outage
school.exampleрд╕рд╛рдареАрдЪреЗ certificateapi.school.exampleрд╡рд░ рд╡рд╛рдкрд░рдгреЗ- code рдордзреНрдпреЗ certificate рддрдкрд╛рд╕рдгреА рдмрдВрдж рдХрд░рдгреЗ (
verify=False,rejectUnauthorized: false) "рдлрдХреНрдд testing рд╕рд╛рдареА" рдЖрдгрд┐ рддрд╕реЗрдЪ ship рдХрд░рдгреЗ - рдкреНрд░рддреНрдпреЗрдХ subdomain HTTPS support рдХрд░рдгреНрдпрд╛рдЖрдзреАрдЪ HSTS рдЪрд╛
max-ageрдПрдХрд╛ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА рд▓рд╛рд╡рдгреЗ тАФ рдордЧincludeSubDomainsрд╕рд╣ HSTS рдЬреЗ support рдХрд░рдд рдирд╛рд╣реАрдд рддреЗ рддреЛрдбрддреЗ - рдкреНрд░рддреНрдпреЗрдХрдЬрдг рд╡рд╛рдкрд░реВ рд╢рдХреЗрд▓ рдЕрд╢рд╛ key рдиреЗ encryption at rest тАФ рдлрдХреНрдд "encrypted: yes" box рдирд╛рд╣реА, key policy рддрдкрд╛рд╕рд╛
- encrypted database рдЪрд╛ unencrypted snapshot рдХрд┐рдВрд╡рд╛ backup, рджреБрд╕рд▒реНрдпрд╛ account рдордзреНрдпреЗ copy рдХреЗрд▓реЗрд▓рд╛
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ ACM рдХрдбреВрди certificate, DNS рджреНрд╡рд╛рд░реЗ validated (рддреЗ рд╡рд╛рдкрд░рд╛рдд рдЕрд╕реЗрдкрд░реНрдпрдВрдд ACM рддреЗ рдЖрдкреЛрдЖрдк renew рдХрд░рддреЛ):
aws acm request-certificate --domain-name school.example \
--subject-alternative-names www.school.example api.school.example \
--validation-method DNS
aws acm describe-certificate --certificate-arn arn:aws:acm:ap-south-1:111122223333:certificate/0a1b2c3d-1111-2222-3333-444455556666 \
--query 'Certificate.{status:Status,names:SubjectAlternativeNames,notAfter:NotAfter,renewal:RenewalEligibility}'
рдПрдХ ALB listener рдЬреЛ рдлрдХреНрдд TLS 1.3 рдЖрдгрд┐ 1.2 рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ, рдЖрдгрд┐ рдПрдХ port-80 listener рдЬреЛ рдлрдХреНрдд redirect рдХрд░рддреЛ:
aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:ap-south-1:111122223333:loadbalancer/app/school-alb/50dc6c495c0c9188 \
--protocol HTTPS --port 443 \
--certificates CertificateArn=arn:aws:acm:ap-south-1:111122223333:certificate/0a1b2c3d-1111-2222-3333-444455556666 \
--ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 \
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-south-1:111122223333:targetgroup/results-api/6d0ecf831eec9f09
aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:ap-south-1:111122223333:loadbalancer/app/school-alb/50dc6c495c0c9188 \
--protocol HTTP --port 80 \
--default-actions 'Type=redirect,RedirectConfig={Protocol=HTTPS,Port=443,StatusCode=HTTP_301}'
CloudFront тАФ certificate us-east-1 рдордзреНрдпреЗ рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ; distribution config рдордзреНрдпреЗ
"ViewerProtocolPolicy": "redirect-to-https" рд▓рд╛рд╡рд╛ рдЖрдгрд┐:
"ViewerCertificate": {
"ACMCertificateArn": "arn:aws:acm:us-east-1:111122223333:certificate/9f8e7d6c-aaaa-bbbb-cccc-ddddeeeeffff",
"SSLSupportMethod": "sni-only",
"MinimumProtocolVersion": "TLSv1.2_2021"
}
Response headers policy рд╡рд╛рдкрд░реВрди CloudFront рдХрдбреВрди HSTS (рдХрд┐рдВрд╡рд╛ header app рдХрдбреВрди рдкрд╛рдард╡рд╛):
aws cloudfront create-response-headers-policy --response-headers-policy-config '{
"Name": "school-security-headers",
"SecurityHeadersConfig": {
"StrictTransportSecurity": { "Override": true, "IncludeSubdomains": true, "Preload": false,
"AccessControlMaxAgeSec": 31536000 },
"ContentTypeOptions": { "Override": true },
"FrameOptions": { "Override": true, "FrameOption": "DENY" }
}
}'
Customer-managed KMS key рд╕рд╣ encryption at rest тАФ key (рджрд░рд╡рд░реНрд╖реА rotation рд╕рд╣), S3 default encryption, default рдиреЗ EBS encryption, рдЖрдгрд┐ рдПрдХ encrypted RDS database рдЬреЛ TLS рд╕реБрджреНрдзрд╛ рдмрдВрдзрдирдХрд╛рд░рдХ рдХрд░рддреЛ:
aws kms create-key --description "school data at rest" --query KeyMetadata.KeyId --output text
aws kms create-alias --alias-name alias/school-data --target-key-id 1234abcd-12ab-34cd-56ef-1234567890ab
aws kms enable-key-rotation --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
aws s3api put-bucket-encryption --bucket school-results --server-side-encryption-configuration '{
"Rules": [{ "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "alias/school-data" },
"BucketKeyEnabled": true }]
}'
aws ec2 enable-ebs-encryption-by-default --region ap-south-1
aws ec2 modify-ebs-default-kms-key-id --kms-key-id alias/school-data --region ap-south-1
aws rds create-db-instance --db-instance-identifier school-db --engine postgres \
--db-instance-class db.t4g.medium --allocated-storage 50 \
--master-username school_admin --manage-master-user-password \
--storage-encrypted --kms-key-id alias/school-data \
--db-parameter-group-name school-pg-tls # a parameter group with rds.force_ssl = 1
(рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ unencrypted RDS instance рд╡рд░ encryption рдЬрд╛рдЧрдЪреНрдпрд╛ рдЬрд╛рдЧреА рдЪрд╛рд▓реВ рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА: snapshot
--kms-key-id рд╕рд╣ copy рдХрд░рд╛, рдордЧ encrypted copy рдордзреВрди restore рдХрд░рд╛.)
TLS рди рд╡рд╛рдкрд░рдгрд╛рд░реА рдХреЛрдгрддреАрд╣реА request рдирд╛рдХрд╛рд░рдгрд╛рд░реА bucket policy:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyPlainHTTP",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::school-results", "arn:aws:s3:::school-results/*"],
"Condition": { "Bool": { "aws:SecureTransport": "false" } }
}]
}
рддреБрдордЪреНрдпрд╛ laptop рд╡рд░реВрди live endpoint рддрдкрд╛рд╕рд╛ тАФ рддрд╛рд░рдЦрд╛ рдЖрдгрд┐ рдирд╛рд╡реЗ, рдЖрдгрд┐ рдЬреБрдиреЗ TLS рдирд╛рдХрд╛рд░рд▓реЗ рдЬрд╛рддреЗ рддреЗ:
echo | openssl s_client -connect school.example:443 -servername school.example 2>/dev/null \
| openssl x509 -noout -subject -enddate -ext subjectAltName
openssl s_client -connect school.example:443 -servername school.example -tls1_1 </dev/null # should fail to connect
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: "ALB uses a modern TLS policy", "S3 bucket has default encryption", "EBS encryption by default" рдЖрдгрд┐ "RDS storage encrypted" рдпрд╛рдВрд╕рд╛рдареА AWS Config rules рдХрд┐рдВрд╡рд╛ Security Hub controls рдЪрд╛рд▓реВ рдХрд░рд╛, рдЖрдгрд┐ ACM certificates рдЪреНрдпрд╛
DaysToExpiryрд╡рд░ alarm рд▓рд╛рд╡рд╛. рдордЧ рдЪреБрдХреАрдЪреА setting рдЬреНрдпрд╛ рджрд┐рд╡рд╢реА рджрд┐рд╕рддреЗ рддреНрдпрд╛рдЪ рджрд┐рд╡рд╢реА robot рд▓рд╛ рд╕рд╛рдкрдбрддреЗ, рдЬреНрдпрд╛ рджрд┐рд╡рд╢реА рдХрд╛рд╣реАрддрд░реА рддреБрдЯрддреЗ рддреНрдпрд╛ рджрд┐рд╡рд╢реА рдкрд╛рд▓рдХрд╛рдВрдирд╛ рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
рдЗрдорд╛рд░рдд рдЦрд┐рдбрдХреАрдЪреЗ рдХрд╛рдо рдкреВрд░реНрдг рдЭрд╛рд▓реЗ: secrets, permissions, networks рдЖрдгрд┐ encryption. рдкреБрдвреЗ рдЖрдкрдг рдкрд░рд┐рд╕рд░рд╛рдЪреНрдпрд╛ рджрд░рд╡рд╛рдЬрд╛рдВрдХрдбреЗ рдЬрд╛рддреЛ тАФ Kubernetes тАФ рдЖрдгрд┐ рддрд┐рдерд▓рд╛ рдкрд╣рд┐рд▓рд╛ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЛ: cluster рдордзреНрдпреЗ рдХреЛрдг рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЛ?
git checkout lesson-10-k8s-rbac