Аутентификация Apache Shiro для Apache Zeppelin¶
- Обзор
- Настройка безопасности
- Группы и разрешения (опционально)
- Настройка Realm (опционально)
- Безопасность Cookie в сессиях Zeppelin (опционально)
- Защита информации Zeppelin (опционально)
- Альтернативные методы аутентификации
Обзор¶
Apache Shiro – это мощный и простой в использовании Java фреймворк безопасности, плозволяющий выполнить аутентификацию, авторизацию, криптографию и управление сессиями. В данном разделе объясняется, как Shiro работает для аутентификации на сервер Zeppelin.
При подключении к Apache Zeppelin необходимо ввести учетные данные. После входа в систему появляется доступ ко всем блокнотам, включая блокноты других пользователей.
Настройка безопасности¶
Настройка аутентификации на сервер Zeppelin осуществляется несколькими простыми шагами:
1. Права Shiro
По умолчанию в conf находится файл shiro.ini.template. Данный файл используется в качестве примера, и настоятельно рекомендуется создать файл shiro.ini, выполнив следующую команду:
cp conf/shiro.ini.template conf/shiro.ini
Дополнительная информация о формате файла shiro.ini находится по ссылке Shiro Configuration.
2. Безопасность канала Websocket
Для свойства zeppelin.anonymous.allowed необходимо установить значение false в conf/zeppelin-site.xml. В случае если данного файла нет, следует просто скопировать файл conf/zeppelin-site.xml.template в conf/zeppelin-site.xml.
3. Запуск Zeppelin
Для запуска Zeppelin необходимо выполнить команду:
bin/zeppelin-daemon.sh start (or restart)
После чего можно обратиться к Zeppelin по адресу http://localhost:8080.
4. Авторизация
Теперь можно войти в систему, используя комбинацию имени и пароля пользователя (Рис.8.).

