본문 바로가기

Dev/CICD

[Jenkins] 사용자 권한 자동 검증 기능 구현

고객 요구사항

  • ITSM에서 Jenkins 배포 실행 시, 사용자 계정을 파라미터로 전달하여 해당 계정의 배포 권한을 자동 검증하는 기능 검토
  • 아래 절차로 검토 요청
    • sample 파이프라인 생성
    • 해당 job에 Enable project-based-security > 테스트 아이디 추가 > job build, read, cancel 추가
    • 파이프라인 실행 시 특정 userId 파라미터로 받아서 해당 아이디가 job build 권한이 있는지 체크하는 로직 구현
    • 폴더에 job build 설정하고 하위 잡에서 상속된 권한도 체크할 수 있는지 확인

구현 내용

  • jenkins-pipeline-library에 함수(checkBuildPermission) 구현함
// Jenkins 파이프라인 라이브러리 내의 함수
def checkBuildPermission(String userId) {
    // Jenkins 인스턴스를 가져옵니다.
    def jenkins = Jenkins.getInstance()
    
    // 현재 실행 중인 Jenkins 작업을 가져옵니다.
    def currentJob = jenkins.getItemByFullName(env.JOB_NAME)
    
    // 지정된 사용자 ID로 Jenkins 사용자를 가져옵니다.
    def user = jenkins.getUser(userId)
    
    // 사용자 인증 정보를 얻어옵니다. 이를 통해 해당 사용자의 권한을 확인할 수 있습니다.
    org.acegisecurity.Authentication auth = user.impersonate()
    
    // 현재 작업에 대해 해당 사용자가 빌드 권한을 가지고 있는지 확인합니다.
    boolean hasPermission = jenkins.getAuthorizationStrategy().getACL(currentJob).hasPermission(auth, Item.BUILD)

    if (hasPermission) {
        // 빌드 권한이 있는 경우 메시지를 출력하고 true를 반환합니다.
        echo "해당 유저(${userId})는 빌드 권한이 있습니다."
        return true
    } else {
        // 빌드 권한이 없는 경우 메시지를 출력하고 false를 반환합니다.
        // 주의: 이 부분의 메시지는 현재 빌드 권한이 없다는 의미로 수정되어야 합니다.
        echo "해당 유저(${userId})는 빌드 권한이 없습니다."
        return false
    }
}

// 상단 함수를 사용하는 Jenkinsfile
@Library(["jenkins-template-library", "jenkins-pipeline-library"])

nodeWrap {
    properties([
        parameters([
            string(name: 'USER_ID', defaultValue: '')
        ])
    ])
}

stageWrap("Build Permission Check") {
    // 파이프라인 파라미터에서 사용자 ID를 가져옵니다.
    def userIdParam = params.USER_ID
    
    // 사용자의 빌드 권한을 확인합니다.
    def hasPermission = cicdCommUtils.checkBuildPermission(userIdParam)
    
    if (!hasPermission) {
        // 권한이 없을 경우 오류를 발생시킵니다.
        error "권한 없음"
    }
}

'Dev > CICD' 카테고리의 다른 글

[Jenkins] 전체 사용자 권한 조회 및 CSV 파일 생성  (0) 2025.04.08