Kết quả
No results found.
Phiên bản 02. Cập nhật:
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 phần mềm Locker Secrets Manager.
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)
mkdir -p ~/.locker
wget https://locker.io/secrets/download/cli-linux -O ~/.locker/locker
chmod +x ~/.locker/locker
sudo ln -sf ~/.locker/locker /usr/local/bin/locker
mkdir -p ~/.locker
wget https://locker.io/secrets/download/cli-mac-arm64 -O ~/.locker/locker
chmod +x ~/.locker/locker
sudo ln -sf ~/.locker/locker /usr/local/bin/locker
mkdir -p ~/.locker
wget https://locker.io/secrets/download/cli-mac-x64 -O ~/.locker/locker
chmod +x ~/.locker/locker
sudo ln -sf ~/.locker/locker /usr/local/bin/locker
Sử dụng lệnh scan như sau
locker scan --source <path-to-source-code>
Chúng ta sẽ thu được kết quả như hình dưới, bao gồm:
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.
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 đã tạo từ trước đó bằng biến môi trường.
Linux/MacOS
export ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
export SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>
Windows
Powershell
$Env:ACCESS_KEY_ID = '<YOUR_ACCESS_KEY_ID>'
$Env:SECRET_ACCESS_KEY = '<SECRET_ACCESS_KEY>'
Command Prompt
set ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
set 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 tại nơi lộ lọt secret của bạ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")
}
}
# ...
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 nó cũng sẽ tự động thay thế các secrets của bạn trong mã nguồn bằng việc sử dụng SDK gọi biến tương ứng trên dự án Locker:
scan fix
locker scan fix --source <path-to-source-code> --language <program-language>
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"
Lưu trữ cặp Locker Access Key của bạn đã tạo từ trước đó bằng biến môi trường, tương tự như với việc cập nhật thu công ở trên.
Sử dụng lệnh scan fix
như sau
locker scan fix --source . --language python
Sau khi sử dụng lệnh này, các secrets sẽ tự động được nạp tự động lên project của bạn với tên key tăng dần như SECRET1, SECRET2 và đồng thời khởi tạo Locker SDK instance và thay thế trong mã nguồn của bạn
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")
}
}
# ...
locker configuration --access-key-id {access key id} --secret-access-key {secret access key}
locker secret create
:locker secret create --key {secret key} --value {secret value} --description {secret description (optional)} --environment {secret environment (if the secret is associated with a specific environment)}
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 (đã được lưu trên Locker Secret trước đó) 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.
locker configuration --access-key-id {YOUR_ACCESS_KEY_ID} --secret-access-key {YOUR_SECRET_ACCESS_KEY}
locker secret import --source {CONFIG_FILE_LOCATION}
Dưới đây là minh họa với ngôn ngữ Python
Giả sử bạn có file cấu hình chứa secrets bị lộ lọt như sau config.ini
[DEFAULT]
Timeout = 30
SecretKey = this.is.secret
Forward = 1
MaxRetries = 10
[mysql1]
Port = 3306
Host = mysql1.example
Username = root
Password = root
[mysql2]
Port = 3307
Host = mysql2.example
Username = root
Password = root
Mã nguồn load file cấu hình trên của bạn giả sử như sau:
import configparser
class Config:
def __init__(self):
self.config_parser = configparser.ConfigParser()
self.config_parser.read('config.ini')
self.set_attr()
def set_attr(self):
for sec in self.config_parser.sections():
for key, value in self.config_parser.items(sec):
setattr(self, f"{sec}_{key}", value)
Khi này, bạn cần import các secrets này lên Locker project của bạn bằng lệnh
locker secret import --source config.ini
Thay thế mã nguồn load file cấu hình với Locker Python SDK
from locker import Locker
LOCKER_ACCESS_KEY_ID = os.getenv('LOCKER_ACCESS_KEY_ID')
LOCKER_SECRET_ACCESS_KEY = os.getenv('LOCKER_SECRET_ACCESS_KEY')
class Config:
def __init__(self):
self.locker = Locker(access_key_id=LOCKER_ACCESS_KEY_ID, secret_access_key=LOCKER_SECRET_ACCESS_KEY)
self.set_attr()
def set_attr(self):
secrets = self.locker.list()
for arg in secrets:
setattr(self, arg['key'], arg['value'])
Cuối cùng chúng ta xóa bỏ file cấu hình ra khỏi thư mục.
Không giống như cách tổ chức tệp tin thông thường trong máy tính, Git là một phần mềm với cơ chế lưu tệp tin và tổ chức dữ liệu phức tạp dựa trên phiên bản. Vì thế, nếu bạn xóa hoặc thay đổi nội dung của một tệp tin, nó chỉ đơn giản là xóa và thay đổi ở phiên bản hiện tại trong khi những nội dung đó vẫn tồn tại ở các phiên bản trước, và chúng có thể truy xuất được thông qua các git commit
.
Với những dữ liệu nhạy cảm và bí mật, để xóa bỏ hoàn toàn, chúng ta buộc phải xóa toàn bộ lịch sử git commit
có liên quan đến tệp tin chứa dữ liệu đó. Có 2 phương pháp chính có thể sử dụng cho công việc này:
git filter-branch
nhưng tốc độ nhanh hơn 10-720 lần. --mirror
. Điều này sẽ giúp chúng ta có được đầy đủ git index và metadata của dự án mà không cần có dữ liệu thựcgit clone --mirror https://github.com/owner/repo.git
java -jar bfg.jar <file_name> some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push -f
Email: [email protected]
Website: https://locker.io/vi/secrets