https://github.com/taehyung-99/secops-actions-lab
GitHub Actions를 활용한 CI 파이프라인을 조립해보고, 실제 SecOps 운영에서 PR → Merge 과정에 어떤 도구를 어떻게 활용해서 안전하게 코드를 관리할 수 있는가를 직접 경험하며 배운다.
먼저, 나에게는 생소한 도구들이 많아 각 도구들이 어떤 역할을 하는지 찾아보았다.
Ruff는 파이썬 코드의 린트와 포맷, 보안 검사 등을 해주는 도구이다.(900개 이상의 린트 규칙을 지원)
코드의 미사용 import, 문법 오류 등 린트를 탐지해 결과를 보여주고, --fix 옵션을 통해 자동 수정이 제공되는 일부 규칙을 안전한 범위에서 수정해 준다. 또한 S 규칙으로 취약한 암호화 및 해시 알고리즘, 민감한 정보가 코드 내에 노출되어 있지는 않은지 등 소스 코드 내의 잠재적인 보안 취약점과 리스크를 탐지해준다.
파이썬 코드를 실행하기 전 타입 힌트를 바탕으로 오류를 미리 찾아내는 정적 타입 검사 도구이다.
아래의 예시처럼 잘못된 인자의 타입과, 반환 타입 불일치를 탐지해준다.
""" 잘못된 인자 타입 예시 """
def greet(name: str) -> None:
print(f"Hello, {name}")
# str 타입이 필요한데, int 타입을 전달
greet(123)
""" 반환 타입 불일치 """
def add_numbers(a: int, b: int) -> int:
# int 타입을 반환해야 하는데, 결과가 str 타입
return f"{a+b}"
개발자가 테스트 코드에 작성한 기대값과 실제 실행 결과를 비교해주는 도구이다.
함수의 계산 결과, 비즈니스 로직, 잘못된 값을 넣었을 때 오류가 발생하는지를 검증하는 데 사용한다. 직접 코드를 돌려서 오류를 확인해보면 되지 않을까? 라는 안일한 생각을 할 수도 있지만, pytest는 어디서 어떤 값에 의해 실패했는지를 정확하게 보여줘 생산성이 좋다.
또한, pytest-cov 플러그인이 제공하는 --cov 옵션을 통해 코드 커버리지도 측정이 가능해, 작성한 코드가 실제 소스 코드의 몇 %를 실행하고 검증 하였는지 비율로 보여줘 테스트 구멍을 쉽게 찾아낼 수 있다.
파이썬 환경과 의존성 파일을 스캔하여 패키지의 CVE를 탐지하고 수정 가능한 버전을 안내해주는 도구이다. CI 파이프라인에서 코드 내에 취약한 오픈소스 라이브러리가 포함되지 않도록 차단해주는 역할을 수행한다.