Chuyển đến nội dung chính
Phiên bản 02. Cập nhật:
  • Link Invoke-WebRequest
  • Với secrets lưu trong mã nguồn
  • Với secrets lưu trong file cấu hình
Việc lưu trữ các dữ liệu nhạy cảm ngay trong mã nguồn (secrets hardcoding) là một loại lỗ hổng bảo mật. Thông qua việc vô tình làm lộ mã nguồn, hoặc các tấn công đọc file ở máy chủ, những secrets này có thể bị kẻ tấn công thu thập, và từ đó giành quyền truy cập trái phép vào những hệ thống có liên quan. Vì vậy, cần tuyệt đối tránh hình thức lưu trữ không an toàn này trong quá trình phát triển phần mềm. Dưới đây là cách phát hiện và gỡ bỏ các secrets trong mã nguồn dự án của bạn một cách an toàn với Locker Secrets Manager.

Cài đặt Locker CLI

Start-Process powershell -Verb runAs
New-Item -Path "$HOME\.locker" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://locker.io/secrets/download/cli-windows" -OutFile "$HOME\.locker\locker.exe"
$oldPath = [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine)
$newPath = "$oldPath;$HOME\.locker"
[System.Environment]::SetEnvironmentVariable("Path", $newPath, [System.EnvironmentVariableTarget]::Machine)

Phát hiện Secrets trong dự án

Sử dụng lệnh scan như sau:
locker scan --source <path-to-source-code>
Chúng ta sẽ thu được kết quả bao gồm: đường dẫn đến tệp tin chứa secrets, giá trị secret tìm thấy, thứ tự dòng chứa secret, loại secret và mã commit. Kết quả lệnh locker scan

Thay đổi cách lưu Secrets an toàn

Với các phát hiện sau khi scan ra, chúng ta sẽ cần thay đổi cách lưu chúng an toàn hơn thay vì hardcoding. Khởi tạo dự án tại Locker Secrets
  • Tạo một tài khoản Locker Secrets tại đây nếu bạn chưa có tài khoản.
  • Tạo mới project, tương ứng với dự án chứa secrets của bạn.
  • Tạo Access Key trong Project, đây là cặp khóa bạn sẽ sử dụng cho Locker SDK ở các bước tiếp theo.

Với secrets lưu trong mã nguồn

Với số lượng secrets lưu trong mã nguồn nhỏ, bạn có thể tiến hành cập nhật thủ công lại theo các bước sau:
  1. Thêm các secrets bị hardcoding tương ứng lên Locker Secrets Project bạn vừa tạo thông qua giao diện web.
  2. Cài đặt Secrets SDK tương ứng với ngôn ngữ bạn đang sử dụng tại đây.
  3. Sử dụng cặp Access Key và Secret Access Key ở trên để khởi tạo trong SDK Config object.
  4. Tìm kiếm thủ công vị trí secret của bạn bị hardcoding, tiến hành thay thế lại bằng cách sử dụng SDK để gọi biến secret tương ứng đã được lưu từ trước đó.
Tính năng cập nhật tự động secrets đang được hoàn thiện và sẽ được cập nhật trong các phiên bản tiếp theo.
Ví dụ minh họa với ngôn ngữ Python Giả sử bạn có file settings.py bị hardcoding như sau:
# ...
DEFAULT_CONFIG = {
  "database": {
    "host": "mysql.myserver.com",
    "port": 3306,
    "username": "my_database",
    "password": "Ol1PPgsG4htlBb0q7THJP7nWyBJXbAJg"
  },
  "request": {
    "access_key_id": "ak29NASAs",
    "secret_token": "qHg34VAGQZwCkUy4UjZQAsCVeH6TvsJg"
  }
}
# ...
Locker CLI đã phát hiện bạn hardcoding ở các dòng:
"password": "Ol1PPgsG4htlBb0q7THJP7nWyBJXbAJg"
...
"secret_token": "qHg34VAGQZwCkUy4UjZQAsCVeH6TvsJg"
Bạn sẽ cần tiến hành tạo các secret lên Locker Project qua giao diện web tương ứng như sau:
DATABASE_PASSWORD: Ol1PPgsG4htlBb0q7THJP7nWyBJXbAJg
REQUEST_SECRET_TOKEN: qHg34VAGQZwCkUy4UjZQAsCVeH6TvsJg
Cài đặt Locker Secret SDK và tiến hành thay thế việc hardcoding bằng việc sử dụng SDK. requirements.txt
...
lockerpm
...
Lưu trữ cặp Locker Access Key của bạn bằng biến môi trường:
export ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
export SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>
Tiến hành khai báo, khởi tạo Locker Secret Manager object: secret_management.py
import os
from locker import Locker