Рис. 8. Авторизация в Apache Zeppelin
После пароля через запятую можно указать роли для каждого пользователя:
[users] admin = password1, admin user1 = password2, role1, role2 user2 = password3, role3 user3 = password4, role2
Группы и разрешения (опционально)¶
Для использования групп пользователей и прав для них необходимо применить одну из нижеприведенных конфигураций для LDAP или AD в разделе [main] в файле shiro.ini:
activeDirectoryRealm = org.apache.zeppelin.realm.ActiveDirectoryGroupRealm activeDirectoryRealm.systemUsername = userNameA activeDirectoryRealm.systemPassword = passwordA activeDirectoryRealm.searchBase = CN=Users,DC=SOME_GROUP,DC=COMPANY,DC=COM activeDirectoryRealm.url = ldap://ldap.test.com:389 activeDirectoryRealm.groupRolesMap = "CN=aGroupName,OU=groups,DC=SOME_GROUP,DC=COMPANY,DC=COM":"group1" activeDirectoryRealm.authorizationCachingEnabled = false activeDirectoryRealm.principalSuffix = @corp.company.net ldapRealm = org.apache.zeppelin.server.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
И определить роли/группы, которые необходимо иметь в системе, например:
[roles] admin = * hr = * finance = * group1 = *
Настройка Realm (опционально)¶
Realms отвечают за аутентификацию и авторизацию в Apache Zeppelin. По умолчанию Apache Zeppelin использует IniRealm (пользователи и группы настраиваются в файле conf/shiro.ini в разделах [user] и [group]). Также можно использовать Shiro Realms, такие как JndiLdapRealm, JdbcRealm или создать собственный. Подробная документация о Apache Shiro Realm представлена по ссылке.
Active Directory¶
activeDirectoryRealm = org.apache.zeppelin.realm.ActiveDirectoryGroupRealm activeDirectoryRealm.systemUsername = userNameA activeDirectoryRealm.systemPassword = passwordA activeDirectoryRealm.hadoopSecurityCredentialPath = jceks://file/user/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,OU=groups,DC=SOME_GROUP,DC=COMPANY,DC=COM":"group1" activeDirectoryRealm.authorizationCachingEnabled = false activeDirectoryRealm.principalSuffix = @corp.company.net
Кроме того, вместо указания systemPassword в виде текста в shiro.ini администратор может указать то же самое, что и в hadoop credential. Необходимо создать keystore-файл, используя командную строку hadoop credential, для этого hadoop должен быть прописан в classpath:
hadoop credential create activeDirectoryRealm.systempassword -provider jceks://file/user/zeppelin/conf/zeppelin.jceks
Далее следует изменить следующие значения в файле Shiro.ini и раскомментировать строку:
activeDirectoryRealm.hadoopSecurityCredentialPath = jceks://file/user/zeppelin/conf/zeppelin.jceks
LDAP¶
Для настройки LDAP Realm существует два способа. Проще использовать LdapGroupRealm. Однако, он менее гибкий при настройке соответствий между группами LDAP и пользователями, а также для авторизации групп пользователей. Далее приведен пример файла с соответствующими настройками:
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
Другим более гибким способом является использование LdapRealm. Он позволяет сопоставлять ldapgroups с ролями, а также допускает проверку подлинности на основе ролей/групп на сервере zeppelin. Пример конфигурации приведен ниже:
ldapRealm=org.apache.zeppelin.realm.LdapRealm ldapRealm.contextFactory.authenticationMechanism=simple ldapRealm.contextFactory.url=ldap://localhost:33389 ldapRealm.userDnTemplate=uid={0},ou=people,dc=hadoop,dc=apache,dc=org
Возможность задать параметр ldap paging. Размер по умолчанию - 100
ldapRealm.pagingSize = 200 ldapRealm.authorizationEnabled=true ldapRealm.contextFactory.systemAuthenticationMechanism=simple ldapRealm.searchBase=dc=hadoop,dc=apache,dc=org ldapRealm.userSearchBase = dc=hadoop,dc=apache,dc=org ldapRealm.groupSearchBase = ou=groups,dc=hadoop,dc=apache,dc=org ldapRealm.groupObjectClass=groupofnames
Возможность настройки параметра userSearchAttribute
ldapRealm.userSearchAttributeName = sAMAccountName ldapRealm.memberAttribute=member
Возврат имен пользователей из ldap в ниженем регистре для использования в AD
ldapRealm.userLowerCase = true
Возможность установить парметр searchScopes в одно из трех значений: subtree (по умолчанию), one или base
ldapRealm.userSearchScope = subtree; ldapRealm.groupSearchScope = subtree; ldapRealm.memberAttributeValueTemplate=cn={0},ou=people,dc=hadoop,dc=apache,dc=org ldapRealm.contextFactory.systemUsername=uid=guest,ou=people,dc=hadoop,dc=apache,dc=org ldapRealm.contextFactory.systemPassword=S{ALIAS=ldcSystemPassword}
Включение поддержки вложенных групп при помощи оператора LDAPMATCHINGRULEINCHAIN
ldapRealm.groupSearchEnableMatchingRuleInChain = true
Дополительная настройка соответствий между физическими группами и логическими ролями приложений
ldapRealm.rolesByGroup = LDNUSERS: userrole, NYKUSERS: userrole, HKGUSERS: userrole, GLOBALADMIN: adminrole
Дополнительный список ролей, которым разрешена аутентификация. В случае если список не представлен, всем ролям разрешается аутентификация (вход)
Данные изменения не влияют на специфические права url. Для url будут работать те права, котрые указаны в разделе [urls]
ldapRealm.allowedRolesForAuthentication = adminrole,userrole ldapRealm.permissionsByRole= userrole = :ToDoItemsJdo::, *:ToDoItem::*; adminrole = * securityManager.sessionManager = $sessionManager securityManager.realms = $ldapRealm ```
РАМ¶
Поддержка аутентификации с помощью PAM позволяет повторно использовать существующие модули аутентификации в узле, где запущен Zeppelin. В типичных системных модулях, например, sshd, passwd и других сервис настраивается в /etc/pam.d/. Можно повторно использовать один из этих сервисов или создать свой собственный для Zeppelin. Для активации аутентификации PAM требуется два параметра: 1 – realm: использование Shiro realm; 2 – service: настроенный в /etc/pam.d/ сервис. Название должно совпадать с именем файла в /etc/pam.d/.
[main] pamRealm=org.apache.zeppelin.realm.PamRealm pamRealm.service=sshd
ZeppelinHub¶
ZeppelinHub – это сервис, синхронизурующий блокноты Apache Zeppelin и обеспечивающий легкое взаимодействие с ними. Для подключения ZeppelinHub необходимо применить следующее изменение в conf/shiro.ini в разделе [main]:
### A sample for configuring ZeppelinHub Realm zeppelinHubRealm = org.apache.zeppelin.realm.ZeppelinHubRealm ## Url of ZeppelinHub zeppelinHubRealm.zeppelinhubUrl = https://www.zeppelinhub.com securityManager.realms = $zeppelinHubRealm
Important
ZeppelinHub не относится к проекту Apache Zeppelin
Безопасность Cookie в сессиях Zeppelin (опционально)¶
Zeppelin может быть настроен выставлением флага HttpOnly в настройка cookie для сессии. С такой конфигурацией cookie-файлы Zeppelin не могут быть доступны через скрипты на стороне клиента, тем самым предотвращая большинство атак типа Cross-Site scripting (XSS).
Чтобы включить безопасную поддержку файлов cookie через Shiro, необходимо добавить следующие строки в conf/shiro.ini в раздел [main], а затем задать sessionManager:
cookie = org.apache.shiro.web.servlet.SimpleCookie cookie.name = JSESSIONID cookie.secure = true cookie.httpOnly = true sessionManager.sessionIdCookie = $cookie
Защита информации Zeppelin (опционально)¶
По умолчанию любой пользователь, определенный в [users], может видеть информацию об интерпретаторах, учетных данных и настройках в Apache Zeppelin. В случае если данную информацию необходимо скрыть, поскольку Shiro обеспечивает защиту на уровне url, следует закомментировать или раскомментировать приведенные ниже строки в conf/shiro.ini:
[urls] /api/interpreter/** = authc, roles[admin] /api/configurations/** = authc, roles[admin] /api/credential/** = authc, roles[admin]
В таком случае информацию об интерпретаторах, учетных данных и настройках в Apache Zeppelin могут видеть только пользователи с ролью admin. При необходимости предоставления прав другим пользователям следует изменить роли в разделе [users].