일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 레디스
- Docker
- login
- 머신러닝
- EMR
- SpringBoot
- Kafka
- 간단
- 로그인
- config
- redash
- aws
- 설정
- Cluster
- 예제
- fastcampus
- Redis
- 자동
- 클러스터
- java
- vue
- Jenkins
- hive
- 자바
- Mac
- ec2
- Zeppelin
- spring
- gradle
- 젠킨스
- Today
- Total
코알못
[ Zeppelin] 계정별로 권한을 설정해보자! 본문
Zeppelin 의 경우 Apache Shiro를 사용하여 인증, 권한 관리 등 보안 관련 부분을 관리한다.
아래 세가지 실습을 진행하도록 한다.
1. 노트별 실행, 읽기, 쓰기 권한 설정
2. URL 별 권한 설정
3. interpreter별 권한 설정 (interpreter가 DB 일시 데이터베이스별 권한 설정 가능하다)
우선 실습을 진행하기 앞서 처음 설치시 로그인 기능이 없으며 비로그인상태로 이용하도록 되어있어서 이 부분을 수정하도록 한다.
'zeppelin.anonymous.allowed' 를 'false' 로 설정하여 비로그인자가 접속 못하도록 한다.
$ ssh -i key.pem hadoop@ip
$ cd /etc/zeppelin/conf
$ sudo vi zeppelin-site.xml
<property>
<name>zeppelin.anonymous.allowed</name>
<value>false</value>
</property>
:wq!
이제 로그인을 해야 이용할 수 있게 되는데 로그인할 유저를 shiro.ini 파일에 정의 해야 한다.
Shiro 설정 파일의 경우 없다면 template 파일로 복사하여 만든다.
설정은 'ID = PW, 권한...' 형식으로 입력한다.
roles 부분에 '*' 로 설정하라고 공식문서에 가이드 되어 있어 설정 했으며, 이외에 어떤 설정도 가능한지 알아보기 위해 구글링 해보았으나 찾을수 없었다. 이 부분은 추후 더 찾아보기로 한다. (현재 실습에는 문제 없으므로 넘어간다.)
$ sudo cp shiro.ini.template shiro.ini
$ sudo vi shiro.ini
[users]
admin = admin, admin
user1 = 1234, role_test_writer
user2 = 1234, role_test_runner
user3 = 1234, role_test_reader
user4 = 1234, default
[roles]
role_test_writer = *
role_test_runner = *
role_test_reader = *
default = *
admin = *
:wq!
설정을 완료 하였으면 Zeppelin을 재기동 한다.
$ sudo systemctl --type=service | grep 'zeppelin'
zeppelin.service loaded active running Zeppelin
$ sudo systemctl stop zeppelin.service
$ sudo systemctl status zeppelin.service
● zeppelin.service - Zeppelin
Loaded: loaded (/etc/systemd/system/zeppelin.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 월 2022-03-07 05:46:24 UTC; 20s ago
Main PID: 32582 (code=exited, status=143)
$ sudo systemctl start zeppelin.service
$ sudo systemctl status zeppelin.service
● zeppelin.service - Zeppelin
Loaded: loaded (/etc/systemd/system/zeppelin.service; enabled; vendor preset: disabled)
Active: active (running) since 월 2022-03-07 05:46:59 UTC; 6s ago
재기동 완료후 Zeppelin 접속시
기존에는 anonymous로 접속 되어있고 다른 계정으로 로그인할 수 없었으나
아래와 같이 로그인 버튼이 생성된것을 볼 수 있다.
설정에 입력한 ID/PW 를 입력한다.
우선 '1. 노트별 실행, 읽기, 쓰기 권한 설정' 실습을 진행한다.
기존에 생성한 노트에 접속한뒤 오른쪽 상단에 잠금 버튼을 누른다.
아래와 같은 설정 창이 뜨며 읽기, 쓰기, 실행 권한을 설정 할 수 있으며 유저나 role 을 선택하여 권한 지정이 가능하다.
owners : 권한 변경, 읽기, 실행, 쓰기 가능
writers : 읽기, 실행, 쓰기 가능
runners : 읽기, 실행 가능
readers : 읽기만 가능
정의되지 않은 권한 및 유저일시 select box 에 뜨지 않으니 설정시 참고한다.
테스트를 위해 사진과 같이 지정한다.
완료시 아래와 같은 알람창이 뜬다.
테스트 예상 결과는 아래와 같으며 테스트를 진행 하면서 확인하며 결론부터 말하자면 모두 정상적으로 적용 된다.
- user1(=role_test_writer) : write (o), excute (o), read (o)
- user2(=role_test_runner) : write (x), excute (o), read (o)
- user3(=role_test_reader) : write (x), excute (x), read (o)
우선 user1 부터 로그인 하여 테스트 진행하며, 모두 정상적으로 작업 가능 하였다.
1. write : hi 문구 출력하는 단락 추가
2. read : 노트 접근 가능
3. excute : 해당 노트 정상적으로 실행 됨
그 다음 user2 테스트 진행 하면 write 가 안되는것을 볼 수 있다.
1. write : 쓰기 버튼이 사라짐
2. read : 노트 접근 가능
3. excute : 해당 노트 정상적으로 실행 됨
user3 테스트 진행하면 쓰기가 안되며, 실행 또한 안된다.
1. write : 쓰기 버튼이 사라짐
2. read : 노트 접근 가능
3. excute : 권한 필요 문구 노출
user4 테스트 진행하면 아예 노트에 접근 할 수 없다.
1. write : 노트 접근 불가능하여 쓰기도 불가능
2. read : 노트 접근 불가능
3. excute : 노트 접근 불가능하여 실행도 불가능
노트 안에서 기능별 권한 설정 하는 방법을 알아 봤으며 이제 '2. URL 별 권한 설정' 을 진행해본다.
설정 값은 아래 참고하여 설정한다.
설정 | |
anon | 익명의 엑세스 허용 |
authc | 로그인 보안 형성 (비로그인자 접근 불가) |
authc, roles[권한명, ..] | 해당 권한명을 보유한자만 허용 |
만약 zeppelin 설정 화면을 admin, default 권한 보유자만 볼수 있도록 하려면 아래와 같이 설정 한다.
[urls]
/api/configurations/** = authc, roles[admin, default]
테스트를 진행해보면 아래와 같이 default 권한이 있거나 admin 권한 보유자의 경우 정상적으로 조회 되고
그외 유저는 permission 오류가 발생한다.
익명의 사용자도 접속 가능하도록 하기 위해서는 anon 으로 설정하면 된다.
[urls]
/api/configurations/** = anon
익명의 사용자도 허용하기에 user4로 로그인후 접속해도 설정 정보 정상적으로 보인다.
브라우저에 '/api/configurations' 호출하여 비 로그인 상태의 테스트 진행 하려고 하였으나
해당 URL 은 비로그인 상태로 접근 불가능한 URL 이라 비로그인 상태로 호출시 메인으로 랜딩 되어 테스트 할 수 없었다.
그래서 비로그인 상태서 호출할 수 있는 URL로 테스트한다.
[urls]
/api/version = anon
비로그인 상태로 호출하면 정상적으로 아래처럼 정보를 확인 할 수 있다.
권한 상관없이 로그인만 체크하려면 authc로 설정하면 된다.
[urls]
/api/version = authc
authc 설정시 로그인이 필수이기에 302(redirection) code 리턴하면서 login 페이지로 이동되는것을 볼 수 있다.
그러나 login URL을 get 방식으로 호출하는데 get 호출에 대해 Zeppelin에서 처리하는 로직이 없어서 에러 발생한다. (버그)
로그인 하여 호출하면 정상적으로 아래처럼 정보를 확인 할 수 있다.
그러나 'zeppelin.anonymous.allowed' 를 'false' 설정시에 노트 접근이나 필요한 설정 부분은 모두 기본적으로 로그인이 필요하기에 anon, authc 설정은 따로 안해줘도 될 것 같으며 URL 별 권한 설정이 필요할시 그때 추가로 설정 하면 될 것 같다.
URL 권한 설정의 경우 권한 명이 아닌 유저명으로 설정하고 싶다면 아래와 같이 main에 정의후 설정 가능하다.
[main]
anyofrolesuser = org.apache.zeppelin.utils.AnyOfRolesUserAuthorizationFilter
[urls]
/api/interpreter/** = authc, anyofrolesuser[admin, user3]
user3 의 경우 설정한대로 interpreter 정상적으로 접근 된다.
user1 의 경우 설정한대로 permission 에러 발생하며 접근이 불가능 하다.
이제 '3. interpreter 별 권한 설정' 을 진행해본다.
우선 role_spark 권한을 만들고 user1에 해당 권한을 부여한다.
[users]
admin = admin, admin
user1 = 1234, role_test_writer, role_spark
user2 = 1234, role_test_writer
user3 = 1234, role_test_reader
user4 = 1234, default
[roles]
...
role_spark = *
재기동후 zeppelin 에 접속한다.
$ sudo systemctl stop zeppelin.service
$ sudo systemctl start zeppelin.service
admin 으로 로그인한뒤 interpreter을 클릭한다.
spark 에 권한을 설정하기 위해 아래 edit 를 누르고 'set permission' 을 누른다.
admin, role_spark 를 선택하고
save 버튼을 눌러 저장한다.
user1 유저로 노트로 가서 해당 interpreter 를 사용해본다.
정상적으로 스파크 데이터가 조회된다.
이제 user2 로 접속하여 조회 안되는지 확인하면 아래 문구 뜨면서 조회 불가능 하다.
끝!
'BIG DATA' 카테고리의 다른 글
[AWS] RedShift 이용해보자! (2) | 2022.03.28 |
---|---|
[AWS] Kafka connector 분산 처리 (2) | 2022.03.09 |
[ Zeppelin] 스케쥴링 기능을 이용해보자! (0) | 2022.03.07 |
[Zeppelin] 설치 하고 이용해보자! (0) | 2022.03.07 |
[Redash] 데이터 시각화 도구를 이용 해보자! - 다른 저장소 결과간 데이터 조인 (2) | 2022.02.27 |