코알못

[Redash] Ldap 연동 해보자! 본문

BIG DATA

[Redash] Ldap 연동 해보자!

코린이s 2022. 5. 8. 17:01
728x90

이전 시간에 [ldap 구성], [ldap 웹 페이지 연동] 하는 실습을 진행하였다.

이제 redash 라는 데이터 시각화 툴에도 ldap 연동하여 로그인하는 실습을 진행해본다.

[redash 설치] 와 [버전 업그레이드] 까지 완료 됐다는 가정하에 실습 진행한다.

버전 업그레이드를 하는 이유는 파이썬을 이용하여 ldap 라이브러리를 설치 하여야 하는데 v8 에서는 설치 되지 않기 때문이다.

redash 서버에 접속한다.

ldap연동을 위해서는 ldap3 라는 파이썬 라이브러리가 필요하여 ldap3 가 설치된 도커 이미지를 사용해야 한다.

그러므로 기존 도커 이미지인 v10 에서 ldap 3 라이브러리가 설치된 이미지를 이용할 것이다.

이를 위해 '/opt/redash' 디렉토리에서 Dockerfile 을 만든다.

$ cd /opt/redash
$ vi Dockerfile
FROM redash/redash:10.1.0.b50633
RUN pip install ldap3
:wq!

해당 파일을 읽어보면 아래와 같다.

$ cat Dockerfile
FROM redash/redash:10.1.0.b50633
RUN pip install ldap3

Dockerfile 이 있는 경로에서 아래 명령어를 호출하여 빌드하여 redash_ldap3 이미지를 생성한다.

$ sudo docker build -t redash_ldap3 .

오류 없이 success 메세지가 나왔다면 redash docker 'docker-compose.yml' 파일에서 image 명을 redash_ldap3 로 수정한다.

version: "2"
x-redash-service: &redash-service
  image: redash_ldap3:latest

 이제 빌드를 다시 하여 정상적으로 서비스 되는지 확인 한뒤 ctrl+c 를 눌러 나간다.

// stop 
sudo docker-compose stop server scheduler scheduled_worker adhoc_worker
// build
$ sudo docker-compose up --force-recreate --build

이제 env 파일을 수정하여 연동을 진행한다.

아래는 ldap, mail 설정 하기 위한 샘플 정보 이며

// ldap
REDASH_LDAP_ONLY_LOGIN=true // ldap 로그인만 허용할 것인가
REDASH_LDAP_LOGIN_ENABLED=true // ldap 로그인 사용할 것인가
REDASH_LDAP_URL=ldap://[LDAP IP]:[LDAP PORT]
REDASH_LDAP_BIND_DN=[BIND DN] // ldap 에 접근을 위한 dn (관리자 dn이 될 수 있다.)
REDASH_LDAP_BIND_DN_PASSWORD=[BIND PASSWORD] // 위 dn 에 해당하는 password
REDASH_LDAP_DISPLAY_NAME_KEY=[name attribute key] // 회원 아이디 표기를 위한 속성키
REDASH_LDAP_EMAIL_KEY=[mail attribute key] // 메일 정보 속성키
REDASH_LDAP_CUSTOM_USERNAME_PROMPT=[display id value] // iD 입력창에 표기할 문구
REDASH_LDAP_SEARCH_TEMPLATE=[userid search filter] // ID 찾기를 위한 필터
REDASH_LDAP_SEARCH_DN=[userid search dn] // ID 찾기를 위한 베이스 DN
REDASH_PASSWORD_LOGIN_ENABLED=false // ldap 과 같은 외부 연동 사용시 패스워드 로그인 비활성화 해야 한다는 가이드가 있어 false
// mail
REDASH_MAIL_SERVER=smtp.gmail.com
REDASH_MAIL_PORT=587
REDASH_MAIL_USE_TLS=true
REDASH_MAIL_USE_SSL=false
REDASH_MAIL_USERNAME=[gmail address]
REDASH_MAIL_PASSWORD=[gmail app password]
// host는 메일 template 작성시 필요
REDASH_HOST=http://[redash ip]
REDASH_MAIL_DEFAULT_SENDER=[gmail address]

아래는 예시 이다.

REDASH_LDAP_ONLY_LOGIN=true
REDASH_LDAP_LOGIN_ENABLED=true
REDASH_LDAP_URL=ldap://172.1.1.1:389
REDASH_LDAP_BIND_DN=test@corin.com
REDASH_LDAP_BIND_DN_PASSWORD=admin@1234
REDASH_LDAP_DISPLAY_NAME_KEY=sAMAccountName
REDASH_LDAP_EMAIL_KEY=userPrincipalName
REDASH_LDAP_CUSTOM_USERNAME_PROMPT=AM ID
REDASH_LDAP_SEARCH_TEMPLATE=(sAMAccountName=%(username)s)
REDASH_LDAP_SEARCH_DN=OU=pepole,DC=corin,DC=com
REDASH_PASSWORD_LOGIN_ENABLED=false
REDASH_MAIL_SERVER=smtp.gmail.com
REDASH_MAIL_PORT=587
REDASH_MAIL_USE_TLS=true
REDASH_MAIL_USE_SSL=false
REDASH_MAIL_USERNAME=test@gmail.com
REDASH_MAIL_PASSWORD=1234abcd
REDASH_HOST=http://172.1.1.1
REDASH_MAIL_DEFAULT_SENDER=test@gmail.com

