Help keep your Google Cloud service account keys safe: taking charge of your security

Vừa rồi công ty có vụ lộ key Google Cloud Platform (GCP). Mình có quyết định tìm hiểu thêm làm sao để bảo mật key, vừa là bảo vệ chính mình (kinh nghiệm và tính chuyên nghiệp), vừa là bảo vệ tài sản của công ty, hoặc uy tín của công ty với khách hàng.
Google Cloud Platform (GCP) cung cấp khả năng quản lý khóa tài khoản dịch vụ mạnh mẽ để giúp đảm bảo rằng chỉ những người dùng được ủy quyền và được xác thực hợp lệ mới có thể truy cập tài nguyên chạy trên GCP.
Bài viết tuy ngắn thôi, nhưng là một tip theo mình là quan trọng mà mọi người nên để tâm lưu ý.

Protecting service account keys outside GCP

Khi sử dụng ứng dụng để truy cập Cloud Platform APIs, ta nên sử dụng account services. Khi tạo tài khoản, hãy đảm bảo rằng ta đang tuân thủ các nguyên tắc của GCP đưa ra. Đây là cách thực hành tốt trong mọi trường hợp, vì khi ta tải xuống thông tin đăng nhập, GCP không còn quản lý khóa, điều làm tăng nguy cơ vô tình bị lộ.
Lưu ý rằng ta chịu trách nhiệm bảo mật private-key.

Best practices when downloading service account keys

Dưới đây là những cách thực hành tốt nhất để làm sao tránh lộ key ngoài phạm vi sử dụng dự định

  1. Nếu ta đã tải xuống khóa để phát triển trên local, hãy đảm bảo rằng nó không được cấp quyền truy cập vào production resource.
  2. Thay đổi key (Rotate keys) theo các cách của IAM Service Account API :
    • ServiceAccounts.keys.create ()
    • Thay thế khóa cũ bằng khóa mới
    • ServiceAccounts.keys.delete ()
  3. Cân nhắc thực hiện quy trình đổi khóa hàng ngày và cung cấp cho các developer một cloud storage bucket từ đó họ có thể tải về khóa mới mỗi ngày.
  4. Kiểm tra tài khoản và key bằng cách sử dụng phương thức serviceAccount.keys.list () hoặc xem Log Viewer trên console.
  5. Hạn chế cấp key cho người dùng tràn lan.
  6. Luôn sử dụng cleint library và GOOGLE_APPLICATION_CREDENTIALS để phát triển ở local.
  7. Ngăn chặn các developers commit key vào kho lưu trữ mã nguồn bên ngoài (repository cá nhân, hoặc repository không được private).
  8. Và cuối cùng, thường xuyên quét các kho lưu trữ bên ngoài để tìm khóa và thực hiện hành động khắc phục nếu có.
    Dưới đây là một số cách để thực hiện một số trong những thực tiễn tốt nhất này.

Prevent committing keys to external source code repositories

Ta không nên giữ bất kỳ key nào trong mã code của mình, nhưng incedent xảy ra thường là do mã code có chứa key và bị public ra bên ngoài. Một cách để tránh điều này là không sử dụng các kho lưu trữ bên ngoài và đưa các quy trình quản lý vào để ngăn chặn việc sử dụng chúng.
GCP cung cấp git repository riêng cho trường hợp sử dụng này. Hoặc ta cũng có thể áp dụng các biện pháp phòng ngừa để ngăn chặn việc key bị commit lên repository. Một công cụ nguồn mở mà bạn có thể sử dụng là git-secret. Lên google hỏi "How to install git secret" để biết thêm thông tin chi tiết cách cài đặt.
Sau khi cài đặt xong. ta cấu hình để kiểm tra các pattern để match với các từ khóa chứa private key chẳng hạn. <> Ví dụ:

git secrets --add 'private_key'
git secrets --add 'private_key_id'

Một tệp tin json trong source như dưới đây:

{
 "type": "service_account",
 "project_id": "your-project-id",
 "private_key_id": "randomsetofalphanumericcharacters",
 "private_key": "-----BEGIN PRIVATE KEY-----\thisiswhereyourprivatekeyis\n-----END PRIVATE KEY-----\n",
 "client_email": "[email protected]",
 "client_id": "numberhere",
 "auth_uri": "https://accounts.google.com/o/oauth2/auth",
 "token_uri": "https://accounts.google.com/o/oauth2/token",
 "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
 "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/keyname%40your-project-id.iam.gserviceaccount.com"
}

Thì với tệp tin json như trên, khi run lệnh "git add" rồi "git commit" nó sẽ thông báo rằng tệp tin json của ta đang chứa thông tin key nhạy cảm:

SUN-ASTERISK\[email protected]:~/CODE/PiggyMetrics$ git commit -m "abc"
config/src/main/resources/shared/abc.json:4:  "private_key_id": "randomsetofalphanumericcharacters",
config/src/main/resources/shared/abc.json:5:  "private_key": "-----BEGIN PRIVATE KEY-----\thisiswhereyourprivatekeyis\n-----END PRIVATE KEY-----\n",

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
SUN-ASTERISK\[email protected]:~/CODE/PiggyMetrics$ 

Với git-secret, có rất nhiều option mode. Trong đó có option với aws [--register-aws] , giúp ta thêm các AWS patterns common trong git config, quét các key của AWS trong commit.

--register-aws
Adds common AWS patterns to the git config and ensures that keys present in ~/.aws/credentials are not found in any commit. The following checks are added:

AWS Access Key IDs via (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
AWS Secret Access Key assignments via ":" or "=" surrounded by optional quotes
AWS account ID assignments via ":" or "=" surrounded by optional quotes
Allowed patterns for example AWS keys (AKIAIOSFODNN7EXAMPLE and wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)
Known credentials from ~/.aws/credentials

Git secret chi tiết

Scan external repositories for keys

Để bổ sung cho việc sử dụng git-secret, ta cũng có thể chạy trufflehog - một công cụ mã nguồn mở . Trufflehog tìm kiếm lịch sử của repo để tìm bí mật bằng cách sử dụng phân tích entropy (nó sử dụng entropy của Shannon) để tìm bất kỳ khóa nào có thể đã được tải lên.


All Rights Reserved