티스토리 뷰
지난 포스팅으로로 Jenkins 권한관리를 KeyCloak과 연동해서 하는 방법에 대해 다뤘었는데 이것만으로는 성에 차지 않을 수 있다. 왜냐면 글로벌한 설정이기 때문이다. 대형 프로젝트 같은것을 하는 경우 각 파트별로 자기의 영역만 보이는것이 가장 좋다. 아니, 그래야만 한다. 이를테면 이런 상황이다.
User 계정으로 접속을 했는데 admin view에 있는 내용까지 모두 보인다. 각 프로젝트 사용자는 해당 프로젝트에만 접근이 가능해야한다. 이럴때 권한 설정을 하는 방법을 KeyCloak의 openid-connect를 사용해서 진행해 보도록 하겠다.
해야할 일은 쉽게 설명을 하자면
1. KeyCloak에서 3개의 '그룹' 을 생성할것이다. (admin, project1, project2) 여기에 사용자들을 각각 추가시킨다.
2. Jenkins를 KeyCloak의 openid-connect를 통해 연결을 한다. 이때 Jenkins에서는 KeyCloak에서 준 그룹 권한을 가져올 수 있다.
3. KeyCloak으로부터 가지고 온 그룹을 바탕으로 Jenkins에서 권한을 부여한다. 이로인해 사용자는 권한에 맞는 Jenkins의 item만 볼 수 있다. (admin -> all, project1_user -> project1 item, project2_user -> project2 item)
기본적인 환경은 지난 시간에 포스팅한 내용을 참고하도록 한다.
KeyCloak 설정
- OpenID Endpoint Configuration 획득
필자는 Oingdaddy 라는 Realm을 생성했었다. Realm을 생성하면 OpenID Endpoint Configuration 을 얻을 수 있다. 이것은 나중에 Jenkins와 openid-connect를 할때 꼭 필요하므로 일단 보관을 한다.
OpenID Endpoint Configuration 을 누르면 http://localhost:8180/auth/realms/oingdaddy/.well-known/openid-configuration 이런 주소로 연결이 되며 openid-connect를 하는데 필요한 json string이 나온다. 여기서 필요한건 http://localhost:8180/auth/realms/oingdaddy/.well-known/openid-configuration 이 url이다. 잘 메모해두자.
- Client 세팅
Client에서는 jenkins라는 Client를 생성했다.
Client Protocol을 openid-connect로, Access Type을 confidential 로 설정하는것이 중요하다. 그리고 Valid Redirect URIs에서는 Jenkins와 KeyCloak의 URL을 입력해주자. 뒤에 /* 붙이자. 다 세팅했으면 Save를 꼭 눌러준다.
저장을 눌렀으면 바로 옆의 Credentials tab으로 이동한다.
여기에서는 jenkins라는 client의 Secret을 잘 메모 해놔야 한다. 나중에 Jenkins와 연동할때 필요하다.
메모를 했으면 Mappers tab으로 이동을 한다.
Mapper tab에 들어가면 아무것도 없을 것이다. 위의 Create를 눌러준다.
Create를 누르면 위와 같은 화면이 나올 것이고 여기서 Mapper Type을 제일 먼저 Group Membership으로 선택을 해준다. 그리고 템플릿이 바뀌면 Name과 Token Claim Name을 group-membership으로 입력하고 저장을 한다.
- Group 생성
Client 세팅이 다 끝났다면 그다음은 Group을 생성한다. 필자는 jadmin, project1, project2 이렇게 그룹을 생성했다. 본인 상황에 맞게 그룹명을 정해서 생성해주면 된다.
- User 생성 및 Group Mapping
그룹을 만들었으면 다음은 User를 생성하고 생성한 그룹에 매핑을 시켜주는 작업이 필요하다. 필자는 jadmin, project1_user1, project2_user2 라는 User를 생성했다.
jadmin User는 모든 그룹에 속해 있게 설정을 했고 project1_user1 User는 project1 그룹만, project2_user1 User는 project2 그룹만 속하도록 각각 설정을 했다.
여기까지 했으면 KeyCloak에서의 설정은 모두 끝났다. 아까 메모해둔 두가지 사항 (OpenID Endpoint Configuration URL, Client Secret) 을 잊지 말자.
Jenkins 설정
KeyCloak 만큼 Jenkins에서도 해줄일이 많다. 인증/권한 관련된 부분은 해도해도 어려운것 같다.
- 플러그인 설치
가장 먼저 해야 할 일은 Jenkins에 OpenId Connect Authentication plugin을 설치하는것이다. 검색하여 설치해준다.
- Configure Global Security 설정
주의! 일단 이 부분 설정에 앞서 Jenkins 설정에 대한 백업을 해야 한다.
백업을 하지 않으면 조금만 설정이 이상하면 Jenkins 로그인이 안된다... 백업을 하는 위치랑 파일은 여기를 참조하도록 하자. 꼭 이 설정 시작하기 전에 config.xml 파일을 백업해두고 진행하자. 필자는 아픔을 겪었다..
플러그인 설치가 되었다면 시스템 관리 > Configure Global Security 로 들어간다.
Configure Global Security에 들어오면 Security Realm 을 설정하는 부분이 있다. 이부분 세팅이 중요하다. 각 항목에 아까 메모해둔것들을 입력해 넣는다. 그리고 저장을 누르고 빠져 나온다.
그리고 이곳으로 다시 들어간다. 어리둥절 하겠지만 들어가보면 안다.
기존 저장할때 썼던 Automatic Configuration -> Manual Configuration 으로 변경을 하면 Token, Authorization, UserInfo, Scopes 등의 정보가 자동으로 채워지는 것을 볼 수 있다. 이를 위해 저장하고 나갔다 온것이다. 채워야 할 항목들에 대해서는 빨간색 네모를 쳤다. 고급을 눌러야 나온다. 이중 Group field name은 아까 Client Mapper에서 정의했던 이름을 사용한다.
저장을 누르고 나온다.
- Manage and Assign Roles 설정
다음은 Manage and Assign Roles 설정을 한다. 위의 과정이 openid-connect 를 해주는 과정이었다면 이것은 가져온 정보를 토대로 Jenkins의 권한을 세팅하는 곳이다. 이 메뉴가 안보인다면 여기에서 Jenkins 설정 부분을 참고하도록 하자.
일단은 Manage Roles에 들어간다.
그리고 Global Roles에 Admin이 아닌 Role을 하나 추가한다. 그리고 Read 권한만 준다.
Item Role은 Jenkins item(job) 의 네이밍 규칙에 따라서 권한관리를 하는것이다. 필자는 Jenkins Job을 다음과 같이 설정했기에 위처럼 Item Roles을 설정했다.
저장을 누르고 나온다.
이번에는 Assign Roles을 설정한다.
위와 같은 방식으로 KeyCloak에서 지정한 Group 명에 맞게 설정을 해준다. project1 이라는 group은 /project1 이런식으로.. 앞에 /를 꼭 붙여줘야 한다. 그리고 혹시 /를 안쓰면 User를 뜻한다. jadmin 이라는 user가 jadmin group에 속해 있었으므로 위와 같은 경우도 되는것이다. Global roles에서는 이 그룹 혹은 사용자가 admin 권한인가 아닌가를 체크한다. 그리고 Item Roles에서는 각 그룹에 해당하는 Jenkins의 권한을 매핑시키는 단계이다. 저장을 누른다.
이제 끝났다. 실행을 해보자. 실행이라 함은 로그아웃부터 시작이다.
테스트
로그아웃을 했을때 한번에 이렇게 나오면 아주아주 잘 된것이다. KeyCloak 오류 메세지가 나오면 아까 위에서 강조한 config.xml 파일을 통해 원복시키고 다시 시작해야 한다. 일단 jadmin 이라는 admin 권한을 가진 user 부터 들어가본다.
원래대로 모든 화면이 다 잘 보인다. 또 로그아웃을 한다. 그리고 project1_user1 계정으로 로그인해본다.
project1_user는 item이 project1 로 시작하는 item만 보인다. 성공적으로 잘 되었다.
project2_user는 item이 project2 로 시작하는 item만 보인다. 다 잘 된다.
그리고 마지막으로 admin 계정으로 들어가서 Jenkins 사용자를 한번 보자.
이런식으로 KeyCloak을 통해 로그인을 하면 사용자 등록이 자동으로 되고 그룹도 KeyCloak으로부터 가져오는것을 확인할 수 있다. 이렇게 /project1 방식으로 그룹을 가지고 오므로 위에서 Assign Role을 설정할때 / 를 추가해서 했던 것이다.
원하는대로 권한 설정이 잘 되었다. 쓰고보니 굉장히 길어졌다.. 최대한 나의 아픔을 겪지 않도록 상세하게 쓰다보니 그런것 같다.
끝!
'CI,CD > Jenkins' 카테고리의 다른 글
Jenkins (Hudson) 재밌는 기능 (0) | 2021.03.19 |
---|---|
Jenkins로 Windows 서버에 자동배포하는 모든과정 (1) | 2021.01.12 |
Jenkins 문제 생겼을때 설정파일 직접 수정하기 (설치파일 경로 포함) (0) | 2021.01.08 |
Jenkins Window 10에 설치하기 (0) | 2021.01.08 |
Jenkins 권한관리 KeyCloak 연동해서 하기 (1) (0) | 2021.01.08 |