저자가 설정한 값은 아래와 같다. (mail 설정은 '[Redash] 데이터 시각화 도구를 이용 해보자! - 경고 알람' 글을 참고한다.)

REDASH_LDAP_ONLY_LOGIN=true
REDASH_LDAP_LOGIN_ENABLED=true
REDASH_LDAP_URL=ldap://[공인 IP]:389
REDASH_LDAP_BIND_DN=cn=Manager,dc=corin,dc=com
REDASH_LDAP_BIND_DN_PASSWORD=admin@1234
REDASH_LDAP_DISPLAY_NAME_KEY=uid
REDASH_LDAP_EMAIL_KEY=mail
REDASH_LDAP_CUSTOM_USERNAME_PROMPT=AM ID
REDASH_LDAP_SEARCH_TEMPLATE=(uid=%(username)s)
REDASH_LDAP_SEARCH_DN=ou=people,dc=corin,dc=com
REDASH_PASSWORD_LOGIN_ENABLED=false

 

redash 처음 접속한 계정은 관리자 계정이 되고 관리자 계정 변경은 불가능하나 관리자 계정으로 다른 유저에게 admin 권한을 부여 할 수는 있는점 참고 바란다.(만약 ldap 연동전에 A 계정으로 로그인 했다면 A가 관리자)

설정을 완료 했다면 컨테이너를 시작하고 로그를 확인한다.

// 컨테이너 시작 
sudo docker-compose up -d
// 로그
sudo docker logs -f redash_server_1

 

이제 redash 주소를 입력하여 redash를 접속한다.

만약 ldap_only_login 설정이 false 라면 아래와 같은 화면이 노출되며

ldap_only_login 가 true 라면 아래와 같이 ldap 로그인만 가능하게 된다.

아래 화면은 관리자 계정으로 접속한 화면이며

 일반 유저 계정으로 접속시에는 아래와 같이 관리자만 수정 가능한 설정 메뉴가 없다. (datasource, general 메뉴가 없음)

끝!

<참고>

1. redash 서버에서 ldap 통신이 되지 않을시

- 원인 : ldap 서버가 로컬 pc 이며, 저자는 공유기를 사용하여 인터넷 이용중이라 공인 IP로 ldap 접속시 여러 사설 IP 중 ldap 이 설치된 PC 를 찾지 못해 발생한 이슈

- 해결 방안 : 포트 포워딩(공인 IP 의 특정 포트로 요청 왔을지 목적지 IP, 포트 지정 해줄 수 있음) 설정

우선 와이파이에 해당하는 설정 페이지에 접속한다.

저자의 경우 KT 와이파이 이므로 'http://172.30.1.254:8899/' 로 접속한다. (공유기 마다 다르므로 해당 링크에서 설정 URL 확인 하자!)

아래와 같이 입력하여 389로 왔을시 해당 PC의 사설 IP 를 입력하여 해당 사설 IP로 갈 수 있도록 설정 한다.



ldap 설정 변경은 안해도 되며 띄울때 아래와 같이 localhost 가 아닌 사설 IP 를 입력하여 띄운다.

$ sudo /usr/libexec/slapd -h ldap://[사설IP] -d 50

이제 로컬 PC 에서 공인 IP 로 389 입력시 해당 사설 IP 로 오는지 확인한다.

connected 되면서 연결 된것을 볼 수 있다.

$ telnet [공인IP] 389
Trying IP...
Connected to IP.
Escape character is '^]'.

이제 aws redash 서버 접속한다.

 $ ssh -i key.pem ubuntu@[IP]

redash 서버에서 ldap 접근이 정상적으로 되는지 확인하며, 안된다면 security group 이나 ACL 을 확인 한다. (로컬에서는 공인 IP 로 찾아졌으니 포트 포워딩에는 문제 없음을 확인 했으므로 aws 보안 이슈 확인 해본다.)

$ telnet [공인IP] 389
Trying IP...
Connected to IP.
Escape character is '^]'.

2. 'No entry associated with KerberosKDC' 에러

- 원인 : openldap 데이터베이스 bdb or hdb 사용시 database kerberos 인증 수단을 사용하는데 해당 설정이 되어 있지 않아 발생한 이슈

- 해결 방안 : kerberos 설정 or 사용 안하는 데이터베이스 ldif 사용

