고객 요구사항
- 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 "권한 없음"
}
}