Basic Jenkins Information

htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요 !!

HackTricks를 지원하는 다른 방법:

접근

사용자명 + 비밀번호

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

쿠키

인증된 쿠키가 유출되면, 해당 쿠키를 사용하여 사용자의 세션에 액세스할 수 있습니다. 쿠키는 일반적으로 JSESSIONID.*로 불립니다. (사용자는 모든 세션을 종료할 수 있지만, 먼저 쿠키가 유출되었음을 알아야 합니다).

SSO/플러그인

Jenkins는 제3자 SSO를 통해 액세스할 수 있도록 플러그인을 사용하여 구성할 수 있습니다.

토큰

사용자는 토큰을 생성하여 CLI 또는 REST API를 통해 애플리케이션에 액세스할 수 있습니다.

SSH 키

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

권한

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

  • 누구나 아무 것이나 할 수 있음: 익명 액세스조차 서버를 관리할 수 있습니다.

  • 레거시 모드: Jenkins <1.164와 동일합니다. "admin" 역할이 있는 경우 시스템 전체를 완전히 제어할 수 있고, 그렇지 않은 경우(익명 사용자 포함) 읽기 액세스만 있습니다.

  • 로그인한 사용자는 아무 것이나 할 수 있음: 이 모드에서 로그인한 모든 사용자가 Jenkins를 완전히 제어할 수 있습니다. 유일하게 완전한 제어권이 없는 사용자는 익명 사용자로, 해당 사용자는 읽기 액세스만 받습니다.

  • 기반 테이블 보안: 테이블에서 누가 무엇을 할 수 있는지 구성할 수 있습니다. 각 권한을 나타냅니다. 각 사용자 또는 그룹/역할을 나타냅니다. 이에는 '익명'이라는 특수 사용자가 포함되어 있으며, 이는 인증되지 않은 사용자를 나타내는 것뿐만 아니라 '인증됨'도 포함되어 있어 모든 인증된 사용자를 나타냅니다.

  • 프로젝트 기반 매트릭스 권한 전략: 이 모드는 각 프로젝트에 대해 별도의 ACL 매트릭스를 정의할 수 있는 "Matrix-based security"의 확장입니다.

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

보안 영역

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

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

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

  • LDAP: 사용자 및 그룹을 포함한 모든 인증을 구성된 LDAP 서버로 위임합니다.

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

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

Jenkins 노드, 에이전트 및 실행기

문서에서 정의:

노드는 빌드 에이전트가 실행되는 기계입니다. Jenkins는 각 연결된 노드를 디스크 공간, 무료 임시 공간, 무료 스왑, 시계 시간/동기화 및 응답 시간에 대해 모니터링합니다. 이러한 값 중 하나가 구성된 임계값을 벗어나면 노드가 오프라인으로 전환됩니다.

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

실행기는 작업을 실행하는 슬롯입니다. 사실상, 이는 에이전트의 스레드입니다. 노드의 실행기 수는 한 번에 해당 노드에서 실행할 수 있는 동시 작업의 수를 정의합니다. 다시 말해, 이는 한 번에 해당 노드에서 실행할 수 있는 동시 Pipeline 단계의 수를 결정합니다.

Jenkins 비밀

비밀 및 자격 증명의 암호화

문서에서 정의: Jenkins는 비밀, 자격 증명 및 해당 암호화 키를 암호화하고 보호하기 위해 AES를 사용합니다. 이러한 암호화 키는 $JENKINS_HOME/secrets/에 저장되며 해당 키를 보호하는 데 사용되는 마스터 키와 함께 저장됩니다. 이 디렉토리는 Jenkins 컨트롤러가 실행 중인 운영 체제 사용자만이이 디렉토리에 읽기 및 쓰기 액세스 권한이 있도록 구성되어야 합니다(chmod 값이 0700이거나 적절한 파일 속성을 사용). 마스터 키(암호화 용어로 "키 암호화 키"로도 불림)는 **$JENKINS_HOME/secrets/master.key**에 암호화되지 않은 상태로 저장되어 있으며 해당 파일에 직접 액세스할 수 있는 공격자에 대해 보호하지 않습니다. 대부분의 사용자 및 개발자는 이러한 암호화 키를 일반적인 비밀 데이터를 암호화하는 데 사용하는 Secret API 또는 자격 증명 API를 통해 간접적으로 사용할 것입니다. Jenkins는 CryptoConfidentialKey의 인스턴스를 암호화하기 위해 AES를 사용하며, 이러한 인스턴스는 $JENKINS_HOME/secrets/에 저장되며 해당 CryptoConfidentialKey ID에 해당하는 파일 이름으로 저장됩니다. 일반적인 키 ID는 다음과 같습니다:

  • hudson.util.Secret: 일반 비밀에 사용됨;

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

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

자격 증명 액세스

자격 증명은 글로벌 제공자에 대해 범위가 지정될 수 있으며 (/credentials/), 이는 구성된 모든 프로젝트에서 액세스할 수 있거나 특정 프로젝트에 대해 범위가 지정될 수 있으며 (/job/<project-name>/configure), 따라서 해당 특정 프로젝트에서만 액세스할 수 있습니다.

문서에 따르면: 범위에 있는 자격 증명은 제한 없이 파이프라인에서 사용할 수 있습니다. 빌드 로그에서의 실수로 노출을 방지하기 위해 자격 증명은 정규 출력에서 마스킹되어 있어서, env (Linux) 또는 set (Windows)을 호출하거나 환경 또는 매개변수를 인쇄하는 프로그램은 빌드 로그에서 사용자에게 노출되지 않습니다.

따라서 공격자가 자격 증명을 유출하려면 예를 들어 base64로 인코딩해야 합니다.

참고 자료

AWS 해킹을 제로부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

最終更新