Bandit을 SAST 도구로 사용하여 Python 앱 보안하기

발행: (2025년 12월 6일 오전 10:18 GMT+9)
9 min read
원문: Dev.to

Source: Dev.to

Static Application Security Testing (SAST) 도구는 애플리케이션이 실행되거나 배포되기 전에 소스 코드에서 직접 취약점을 탐지하는 데 도움을 줍니다. 이 글에서는 Python에 특화된 SAST 도구인 Bandit을 사용해 Python 애플리케이션을 스캔하고 보안 상태를 개선하는 방법을 살펴봅니다.

SAST란 무엇이며 왜 중요한가

SAST는 애플리케이션을 실행하지 않고도 소스 코드, 바이트코드 또는 바이너리를 분석해 보안 취약점을 찾는 기술과 도구를 의미합니다. 이러한 도구는 인젝션, 안전하지 않은 시스템 호출, 약한 암호화, 하드코딩된 비밀과 같은 보안에 취약한 패턴을 검색합니다.

개발 라이프사이클 초기에 SAST를 실행하면 팀이 문제를 프로덕션에 도달하기 전에 발견하고 수정할 수 있어 위험과 수정 비용을 모두 줄일 수 있습니다. SAST를 일상적인 워크플로(IDE 검사, pre‑commit 훅, CI/CD 파이프라인)와 통합하면 보안을 늦은 수동 단계가 아닌 지속적이고 자동화된 실천으로 전환할 수 있습니다.

Bandit 소개: Python 보안 린터

Bandit은 Python 코드에서 흔히 발생하는 보안 문제를 찾아내기 위해 설계된 오픈소스 보안 린터입니다. Python 파일을 파싱하고 추상 구문 트리(AST)를 구축한 뒤, 다음과 같은 문제를 탐지하는 일련의 보안 테스트를 실행합니다:

  • 하드코딩된 비밀번호
  • exec 같은 위험한 함수 사용
  • 안전하지 않은 난수 생성기
  • 약한 해시 함수
  • 위험한 XML 및 서브프로세스 사용

Bandit은 Python 문법과 관용구를 이해하기 때문에 일반 텍스트 기반 스캐너보다 더 정확한 결과를 제공할 수 있습니다. PyPI를 통해 배포되며 PyCQA 커뮤니티가 활발히 유지 관리하고, 로컬 개발 워크플로와 CI/CD 파이프라인에 쉽게 통합할 수 있습니다.

