Bảo mật hạ tầng và quản lý secret

Chủ đề Dành cho thành viên
Bài đọc thử: 1/3 · còn 2 bài miễn phí · Xem gói thành viên

Bài toán

Khi hệ thống lớn lên, số credential (mật khẩu DB, API key, SSH key, token, cookie phiên) tăng theo số service, pipeline, nhà cung cấp, và chúng rải vào code, cấu hình, hệ build, log. Các nguồn trong wiki cho thấy kẻ tấn công hiếm khi phá thẳng sản phẩm; họ đi qua đường vòng của hạ tầng: môi trường dev, build server, tài khoản CI/CD, cache, hệ giám sát lỗi. Bài toán là thu hẹp quyền của mỗi credential, biết credential nằm ở đâu, xoay vòng được hàng loạt khi lộ, và chặn các đường rò mà không ai để ý.

Trang này nói về phía hạ tầng và vận hành (secret, quyền, sự cố bảo mật). Mật mã ứng dụng và bảo mật sản phẩm nằm ngoài phạm vi; quy trình xử lý sự cố chung ở Xử lý sự cố và on-call.

Diễn tiến theo thời gian

  • 2010→2013 · Go: Playground cách ly code người dùng bằng Native Client (giới hạn CPU, RAM, không mạng, không file) và giới hạn cả thời gian thật để chống DoS; tài nguyên bị cấm được giả lập trong runtime thay vì nới cách ly. Go 2013
  • 2013→2017 · Riot Games: đội bảo mật từ người gác cổng nói "không" thành đội đưa phương án: hỏi engineer cần gì, chuẩn hoá qua RFC, security champion trong team. Công cụ tự động gắn ownership cho EC2 bằng tag (nhắc rồi tắt, xoá instance không tag) lần đầu làm suy giảm production của League; RCA công khai, làm lại, mở mã thành Cloud Inquisitor. Riot Games 2017
  • 2013→2017 · Stack Overflow: đưa cookie lên domain gốc cho đăng nhập chung thì mọi subdomain đều nhận cookie, nên phải dời dịch vụ bên thứ ba (link email, blog) ra domain khác. HSTS includeSubDomains chưa bật được vì domain cũ và domain nội bộ. Theo Nick Craver, động lực chính của HTTPS là HTTP/2 chứ không phải bảo mật. Stack Overflow 2017
  • 2014→2018 · Mozilla: mã hoá dữ liệu đồng bộ mà nhà cung cấp không giữ khoá: khoá dẫn xuất từ mật khẩu ở máy người dùng, server chỉ nhận token xác thực. Theo Mozilla, mật khẩu riêng cho mã hoá (kiểu Chrome) dễ bị đặt trùng còn tuỳ chọn thì hiếm ai bật; bài tự ghi các hằng số đã cũ (1.000 vòng PBKDF2, CBC+HMAC). Mozilla 2018
  • 2017 · Slalom Build (công ty tư vấn): ba mức quản lý secret (giới hạn truy cập → mã hoá → quản lý có ACL/audit/TTL), đi dần theo kỹ năng của team. Hai kiến trúc cho khách: git-crypt trong repo riêng + Jenkins đẩy lên Chef Vault, kèm job 5 phút một lần làm mới danh sách quyền tĩnh; rồi HashiCorp Vault với token lấy trước khi Chef chạy và cron làm mới token vì khách muốn vá instance tại chỗ. Theo Slalom, mỗi lớp mã hoá sinh ra một key mới, nên phải chọn chỗ neo niềm tin (KMS, Vault) Slalom Build 2017
  • 2018 · Segment: từ một tài khoản AWS lên vài chục (cô lập bảo mật, GDPR, giới hạn rate limit theo tài khoản); bỏ hẳn AWS key của nhân viên, mọi truy cập qua Okta vào tài khoản hub rồi assume role sang spoke; công cụ aws-okta gần như thay thế y hệt aws-vault nên việc thu hồi key diễn ra êm. Segment 2018
  • 2018 · Coinbase: deployer Odin (Lambda + Step Function) là hạ tầng nhạy cảm nên chính nó bị khoá: chỉ Odin được deploy, chỉ người được chọn gọi được nó, tài nguyên tham chiếu bằng tag nên chỉ dùng được cho đúng project, chống replay bằng ngày tạo và bản release trên S3; thay máy mới mỗi lần deploy để giữ 98% instance dưới 30 ngày tuổi. Coinbase 2018
  • 2018 · Slalom Build (cho Discover): kiến trúc nhiều tài khoản AWS: tài khoản identity là nơi đăng nhập duy nhất, người dùng assume role vào tài khoản team (không IAM user, không access key sống lâu), role cấm sửa CloudTrail/VPC/Lambda giám sát, log về một tài khoản logging riêng, SCP theo nhánh tổ chức; tài khoản team đồng nhất, tạo bằng pipeline Yeoman + Terraform + Jenkins. Bài tư vấn, mọi nhận định theo Slalom. Slalom Build 2018
  • 2018 · Heroku: Lỗ hổng Redis bị cấm công bố: vá toàn fleet mà không nói nguyên nhân cho khách, xong trước ngày công bố một tuần. Heroku 2018
  • 2019 · Stack Overflow: chuỗi tấn công 12 ngày: tầng dev mở Internet cho phép giả danh mọi user và xem email khôi phục; site settings chứa credential của một tính năng đã bỏ nhưng còn hiệu lực; TeamCity mở Internet và gán quyền admin mặc định; SSH key plaintext trên build server dẫn tới clone mã nguồn; cuối cùng một build chạy SQL nâng quyền trên production. Truy vết được nhờ log toàn bộ traffic. Sau đó: build và source control ra sau firewall, gỡ secret khỏi code và xoay vòng, secret chỉ ghi không đọc, tách build khỏi deploy, kho secret lúc chạy. Stack Overflow 2021
  • 2019→2023 · Slack: gỡ IMDSv1 (credential instance dễ lấy qua SSRF) khỏi khoảng 60.000 instance: đo bằng metric, tìm process gọi, đổi mặc định trong module Terraform dùng chung với danh sách ngoại lệ co dần, chặn bằng SCP, lưới cuối là cảnh báo và tự khắc phục. Slack 2023
  • 2019 · Postman: IAM user và group theo sơ đồ tổ chức (team, mức quyền, chủ service); audit theo checklist (root key, MFA, xoay key 45/180 ngày, quyền không dùng 180 ngày, policy wildcard) lần đầu làm tay mất 3 ngày, sau đó chạy theo lịch và đẩy kết quả vào Slack. Postman 2019
  • 2019 · Monzo: khoảng 1.100 microservice; gộp hai cơ chế secret (Kubernetes secrets plaintext trong etcd, Vault cần key ceremony 3 giờ cho mọi thay đổi) về một Vault cấu hình bằng Terraform: service xác thực bằng service account token, policy templating cho mỗi service một vùng đọc mặc định, mọi engineer tự thêm secret mới (bất biến, có phiên bản) nhưng không ghi đè được; Kubernetes secrets mã hoá at rest bằng khoá trong Vault. Monzo 2019
  • 2019→2022 · Monzo: detection rule từ hàm Go trong microservice cảnh báo (hợp khi đội 12 người, phần lớn là engineer) sang Sigma (YAML) khi đội gần 50 người: analyst tự viết rule, độ phủ phân tích được; thử bằng thư viện sigma-go thay logic trong service cũ thay vì dựng SIEM; tự viết lint và unit test cho rule để bù CI đã mất khi rời Go. Monzo 2022
  • 2019 · GitLab: cert và CA của Consul tạo cho proof-of-concept vào production không qua readiness review, không ai giám sát hạn, CA key bị mất; mTLS hai chiều làm mọi bản sửa phải đồng thời trên cả fleet. Tạm thời tắt kiểm ngày hết hạn để có thời gian làm đúng. GitLab 2019
  • 2019 · Zillow: Lambda quét trang mỗi vài phút bằng Selenium + Chrome, đọc file cookie SQLite của Chrome, so với whitelist trong DynamoDB và báo qua Opsgenie khi có cookie không tôn trọng tuỳ chọn của người dùng. Zillow 2019
  • 2020→2021 · GitLab: push mirror từ repo công khai sang fork Security riêng tư dùng git fetch, nên commit vá lỗi nằm trên đĩa repo công khai và xem được qua SHA hiện ở trang Help trong lúc security release. Tạm dừng mirror khi đang vá, rồi đổi sang ls-remote qua thí nghiệm so song song, feature flag, bật mặc định cho self-managed; lỗi phụ là race giữa hai lần lấy ref, sửa bằng đổi thứ tự. GitLab 2021
  • 2020 · Disney Hotstar: đội security mới vài tháng, hơn 20 tài khoản cloud và hai chữ số cụm Kubernetes: "control line và mop-up" (từ một ngày đã thống nhất thì phát hiện realtime vi phạm mới, vi phạm cũ quét toàn bộ rồi giao chủ dịch vụ dọn dần), một công cụ chụp snapshot tài nguyên AWS dùng chung cho mọi kiểm tra (tránh bị throttle), giám sát Route53 chống subdomain takeover, quét secret (chỉ 5% là secret production quan trọng), quyền có thời hạn qua cổng truy cập, MFA cho mọi người. Disney Hotstar 2020
  • 2020 · Stack Overflow: phòng thủ theo lớp chống lạm dụng: rate limit và chặn IP ở rìa, phân loại nội dung trong app, rồi con người; cờ của user và moderator quay về làm tín hiệu cho bộ lọc tự động. Stack Overflow 2020
  • 2021 · Twitter: chuyển hệ nội bộ sang security key bắt buộc trước khi có sự cố phishing kiểu Dropbox 2022: hơn 5.500 khoá gửi trong COVID, platform authenticator làm phương án thay khi khoá giao trễ. Twitter 2021
  • 2021 · Loveholidays: hạ tầng self-serve trên 33 repo Terraform, apply qua Atlantis (credential riêng mỗi instance bằng Workload Identity, chỉ public đường webhook vì trang chủ Atlantis có nút tắt apply không cần đăng nhập); policy as code bằng Rego (Regula + Conftest) chạy trên plan chứ không trên code, tải bản mới nhất mỗi lần plan, có unit test, vi phạm cũ được miễn trừ tường minh bằng waiver. Loveholidays 2021
  • 2021 · WhatsApp: khoá sao lưu E2EE cất trong Backup Key Vault trên HSM, HSM giới hạn số lần thử mật khẩu nên chính WhatsApp không dò được; ChatD chuyển tin mã hoá giữa client và HSM mà không đọc. Năm 2026 đội HSM replication theo đa số, khoá đội HSM cho Messenger phân phối qua mạng trong gói Cloudflare ký. WhatsApp 2021 WhatsApp 2026
  • 2022 · Dropbox: email giả CircleCI lừa nhân viên nhập mật khẩu GitHub và mã OTP từ khoá phần cứng vào trang giả; mất 130 repo (không phải repo lõi) chứa API key. Xoay vòng credential, đẩy nhanh WebAuthn vì chỉ xác thực gắn tên miền mới chống được phishing. Dropbox 2022
  • 2022→2024 · Fly.io: token OAuth2 quá nhiều quyền được thay bằng Macaroon: user tự thu hẹp token bằng caveat, caveat bên thứ ba cho SSO và chính sách ngoài; dịch vụ xác minh cách ly vật lý; service token cho worker suy ra từ token của khách và khoá vào đúng máy. Fly.io 2024
  • 2023 · Dropbox: dịch vụ bảo mật bên thứ ba cũng là đường rò: URL gửi đi kiểm malware hiện ra cho khách khác của vendor; hướng mới là phát hiện bằng tín hiệu hành vi thay vì gửi dữ liệu người dùng ra ngoài. Dropbox 2023
  • 2024 · WarpStream (nhà cung cấp): BYOC cho Kafka mà nhà cung cấp không cần quyền vào tài khoản khách: agent không trạng thái chỉ cần một bucket và kết nối outbound, chỉ metadata đi sang control plane; có được nhờ tách compute khỏi storage và dữ liệu khỏi metadata (theo WarpStream). WarpStream 2024
  • 2025 · Rust (crates.io): cookie phiên (đủ để giả danh user) bị gửi kèm payload lỗi lên Sentry; header Authorization đã được che nhưng cookie thì không. Che mọi cookie, vô hiệu mọi phiên. Rust 2025
  • 2025 · Uber: hơn 150.000 secret: pre-commit hook chặn secret, quét real-time và định kỳ; gom 25 kho của nhiều team thành 6 kho của một team; metadata (provider, nền tảng phân phối, mức ảnh hưởng); xoay vòng tự động 20.000 secret mỗi tháng; trao đổi secret với nhà cung cấp không qua tay người. Hướng tới không dùng secret (workload identity). Uber 2025
  • 2025 · Uber: credential superuser chuyển từ máy engineer về một dịch vụ thực thi; audit log ghi người khởi tạo thay vì chỉ principal chung (bài 2/2026). Uber 2026
  • 2025 · WhatsApp: Private Processing: build chỉ từ mã đã check-in, đổi build cần nhiều kỹ sư, cấm remote shell kể cả từ host, công bố image CVM để bên ngoài kiểm. WhatsApp 2025
  • 2025 · Slack: Anomaly Event Response: phát hiện Tor, tải hàng loạt, scraping, fingerprint session lệch trên hàng tỉ event/ngày với ngưỡng theo lịch sử từng tổ chức, rồi tự cắt session trong vài phút. Slack 2025
  • 2026 · Rust (Miri): Miri ghi toàn bộ biến môi trường vào target/; nếu target/ được cache trong GitHub Actions và job có secret, PR có thể đọc secret từ cache. Sửa Miri và khuyến nghị chỉ cấp secret theo step. Rust 2026

Các lựa chọn và đánh đổi

Lựa chọn Được Mất Nguồn
Secret tiêm lúc build Đơn giản, có sẵn trong CI Build server thành kho secret; artifact mang secret Stack Overflow 2021
Kho secret lúc chạy, một đội sở hữu Áp chuẩn đồng nhất, xoay vòng được Phải migrate từ kho tự dựng; một đội chịu tải Uber 2025
Token thu hẹp được (Macaroon) Least privilege tại chỗ, plugin chính sách Phức tạp; dịch vụ xác minh riêng Fly.io 2024
Workload identity, không secret Không có gì để lộ Cần tích hợp từng hệ; chưa phủ hết Uber 2025
MFA OTP/push Dễ triển khai Vẫn bị phishing Dropbox 2022
WebAuthn Chống phishing Phải cấp khoá phần cứng/sinh trắc cho mọi người; app dùng trình duyệt nhúng chưa hỗ trợ Dropbox 2022, Twitter 2021
Đội bảo mật gác cổng (bắt buộc review, chặn) Kiểm soát tập trung Team đi vòng; không scale Riot Games 2017
Chuẩn qua RFC + security champion + công cụ tự áp Đồng thuận từ dưới lên; scale theo số team Chậm; công cụ tự áp có thể gây sự cố Riot Games 2017
Đổi mặc định ở nền tảng + danh sách ngoại lệ Phủ cả fleet, chặn tái phát Cần đo và đuổi phần đuôi Slack 2023
Credential người qua IdP + tài khoản hub, không key dài hạn Không có key để lộ; thu hồi tập trung Công cụ thay thế phải gần như y hệt cách cũ Segment 2018
IAM user có key + audit định kỳ Đơn giản, quen thuộc Key dài hạn vẫn tồn tại; audit chỉ phát hiện, không sửa Postman 2019
Detection rule là code (Go trong microservice) Dùng sẵn mẫu, thư viện, CI của công ty Analyst không viết được; khó phân tích độ phủ; không chạy thử trên dữ liệu cũ Monzo 2022
Detection rule là dữ liệu (Sigma) Analyst tự viết; phân tích độ phủ; đổi engine được Phải tự dựng lại lint/test Monzo 2022
BYOC mà data plane không trạng thái Nhà cung cấp không cần quyền vào tài khoản khách Khách tự vận hành compute WarpStream 2024

