Ngày dài, Tháng nhớ, Năm mong để viết được một bài blog mới
Chuyện là dạo gần đây, mình có tìm hiểu mấy thứ liên quan về DevSecOps và cũng có được tham gia một dự án có áp dụng DevSecOps thì mình cũng có nhìn thấy một số vấn đề, và bài viết này là một trong những vấn đề mình nhìn thấy.
I. Giới thiệu
Câu chuyện nó giống như thế này “Thôi xong, tui push secret key lên github rồi“, mọi người có thể đọc câu chuyện và nắm được tình huống. Nhưng, trong bài viết này của tác giả @kiendinang ( một người anh đáng kính mình có quen , hâm mộ thực sự ) chỉ nói đến việc xử lý thế nào sau khi lỡ push secret key lên github ⇒ Vậy cách của anh @kiendinang là cách chữa bệnh.
Vậy hôm nay mình sẽ viết một bài về cách phòng bệnh: Làm thế nào để ngăn không cho Dev commit secrets lên git?
Ngăn chặn và phát hiện secrets trong Git
( Người ta vẫn có câu Phòng bệnh hơn chữa bệnh
)
Chúng ta bắt đầu đi vào tìm hiểu cách phòng bệnh nhé!!!!!!
II. Ngăn chặn Dev vô tình commit secrets
Trước khi bạn thực hiện các thay đổi (commit changes), hãy kiểm tra để đảm bảo các secrets key không bị thêm vào history của git.
Yelp's Detect Secrets là một công cụ dùng để phát hiện các secret key trước khi commit code.
Một thành viên nào đó bất kỳ trong nhóm Dev có quyền push code lên repository của dự án có thể sử dụng lệnh dưới đây để tạo một pre-commit hook
trong repository.
1. Thêm detect-secrets vào repository (Chỉ cần thực hiện một lần duy nhất)
Cài đặt detect-secrets
và pre-commit
pip install detect-secrets==v1.2.0 pre-commit
Vào folder source code của dự án ( Ở đây tôi đã có 1 dự án tạo sẵn, nên tôi sẽ clone nó về)
git clone https://github.com/0xmanhnv/precommit-with-detect-secrets.git
cd precommit-with-detect-secrets
Cấu hình pre-commit framework.
Tôi sẽ tạo một file có tên là .pre-commit-config.yaml
trong dự án.
cat > .pre-commit-config.yaml <<EOL
repos:
- repo: git@github.com:Yelp/detect-secrets
rev: v1.2.0
hooks:
- id: detect-secrets
args: ['--baseline', '.secrets.baseline']
EOL
Cài đặt git hooks
pre-commit install
Trước khi tiếp tục, chúng ta phải thực hiện scan
xem trong source code hiện tại có tồn tại secret key nào hay không và đưa chúng vào baseline. Để loại bỏ false positive.
detect-secrets scan > .secrets.baseline
Đánh giá thủ công một baseline để kiểm tra tính validity của các secrets đã được tìm thấy.
detect-secrets audit .secrets.baseline
Nếu như những gì xuất hiện là một secret key quan trọng, thì chúng ta cần thực hiện xóa nó ra khỏi source code, xóa như thế nào thì các bạn lại đọc lại “****Thôi xong, tui push secret key lên github rồi “**, nếu không phải là secret key (false positive) thì chúng ta sẽ commit .secrets.baseline
để detect-secrets
sẽ ignore nó đi cho những lần sau.
(Trong case này của tôi, tôi cứ coi như nó là false positive)
git add .secrets.baseline .pre-commit-config.yaml
Thực hiện commit cấu hình pre-commit cũng như secrets baseline vào git.
git commit -m "Add .secrets.baseline .pre-commit-config.yaml"
Lần đầu tiên cài đặt, commit sẽ Passed
Tôi sẽ push nó lên remote.
git push origin main
Như vậy là tôi đã cài đặt và cấu hình xong detect-secrets
và pre-commit
, từ bây giờ team Dev chỉ cần clone | pull
source code về vào thực hiện các bước dưới đây để sử dụng.
2. Cài đặt repo với pre-commit (Dành cho các Dev)
Mỗi thành viên trong nhóm DevOps phải hoàn thành các bước này sau khi hoàn tất quá trình thiết lập ở trên.
pre-commit là một Frame-work để quản lý và duy trì multi-language pre-commit hooks. Nó được sử dụng ở đây để đảm bảo rằng mỗi Dev đang sử dụng cùng một version của Yelp's detect-secrets
.
Bây giờ tôi đóng vai trò là một Dev trong dự án. Tôi sẽ clone source code về và cài đặt như sau.
git clone https://github.com/0xmanhnv/precommit-with-detect-secrets.git
Cài đặt pre-commit
pip install pre-commit
pre-commit install
3. Ví dụ tạo một file có chứa secret key
Tạo file test-secrets.txt
cat > test-secrets.txt<<EOL
password=7a854a65fa34cf5c274f018ace6847ef64a60a0f
EOL
Add test-secrets.txt
vào git.
git add test-secrets.txt
Bây giờ, tôi sẽ thực hiện commit
và xem kết quả.
git commit -m "Add test-secrests.txt"
Secret key trong file test-secrets.txt
đã được phát hiện. Bây giờ, chúng ta cần thực hiện xóa bỏ nó, hoặc đưa nó vào baseline để đánh dấu là False positive thì sau đó mới có thể commit được.
Thực hiện xóa bỏ secret key. Có 3 cách để xóa bỏ nó.
- Đưa
test-secrets.txt
và.gitignore
để bỏ qua file này khi commit code.
vi .gitignore
- Xóa bỏ file test-secrets.txt trước khi commit.
rm -rf test-secrets.txt
- Xóa bỏ nội dung secret key trong file
test-secrets.txt
trước khi commit.
vi test-secrets.txt
⇒ Cách mình khuyến nghị là:
- Đưa
test-secrets.txt
và.gitignore
để bỏ qua file này khi commit code. Nếu đó là file cấu hình hoặc không cần thiết phải commit lên git. - Xóa bỏ nội dung secret key trong file
test-secrets.txt
trước khi commit. Nếu đó là một file cần thiết phải đưa lên git.
Trong trường hợp này của tôi, tôi cần đưa file **test-secrets.txt
** lên git. Nên chọn phương án Xóa bỏ nội dung secret key trong file test-secrets.txt
trước khi commit.
Trước tiên cần xóa bỏ secret key ra khỏi **test-secrets.txt
** và add lại file vào git.
Bây giờ thử commit lại và xem kết quả.
git commit -m "Add test-secrests.txt"
Như vậy là đã passed
, bây giờ chỉ cần push lên remote.
git push origin main
III. Detecting Secrets
Nếu một secret
được commit, một công cụ như GitHub's Secret Scanning có thể gửi cho bạn thông báo rằng một secrets đã bị lộ.
GitHub's Secret Scanning được bật mặc định cho các repository GitHub public.Tuy nhiên đối với private repositories, Có thể đọc Enabling secret scanning for private repositories.
Nhưng trong bài này tôi muốn nhúng Yelp's detect-secrets
vào để thay cho GitHub's Secret Scanning.
Để thêm Yelp's detect-secrets
vào GitHub workflow, bạn có thể sử dụng ví dụ .github/workflows/detect-secrets.yaml sau:
name: Detect Secrets
on: pull_request
jobs:
detect-secrets:
runs-on: ubuntu-latest
container: python:latest
steps:
- uses: actions/checkout@v2
- name: Install Yelp's detect secrets
run: |
apt-get update && apt-get install -y jq
pip install yq
pip install detect-secrets==$(yq -r .repos[0].rev .pre-commit-config.yaml)
- name: Detect potential secrets
run: find -type f -not -path './.git/*' -printf '%P\n' | xargs detect-secrets-hook --baseline .secrets.baseline
IV. Kết luận
Để có thể ngăn chặn Dev commit secret key linh tinh lên git, thì trong bài viết này mình đã giới thiệu các nội dung như sau:
- Ngăn chặn Dev vô tình commit secrets
- Thêm detect-secrets vào repository
- Cài đặt repo với pre-commit
- Detecting Secrets bằng cách nhúng
Yelp's detect-secrets
và GitHub workflow
Hi vọng kiến thức trên có thể đâu đó giúp bạn được phần nào để áp dụng vào thực tế.
Cảm ơn các bạn đã đọc bài của mình.
Các bạn có thể đọc nhiều bài viết hơn của mình tại: https://manhnv.com Ngoài ra mình còn lập một số chanel để các bạn trao đổi về DevSecOps:
- Facebook group: https://www.facebook.com/groups/1263207130787754/
- Discord: https://discord.gg/EuumFWhH3U