> ## Documentation Index
> Fetch the complete documentation index at: https://support.locker.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Hướng dẫn gỡ bỏ dữ liệu bí mật trong mã nguồn phần mềm

> Hướng dẫn phát hiện và gỡ bỏ secrets bị hardcoding trong mã nguồn dự án một cách an toàn với Locker Secrets Manager

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

<Tabs>
  <Tab title="Windows">
    ```powershell theme={null}
    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)
    ```
  </Tab>

  <Tab title="Linux">
    ```bash theme={null}
    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
    ```
  </Tab>

  <Tab title="macOS (arm)">
    ```bash theme={null}
    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
    ```
  </Tab>

  <Tab title="macOS (x64)">
    ```bash theme={null}
    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
    ```
  </Tab>
</Tabs>

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

Sử dụng lệnh `scan` như sau:

```bash theme={null}
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.

<img src="https://mintcdn.com/locker/ZpQHj9IjHy-TnRFC/images/vi/locker-secrets-manager/get-started/scan-result.png?fit=max&auto=format&n=ZpQHj9IjHy-TnRFC&q=85&s=8888f237594483117dc8eb32d114d354" alt="Kết quả lệnh locker scan" width="728" height="562" data-path="images/vi/locker-secrets-manager/get-started/scan-result.png" />

### 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 đó.

<Note>
  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.
</Note>

**Ví dụ minh họa với ngôn ngữ Python**

Giả sử bạn có file `settings.py` bị hardcoding như sau:

```python theme={null}
# ...
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:

```python theme={null}
"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:

<Tabs>
  <Tab title="Linux/macOS">
    ```bash theme={null}
    export ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
    export SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>
    ```
  </Tab>

  <Tab title="Windows (Powershell)">
    ```powershell theme={null}
    $Env:ACCESS_KEY_ID = '<YOUR_ACCESS_KEY_ID>'
    $Env:SECRET_ACCESS_KEY = '<SECRET_ACCESS_KEY>'
    ```
  </Tab>

  <Tab title="Windows (Command Prompt)">
    ```cmd theme={null}
    set ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
    set SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>
    ```
  </Tab>
</Tabs>

Tiến hành khai báo, khởi tạo Locker Secret Manager object:

`secret_management.py`

```python theme={null}
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`

```python theme={null}
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`:

```bash theme={null}
locker scan fix --source <path-to-source-code> --language <program-language>
```

3. 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.

<Note>
  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.
</Note>

**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`

```python theme={null}
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`

```python theme={null}
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:

```bash theme={null}
locker configuration --access-key-id {access key id} --secret-access-key {secret access key}
```

3. Lưu secret vào Vault của Locker Secret:

```bash theme={null}
locker secret create --key {secret key} --value {secret value} --description {secret description (optional)} --environment {secret environment}
```

4. Sử dụng lệnh `locker secret run` để chạy dự án với các secret đã được lưu:

```bash theme={null}
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.

5. 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 đó:

```bash theme={null}
locker configuration --access-key-id {YOUR_ACCESS_KEY_ID} --secret-access-key {YOUR_SECRET_ACCESS_KEY}
```

2. 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:

```bash theme={null}
locker secret import --source {CONFIG_FILE_LOCATION}
```

3. 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.
