티스토리 뷰

Computer/Software

LLDAP(경량 LDAP) 구축

zepinos 2024. 4. 22. 10:51
반응형

사용목적

조그만 회사들은 Google이나 Daum 등의 기업용 계정을 생성해서 쓰는 경우도 많지만, 아무래도 여러 개발 지원 프로그램, 특히 웹기반의 프로그램들을 쓸 때에는 계정을 관리하는 어려움을 겪게 됩니다. 입퇴사자의 관리, 부서별 관리와 같은 것을 각 프로그램마다 하기에는 불편하고, 어떤 프로그램들은 구글 등의 소셜 로그인(oAuth 등)을 지원해도 그렇지 않은 프로그램들도 심심찮게 만날 수 있습니다. 어떤 경우에는 회사에서 관리하는 계정 정보를 구글 등에 적용해서 쓰고 싶을 때도 있습니다.

 

이런 상황에서 가장 먼저 떠올릴 수 있고, 가장 근본(?)처럼 여겨지는 것이 바로 LDAP입니다. 원래 계정 관리를 위해 태어난 것은 아니지만, Tree(계층) 구조의 데이터를 표준적으로 제공하고 있기 때문에 회사의 조직(Organization) 형태를 저장하는데 괜찮습니다. 하지만, 이 LDAP을 구현하기 위해서는 아주 무겁고 어려운 상용 프로그램(대표적으로 MS Active Directory)을 쓰거나 무료지만 뭔가 자료도 없고 설정하기도 까다롭고 관리하기도 껄끄러운 OpenLDAP 같은 것을 이용해야 했습니다. 회사의 규모가 어느 정도 있어서 그룹웨어를 도입했을 때 이 LDAP을 같이 제공하거나, NAS 제품(Synology)을 먼저 도입해서 거기에 포함된 LDAP을 사용하게 된다면 그나마 쉽게 이용할 수 있지만, LDAP의 존재 자체를 몰라서 방치해두거나...심지어 사용자 스스로 본인의 비밀번호를 변경해야 하는데, 방법을 제공하기가 껄끄러워서 각 사이트마다 계정을 일일이 생성하는 경우도 있습니다. 그래서 결재를 통해서 하루 정도 걸려서 계정들을 다 받아야 하는 경우도 심심찮게 봤습니다.

 

LDAP 설치

큰 회사에서는 무리겠지만, 조그만 규모의 회사 혹은 개발팀을 꾸리고 있다면, LLDAP이 대안이  될 수 있습니다. 서론이 길었지만, LLDAP은 LDAP에서 가급적 최소한의 기능만을 제공하는 형태입니다. 그렇기 때문에 처음 구축 시 고려할 것이 거의 없고, 기본적으로 웹콘솔을 제공하기 때문에 계정을 구성하는 관리자나, 비밀번호를 관리하고자 하는 사용자 모두 편리하게 이용할 수 있습니다.

 

빠르게 구축하고 테스트를 하기 위해 docker-compose 예제를 공유하겠습니다.

version: '3'
services:
  lldap:
    image: lldap/lldap
    container_name: lldap
    restart: unless-stopped
    environment:
      - UID=0
      - GID=0
      - TZ=Asia/Seoul
      - LLDAP_JWT_SECRET=(임의의 문자)
      - LLDAP_KEY_SEED=(임의의 문자)
      - LLDAP_LDAP_BASE_DN=(사용할 DN. 예: dc=ldap,dc=example,dc=com)
    ports:
      - "17170:17170"
    volumes:
      - "data:/data"
volumes:
  data:
    driver: local

LLDAP에서 이용하는 보안을 위해 LLDAP_JWT_SECRET와 LLDAP_KEY_SEED를 충분히 긴 문자열로 만들어서 생성 시 제공합니다. 포트는 17070을 기본 웹콘솔 포트로 이용하기 때문에 외부에서 접속할 적절한 연결을 설정하면 됩니다. 내부에서 정보를 저장하는건 /data 디렉토리이므로 볼륨을 외부와 연결하기 위한 적당한 처리를 하면 됩니다. 추후 기본 설정은  /data/lldap_config.toml 에 존재하므로, 설정은 해당 파일을 변경하여 처리할 수 있습니다.

그리고 LLDAP_LDAP_BASE_DN이라는 값을 추가로 넣어줘야 합니다. LDAP을 이용할 때 가장 먼저 정해야 하는 것이 BASE_DN인데, 쉽게 말해 내가 설정할 정보의 기본 시작위치입니다. 구글을 접속할 때 google.com와 같이 FQDN 형태로 주소를 사용하는 것과 비슷한데, LDAP에서는 점(dot)으로 구분하지 않고 dc라는 것으로 구분한다고 생각하시면 됩니다. 즉, 위 예제에서 나오는 dc=ldap,dc=example,dc=com이라는 정보는 웹브라우져에서 입력하는 도메인 정보 기준으로는 ldap.example.com와 같은 것입니다. 반드시 설치될 서버의 도메인 정보와 일치할 필요는 없기 때문에 본인이 관리하기 편리하고 혼동을 일으키지 않을 정보로 입력하면 됩니다. 통상적으로 dc=example,dc=com와 같이 ROOT DN 형태로도 많이 사용하고, 예와 같이 dc=ldap을 추가해서 선언하는 경우도 있습니다. 하지만, 가급적 빈 값으로 두진 말아주세요.

그 외에도 LDAPS(LDAP 통신 시 보안 연결을 지원)를 설정하거나 외부의 다른 DBMS을 쓸 경우(기본은 docker 내에 포함된 SQLite) 설정을 추가할 수 있으므로, 공식 문서를 참고해주세요.

LLDAP 공식 사이트 : https://github.com/lldap/lldap

 

LDAP 웹콘솔

이렇게 docker-compose로 LLDAP을 실행한 뒤, 웹콘솔에 접근하면 다음과 같은 로그인 페이지를 볼 수 있습니다. 초기 관리자 아이디와 비밀번호는 admin/password입니다. 그리고 lldap_admin, lldap_password_manager, lldap_strict_readonly이라는 3개의 group이 기본 설정되어 있고 admin은 lldap_admin 그룹에 기본 포함되어 있습니다. 로그인 후 비밀번호는 바로 변경해주시길 바랍니다.

 

사용자의 부서에 맞게 group을 설정하고, 새로운 사용자를 추가한 뒤 group에 적절하게 배치해주세요. 사용자는 여러 group에 속할 수 있습니다.

 

Schema 메뉴들에서는 관리할 정보의 형태(Schema)를 관리할 수 있습니다. 이 정보들은 타 시스템에 전달될 수 있는 정보이기 때문에 필요한 정보가 있다면 User-defined attributes에 추가합니다. Hardcodeed attributes 항목들은 대부분의 LDAP을 지원하는 프로그램들이 주로 사용하는 변수 형태로 이루어져있기 때문에 가급적 저 값들을 잘 활용해주세요.

 

LDAP 연동

이제 타 시스템에서 LDAP와 연동하는 법을 알아보겠습니다. 크게 두 시스템을 보여드리겠습니다. 많이 사용하는 GitLab의 대안으로 매우 가볍고 기본 기능을 충실히 구현한 Gitea와 CI/CD로 많은 사랑을 받지만, 설정이 까다로운 Jenkins입니다.

매우 다행스럽게도, LLDAP 소스에는 유명한 시스템에 설정을 하기 위한 예제를 제공하고 있습니다. Giea, Jenkins 모두 있으므로, 예제를 참고하세요.

LLDAP 설정 예제 : https://github.com/lldap/lldap/tree/main/example_configs

 

Gitea

Gitea의 설치를 설명드리진 않겠습니다. 이미 설치된 Gitea의 관리자 권한이 있는 계정으로 로그인을 한 뒤 (한글 번역 기준) "사이트 관리 > Identity & Access > 인증 소스" 메뉴로 이동합니다. 그리고 "인증 소스 추가" 버튼을 선택하여 구축한 LDAP 정보를 입력해주면 됩니다. 자세한 정보는 아래의 Gitea 설정 예제를 따라해주세요.

Gitea 설정 예제 : https://github.com/lldap/lldap/blob/main/example_configs/gitea.md

주의할 것은 Map LDAP groups to Organization teams 항목입니다. 이게 무슨 의미인지 저도 잘 이해가 되지 않아 많은 시행착오를 겪었는데, 알고보니 LDAP의 group 정보(user는 여러 group을 가질 수 있다고 했습니다)를 Gitea의 조직(Organization)과 팀(Team)에 자동으로 등록해주는 기능입니다. 즉, LDAP의 계정으로 로그인 시 자동으로 Gitea의 계정으로 자동 등록이 되는데, 이 때 이미 만들어둔 그룹과 팀에 자동 등록이 되기 때문에 새로운 사람이 등록될 때에도 별도의 저장소 권한 설정 없이도 조직/팀에 정의된 권한 정보를 그대로 이용할 수 있다는 의미입니다. 그룹과 팀은 미리 만들어져 있어야 한다는 점만 유의하면 됩니다.

예를 들어, LLDAP이 기본으로 만들어준 lldap_strict_readonly이라는 group에 속한 사용자는 Gitea의 test_group 조직의 test_team에 자동으로 등록시키고 싶다면 다음과 같이 설정하면 됩니다. 물론 LLDAP group이 여러개이거나 여러 조직이나 팀에 한꺼번에 등록하고 싶다면 예제와 같이 Json 구조에 맞게 콤마(,)나 배열(array) 형태로 나열하면 됩니다.

{"cn=lldap_strict_readonly,ou=groups,dc=ldap,dc=example,dc=com":{"test_group": ["test_team"]}}

이렇게 생성된 유저를 조회하면 아래 이미지와 같이 "인증 소스"가 LDAP으로 인증된 계정이라고 표시됩니다. Gitea는 로컬 계정과 인증 소스를 통해 생성된 계정 모두 사용할 수 있습니다.

 

Jenkins

Jenkins도 Gitea와 유사합니다. 아래의 예제대로 입력하면 됩니다.

Jenkins 설정 예제 : https://github.com/lldap/lldap/blob/main/example_configs/jenkins.md

Jenkins에서 주의할 점은 예제에도 나오지만, 아래의 내용이라고 생각합니다.

Jenkins는 여러 인증 정보를 동시에 처리하지 않습니다. 그러므로, Jenkins에서 LDAP으로 로그인 정보를 변경할 때에는 반드시 "Apply" 버튼을 선택하여 설정 페이지를 벗어나지 않은 상태에서 "새 InPrivate 창" 혹은 "새 사생활 보호 창"과 같이 로그인이 연동되지 않은 브라우져를 열어 LDAP 계정으로 잘 접속되는지 테스트를 한 뒤, 확인이 된 후에 마무리해야 합니다. 당연히 관리자 역할을 할 LDAP 계정으로 로그인 한 뒤 전체 설정까지 무리없이 잘 접근이 되어야 합니다. Jenkins의 User(사용자)/Group(그룹) 권한 설정 방식은 매우 난해하므로 조심하세요.

Jenkins는 내장 계정에는 Group이라는 개념이 없습니다. 그래서 Group에 대한 설정을 하기 위해서는 Authentication 메뉴에서 Authorization 항목을 선택해야 합니다. 저는 프로젝트 별로 권한을 다 주길 원하기 때문에 "Project-based Matrix Authorization Strategy"를 이용해 권한을 부여합니다. 이 때 "Add user..."나 "Add group..."에서 검색 기능을 제공해주지 않기 때문에 권한을 부여할 LDAP의 user나 group 이름을 정확히 기입해야 합니다. 제대로 기입이 된다면, 표시 이름이 나타나기 때문에 이를 통해 검증을 할 수 있습니다.

 

마무리

돈 있는 곳이라면 당연히 LDAP을 이미 사용중일 수 있습니다. 하지만, 기반을 덜 갖춘 곳에서는 LDAP은 유용한 인증 정보를 제공할 수 있는 환경을 제공합니다. 이러한 인증을 제공하는 것을 Provider라고 하는데 oAuth, SAML, proxy-auth 등 많은 방식으로 SSO까지 제공해주는 시스템이 많지만, 모든 시스템에 다 적용이 가능한 Provider는 없다고 봐도 무방합니다. 그래서 LDAP으로 내부 사용자의 정보를 구축한 뒤 Provider에 연동하는 형태로도 구축을 많이 합니다. OpenLDAP은 오래된 기술이고, 그래서 자료도 많지 않고 문서들이나 그 구조가 모두 어렵습니다. 쉽게 LDAP을 구축하여 인증을 통일화한다면 사내 시스템 환경 정비에 많은 도움이 될 것입니다.

반응형

'Computer > Software' 카테고리의 다른 글

SoftEther VPN 분석  (0) 2019.09.17
무료 Hypervisor 3종 : Hyper-V, Proxmox VE, XCP-ng  (0) 2019.08.22
WinSSHTerm  (0) 2019.07.30
Adobe Acrobat Reader DC 에서 보호 모드 끄기  (0) 2019.07.11
무료 채팅 소프트웨어 검토  (2) 2019.06.25
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함