Basic Jenkins Information

Support HackTricks

Access

Username + Password

Jenkins에 로그인하는 가장 일반적인 방법은 사용자 이름 또는 비밀번호입니다.

인증된 쿠키가 도난당하면, 사용자의 세션에 접근하는 데 사용될 수 있습니다. 쿠키는 일반적으로 JSESSIONID.*라고 불립니다. (사용자는 자신의 모든 세션을 종료할 수 있지만, 먼저 쿠키가 도난당했음을 알아야 합니다).

SSO/Plugins

Jenkins는 플러그인을 사용하여 타사 SSO를 통해 접근 가능하도록 구성할 수 있습니다.

Tokens

사용자는 토큰을 생성하여 애플리케이션이 자신을 가장할 수 있도록 CLI 또는 REST API를 통해 접근할 수 있게 합니다.

SSH Keys

이 구성 요소는 Jenkins를 위한 내장 SSH 서버를 제공합니다. 이는 Jenkins CLI에 대한 대체 인터페이스이며, 명령은 모든 SSH 클라이언트를 사용하여 이 방법으로 호출할 수 있습니다. (문서에서)

Authorization

/configureSecurity에서 Jenkins의 권한 부여 방법을 구성할 수 있습니다. 여러 가지 옵션이 있습니다:

  • 누구나 무엇이든 할 수 있음: 익명 접근조차도 서버를 관리할 수 있습니다.

  • 레거시 모드: Jenkins <1.164와 동일합니다. "admin" 역할이 있는 경우 시스템에 대한 전체 제어가 부여되며, 그렇지 않은 경우(익명 사용자 포함) 읽기 접근만 가능합니다.

  • 로그인한 사용자는 무엇이든 할 수 있음: 이 모드에서는 모든 로그인한 사용자에게 Jenkins의 전체 제어가 부여됩니다. 전체 제어를 가지지 않는 유일한 사용자는 익명 사용자로, 읽기 접근만 가능합니다.

  • 행렬 기반 보안: 누가 무엇을 할 수 있는지를 표로 구성할 수 있습니다. 각 권한을 나타냅니다. 각 사용자 또는 그룹/역할나타냅니다. 여기에는 인증되지 않은 사용자를 나타내는 특별한 사용자 'anonymous'와 모든 인증된 사용자를 나타내는 'authenticated'가 포함됩니다.

  • 프로젝트 기반 행렬 권한 부여 전략: 이 모드는 "행렬 기반 보안"에 대한 확장으로, 각 프로젝트에 대해 추가 ACL 행렬을 별도로 정의할 수 있습니다.

  • 역할 기반 전략: 역할 기반 전략을 사용하여 권한을 정의할 수 있습니다. /role-strategy에서 역할을 관리합니다.

Security Realm

/configureSecurity에서 보안 영역을 구성할 수 있습니다. 기본적으로 Jenkins는 몇 가지 다른 보안 영역에 대한 지원을 포함합니다:

  • 서블릿 컨테이너에 위임: Jenkins 컨트롤러를 실행하는 서블릿 컨테이너에 대한 인증 위임을 위해, 예를 들어 Jetty와 같은 것입니다.

  • Jenkins의 자체 사용자 데이터베이스: 외부 시스템에 위임하는 대신 Jenkins의 내장 사용자 데이터 저장소를 사용하여 인증합니다. 이는 기본적으로 활성화되어 있습니다.

  • LDAP: 구성된 LDAP 서버에 모든 인증을 위임하며, 사용자와 그룹 모두 포함됩니다.

  • Unix 사용자/그룹 데이터베이스: Jenkins 컨트롤러의 기본 Unix OS 수준 사용자 데이터베이스에 대한 인증을 위임합니다. 이 모드는 또한 권한 부여를 위해 Unix 그룹을 재사용할 수 있게 합니다.

플러그인은 Jenkins를 기존 신원 시스템에 통합하는 데 유용할 수 있는 추가 보안 영역을 제공할 수 있습니다:

Jenkins Nodes, Agents & Executors

문서에서의 정의:

