Sh4n3e
SecOps 달성을 위한 고민 본문
나는 현재 Security Researcher/Engineer로 일하고 있다. 다양한 보안업무를 진행하는 와중에, 특히 보안 관련 서비스를 개발하고 이를 CI/CD 파이프라인을 통해 손쉽게 배포를 할 수 있는 환경 구성에 대한 갈증을 느끼게 한다.
근래 내가 진행했던 것에 대해서 간략하게 풀어보고자 한다.
1. Github 내에 존재하는 갖은 토큰 값의 존재로 인한 보안 이슈 해결 방안 고민
private 환경의 형상관리툴(github, gitlab 등), 그리고 private repository라고 하더라도 Data Loss(데이터 유출)에 대해선 언제나 자유로울 수 없다. 악의적인 소스코드 유출, 3rd party application의 취약점으로 인한 소스코드 유출등 갖은 위협은 우리의 곁에 함께 존재한다.
나는 이를 풀어보고자, Aquasecurity의 오픈소스 툴인 Trivy를 이용하였다.
해당 툴은 다양한 Secret Token값에 대한 Rule을 기본으로 제공하며, 정규표현식을 통해 커스텀 룰을 추가로 제공할 수 있다는 점과 기본 적용룰을 disable할 수 있다는 장점이 존재했기에 사용을 결정하였다.
나는 다음과 같은 프로세스를 통해 Github내에 존재하는 토큰 값들을 스캔할 수 있도록 구현하였다.
- Github Enterprise Api를 사용하여 Organization 및 Repository 정보 수집
- 수집된 정보를 바탕으로 Trivy 스캔
trivy repo --scanners secret --secret-config ./trivy-secret.yaml --output ${file_name} -q ${repo_url}
- 수집된 정보를 파싱(--output 옵션을 통해 파일이 저장되면, 그 결과를 파싱)
- 파싱된 정보를 기반으로 Slack에 Alert
해당 코드는 python 과 trivy를 이용하기 위해 shell script 2가지를 활용하여 구현 하였다.
2. 구현된 코드의 형상 관리 및 자동 배포 구현
내가 적용한 CI/CD 파이프라인 기술 스택은 GitOps중에서도 Github Action 및 K8S 환경을 기반으로 진행한다.
Github Action의 경우, Workflow에 대해 원하는 Trigger를 설정할 수 있고, 기타 코드내 Secret한 정보(Token 등)에 대해서는 Github secrets를 통해 관리할 수 있다.
이런 환경을 설정하기 위해서는 아래와 같이 구성하였다.
- K8S Cluster
- Action Runner Controller 및 Action Runner Deployment 구성
- Action Runner Controller의 경우 Github Action Runner 를 Pod단위로 배포/관리할 수 있는 컨트롤러이다.
- 첨부된 링크를 통해 간단하게 K8S 내에 올릴 수 있는 App service 이다.
- Github Workflow 구현
- workflow는 yaml의 형태로 구현이되며, trigger에 대한 설정(on.push.branches)과 jobs로 구현된다.
- jobs.build.runs-on의 경우 어떤 runner를 사용해야할지 설정하면 되고, 이는 label단위로 설정하여 사용하면 된다.
- jobs.build.steps 내에 workflow가 Triggering 되었을 때 서비스 배포를 위한 초기 설정과 Image build 및 K8S 에 apply하는 과정들을 담을 수 있다.
3. 자동 배포시 고려 되어야 할 것
자동 배포를 위해 고려되어야할 것은 Docker Image를 build하게되면, 해당 Image는 runner 내에만 존재하게 되는데, Runner Pod는 workflow의 종료와 함께 종료되고, 신규로 Pod가 올라오는 구조이다.
따라서 Image를 build하고, 해당 Image를 Private Image Repository에 저장해야 한다. (위 그림을 보면 "Docker Login to Harbor, Build and Push Docker Image"가 해당 과정을 담고있다.)
그리고 앞서 배포하기 위해서 미리 Helm Chart 또한 Custom으로 구현을 하여 함께 소스 코드를 Commit / Push하게 되는데, 해당 Helm을 통해 서비스를 배포하게 된다.
해당 서비스는 주 단위로 스캔을 할 수 있도록 Cronjob을 이용하였다.
해당 환경에서는 Docker Build시 Base Image는 trivy Image를 사용하였고, Python을 사용해야하는 특성이 있기에, Cutom build한 Base Image를 만들어 Private Image Repo.에 미리 Push한뒤 활용하였다.
'DevOps > K8S' 카테고리의 다른 글
K8S/Container Security - Aqua Trivy (0) | 2023.02.05 |
---|---|
DevOps Security == DevSecOps (0) | 2023.02.05 |