0
0
Lập trình
NM

Sử Dụng Công Cụ Bandit SAST Để Bảo Mật Ứng Dụng Python

Đăng vào 3 tuần trước

• 6 phút đọc

Giới thiệu

Bảo mật ứng dụng là một trong những mối quan tâm hàng đầu của các lập trình viên Python. Để giúp phát hiện các lỗ hổng bảo mật trong mã nguồn, công cụ Bandit đã ra đời như một giải pháp hữu hiệu. Bandit là một công cụ SAST (Static Application Security Testing) mã nguồn mở do Dự án Bảo mật OpenStack phát triển, chuyên phân tích mã Python để tìm ra các vấn đề bảo mật phổ biến. Trong bài viết này, chúng ta sẽ tìm hiểu cách áp dụng Bandit để bảo mật ứng dụng Python của bạn.

Tại Sao Chọn Bandit Cho Bảo Mật Python?

Bandit cung cấp nhiều lợi ích mà các lập trình viên Python không nên bỏ qua:

  • Phân tích riêng cho Python - Hiểu biết về các idiom và mẫu mã phổ biến trong Python.
  • Kiến trúc dựa trên plugin - Có thể mở rộng với các kiểm tra tùy chỉnh.
  • Thân thiện với CI/CD - Được thiết kế để tự động hóa.
  • Chi phí bằng 0 - Hoàn toàn miễn phí và mã nguồn mở.

Các Lỗ Hổng Thường Gặp Mà Bandit Phát Hiện

Bandit có khả năng phát hiện nhiều loại lỗ hổng khác nhau trong mã Python:

  • Lỗ hổng SQL injection
  • Nguy cơ shell injection
  • Mật khẩu và bí mật được mã hóa cứng
  • Sử dụng các module không an toàn
  • Vấn đề xác thực đầu vào
  • Nguy cơ rò rỉ thông tin

Hướng Dẫn Thực Hành: Cài Đặt Bandit

Cài Đặt

Bạn có thể cài đặt Bandit dễ dàng qua pip:

Copy
# Cài đặt bằng pip
pip install bandit

# Hoặc cài đặt từ mã nguồn
git clone https://github.com/PyCQA/bandit.git
cd bandit
pip install .

Cách Sử Dụng Cơ Bản

Dưới đây là một số lệnh cơ bản để quét mã nguồn:

Copy
# Quét một tệp đơn
bandit my_script.py

# Quét toàn bộ thư mục
bandit -r my_project/

# Tạo báo cáo HTML
bandit -r my_project/ -f html -o report.html

# Quét với mức độ bảo mật cụ thể
bandit -r my_project/ -l high

Mã Python Có Lỗ Hổng

Dưới đây là một ví dụ về mã Python có lỗ hổng:

python Copy
# vulnerable_app.py
import os
import pickle
import subprocess
import sqlite3

def process_user_input():
    # Lỗ hổng: Tiêm mã
    user_input = input("Nhập lệnh: ")
    os.system(user_input)  # B602: subprocess_popen_with_shell_equals_true

def database_operations():
    # Lỗ hổng: SQL injection
    username = input("Nhập tên người dùng: ")
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")  # B608: hardcoded_sql_expressions

def data_deserialization():
    # Lỗ hổng: Deserialization không an toàn
    data = input("Nhập dữ liệu đã tuần tự: ")
    obj = pickle.loads(data.encode())  # B301: blacklist

Chạy Quét Bandit

Để chạy quét Bandit cho mã có lỗ hổng:

Copy
bandit -r vulnerable_app.py -f txt

Kết Quả Quét Bandit

Khi quét xong, Bandit sẽ cung cấp báo cáo về các vấn đề phát hiện được:

Copy
Kết quả được tạo:
>> Vấn đề: [B602:subprocess_popen_with_shell_equals_true] Sử dụng subprocess với shell=True
   Mức độ: Cao   Độ tin cậy: Cao
   Vị trí: vulnerable_app.py:8
   Thông tin thêm: https://bandit.readthedocs.io/en/latest/blacklists/blacklist_calls.html#b602-subprocess-popen-with-shell-equals-true
7    user_input = input("Nhập lệnh: ")
8    os.system(user_input)

>> Vấn đề: [B608:hardcoded_sql_expressions] Có thể có vector SQL injection thông qua việc xây dựng truy vấn dựa trên chuỗi.
   Mức độ: Trung bình   Độ tin cậy: Trung bình
   Vị trí: vulnerable_app.py:15
15    cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")

>> Vấn đề: [B301:blacklist] Sử dụng hàm deserialization không an toàn.
   Mức độ: Cao   Độ tin cậy: Cao
   Vị trí: vulnerable_app.py:20
20    obj = pickle.loads(data.encode())

Cấu Hình Bandit Nâng Cao

Tệp Cấu Hình Tùy Chỉnh

Bạn có thể tạo một tệp cấu hình để tùy chỉnh cách Bandit hoạt động:

yaml Copy
# bandit.yml
exclude_dirs: ['tests', 'venv', 'migrations']
skips: ['B101', 'B102']
tests: ['B301', 'B302', 'B601', 'B602']