노드빌드 에이전트가 실행되는 머신입니다. Jenkins는 각 연결된 노드의 디스크 공간, 여유 임시 공간, 여유 스왑, 시계 시간/동기화 및 응답 시간을 모니터링합니다. 이러한 값 중 하나라도 구성된 임계값을 초과하면 노드는 오프라인 상태가 됩니다.

에이전트Jenkins 컨트롤러를 대신하여 작업 실행을 관리합니다. 에이전트는 Java를 지원하는 모든 운영 체제를 사용할 수 있습니다. 빌드 및 테스트에 필요한 도구는 에이전트가 실행되는 노드에 설치되며, 직접 설치하거나 컨테이너(Docker 또는 Kubernetes)에서 설치할 수 있습니다. 각 에이전트는 호스트 머신에서 고유한 PID를 가진 프로세스입니다.

실행기작업 실행을 위한 슬롯입니다; 본질적으로, 이는 에이전트의 스레드입니다. 노드의 실행기 수는 해당 노드에서 동시에 실행할 수 있는 동시 작업 수를 정의합니다. 즉, 이는 해당 노드에서 동시에 실행할 수 있는 동시 파이프라인 단계를 결정합니다.

Jenkins Secrets

Encryption of Secrets and Credentials

문서에서의 정의: Jenkins는 비밀, 자격 증명 및 해당 암호화 키를 보호하기 위해 AES를 사용하여 암호화합니다. 이러한 암호화 키는 $JENKINS_HOME/secrets/에 저장되며, 해당 키를 보호하는 데 사용되는 마스터 키와 함께 저장됩니다. 이 디렉토리는 Jenkins 컨트롤러가 실행되는 운영 체제 사용자만 읽기 및 쓰기 접근할 수 있도록 구성해야 합니다(즉, chmod 값이 0700이거나 적절한 파일 속성을 사용해야 함). 마스터 키(때때로 암호 용어에서 "키 암호화 키"라고도 함)는 Jenkins 컨트롤러 파일 시스템에 _암호화되지 않은 상태로 저장됩니다 **$JENKINS_HOME/secrets/master.key**에 저장되어 있으며, 이는 해당 파일에 직접 접근할 수 있는 공격자에 대한 보호를 제공하지 않습니다. 대부분의 사용자와 개발자는 일반적으로 Secret API를 통해 일반 비밀 데이터를 암호화하거나 자격 증명 API를 통해 이러한 암호화 키를 간접적으로 사용합니다. 암호화에 관심이 있는 사람들을 위해, Jenkins는 AES를 암호 블록 체인(CBC) 모드에서 PKCS#5 패딩 및 무작위 IV를 사용하여 CryptoConfidentialKey 인스턴스를 암호화하며, 이는 $JENKINS_HOME/secrets/에 해당 CryptoConfidentialKey ID에 해당하는 파일 이름으로 저장됩니다. 일반적인 키 ID는 다음과 같습니다:

  • hudson.util.Secret: 일반 비밀에 사용됩니다;

  • com.cloudbees.plugins.credentials.SecretBytes.KEY: 일부 자격 증명 유형에 사용됩니다;

  • jenkins.model.Jenkins.crumbSalt: CSRF 보호 메커니즘에서 사용됩니다; 및

Credentials Access

자격 증명은 전역 제공자(credentials/)에 범위가 지정될 수 있으며, 이는 구성된 모든 프로젝트에서 접근할 수 있습니다. 또는 특정 프로젝트(job/<project-name>/configure)에 범위가 지정되어 해당 프로젝트에서만 접근할 수 있습니다.

문서에 따르면: 범위 내에 있는 자격 증명은 제한 없이 파이프라인에 제공됩니다. 빌드 로그에서 우발적인 노출을 방지하기 위해, 자격 증명은 일반 출력에서 마스킹되므로 env(Linux) 또는 set(Windows) 호출이나 환경 또는 매개변수를 인쇄하는 프로그램은 빌드 로그에서 자격 증명을 노출하지 않습니다.

그래서 자격 증명을 유출하기 위해 공격자는 예를 들어, base64로 인코딩해야 합니다.

References

Support HackTricks

Last updated