client = Locker(
    access_key_id=os.get_env(ACCESS_KEY_ID),
    secret_access_key=os.get_env(SECRET_ACCESS_KEY),
)
Thay thế việc hardcoding bằng cách dùng SDK gọi biến: settings.py
from secret_management import client
# ...
DEFAULT_CONFIG = {
  "database": {
    "host": "mysql.myserver.com",
    "port": 3306,
    "username": "my_database",
    "password": client.get("DATABASE_PASSWORD"),
  },
  "request": {
    "access_key_id": "ak29NASAs",
    "secret_token": client.get("REQUEST_SECRET_TOKEN")
  }
}
# ...
Với số lượng secrets lớn, bạn có thể dùng tùy chọn scan fix. Tùy chọn này sẽ thực hiện nạp toàn bộ các secrets của bạn lên dự án Locker tương ứng, đồng thời tự động thay thế các secrets trong mã nguồn bằng việc sử dụng SDK:
  1. Lưu trữ cặp Locker Access Key bằng biến môi trường (tương tự như trên).
  2. Sử dụng lệnh scan fix:
locker scan fix --source <path-to-source-code> --language <program-language>
  1. Rà soát lại mã nguồn của bạn, đảm bảo các secrets được gọi và dùng đúng mục đích.
Hiện tại tùy chọn scan fix mới được hỗ trợ với ngôn ngữ Python. Các ngôn ngữ khác sẽ được chúng tôi cập nhật thêm trong thời gian tới.
Ví dụ minh họa với lệnh scan fix: Sau khi sử dụng lệnh locker scan fix --source . --language python, các secrets sẽ tự động được nạp lên project với tên key tăng dần như SECRET1, SECRET2 và khởi tạo Locker SDK instance: secret_manager.py
import os
from locker import Locker
locker_client = Locker(
    access_key_id=os.getenv("LOCKER_ACCESS_KEY_ID"),
    secret_access_key=os.getenv("LOCKER_SECRET_ACCESS_KEY")
)
settings.py
from secret_management import locker_client
# ...
DEFAULT_CONFIG = {
  "database": {
    "host": "mysql.myserver.com",
    "port": 3306,
    "username": "my_database",
    "password": locker_client.get("SECRET1"),
  },
  "request": {
    "access_key_id": "ak29NASAs",
    "secret_token": locker_client.get("SECRET2")
  }
}
# ...

Với secrets lưu trong file chứa biến môi trường

  1. Kiểm tra xem file chứa biến môi trường này có cần thiết với dự án không. Nếu không, tiến hành xóa bỏ file biến môi trường này.
  2. Nếu dự án bạn cần các secret trong file chứa biến môi trường này, cấu hình locker với cặp Access Key đã tạo bằng lệnh:
locker configuration --access-key-id {access key id} --secret-access-key {secret access key}
  1. Lưu secret vào Vault của Locker Secret:
locker secret create --key {secret key} --value {secret value} --description {secret description (optional)} --environment {secret environment}
  1. Sử dụng lệnh locker secret run để chạy dự án với các secret đã được lưu:
locker secret run --environment dev --command your_command
Lệnh locker run sẽ đưa các secret ở một môi trường chỉ định vào như là các biến môi trường trong lệnh chạy chương trình của bạn.
  1. Xóa secrets lưu trong file chứa biến môi trường của bạn.

Với secrets lưu trong file cấu hình

  1. Cấu hình Locker CLI với cặp Access Key và Secret Key bạn đã tạo trước đó:
locker configuration --access-key-id {YOUR_ACCESS_KEY_ID} --secret-access-key {YOUR_SECRET_ACCESS_KEY}
  1. Dựa theo kết quả scan, xác định vị trí file cấu hình có chứa các secrets của bạn, sử dụng Locker CLI để import các secrets này lên project:
locker secret import --source {CONFIG_FILE_LOCATION}
  1. Nếu trong chương trình của bạn có sử dụng các secrets lưu trong file cấu hình, tiến hành thay thế phần mã nguồn sử dụng file config này bằng Locker SDK.