프로젝트에 Bandit 설정하기

  1. 가상 환경 만들기 (선택 사항)

    python -m venv .venv
    source .venv/bin/activate   # On Windows: .venv\Scripts\activate
  2. Bandit 설치

    pip install bandit
    `` ```
    
  3. 선택적 추가 기능 설치 (예: TOML 지원, 베이스라인 관리, SARIF 출력)

    pip install "bandit[toml]" "bandit[baseline]" "bandit[sarif]"

설치가 완료되면 쉘에서 bandit 명령을 사용할 수 있게 됩니다.

Bandit으로 Python 애플리케이션 스캔하기

  • 단일 파일 스캔

    bandit app.py
  • 프로젝트 전체를 재귀적으로 스캔

    bandit -r .

Bandit은 발견된 각 이슈에 대해 심각도, 신뢰도, 파일 경로, 라인 번호 및 간단한 설명을 포함한 보고서를 출력합니다. JSON, XML, HTML, YAML 등 다양한 출력 형식은 -f 플래그로 선택해 대시보드나 저장소와 연동할 수 있습니다.

Bandit 출력 이해하기

Bandit은 각 발견에 두 가지 핵심 속성을 부여합니다:

  • Severity – 잠재적 취약점의 심각도 수준 (low, medium, high).
  • Confidence – 해당 패턴이 실제 보안 문제임을 Bandit이 얼마나 확신하는지.

심각도가 높고 신뢰도가 높은 이슈는 보통 약한 암호화 함수, 안전하지 않은 임시 파일, 위험한 XML 파서, 신뢰할 수 없는 입력이 포함된 쉘 명령 등 위험한 패턴을 의미합니다. 개발자는 이러한 결과를 상황에 맞게 검토하고, 입력 검증, 파라미터화, 약한 알고리즘 교체, 위험 코드 리팩터링 등의 방법으로 수정해야 합니다.

샘플 시나리오에 Bandit 적용하기

다음과 같은 작은 Python 웹 애플리케이션을 상상해 보세요:

  • 파일 작업 수행
  • 외부 명령 호출
  • 사용자 입력 처리

Bandit은 다음을 식별하는 데 도움을 줍니다:

  • 안전하지 않은 방법으로 임시 파일을 생성하는 경우
  • 사용자 입력이 쉘 명령이나 SQL 쿼리에 직접 전달되는 경우
  • telnetlib 같은 불안전한 모듈이나 md5 같은 약한 해시 함수 사용 여부

프로젝트 루트에서 bandit -r . 를 실행하면 라인 번호와 설명이 함께 이러한 패턴을 보여 주어 배포 전에 리팩터링하기가 쉬워집니다.

CI/CD에 Bandit 통합하기

SAST 도구의 진정한 힘은 자동화 파이프라인에 포함될 때 발휘됩니다. Bandit을 사용하면 다음과 같은 CI 작업을 추가할 수 있습니다:

  1. 의존성 설치
  2. bandit -r . 실행
  3. 새로운 고심각도 이슈가 발견되면 파이프라인 실패

예시 (GitHub Actions)

name: Security Scan
on: [push, pull_request]

jobs:
  bandit-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - name: Install Bandit
        run: pip install bandit
      - name: Run Bandit
        run: bandit -r . -f json -o bandit-report.json
      - name: Upload report
        uses: actions/upload-artifact@v3
        with:
          name: bandit-report
          path: bandit-report.json

Bandit을 SARIF 형식으로 출력해 보안 대시보드에 연결하거나, 베이스라인 파일을 사용해 이전 스캔 결과와 비교해 새로운 발견만 빌드를 중단하도록 구성할 수도 있습니다.

Bandit 사용 시 권장 모범 사례

  • 코드를 푸시하기 전에 insecure 패턴을 잡아내기 위해 pre‑commit 훅에 Bandit을 로컬에서 실행합니다.
  • 프로젝트 위험 허용도에 맞게 심각도·신뢰도 임계값을 조정해 고영향 이슈에 우선 집중합니다.
  • .bandit.yml 같은 설정 파일을 정기적으로 검토·업데이트해 false positive를 제외하거나 프로젝트 특화 규칙을 정의합니다.
  • 의존성 스캔, 동적 테스트, 수동 코드 리뷰 등 다른 보안 관행과 Bandit을 결합합니다.

Bandit은 만능은 아니지만, 가볍고 효과적인 방법으로 일상적인 Python 개발에 보안 인식을 심어줄 수 있습니다.

한계와 보완 도구

Bandit은 Python 소스 코드의 정적 분석에 초점을 맞추므로 동적 애플리케이션 보안 테스트나 런타임 보호를 대체하지 않습니다. 비즈니스 로직을 깊이 이해해야 하는 복잡한 논리 문제를 놓칠 수 있기 때문에 인간 검토가 여전히 필수적입니다.

보다 완전한 보안 전략을 위해 다음과 같은 도구와 결합하세요:

  • 오픈소스 의존성 검사 (pip-audit, safety 등)
  • 실행 중인 환경에 대한 동적 스캔
  • 프로덕션 시스템의 런타임 위협 모니터링

이러한 한계에도 불구하고 Python용 SAST 도구로 Bandit을 도입하면 비교적 적은 노력으로 애플리케이션 보안 기준을 크게 끌어올릴 수 있습니다.

Back to Blog

관련 글

더 보기 »

Blender Addon 개발에 DevOps가 더 필요함

개요 테스트 코드를 작성하고 자동화하십시오. 마음의 평안을 가지고 릴리즈하기 위해 다양한 버전의 Blender에서 테스트를 실행합니다. 현재 개발자이거나 개발자가 되고자 하는 개인…