코알못

[ Zeppelin] 계정별로 권한을 설정해보자! 본문

BIG DATA

[ Zeppelin] 계정별로 권한을 설정해보자!

코린이s 2022. 3. 7. 22:05
728x90

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 로 접속하여 조회 안되는지 확인하면 아래 문구 뜨면서 조회 불가능 하다.

끝!

728x90
Comments