ldap_read: want=8 error=Resource temporarily unavailable
ber_dump: buf=0x7fc18c005c70 ptr=0x7fc18c005c73 end=0x7fc18c005ca1 len=46
  0000:  60 2c 02 01 03 04 23 75  69 64 3d 70 69 61 6e 6f   `,....#uid=piano
  0010:  2c 6f 75 3d 70 65 6f 70  6c 65 2c 64 63 3d 63 6f   ,ou=people,dc=co
  0020:  72 69 6e 2c 64 63 3d 63  6f 6d 80 02 71 31         rin,dc=com..q1
ber_dump: buf=0x7fc18c005c70 ptr=0x7fc18c005c9d end=0x7fc18c005ca1 len=4
  0000:  00 02 71 31                                        ..q1
6277611c odusers_copy_krbrealm: No entry associated with KerberosKDC cn=kerberoskdc,cn=config,dc=corin,dc=com

저자의 경우 사용안하는 데이터 베이스인 ldif 로 변경하려고 하며 변경전 이전에 생성한 데이터를 ldif 파일로 내보낸다.

 

필터를 전체로 하여 모든 클래스를 저장한다.

저장위치를 지정하고 finish 를 클릭한다.

저장된 것을 볼 수 있다.

slapd.conf 설정을 아래와 같이 변경한다.

- index : 주석

- database:  ldif 로 변경

- directory : 기존에 사용하던 디렉토리 비우거나 새 디렉토리 만들어 지정 

database        ldif
#maxsize                1073741824
suffix          "dc=corin,dc=com"
rootdn          "cn=Manager,dc=corin,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw          {SSHA}BY2BLO2l8i6j1AdjTPUCUqDtxkQG++lz
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory       /usr/local/var/corin.com.ldif
# Indices to maintain
#index  objectClass     eq

apachedirectoryStudio 로 기존 ldap 연결을 시도하면 아래와 같이 기존  데이터가 모두 사라진것을 볼 수 있다.

기존 데이터 저장한 ldif 파일을 불러온다.

해당 파일을 선택한뒤 finish 를 눌러 불러온다.

정상적으로 불러와졌음을 볼 수 있다.

설정한 database 디렉토리에 가보면 아래와 같이 생성 되었다.

$ cd /usr/local/var/corin.com.ldif
$ ls -all
total 8
drwxr-xr-x   4 admin  admin  128  5  8 15:52 .
drwxrwxr-x  12 admin  admin  384  5  8 15:36 ..
drwxr-x---   6 root        admin  192  5  8 15:52 dc=corin,dc=com
-rw-------   1 root        admin  437  5  8 15:52 dc=corin,dc=com.ldif
$ cd dc=corin,dc=com
$ ls
ou=groups	ou=groups.ldif	ou=people	ou=people.ldif
$ cd ou=people
$ ls
uid=corin.ldif	uid=piano.ldif

이제 ldap 다시 로그인 해보면 오류 발생 안하고 정상적으로 동작하는것을 볼 수 있다.

3. 실습 진행한 ldap 구성

DN class attributes
ou=groups,dc=corin,dc=com organizationalUnit ou=groups
cn=architectures,ou=groups,dc=corin,dc=com groupOfUniqueNames  cn=architectures
ou=architecture
uniqueMember=uid=corin,ou=people,dc=corin,dc=com
cn=developers,ou=groups,dc=corin,dc=com groupOfUniqueNames cn=developers
ou=developer
uniqueMember=uid=corin,ou=people,dc=corin,dc=com
uniqueMember=uid=piano,ou=people,dc=corin,dc=com
ou=people,dc=corin,dc=com organizationalUnit ou=people
uid=corin,ou=people,dc=corin,dc=com inetOrgPerson cn=yoolee
sn=hong
uid=corin
mail=[원하는 메일주소]
userPassword=[원하는 암호로 설정]
uid=piano,ou=people,dc=corin,dc=com inetOrgPerson cn=piano
sn=kim
uid=piano
mail=[원하는 메일주소]
userPassword=[원하는 암호로 설정]

// ldif 파일 (각 행 뒤에 공백 있으면 syntex 오류 발생 )

dn: dc=corin,dc=com
objectClass: dcObject
objectClass: organization
dc: corin
o: Example

dn: ou=groups,dc=corin,dc=com
objectClass: organizationalUnit
objectClass: top
ou: groups

dn: ou=people,dc=corin,dc=com
objectClass: organizationalUnit
objectClass: top
ou: people

dn: cn=architectures,ou=groups,dc=corin,dc=com
objectClass: groupOfUniqueNames
objectClass: top
cn: architectures
uniqueMember: uid=corin,ou=people,dc=corin,dc=com
ou: architecture

dn: cn=developers,ou=groups,dc=corin,dc=com
objectClass: groupOfUniqueNames
objectClass: top
cn: developers
uniqueMember: uid=corin,ou=people,dc=corin,dc=com
uniqueMember: uid=piano,ou=people,dc=corin,dc=com
ou: developer

dn: uid=corin,ou=people,dc=corin,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: yoolee
sn: hong
mail: test@gmail.com
uid: corin
userPassword:: e1NTSEF9N0c5Mnhab1k2K2pWUDVveTB2SUdHV3lja2ZVNG83NE1HdzBhbWc9P
 Q==

dn: uid=piano,ou=people,dc=corin,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: piano
sn: kim
mail: test@naver.com
uid: piano
userPassword:: YWRtaW5AMTIzNA==
728x90
Comments