targets:
  - src/
  - app/

output_format: json
verbose: true

Sử Dụng Tệp Cấu Hình

Để sử dụng tệp cấu hình, bạn chỉ cần chạy lệnh sau:

Copy
bandit -c bandit.yml -r my_project/

Tích Hợp CI/CD (GitHub Actions)

Để tự động quét bảo mật trong quy trình CI/CD, bạn có thể sử dụng GitHub Actions:

yaml Copy
name: Quét Bảo Mật với Bandit
on: [push, pull_request]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - name: Kiểm tra mã
        uses: actions/checkout@v3

      - name: Thiết lập Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'

      - name: Cài đặt Bandit
        run: pip install bandit

      - name: Chạy Quét Bảo Mật Bandit
        run: bandit -r . -f json -o bandit-report.json

      - name: Tải lên Báo cáo Bandit
        uses: actions/upload-artifact@v3
        with:
          name: bandit-report
          path: bandit-report.json

Các Loại Kiểm Tra và Mức Độ Nguy Cơ trong Bandit

Mức Độ Nguy Cơ

Bandit phân loại các vấn đề bảo mật theo các mức độ khác nhau:

  • Thấp: Vấn đề chất lượng mã, mối quan tâm bảo mật nhỏ.
  • Trung bình: Các lỗ hổng bảo mật tiềm ẩn.
  • Cao: Các lỗ hổng bảo mật nghiêm trọng.

Các ID Kiểm Tra Thường Gặp

  • B1xx: Các kiểm tra chung.
  • B2xx: Các vấn đề cụ thể của ứng dụng/khung.
  • B3xx: Các import và hàm bị cấm.
  • B4xx: Sử dụng các bộ sinh ngẫu nhiên không an toàn.
  • B5xx: Các vấn đề SSL/TLS.
  • B6xx: Các lỗ hổng shell injection.
  • B7xx: Deserialization với Pickle và YAML.

Các Plugin Tùy Chỉnh Trong Bandit

Tạo Các Kiểm Tra Tùy Chỉnh

Bạn có thể tạo các kiểm tra tùy chỉnh như sau:

python Copy
# custom_checks.py
import bandit
from bandit.core import test_properties as test

@test.checks('Call')
@test.test_id('B901')
def hardcoded_api_key(context):
    """Kiểm tra khóa API mã hóa cứng"""
    suspicious_strings = ['api_key', 'secret_key', 'password']
    if context.call_function_name_qual in suspicious_strings:
        return bandit.Issue(
            severity=bandit.HIGH,
            confidence=bandit.MEDIUM,
            text="Phát hiện khóa API mã hóa cứng khả nghi"
        )

Sử Dụng Các Plugin Tùy Chỉnh

Để sử dụng các plugin tùy chỉnh, chạy lệnh sau:

Copy
bandit -r my_project/ -p custom_checks.py

Thực Hành Tốt Nhất Khi Triển Khai Bandit

1. Tích Hợp Sớm Trong Quy Trình Phát Triển

Bạn nên tích hợp Bandit sớm trong quy trình phát triển:

bash Copy
# Ví dụ về pre-commit hook
# .git/hooks/pre-commit
#!/bin/bash
bandit -r . -l high -i

2. Quét Định Kỳ

Lên lịch quét định kỳ để kiểm tra bảo mật:

yaml Copy
# Quét định kỳ với GitHub Actions
on:
  schedule:
    - cron: '0 2 * * 1'  # Quét hàng tuần

3. Thiết Lập Cơ Sở Dữ Liệu

Thiết lập cơ sở dữ liệu để bỏ qua các vấn đề hiện có:

Copy
bandit -r . --baseline baseline.json

4. Cổng Chất Lượng

Để đảm bảo chất lượng, bạn có thể làm cho quá trình xây dựng thất bại nếu có vấn đề nghiêm trọng:

Copy
bandit -r . -l high --exit-zero

Hạn Chế và Lưu Ý

Mặc dù Bandit rất mạnh mẽ, nhưng bạn cũng cần hiểu những hạn chế của nó:

  • Chỉ phân tích tĩnh - Không phát hiện được các vấn đề trong thời gian chạy.
  • Chỉ với Python - Chỉ hoạt động với mã Python.
  • Dựa trên mẫu - Có thể tạo ra các kết quả dương tính giả/âm tính giả.
  • Không phân tích luồng dữ liệu - Nhận thức ngữ cảnh hạn chế.

Kết Luận

Bandit là một giải pháp SAST mã nguồn mở tuyệt vời cho các ứng dụng Python. Với tính dễ sử dụng, khả năng phát hiện lỗ hổng toàn diện và tích hợp mượt mà với CI/CD, Bandit là công cụ thiết yếu cho bất kỳ lập trình viên Python nào quan tâm đến bảo mật.

Bằng cách triển khai Bandit trong quy trình phát triển của bạn, bạn có thể phát hiện sớm các vấn đề bảo mật phổ biến, giảm chi phí khắc phục, và xây dựng các ứng dụng Python an toàn hơn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào