TL;DR
- CLI에서의 보안 스캔 결과
- IDE Integration
- ㅂㅂㅂㅂ
1. Intro
tfsec은 pre-commit terraform의 연동가능한 프로그램을 확인하던 중 알게되었다.
작성된 코드를 실행하기전 테스트를 통해 취약점/오구성(misconfiguration)을 파악하는것은 중요하다. 테라폼 내재적인 수준에서, fmt와 validate 명령어를 통해 일종의 lint/test를 수행할 수 있지만, 이는 작성된 코드가 문제없이 실행될 수 있는지를 검증하는 테스트이지 결과물의 안정성을 보장하는 테스트가 아니였다.
안전한 인프라를 구성하기 위해서 지켜야할 몇가지 원칙들이 있을것이다. 가령 SSH(포트22)는 퍼블릭하게(0.0.0.0/0) 공개되어있어야하지 않아야 한다던가, WAS/DB서버등과 같이 중요서버는 프라이빗망에 둔다든가, ALB의 HTTP요청은 HTTPS로 Redirect 하는것이 그 예시이다.
IaC 코드로 대량의 인프라를 관리하다보면 실수/고의(편의?)로 인해 해당 설정을 누락할 수 있다. 그런점에서 파이프라인에 점검테스트 도구를 사용하여 자동화된 테스트를 수행하는 절차를 수행하면 의미있지 않을까. 하는 생각에 좀 더 알아보고 예시들을 수행해보았다.
2. tfsec
Overview
fsec은 Terraform 코드를 위한 정적 분석 보안 스캐너입니다.
로컬 및 CI 파이프라인에서 실행되도록 설계되었으며, 개발자 친화적인 출력과 완전히 문서화된 검사를 통해 최대한 빠르고 효율적으로 탐지 및 수정할 수 있습니다.
tfsec은 개발자 우선 접근 방식을 통해 Terraform 템플릿을 검사하며, 정적 분석과 공식 HCL 파서와의 긴밀한 통합을 통해 인프라 변경이 적용되기 전에 보안 문제를 감지할 수 있도록 합니다.
tfsec is a static analysis security scanner for your Terraform code.
Designed to run locally and in your CI pipelines, developer-friendly output and fully documented checks mean detection and remediation can take place as quickly and efficiently as possible
tfsec takes a developer-first approach to scanning your Terraform templates; using static analysis and deep integration with the official HCL parser it ensures that security issues can be detected before your infrastructure changes take effect.
aqua tfsec
주요 기능(feature)
- ☁️ Checks for misconfigurations across all major (and some minor) cloud providers
- ⛔ Hundreds of built-in rules
- 🪆 Scans modules (local and remote)
- ➕ Evaluates HCL expressions as well as literal values
- ↪️ Evaluates Terraform functions e.g.
concat()
- 🔗 Evaluates relationships between Terraform resources
- 🧰 Compatible with the Terraform CDK
- 🙅 Applies (and embellishes) user-defined Rego policies
- 📃 Supports multiple output formats: lovely (default), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ Configurable (via CLI flags and/or config file)
- ⚡ Very fast, capable of quickly scanning huge repositories
- 🔌 Plugins for popular IDEs available (JetBrains, VSCode and Vim)
- 🏡 Community-driven – come and chat with us on Slack!
다른 테라폼 보안 툴들과의 비교
pre-commit terraform에서는 다양한 보안 툴/스캐너와의 연동이 가능하다
- checkov
- 정책기반으로 작동하는 IaC 구성오류(misconfiguration) 정적 분석 도구
- terrascan
- Compliance & Security violation 정적분석 도구
- TFLint
- 테라폼 린트(코드 컨벤션/에러 검사)
- TFSec
- 정책기반 코드 구성 오류 탐지
간단히 도구별 소개글을 읽어보았을때 사전 정의된 정책에 따라 보안 스캔을 수행하는 방식은 도구마다 동일하였다. CI 파이프라인과의 통합도 다 지원하고, 터미널 등의 출력방식에대한 취향차이? 이지 않을까 싶었다.
그나마 tfsec이 다른 도구 대비 나은 부분은 다음과 같았다.
- repository Star 수
- tfsec(5.9k)/checkov(5.6k)/terrascan(4k)
- Sponsor인 AquaSecurity
- 컨테이너 이미지 취약점 스캐너인 trivy로 유명
- trivy는 오픈소스 컨테이너레지스트리인 Harbor에 포함되어있음
- 컨테이너쪽 보안으로 나름 검증받은회사니까, 여기도 낫지않을까?
3. Demo
이 부분에서는 설치방법과, 터미널/IDE에서 간단한 보안스캔을 수행해볼것이다.
3.1. 설치 과정
공식 문서의 Installation 참고.
brew, chocolatey, binary 설치등을 지원한다
3.2. CLI
tfsec을 사용하는 가장 간단한 방법은, 실행위치에서 tfsec 명령어를 실행하거나 실행할 위치를 지정하는것이다.
# 현재 위치에서 실행
tfsec
# 특정 디렉토리에서 실행
tfsec ./terraform/1lb2ec2+1nat
- 실행 결과
- 개별 항목진단 > 문제점, 자세한 정보에 대한 링크
- 전체 진단 결과 > 전체/등급별 요약
기본 명령어를 수행하면, 개별 진단점과 전체 결과를 조회할 수 있다.
개별적으로 테스트를 수행한다면 권고조치는 읽어보고 필요하면 반영하고 불필요하면 무시할 수 있다. 그러나 추후 CI파이프라인등에 반영시, 0이 아닌 종료코드가 떨어지기 때문에 + 중요하지 않은 결과는 무시하도록 조절을 하고 싶었다.
- 어쨌든 퍼블릭노출을 위한 ALB인데.. ingress 다열어야지..
- 테스트/개발환경용 ALB인데.. HTTP 쓸수도 있지..
tfsec 명령어와 함께 사용할 수 있는 parameter는 해당 공식문서에서 확인할 수 있다.
- -m: 보고할 최소 심각도 설정 (CRITICAL, HIGH, MEDIUM, LOW)
- tfsec -m CRITICAL
- -e: run에서 제외할 규칙 설정
- 기본적으로 적용되는 규칙은 문서의 Checks 부분 참조
- tfsec -e aws-ec2-no-public-ingress-sgr,aws-ec2-no-public-engress-sgr,aws-ec2-add-description-to-security-group-rule,aws-elb-alb-not-public,aws-elb-drop-invalid-headers,aws-ec2-enable-at-rest-encryption,aws-ec2-enforce-http-token-imds,aws-ec2-no-public-ip-subnet,aws-elb-http-not-used,aws-ec2-no-public-egress-sgr
조금 억지스럽긴하지만 규칙을 확인하고 무시함으로써 Exit status 0를 달성했다.
또한 –out 파라미터를 통해 결과물을 별도의 파일로 내보낼 수 있지만, ANSI CODE등이 포함되어 가독성이 떨어지기 때문에 –no-color 파라미터와 같이 사용해야 원하는 출력파일을 얻을 수 있다.
- tfsec –out test –no-color
3.3. VSCode Extension
VSCode에도 통합될 수 있어, 테라폼 코드 작성 후 GUI를 통해 간단하고 빠른 테스트 수행이 가능하다.
- 마켓 플레이스에서 설치
- 설치 후, 디렉토리의 tfsec 결과 시각화
- 해당 취약점의 구성파일을 클릭하여, 수정이 필요한 부분과 권고사항을 확인할 수 있다.
3.4. Github Action
협업의 기본인 PR에 코멘팅 달기가 가능하다.
https://aquasecurity.github.io/tfsec/v1.28.1/guides/github-actions/github-action/
4. Outro
간단히 로컬 환경에서 tfsec을 구성해보고, 기존의 블로그 글에서 사용하였던 예시코드를 대상으로 보안분석을 수행해보았다.
생각보다 많은 보안 취약점들이 스캔되어서 당황하긴했지만, 하나하나 살펴보면 음.. 이쯤이야.. 하게 되면서 결국 모든 스캔결과를 ignore 처리하면서 보안스캐너의 사용의의와 정말 의도한대로 사용하는곳이 있을지 궁금해졌다. > 보안그룹의 egress까지 제어하는 회사가 있을지?
보안 관련 도구는 살펴볼때마다 ‘보안은 본질적으로 번거롭고 불편하다’라는 ㅂㅂㅂㅂ를 한번 더 떠올리게되었다.. 맞아봐야 아려나