제플린의 인증은 shiro.ini파일로 설정한다.
sudo cp /usr/local/zeppelin/conf/shiro.ini.template /usr/local/zeppelin/conf/shiro.ini
sudo vi /usr/local/zeppelin/conf/shiro.ini
sudo /usr/local/zeppelin/bin/zeppelin-daemon.sh restart
재시작후 웹페이지에서 제플린메인을 접속하면,
기존 anonymous계정으로 로그인과 인터프리터, 설정등 페이지에 접근이 불가능하다.
[ Shiro.ini Config ]
설정파일은 main, users, roles, urls와 같이 4파트로 나뉘는데
각 파트별 설정내용은 다음과 같다.
[main] :Realm과 같은 Security Managerd의 object와 properties가 정의
[users] : 사용자 계정과 관련된 properties가 정의
[roles] : 계정의 roles와 관련된 설정값
[urls] : URL 기반 보안에 사용
* Realm
사용자, 역할 및 권한과 같은 애플리케이션별 보안 데이터에 액세스할 수 있는 구성 요소다. Realmssms 애플리케이션별 데이터를 Shiro가 이해한 형식으로 변환하여 데이터 소스가 얼마나 많든, 애플리케이션별로 어떻게 존재하든 Shiro가 이해하기 쉬운 단일 프로그래밍 API를 제공할 수 있도록 한다.
Realms는 관계형 데이터베이스, LDAP 디렉토리, 파일 시스템 또는 기타 유사한 리소스와 같은 데이터 소스와 1 대 1의 상관관계를 가진다. Realms의 인터페이스의 구현은 데이터 소스별 API를 사용하여 JDBC, 파일 IO, 최대 절전 모드 또는 JPA와 같은 권한 부여 데이터(역할, 권한 등)의 Data Access API를 제공한다.
참조 : http://shiro.apache.org/realm.html
1. MAIN
Active Directory
activeDirectoryRealm = org.apache.zeppelin.realm.ActiveDirectoryGroupRealm
activeDirectoryRealm.systemUsername = userNameA
activeDirectoryRealm.systemPassword = passwordA
activeDirectoryRealm.hadoopSecurityCredentialPath = jceks://zeppelin/conf/zeppelin.jceks
activeDirectoryRealm.searchBase = CN=Users,DC=SOME_GROUP,DC=COMPANY,DC=COM
activeDirectoryRealm.url = ldap://ldap.test.com:389
activeDirectoryRealm.groupRolesMap = "CN=aGroupName,DC=COMPANY,DC=COM":"group1"
activeDirectoryRealm.authorizationCachingEnabled = false
activeDirectoryRealm.principalSuffix = @corp.company.net
LDAP
LDAP Realms를 구성하기 위해 가장 사용하기 쉬운 것은 LdapGroupRealm이다.
LDAP 그룹을 사용자에 매핑하고 사용자 그룹에 대한 권한 부여를 위한Realms 설정은 다음과 같다.
ldapRealm = org.apache.zeppelin.realm.LdapGroupRealm
# search base for ldap groups (only relevant for LdapGroupRealm):
ldapRealm.contextFactory.environment[ldap.searchBase] = dc=COMPANY,dc=COM
ldapRealm.contextFactory.url = ldap://ldap.test.com:389
ldapRealm.userDnTemplate = uid={0},ou=Users,dc=COMPANY,dc=COM
ldapRealm.contextFactory.authenticationMechanism = simple
PAM
PAM 인증 지원을 통해 제플린이 실행 중인 호스트에서 기존 인증 모듈을 재사용할 수 있다. 일반적인 시스템 모듈에서는 /etc/pam.d/에 따라 sshd, passwd 등의 서비스별로 구성된다. 이러한 서비스 중 하나를 재사용하거나 Zeppelin을 위해 자신만의 서비스를 만들 수 있다.
[main]
pamRealm=org.apache.zeppelin.realm.PamRealm
pamRealm.service=sshd
Secure Cookie for Zeppelin 세션
세션 쿠키에서 HttpOnly 플래그를 설정하도록 제플린을 구성할 수 있다. 이 구성으로 제플린 쿠키는 클라이언트 쪽 스크립트를 통해 액세스할 수 없으므로 대부분의 XSS(Cross-Site Scripting) 공격을 차단한다.
cookie = org.apache.shiro.web.servlet.SimpleCookie
cookie.name = JSESSIONID
cookie.secure = true
cookie.httpOnly = true
sessionManager.sessionIdCookie = $cookie
그 외에 ZeppelinHub, Knox SSo등의 Realm관련 설정을 할 수 있다.
참고 : https://zeppelin.apache.org/docs/0.8.0/setup/security/shiro_authentication.html#active-directory
2. USERS
Users 섹션에서는 정적 사용자 계정을 정의할 수 있다. 사용자 계정의 수가 매우 적거나 사용자 계정을 런타임에 동적으로 만들 필요가 없는 환경에서 유용하다.
위와 같이 설정포맷은 username = password, role1, role2 .... roleN 이다.
[users]
admin = 1234, admin
kail = pwd1, role1
jack = pwd2, role2, role3
users파트 암호를 일반 텍스트로 만들지 않으려면 해시 알고리즘(MD5, Sah1, Sah256 등)을 사용하여 암호화할 수 있다. 기본적으로 암호 문자열은 Hex 인코딩이며, Base64 인코딩으로도 구성할 수 있다.
3. ROLES
Roles파트의 예시는 아래와 같다.
[roles]
admin = *
hr = *
finance = *
group1 = *
4. URLS
기본적으로 user파트에 정의된 모든 사용자는 아파치 제플린의 인터프리터 설정, 인증 정보 및 구성 정보를 공유할 수 있다. 경우에 따라 사용 사례를 위해 이러한 정보페이지를 숨기고 싶을 수 있다.
Shiro는 URL 기반 보안을 제공하므로 conf/shiro.ini에서 아래 줄에 주석을 달거나 압축을 해제하여 정보를 숨길 수 있다.
변경전
[urls]
/api/interpreter/** = authc, roles[admin]
/api/configurations/** = authc, roles[admin]
/api/credential/** = authc, roles[admin]
변경후
[urls]
/api/interpreter/** = roles[admin]
/api/configurations/** = roles[admin]
/api/credential/** = roles[admin]
위와 같이 설정하면 admin roles가 아닌 모든 계정은 Interpreter, Configuration, Credential 페이지 접근이 불가하다.
[ zeppelin permission ]
각 노트마다 접근권한을 지정해주어 해당노트의 crontab이나 쿼리, 대쉬보드 추가 삭제 등 유저마다 노트에 대한 권한을 달리 줄 수 있다.
아래 이미지와 같이 우측상단의 자물쇠 그림을 눌러 설정한다.
예를 들어 user1이 Note1을 Read만하고 쿼리실행이나 다른 작업을 못하게 하려면 Owners설정은 admin, Reader는 user1으로 설정한다.( Writers랑 Runners는 자동으로 Owners설정값을 따른다.)
또한 다른유저 user2는 Readers권한도 없으므로 로그인해도 해당 Note1이 보이지 않는다.
Readers권한이 있는 User가 다른 권한접근시 알림 메세지가 나온다.
결과적으로 제플린의 인증과 접근권한은 Shiro.ini파일의 users, roles, urls파트 설정과 자물쇠버튼의 Permission설정으로 어느 정도 가능하다. 그러나 유저가 많아 파생되는 그룹이 커지고 동적 유저또한 필요하다면 Realms manager 설정또한 추가되야 할 것이다.