Credentials을 통해 민감한 정보를 보호해 보자!
들어가며
Jenkins를 통해 CI/CD를 구축하려면 소스 코드를 가져와 빌드해야 합니다. 그러나 이 과정에서 YAML이나 Properties와 같은 파일에는 민감한 정보가 포함될 수 있습니다. 이 정보가 노출되면 악의적인 공격에 이용될 수 있습니다. 이러한 보안 문제를 해결하기 위해 Credentials을 활용하여 민감한 정보를 안전하게 다루는 방법을 알아보겠습니다.
사용 방법 종류
1). String Parameter
2). Secret File(Pipeline으로 생성 시에)
이 두 가지 방법의 대해서 설명해 보도록 하겠습니다.
String Parameter
String Parameter는 Jenkins에서 빌드 파라미터로 사용되어 사용자가 빌드할 때 직접 민감한 정보를 입력할 수 있게 합니다. Jenkins는 해당 변수를 빌드할 때 변경하여 사용합니다. 이 방법은 간단하지만 보안 측면에서는 민감 정보가 쉽게 노출될 수 있어 좋지 않습니다. 따라서 실제 개인 정보가 큰 피해를 입히지 않을 경우에만 사용하는 것이 좋습니다.
사용방법
적용 전 깃의 applicatiom.properties 정보이다. 민감한 정보들이 그대로 나오는 것을 볼 수 있다. 이제 String Parameter을 사용해 정보를 보호해 보자
현재 Jenkins 만든 프로젝트를 클릭해 Configure를 클릭한다.
이변수는 매개변수가 있습니다 클릭 후 매개변수 추가를 클릭해 String Parameter을 선택해 준다.
매개변명에 사용할 매개변수명을 입력하고
Default Value에 민감정보를 작성해 준다.
Build Steps로 이동해 Execute shell을 추가해 주고 아래 sed 명령어를 통해 입력해 준다.
(sed /pattern/replacement를 통해 변경한다.)
이제 YML 파일을 ${작성한 변수명}으로 변경하고 PUSH 해준다.
변경 후 깃의 application.properties정보이다.
이제 현재 프로젝트로 가면 지금 빌드가 파라미터와 함께 빌드로 변경된 것을 볼 수 있다.
이제 파라미터와 함께 빌드를 클릭하면
다음과 같이 민감한 정보들이 그대로 노출되는 것을 볼 수 있다.
(위에서 말했던 거와 같이 기관은 저장소에서는 민감한 정보를 보호할 수 있지만 Jenkins에서는 민감한 정보가 나와 노출될 수도 있는 보안의 취약점을 가지고 있다.)
빌드를 하고
작업공간 -> application.properties 위치한 디렉터리로 이동후 파일을 살펴보면
위와 같이 변경된 것을 볼 수 있다.
Secret File
Secret File 방법은 Jenkins의 Credentials에 파일을 등록하고, 빌드할 때 해당 Credentials에 등록한 파일을 사용하는 방법입니다. 하지만 이 설정은 처음 사용하는 사용자에게는 복잡할 수 있습니다.
사용방법
String Parameter에서 설명한 것처럼 현재 깃에는 ${USER_NAME}같이 민감한 정보로 치한 되어서 저장되어 있다고 가정하겠습니다.
Dashboard > Jenkins관리 > Credentials > System > Global credentials로 들오가 새로운 New credentials 만들어줍니다.
Secrect file 선택
파일선택에 치환하지 않은 원래 민감한 정보가 닮 겨 이는 있는 properties파일을 만들어 넣어준다.(git에는 올리지 않도록 한다.)
파이프라인 프로젝트를 생성한 후에 Pipeline script 작성Pipleline Syntax에서 스크립트를 쉽게 만들수도 있다.
pipeline{
agent any
tools{
gradle 'Gradle 8.5'
}
stages{
stage('Replace Properties'){
steps{
script{
//깃주소와 인증정보를 담은 chekout 스크립트
withCredentials([file(credentialsId: 'secretFile', variable: 'srectFile')]) {
sh 'cp $srectFile ./src/main/resources/application.properties'
}
}
}
}
stage('Build'){
steps{
sh 'gradle clean build'
}
}
}
}
sh 'cp $srectFile./src/main/resources/application.properties'
명령어를 통해서 variable에 있는 값을 가지고 appliction.properties를 변경
작성 후에 실행하면 다음과 같이 성공된 것을 볼 수 있다.
현재 jenkins의 wokrspace에 가서 프로젝트의 있는 application.properties를 확인해 보자
(저는 현재 로컬 C드라이브에 마운트 하여 실행했기 때문에 로컬서버에 jenkins 파일이 저장되어 있습니다.)
깃에 있는 properties는 ${DB_USERNAME}으로 저장되어 있지만 SecrectFile을 통해서 빌드 전에 바꿔치기하여 yml을 파일을 수정했기 때문에 작동할 수 있었습니다.
'Devops' 카테고리의 다른 글
[Git] git 실수로 올린 commit 및 push 취소 및 add 취소하는 방법 (1) | 2024.03.08 |
---|---|
[Git] Git bash CLI 명령어 모음 (0) | 2024.03.03 |
[Jenkins] 로컬 Docker(Docker HUB) +Jenkins(pipeline)+Git(Webhook)+MySQL CI/CD 자동 배포하기 (1) | 2024.02.27 |
[Jenkins] 젠킨스를 이용해 Git의 변경내용을 자동 빌드 (1) | 2024.02.24 |
[Jenkins] 젠킨스와 CI/CD란 무엇인가? (0) | 2024.02.24 |