TrainWithShubham/AI-BankApp-DevOps 프로젝트 개요
요약
Spring Boot 3와 Java 21 기반의 금융 플랫폼을 컨테이너화하고, GitHub Actions와 AWS 서비스를 활용하여 DevSecOps 파이프라인을 구축하는 방법을 안내합니다. 이 프로젝트는 OIDC 인증과 다중 보안 게이트를 통해 높은 수준의 보안성을 확보하며, Ollama를 이용한 AI 엔진 통합 과정을 상세히 설명합니다.
핵심 포인트
- Spring Boot 3/Java 21 기반의 고성능 금융 플랫폼 구현
- GitHub Actions와 AWS OIDC를 사용한 안전한 CI/CD 파이프라인 구축
- Gitleaks 등 9단계 보안 게이트로 코드 취약점 사전 차단
- Ollama 전용 EC2 인스턴스를 분리하여 AI 엔진을 운영하는 아키텍처 제시
Spring Boot 3, Java 21로 구축되었으며 Contextual AI가 통합된 고성능 컨테이너화 금융 플랫폼입니다. 이 프로젝트는 GitHub Actions, OIDC 인증 및 AWS 관리형 서비스를 사용하여 안전한 "DevSecOps 파이프라인"을 구현합니다.
애플리케이션은 다중 계층(multi-tier)의 분할된 AWS 환경에 배포됩니다. 제어 평면(control plane)은 모든 단계에서 통합 보안 게이트를 갖춘 GitHub Actions를 활용합니다.
graph TD
subgraph "External Control Plane"
GH[GitHub Actions]
...
CI/CD 파이프라인은 코드가 프로덕션에 도달하기 전에 9개의 순차적인 보안 게이트를 강제 적용합니다:
| Gate | Name | Tool | Purpose |
|---|---|---|---|
| 1 | Secret Scan | Gitleaks | 전체 Git 히스토리에서 유출된 비밀 정보 스캔 |
| ... | |||
| 백엔드 프레임워크: Java 21, Spring Boot 3.4.1 | |||
| 보안 전략: Spring Security, IAM OIDC, Secrets Manager | |||
| 지속성 계층: MySQL 8.0 (Docker Container) | |||
| AI 통합: Ollama (TinyLlama) | |||
| DevOps 도구링: Docker, Docker Compose, GitHub Actions, AWS CLI, jq | |||
| 인프라: Amazon EC2, Amazon ECR, Amazon VPC |
컨테이너 레지스트리 (ECR): -
애플리케이션 서버 (EC2):
아래의 내용으로 Ubuntu 22.04 인스턴스를 배포합니다.
User Data
.#!/bin/bash sudo apt update sudo apt install -y docker.io docker-compose-v2 jq sudo usermod -aG docker ubuntu sudo newgrp docker sudo snap install aws-cli --classic
보안 그룹(Security Group)을 구성하여 포트 22 (관리)와 포트 8080 (서비스)에 대한 인바운드 규칙을 열어주는 것이 좋습니다.
생성된 보안 그룹에 name을 부여하는 것이 좋습니다. -
IAM Instance Profile (IAM EC2 role)을 생성하고 다음 권한을 포함합니다:
이를 애플리케이션 EC2에 연결합니다. EC2 -> Actions -> Security -> Modify IAM role -> Attach created IAM role을 선택하세요.
EC2 인스턴스에 연결하여 아래 명령어를 실행해 IAM 역할이 정상 작동하는지 확인합니다.
aws sts get-caller-identity
IAM 역할을 가정(assumed)한 계정 세부 정보가 표시됩니다.
AI 엔진 계층 (Ollama):
전용 Ubuntu EC2 인스턴스를 배포합니다.
인바운드 포트 11434를 엽니다.
애플리케이션 EC2 보안 그룹(Security Group)에서. 생성된 보안 그룹에 이름을 지정하는 것이 좋습니다.
-
ollama-setup.sh스크립트를 통해 EC2 사용자 데이터(User Data)를 사용하여 초기화를 자동화합니다. -
AI 엔진이 응답 가능한지, 그리고 모델이 다운로드되었는지 확인합니다.
AI 엔진 EC2: ollama list
배포 파이프라인은 GitHub와 AWS 간의 안전하고 키가 필요 없는 인증을 위해 OpenID Connect (OIDC)를 사용합니다.
-
IAM Identity Provider: -
Deployment Role:
'Identity provider'에서 생성된 항목을 클릭합니다. -
GitHubActionsRole이라는 이름의 역할을 할당 및 생성합니다. - 다음 세부 정보를 입력합니다:
Identity provider: 생성된 항목 선택.
Audience: 생성된 항목 선택.
GitHub organization: 이 리포지토리가 위치한 GitHub 사용자 이름 또는 조직명.
GitHub repository: 이 프로젝트의 리포지토리 이름을 작성합니다. (예: DevSecOps-Bankapp)
GitHub branch: 이 프로젝트에 사용할 브랜치입니다. (예: devsecops)
-
다음(Next)을 클릭합니다. -
AmazonEC2ContainerRegistryPowerUser권한을 할당합니다. -다음(Next)을 클릭하고 역할 이름을 입력한 후역할 생성(Create role)을 클릭합니다.
'다른 유형의 비밀(Other type of secret)'에 bankapp/prod-secrets라는 이름의 비밀을 생성하고 다음 키-값 쌍을 포함합니다:
| Secret Key | Description | Sample/Default Value |
|---|---|---|
DB_HOST | MySQL 컨테이너 서비스 이름 | db |
DB_PORT | 데이터베이스 포트 | 3306 |
DB_NAME | 애플리케이션 데이터베이스 이름 | bankappdb |
DB_USER | 데이터베이스 사용자 이름 | bankuser |
DB_PASSWORD | 데이터베이스 비밀번호 | Test@123 |
OLLAMA_URL | AI 계층의 비공개 URL | http://<PRIVATE-IP>:11434 |
GitHub 리포지토리 설정 내에서 다음 액션 비밀(Action Secrets)을 구성합니다:
| Secret Name | 설명 |
|---|---|
AWS_ROLE_ARN | GitHubActionsRole의 ARN |
AWS_REGION | 리소스를 배포할 AWS 리전 |
AWS_ACCOUNT_ID | 12자리 AWS 계정 번호 |
ECR_REPOSITORY | ECR 레지스트리 이름 (devsecops-bankapp) |
EC2_HOST | 애플리케이션 EC2의 공인 IP 주소 |
EC2_USER | SSH 사용자 이름 (기본값은 ubuntu) |
EC2_SSH_KEY | 개인 SSH 키(.pem 파일) 내용 |
NVD_API_KEY | OWASP SCA 스캔을 위한 nvd.nist.gov의 무료 API 키 |
참고: NVD_API_KEY는 NVD API 속도 제한을 ~30초당 5회 요청에서 30초당 50회 요청으로 높여, OWASP Dependency Check 스캔 시간을 30분 이상에서 8분 미만으로 단축합니다. 이 키가 없으면 SCA 작업이 시간 초과됩니다.
1단계: API 키 요청
조직 이름,
이메일 주소를 입력하고조직 유형을 선택하세요. -
사용 약관에 동의하고 제출을 클릭합니다.
2단계: API 키 활성화
- 이메인 받은 편지함에서
[email protected]로부터 온 메시지를 확인합니다. -
이메일의 활성화 링크를 클릭합니다. -
제공된UUID와이메일을 입력하여 활성화하고 -
링크가 키를 확인하고 활성 상태로 표시합니다.
3단계: API 키 받기
4단계: GitHub Secret으로 추가
-
GitHub에서 리포지토리로 이동합니다.
-
설정(Settings) → Secrets and variables → Actions → New repository secret으로 이동합니다. -
이름:NVD_API_KEY -
값: 복사한 API 키를 붙여넣습니다.
-
**Secret 추가(Add Secret)**를 클릭합니다.
DevSecOps 라이프사이클은 DevSecOps 메인 파이프라인을 통해 오케스트레이션되며, CI, Build, CD의 세 가지 모듈식 워크플로우를 안전하게 순차적으로 실행합니다. 이들은 코드가 프로덕션에 도달하기 전에 9개의 순차적인 보안 게이트를 적용합니다. main 또는 devsecops 브랜치로 git push가 발생할 때마다 전체 파이프라인이 자동으로 트리거됩니다.
| 게이트 | 작업 (Job) | 도구 (Tool) | 동작 (Action) |
|---|---|---|---|
| 1 | gitleaks | Gitleaks | 엄격(Strict): 히스토리에서 비밀 정보가 발견되면 실패합니다. |
| 2 | lint | Checkstyle | 감사(Audit): 스타일 위반 사항을 보고하지만 차단하지 않습니다 (Google Style). |
| 3 | sast | Semgrep | 엄격(Strict): 취약점을 위해 코드를 스캔합니다. 발견 시 실패합니다. |
| 4 | sca | OWASP Dependency Check | 엄격(Strict): 종속성 중 CVSS 점수가 7.0을 초과하는 것이 있으면 실패합니다. |
| 5 | build | Maven | 표준 빌드 및 테스트 단계입니다. |
| 6 | image_scan | Trivy | 엄격(Strict): Docker 이미지 레이어를 스캔합니다. High/Critical CVE가 발견되면 실패합니다. |
| 7 | push_to_ecr | Amazon ECR | OIDC를 사용하여 검증된 이미지를 AWS ECR에 푸시합니다. |
| 8 | deploy | SSH / Docker Compose | AWS Secrets Manager에서 비밀 정보를 가져와 컨테이너를 재구축합니다. |
| 9 | dast | OWASP ZAP | 감사 모드(Audit Mode): 발견 사항을 아티팩트로 보고하는 포괄적인 스캔이지만, 파이프라인을 차단하지는 않습니다. |
모든 스캔 보고서 (OWASP, Trivy, ZAP)는 각 GitHub Actions 실행에서 다운로드 가능한 **아티팩트(Artifacts)**로 업로드됩니다. 아티팩트를 확인하실 수 있습니다.
프로세스 상태: docker ps
애플리케이션 작동 여부: -
데이터베이스 연결성: docker exec -it db mysql -u <USER> -p bankappdb -e "SELECT * FROM accounts;"
ZAP은 cd.yml의 DAST - OWASP ZAP Baseline Scan 작업에 의해 자동으로 생성됩니다. 이에 대한 자세한 정보(어떻게, 왜 하는지)는 google...에서 읽을 수 있습니다.
네트워크 검증: nc -zv <OLLAMA-PRIVATE-IP> 11434
학습 즐기세요 (Happy Learning)
TrainWithShubham
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기