Thông tin về lớp học lập trình này
1. Tổng quan
Kỹ thuật mã nguồn bảo mật là một tập hợp phương pháp có thể được dùng để cải thiện tính bảo mật của mã nguồn. Những kỹ thuật này có thể giúp xác định và khắc phục các lỗ hổng bảo mật trong mã nguồn, ngăn chặn hành vi truy cập trái phép vào mã nguồn và bảo vệ mã nguồn không bị sửa đổi.
Một số kỹ thuật mã nguồn bảo mật phổ biến bao gồm:
- Tìm lỗi mã nguồn: Tìm lỗi mã nguồn là quá trình kiểm tra mã nguồn để tìm lỗi và vấn đề về văn phong. Bạn có thể thực hiện việc này bằng cách sử dụng một công cụ tìm lỗi mã nguồn – một chương trình phân tích mã nguồn và xác định các vấn đề tiềm ẩn. Bạn có thể sử dụng công cụ tìm lỗi mã nguồn để kiểm tra nhiều loại lỗi, bao gồm lỗi cú pháp, lỗi ngữ nghĩa, lỗi kiểu và lỗ hổng bảo mật.
- Kiểm thử tính bảo mật của ứng dụng tĩnh (SAST): SAST là một loại kiểm thử bảo mật giúp phân tích mã nguồn, mã nhị phân hoặc mã byte để xác định các lỗ hổng bảo mật. Các công cụ SAST có thể được dùng để tìm lỗ hổng bảo mật trong nhiều ngôn ngữ lập trình, bao gồm Go, Java, Python, C++ và C#.
- Quét giấy phép: Quét giấy phép là quá trình xác định giấy phép của các thành phần phần mềm bên thứ ba được sử dụng trong ứng dụng phần mềm. Điều này rất quan trọng vì quy trình này giúp đảm bảo rằng ứng dụng tuân thủ các điều khoản trong giấy phép, từ đó có thể giúp tránh các vấn đề pháp lý.
Những kỹ thuật này có thể được dùng để cải thiện tính bảo mật của mã nguồn ở tất cả các giai đoạn trong vòng đời phát triển phần mềm. Bạn có thể dùng công cụ tìm lỗi mã nguồn để xác định sớm các lỗi trong quá trình phát triển, SAST có thể dùng để tìm lỗ hổng bảo mật trước khi biên dịch hoặc triển khai mã và có thể dùng tính năng quét giấy phép để đảm bảo rằng ứng dụng tuân thủ các điều khoản trong giấy phép.
Việc sử dụng những kỹ thuật này có thể giúp cải thiện tính bảo mật của mã nguồn và giảm nguy cơ xâm phạm bảo mật.
Kiến thức bạn sẽ học được
Phòng thí nghiệm này sẽ tập trung vào các công cụ và kỹ thuật để bảo mật mã nguồn phần mềm.
- Tìm lỗi mã nguồn
- Kiểm thử tính bảo mật của ứng dụng tĩnh
- Quét giấy phép
Tất cả công cụ và lệnh dùng trong phòng thí nghiệm này sẽ được thực hiện trong Cloud Shell.
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.
- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
- Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (mã này thường được xác định là
PROJECT_ID
). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án. - Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
- Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.
Khởi động Cloud Shell Editor
Phòng thí nghiệm này được thiết kế và thử nghiệm để sử dụng với Google Cloud Shell Editor. Để truy cập vào trình chỉnh sửa,
- Truy cập vào dự án Google của bạn tại https://console.cloud.google.com.
- Ở góc trên cùng bên phải, hãy nhấp vào biểu tượng trình chỉnh sửa vỏ đám mây
- Một ngăn mới sẽ mở ra ở cuối cửa sổ
- Nhấp vào nút Open Editor (Mở trình chỉnh sửa)
- Trình chỉnh sửa sẽ mở ra cùng với một trình khám phá ở bên phải và trình chỉnh sửa ở khu vực trung tâm
- Ngăn thiết bị đầu cuối cũng sẽ xuất hiện ở cuối màn hình
- Nếu cửa sổ dòng lệnh KHÔNG mở, hãy sử dụng tổ hợp phím "ctrl+" để mở cửa sổ dòng lệnh mới
Thiết lập môi trường
Đặt GOPATH thành một thư mục để đơn giản hoá các lệnh được sử dụng trong phòng thí nghiệm này.
export GOPATH=$HOME/gopath
Tạo một thư mục để lưu trữ công việc của chúng ta
mkdir -p workspace
cd workspace
Sao chép kho lưu trữ mã nguồn
git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)
3. Tìm lỗi mã nguồn
Công cụ tìm lỗi mã nguồn được dùng để kiểm tra các lỗi hoặc lỗi phổ biến dựa trên kiểu liên quan đến cú pháp. Công cụ tìm lỗi mã nguồn hỗ trợ bảo mật bằng cách cung cấp một mẫu cú pháp chung cho nhiều nhóm, giúp quá trình đánh giá mã diễn ra nhanh hơn, chia sẻ kiến thức và tính rõ ràng của mã.
Ngoài ra, công cụ Tìm lỗi mã nguồn xác định các lỗi cú pháp phổ biến có thể dẫn đến các lỗ hổng bảo mật phổ biến, chẳng hạn như việc sử dụng thư viện hoặc API cốt lõi sai cách hoặc kém hiệu quả.
Cài đặt công cụ liên kết staticcheck
go get honnef.co/go/tools/cmd/staticcheck@latest
Chạy Go Linter (staticcheck) trong thư mục gốc của dự án
staticcheck
Xem lại kết quả
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
Bạn gặp lỗi này vì http.ListenAndServe()
chấp nhận một Chuỗi và mã hiện tại sử dụng Sprintf
mà không truyền biến vào chuỗi
Xem lại trạng thái thoát lệnh.
echo $?
Trong trường hợp này, vì lệnh dẫn đến lỗi nên trạng thái thoát sẽ là 1 hoặc cao hơn. Đây là một phương pháp có thể dùng trong quy trình CI/CD để xác định mức độ thành công/không thành công của công cụ này.
Chỉnh sửa tệp main.go
và sửa đoạn mã:
- Đánh dấu vào dòng bên dưới
LINTING - Step 1
bên trong phương thứcmain()
, bằng cách thêm dấu gạch chéo ở đầu(//
). - Huỷ nhận xét hai dòng ngay bên dưới
LINTING - Step 2
bên trong phương thứcmain()
, bằng cách xoá dấu gạch chéo ở đầu.
Chạy lại staticcheck
trong thư mục gốc của dự án
staticcheck
Lệnh này không được trả về bất kỳ kết quả nào (tức là một dòng trống).
Kiểm tra trạng thái thoát của lệnh.
echo $?
Trong trường hợp này, vì lệnh không dẫn đến lỗi nên trạng thái thoát sẽ là 0.
4. Kiểm thử tính bảo mật của ứng dụng tĩnh
Kiểm thử bảo mật AST/Tĩnh – Cung cấp tính năng phân tích mã tĩnh nhằm tìm kiếm các điểm yếu và vấn đề phổ biến ( CWE)
Cài đặt công cụ AST (gosec
)
export GOSEC_VERSION="2.15.0"
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}
Chạy gosec
bằng tệp chính sách dựa trên mã nguồn
gosec -conf policies/gosec-policy.json -fmt=json ./...
Kết quả sẽ tương tự như kết quả này
{ "Golang errors": {}, "Issues": [ { "severity": "HIGH", "confidence": "LOW", "cwe": { "ID": "798", "URL": "https://cwe.mitre.org/data/definitions/798.html" }, "rule_id": "G101", "details": "Potential hardcoded credentials", "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go", "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n", "line": "32", "column": "6" } ], "Stats": { "files": 1, "lines": 89, "nosec": 0, "found": 1 } }
Công cụ này đã xác định được một vấn đề tiềm ẩn: Potential hardcoded credentials
5. Quét giấy phép
Giấy phép đóng vai trò quan trọng trong việc bảo mật vì theo luật, giấy phép có thể yêu cầu bạn tiết lộ mã nguồn mà có thể bạn không muốn tiết lộ. Khái niệm này được gọi là " copyleft" các giấy phép yêu cầu bạn hiển thị mã nguồn nếu bạn sử dụng các phần phụ thuộc với những giấy phép đó.
Cài đặt golicense
mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd
Tạo tệp nhị phân
go build
Chạy kiểm tra giấy phép bằng tệp chính sách hiện tại không cho phép "BSD-3-Clause" giấy phép
golicense policies/license-policy.hcl hello-world
LƯU Ý: Bạn sẽ không thực hiện được thao tác này với kết quả tương tự:
🚫 rsc.io/sampler BSD 3-Clause "New" or "Revised" License 🚫 rsc.io/quote BSD 3-Clause "New" or "Revised" License 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License
Sửa đổi tệp chính sách policies/license-policy.hcl
để di chuyển "BSD-3-Clause" từ danh sách deny
sang danh sách allow
.
Chạy lại quá trình kiểm tra giấy phép
golicense policies/license-policy.hcl hello-world
LƯU Ý: Thao tác này sẽ thành công với kết quả tương tự:
✅ rsc.io/quote BSD 3-Clause "New" or "Revised" License ✅ rsc.io/sampler BSD 3-Clause "New" or "Revised" License ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License
6. Xin chúc mừng
Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!
Kiến thức bạn học được
- Các công cụ và kỹ thuật để bảo mật mã nguồn
—
Lần cập nhật gần đây nhất: 23/3/2023