[DevSecOps] 1장. CI/CD 파이프라인과 DevSecOps의 개요
작성자 - S1ON개요
소프트웨어 개발의 효율성과 보안성을 극대화하기 위해 등장한 CI/CD 파이프라인과 DevSecOps의 개념에 대해 알아보고 현업에서 많이 사용되는 소스코드 레포지토리, 빌드 시스템, 자동화 테스트, 보안 분석 도구, 배포 시스템, 모니터링 및 로깅 시스템을 자동화 파이프라인으로 구성하고 보안을 어떻게 접근하고 관리해야할지 알아보자.
CI/CD 파이프라인이란?
CI/CD는 소프트웨어 개발 및 배포 프로세스를 자동화하고 효율성을 극대화하기 위한 방법론이다. CI는 Continuous Integration(지속적 통합)을, CD는 Continuous Delivery(지속적 전달)와 Continuous Deployment(지속적 배포)를 의미한다.
CI/CD 파이프라인은 아래 그림과 같이 개발자들이 소스 코드를 개발, 통합, 빌드하고, 릴리스를 배포하여 운영 및 모니터링을 수행하는 각각의 파이프(프로세스)를 연결하여 자동화 구성한 것을 말한다. 이를 통해 소프트웨어 개발 주기의 각 단계를 자동화하고, 신속하고 일관된 배포를 가능하게 한다.
CI/CD 파이프라인 구성 요소
구분 | 구성 요소 | 역할 | 도구 |
1 | 버전 관리 시스템 | 소스 코드를 저장하고 버전 관리를 수행하며 코드 변경 이력 추적 | Git, GitHub, GitLab, Bitbucket 등 |
2 | CI 서버 | 개발자들이 코드 변경 사항을 커밋할 때마다 빌드, 테스트 실행 | Jenkins, GitLab CI, CircleCI, Travis CI 등 |
3 | 빌드 도구 | 소스 코드를 컴파일하고 패키징하며 코드의 종속성을 관리 | Maven, Gradle, Ant 등 |
4 | 테스트 프레임워크 | 테스트를 실행하여 코드의 기능적, 비기능적 요구 사항 검증 | JUnit, TestNG, Selenium, pytest 등 |
5 | 코드 품질 분석 도구 | 코드의 품질을 분석하고, 코드 스타일, 유지보수성 등 검토 | SonarQube, ESLint 등 |
6 | 배포 도구 | 애플리케이션을 스테이징 또는 프로덕션 환경에 배포 | Jenkins, GitLab CI, Spinnaker, Kubernetes 등 |
7 | 모니터링 및 로깅 도구 | 배포 애플리케이션 성능 및 상태 모니터링, 로그 수집 및 분석 | Prometheus, Grafana, ELK Stack 등 |
DevSecOps란?
DevSecOps는 DevOps(전통의 CI/CD)에 Security를 추가하여 진화된 형태로 개발과 운영 과정에 보안 요소를 통합하는 것이다. DevSecOps는 '시프트 레프트(Shift Left)' 원칙에 기반하여, 보안을 개발 초기 단계에서부터 고려하고, 자동화된 보안 도구와 프로세스를 도입한다. 보안이 추가된 CI/CD 구성은 개발과 운영배포가 완료된 서비스에 대한 보안 위협을 식별하고 조치하는데 드는 비용을 획기적으로 절감할 수 있는 효과가 있다.
아래 DevSecOps 라이프사이클 다이어그램에서는 각 단계별로 보안을 어떻게 통합하는지를 알 수 있다.
단, 아래 라이프사이클은 CI/CD 파이프라인에 Security를 추가하여 자동화 구성가능한 것 외에 보안 팀이 각 단계에서 관리해야하는 다른 요소들도 포함하고 있다.
Stage | Phase | Purpose | Automated Activities |
Plan | Pre-production | 보안 요구사항과 위협 모델링을 통해 초기 계획 단계에서 보안 고려 | Threat Modeling, Change Impact Analysis |
Build | Pre-production | 코드가 안전하게 작성되고 저장되도록 보안 검증 수행 | Pre-commit Hooks, Software Composition Analysis, SAST, Code Review, Container Security, Vulnerability Scanning, DAST |
Test | Pre-production | 빌드된 애플리케이션의 보안 검증 | DAST |
Deploy | Production | 애플리케이션을 안전하게 배포 | Access and Configuration Management, Pen Testing |
Operate | Production | 운영 중인 애플리케이션의 보안 유지 | Log Collection, RASP, Patching, WAF |
Monitor | Production | 지속적인 모니터링을 통해 보안 상태를 유지하고 개선 | SIEM, Vulnerability Monitoring, Access Control |
DevSecOps 아키텍처 예시-1
- 개발자는 코드를 작성하여 GitHub에 푸시합니다.
- GitHub에 푸시된 코드는 Jenkins를 통해 빌드 프로세스를 시작합니다.
- Jenkins는 CI 파이프라인을 통해 Maven을 사용하여 코드를 빌드합니다.
- 빌드된 코드는 SonarQube를 통해 코드 품질과 보안 점검을 수행합니다.
- SonarQube 점검이 끝나면 Dependency-Check를 통해 프로젝트의 의존성 보안 점검을 합니다.
- 그 후 Docker를 사용하여 애플리케이션 이미지를 빌드하고 DockerHub에 이미지를 푸시합니다.
- Trivy를 사용하여 Docker 이미지의 보안 취약점을 검사합니다.
- CI 파이프라인이 끝나면 CD 파이프라인이 시작됩니다.
- SCM에서 코드를 체크아웃합니다.
- 애플리케이션을 컨테이너에 배포합니다.
- 배포된 애플리케이션을 쿠버네티스(Kubernetes, K8s)에 배포합니다.
- CD 파이프라인은 애플리케이션 배포가 완료되면 이메일을 통해 알림을 보냅니다.
DevSecOps 아키텍처 예시-2
- 소스 코드 관리:GitHub, GitLab, AWS CodeCommit와 같은 소스 코드 관리 도구를 통해 코드를 관리합니다.
- CI/CD 도구:Jenkins는 CI/CD 파이프라인의 중심 도구로서, 다양한 소스 코드 관리 도구와 연동됩니다.
- 빌드 및 테스트: 여러 언어 및 프레임워크 지원하는 도구들이 사용됩니다. (Node.js, Java, Maven, Android, iOS 등)
- 코드 품질 및 보안 검사:SonarCloud를 통해 코드 품질과 보안 점검 수행, Snyk을 사용하여 의존성 및 취약점 점검
- 컨테이너화 및 이미지 보안: Docker를 사용하여 애플리케이션을 컨테이너화, Trivy를 통해 Docker 이미지 보안 점검
- 컨테이너 레지스트리: Docker 이미지는 DockerHub, Harbor, Google Container Registry 등 레지스트리에 저장
- 배포:Kubernetes를 사용하여 컨테이너화된 애플리케이션을 배포합니다.
- 애플리케이션 보안: OWASP ZAP을 통해 배포된 애플리케이션의 보안 취약점을 점검합니다.
DevSecOps 아키텍처 예시-3
- 소스 코드 관리: 사용자가 코드를 작성하여 Git을 통해 AWS CodeCommit에 푸시합니다.
- 코드 파이프라인: CodePipeline이 코드를 자동으로 가져와 빌드, 테스트 및 배포 과정을 관리합니다.
- 코드 빌드 및 테스트:
- CodeBuild를 사용하여 코드를 빌드하고 테스트합니다. 여기에는 정적 코드 분석(SAST) 및 소프트웨어 구성 분석(SCA)이 포함됩니다.
- Dependency-Check, PHP Stan, SonarQube가 SCA 및 SAST 도구로 사용됩니다.
- 코드 배포: CodeDeploy를 통해 빌드된 애플리케이션을 배포합니다.
- 동적 애플리케이션 보안 테스트(DAST): OWASP ZAP을 사용하여 애플리케이션의 동적 보안 테스트를 수행합니다.
- 단계별 배포: 빌드된 애플리케이션은 AWS Elastic Beanstalk를 사용하여 스테이징 및 프로덕션 환경에 배포됩니다.
- 알림 및 로그 관리: SNS를 통해 사용자에게 이메일 알림을 보내고, CloudWatch 이벤트 및 로그를 통해 모니터링
- 매뉴얼 승인:특정 단계에서 수동 승인이 필요할 수 있으며, 이는 파라미터 저장소(Parameter Store)에서 관리됩니다.
- 보안 및 컴플라이언스:
- IAM Roles를 사용하여 접근 권한을 관리합니다.
- AWS CloudTrail 및 AWS Config를 통해 보안 및 컴플라이언스를 관리합니다.
- S3 버킷에 로그 및 아티팩트를 저장합니다.
- Lambda 스캔 분석:
- AWS Lambda를 사용하여 추가적인 보안 스캔 및 분석을 수행합니다.
- Security Hub와 연동하여 애플리케이션의 취약점을 모니터링합니다.
결론
개발자가 코드를 작성한 후 보안팀에 소스코드 점검을 요청하고, 검토가 완료된 후 테스트 서버에 배포한 뒤 다시 보안 검토를 요청하던 시대는 저물고 있다. 기업들은 소프트웨어 개발과 배포를 자동화하는 것에 이어 보안도 포함시키면서, 실제 서비스가 운영에 배포되기까지의 워크로드에서 업무 공수와 비용을 줄이는 데 집중하고 있다.
보안을 포함시키는 방식은 온프레미스 및 클라우드 환경, 비용과 기능, 레거시 시스템과의 호환성을 고려한 도구 선정 등 다양한 요인에 따라 조직마다 다르지만 안전하고 신뢰성 높은 소프트웨어를 신속하게 배포하는 목적은 모두 동일하다.
다음 장에서는 CNCF(Cloud Native Computing Foundation) 프로젝트를 통해 개발 중인 최신 도구들과 현업에서 많이 쓰이는 오픈소스 도구를 활용하여 DevSecOps 파이프라인을 설계하고 쿠버네티스 클러스터 내부에 구현하는 내용을 다룰 예정이다.
'Season 1 > 기술 보안' 카테고리의 다른 글
CloudGoat 구축하기 (0) | 2024.08.31 |
---|---|
CVE-2022-22965 PoC (0) | 2024.06.30 |
서버팜별 방화벽 구축의 당위성을 확보해주는 아키텍처 사례 (0) | 2024.06.30 |
DVIA 를 통한 취약점 파헤치기!(Sensitive information in memory) (0) | 2024.06.30 |
DVIA 를 통한 취약점 파헤치기!(Network Layer Security) & IOS burp 인증서 등록 (0) | 2024.05.30 |