본문 바로가기
일반IT

Jenkins의 자물쇠: Credentials는 정말 안전할까? 🔑

by gasbugs 2025. 8. 15.

안녕하세요, 자동화의 심장 Jenkins를 사용하시는 개발자 여러분! CI/CD 파이프라인을 구축하다 보면 GitHub 토큰, SSH 키, 데이터베이스 비밀번호 등 수많은 비밀 정보(Secret)들을 다뤄야 합니다. 이때 우리는 당연하게 Jenkins의 Credentials 기능을 사용하죠.

그런데 문득 이런 생각이 들지 않으셨나요? "내가 여기에 저장한 비밀번호, 정말 안전하게 보관되고 있는 걸까?" 🤔

결론부터 말씀드리면, 네, Jenkins는 당신의 비밀 정보를 암호화하여 안전하게 저장합니다! 하지만 여기에는 우리가 반드시 알아야 할 중요한 전제 조건이 따릅니다. 지금부터 Jenkins의 비밀 창고 속으로 함께 들어가 보시죠!

 

 


Jenkins는 비밀번호를 어떻게 암호화할까? 🧐

Jenkins에 비밀번호나 API 키 같은 민감 정보를 저장하면, 그 정보는 절대 평문(Plain Text)으로 디스크에 기록되지 않습니다. Jenkins는 여러 겹의 암호화 계층을 통해 이 정보들을 보호합니다.

  1. Credentials 저장: 사용자가 UI를 통해 Credential을 생성하면, 이 정보는 암호화되어 $JENKINS_HOME/credentials.xml 파일에 XML 형태로 저장됩니다.
  2. 암호화의 핵심, 2개의 열쇠: 이 암호화 과정에는 아주 중요한 두 개의 파일이 사용됩니다. 이 파일들은 $JENKINS_HOME/secrets/ 디렉터리에 보관되어 있죠.
    • master.key: 모든 암호화의 시작점이 되는 마스터 키입니다. 이 키는 Jenkins가 처음 설치될 때 생성되며, 다른 키들을 암호화하는 데 사용됩니다.
    • hudson.util.Secret: master.key에 의해 암호화되는 또 다른 키입니다. 실제로 credentials.xml 파일의 내용을 암호화하고 복호화하는 데 직접적으로 사용되는 작업용 열쇠라고 생각할 수 있습니다.

간단히 말해, Jenkins는 master.key로 hudson.util.Secret을 잠그고, 잠긴 hudson.util.Secret으로 실제 Credential 정보를 잠그는 이중 잠금장치를 사용하는 셈입니다. 🔐


"왕의 열쇠"를 지켜라: master.key의 중요성

여기서 가장 중요한 점이 드러납니다. 만약 누군가 Jenkins 서버의 파일 시스템에 접근하여 이 master.key와 hudson.util.Secret 파일을 손에 넣는다면 어떻게 될까요? 네, 그렇습니다. credentials.xml에 저장된 모든 비밀 정보를 복호화해서 알아낼 수 있습니다. 😱

Jenkins의 암호화 메커니즘은 파이프라인 실행 중에 비밀번호가 노출되는 것을 막고, UI 상에서 쉽게 알아볼 수 없게 하는 데 매우 효과적입니다. 하지만 Jenkins 컨트롤러(마스터) 서버 자체의 보안이 뚫리면 모든 것이 무용지물이 될 수 있다는 의미입니다.

따라서 Jenkins 관리자는 다음과 같은 보안 수칙을 반드시 지켜야 합니다.

  • Jenkins 컨트롤러 서버 접근 제어: 꼭 필요한 최소한의 인원만 서버에 접근할 수 있도록 권한을 관리해야 합니다.
  • $JENKINS_HOME 디렉터리 보호: 해당 디렉터리에 대한 파일 시스템 권한을 엄격하게 설정하여 Jenkins 실행 계정 외에는 접근할 수 없도록 해야 합니다.
  • 정기적인 백업 및 보안 감사: secrets 디렉터리를 포함한 Jenkins 홈 디렉터리를 안전한 곳에 정기적으로 백업하고, 서버 보안 감사를 통해 위협을 사전에 차단해야 합니다.

 


더 안전하게 Credentials를 사용하는 Best Practice ✨

Jenkins의 기본 암호화 기능을 신뢰하되, 더 안전하게 사용하기 위한 몇 가지 팁이 있습니다.

  1. 스코프(Scope) 최소화: Credential을 생성할 때 무조건 'Global'로 만들지 마세요. 특정 파이프라인이나 폴더에서만 사용된다면, 해당 스코프로 범위를 제한하여 노출 가능성을 줄이는 것이 좋습니다.
  2. Credentials Binding 플러그인 활용: 파이프라인 스크립트(Jenkinsfile) 내에서 Credential을 사용할 때는 credentials() 헬퍼나 withCredentials 블록을 사용하세요. 이 기능은 빌드가 실행되는 동안에만 비밀 정보를 환경 변수로 주입해주고, 빌드 로그에는 별표(****)로 마스킹 처리하여 노출을 방지합니다.
  3. Groovy
    pipeline {
        agent any
        stages {
            stage('Deploy') {
                withCredentials([string(credentialsId: 'my-secret-api-key', variable: 'API_KEY')]) {
                    sh 'echo "API 키를 사용하여 배포를 시작합니다."'
                    // 이제 $API_KEY 환경 변수를 안전하게 사용할 수 있습니다.
                    sh 'curl -H "Authorization: Bearer $API_KEY" https://api.example.com/deploy'
                }
            }
        }
    }
    
  4. 외부 Secret 관리 도구 연동: 대규모 환경이나 더 높은 수준의 보안이 필요하다면, HashiCorp VaultAWS Secrets Manager 같은 외부 Secret 관리 전문 도구와 Jenkins를 연동하는 것을 적극적으로 고려해 보세요. 이 경우 Jenkins는 비밀 정보 자체를 저장하는 것이 아니라, 필요할 때마다 외부 도구로부터 동적으로 받아와 사용하므로 보안 수준을 한 단계 더 높일 수 있습니다.

 

결론: 자물쇠는 튼튼하지만, 집을 잘 지켜야 한다! 🏠

Jenkins의 Credentials 저장 방식은 강력한 암호화 메커니즘을 기반으로 합니다. 하지만 그 안전성은 Jenkins 컨트롤러 서버 자체의 보안 수준에 직접적으로 의존합니다.

따라서 우리는 "Jenkins가 알아서 암호화해주겠지"라고 안심하는 데 그치지 말고, Jenkins가 실행되는 서버 환경을 안전하게 보호하고 Credential을 올바른 방법으로 사용하는 책임감 있는 자세를 가져야 합니다. 튼튼한 자물쇠를 믿는 만큼, 우리 집의 문단속도 철저히 해야겠죠? 😊