Quy tắc rút ra

  1. Đường vào thường là hạ tầng phụ: môi trường dev, build server, CI/CD bên thứ ba, cache CI, hệ giám sát lỗi. Bảo vệ chúng ngang production. Stack Overflow 2021 Dropbox 2022 Rust 2026 Rust 2025
  2. "Secret không chỉ là mật khẩu": SSH key, chuỗi kết nối, cookie phiên, biến môi trường đều là secret; credential của tính năng đã bỏ phải bị thu hồi. Stack Overflow 2021
  3. Biết secret nằm ở đâu trước khi xoay vòng được: inventory + metadata là nền cho tự động hoá. Uber 2025
  4. Dữ liệu chia sẻ giữa các mức tin cậy khác nhau (cache CI, log, telemetry, repo mirror) không được chứa secret; che theo danh sách cho phép bền hơn danh sách cấm. Cả thao tác đồng bộ "chỉ để so sánh" cũng có thể kéo dữ liệu riêng sang chỗ công khai (GitLab fetch). Rust 2026 Rust 2025 GitLab 2021
  5. Credential cho máy chủ nên suy ra từ hành động của khách và bị khoá vào đúng máy, thay vì để máy tự quyết lấy gì. Fly.io 2024
  6. Không chắc đã lộ hay chưa thì vô hiệu hoá hàng loạt (xoay vòng, đăng xuất mọi người): rẻ hơn điều tra. Rust 2025 Dropbox 2022
  7. Log toàn bộ traffic vào: không log thì không điều tra được. Stack Overflow 2021
  8. Đổi phương thức xác thực cho cả công ty theo mẫu cho phép → đo theo người/team → hạn chót báo trước → tắt cách cũ, như đổi mặc định ở hạ tầng. Twitter 2021 Slack 2023
  9. Công cụ bảo mật tự tắt/xoá tài nguyên là một thay đổi production: rollout có truyền thông, có nhắc trước, đo tác động. Riot Games 2017 Xem Tự động hoá vận hành và auto-remediation.
  10. Bảo mật scale bằng người trong team (champion, checklist, chuẩn qua RFC), không bằng đội gác cổng; nhúng engineer bảo mật vào team không scale. Riot Games 2017 Xem Mô hình tổ chức SRE (cùng câu hỏi với SRE).
  11. Cơ chế an toàn khó dùng sẽ bị né: một kho secret cho mọi loại secret, kèm công cụ và thư viện dễ dùng, an toàn hơn hai kho trong đó kho tốt ít ai dùng. Gỡ credential dài hạn của người cũng chỉ êm khi công cụ thay thế "thả vào là chạy". Monzo 2019 Segment 2018
  12. Phân quyền theo hành động trên secret: thêm mới thì tự phục vụ, ghi đè và đọc hàng loạt thì kiểm soát chặt; secret bất biến có phiên bản biến việc đổi secret thành một deploy. Bootstrap bằng danh tính sẵn có của workload để tránh gà-và-trứng. Monzo 2019
  13. Hệ có quyền rộng (deployer, công cụ admin) phải tự bị giới hạn: ai gọi được, dùng được tài nguyên nào, chống replay, để lại audit. Coinbase 2018 Coinbase 2026
  14. Detection rule nên là dữ liệu khai báo như policy phân quyền: phân tích được, người gần vấn đề tự viết được; thử ngôn ngữ mới trên kiến trúc cũ trước khi dựng SIEM. Monzo 2022
  15. Chia tài khoản cloud là một cách giới hạn bán kính ảnh hưởng cho cả bảo mật lẫn rate limit của nhà cung cấp; phải gom quyền về một điểm trước khi số tài khoản tăng. Segment 2018

Câu hỏi mở

  • Chưa có nguồn đo chi phí vận hành của kho secret tập trung (độ trễ, sự cố của chính kho secret làm sập dịch vụ). Monzo 2019 có ghi "scale Vault theo tải" là việc tiếp theo nhưng chưa có bài kể kết quả.
  • Detection rule chạy thử trên dữ liệu lịch sử trước khi bật (Monzo 2022 nêu là việc đang làm) và tỉ lệ alert giả của rule do analyst viết: chưa có số liệu.
  • Xoay vòng tự động lỗi là rủi ro độ tin cậy (Uber nêu, muốn coi cập nhật secret như deploy code); chưa có nguồn kể sự cố do xoay vòng.
  • Chưa có nguồn đo hiệu quả của mô hình security champion (Riot 2017 tự nhận khó đo).
  • Workload identity (SPIFFE/SPIRE) mới được nhắc là hướng đi; chưa có nguồn kể triển khai trọn vẹn. Đã có nơi dùng SPIFFE ID làm định danh khi phân quyền (Uber Charter 2023, Coinbase 2026), xem Xác thực và phân quyền (authn/authz).
  • Liên hệ: Xác thực và phân quyền (authn/authz) (thiết kế hệ xác thực, phân quyền), CI và build ở quy mô lớn (cache CI), Nền tảng nội bộ cho service (đường ray chung) (đổi mặc định ở nền tảng), Sự cố và postmortem, Observability và monitoring (telemetry là nơi rò).
  • Liên hệ: Mã hoá đầu cuối và hệ thống mà server không được đọc (mật mã phía sản phẩm: HSM giữ khoá người dùng, TEE, log minh bạch).