配置 Ranger
本页提供在 HivePlus 中使用 Ranger 进行授权的详细信息。在我们的示例中,我们假设使用 MySQL 数据库作为 Ranger。
我们建议用户尝试使用 Ranger 在 Kubernetes 上运行 HivePlus 的快速入门指南。
配置 Ranger Pod
以下文件配置 Ranger 的 Kubernetes 对象。
├── env.sh
└── yaml
├── ranger-service.yaml
└── ranger.yaml
env.sh
用户应在 env.sh 中设置以下环境变量。
vi env.shCREATE_RANGER_SECRET=true
CREATE_RANGER_SECRET指定是否从目录ranger-key中的密钥表文件创建 Secret。无论是否使用 Kerberos 进行身份验证,都应将其设置为 true(因为ranger-key/install.properties)。
ranger-service.yaml
此清单定义一个服务,用于将 Ranger 暴露到 Kubernetes 集群外部。用户应指定一个 IP 地址(带有有效主机名)和三个端口号,以便管理员从外部和 HiveServer2 从内部都可以使用主机名连接到它。通常无需更改三个 targetPort 字段(它们指定 Ranger Pod 内部的端口号)。
vi yaml/ranger-service.yaml
ports:
- name: ranger-admin-http
protocol: TCP
port: 6080
targetPort: 6080
- name: ranger-admin-https
protocol: TCP
port: 6182
targetPort: 6182
- name: solr
protocol: TCP
port: 6083
targetPort: 6083
externalIPs:
- 10.1.91.41
在我们的示例中,我们使用 10.1.91.41:6080 作为 Ranger 的 HTTP 地址,10.1.91.41:6182 作为 HTTPS 地址。另一个地址 10.1.91.41:6083 保留用于 Ranger 和 Solr 之间的内部通信。
ranger.yaml
此清单为运行 Ranger 定义一个 Pod。在内部,Pod 并行运行两个容器:一个用于 Ranger,另一个用于 Solr。用户应更新 spec.hostAliases 字段和 spec.containers 部分。
spec.hostAliases字段列出默认 DNS 可能找不到的主机的别名。通常包含三个主机就够了:
- 在 Kubernetes 集群外部运行 Ranger 的 MySQL 的主机;
- 在 Kubernetes 集群内部运行 HiveServer2 的主机;
- 在 Kubernetes 集群内部运行 Ranger 的主机。在我们的示例中,
red0是运行 Ranger 的 MySQL 的主机名,indigo20是分配给 HiveServer2 和 Ranger 的主机名。
vi yaml/ranger.yaml
hostAliases:
- ip: "10.1.91.4"
hostnames:
- "red0"
- ip: "10.1.91.41"
hostnames:
- "indigo20"
spec.containers部分中的image字段指定 Ranger 的 Docker 镜像。resources.requests和resources.limits指定分配给 Ranger 容器和 Solr 容器的资源。ports.containerPort字段应与ranger-service.yaml中targetPort字段指定的端口号匹配。
vi yaml/ranger.yaml
spec:
containers:
- image: mr3project/ranger:2.6.0
name: solr
resources:
requests:
cpu: 1
memory: 4Gi
limits:
cpu: 1
memory: 4Gi
ports:
- containerPort: 6083
protocol: TCP
- image: mr3project/ranger:2.6.0
name: ranger
resources:
requests:
cpu: 1
memory: 4Gi
limits:
cpu: 1
memory: 4Gi
ports:
- containerPort: 6080
protocol: TCP
- containerPort: 6182
protocol: TCP
配置 Ranger
两个目录 ranger-conf 和 ranger-key 包含 Ranger 的配置文件。
├── ranger-key
│ ├── install.properties
│ └── solr.in.sh
└── ranger-conf
├── core-site.xml
├── solr-core.properties
├── solr-elevate.xml
├── solr-log4j2.xml
├── solr-managed-schema
├── solr-security.json
├── solr-solrconfig.xml
├── solr-solr.xml
├── ranger-log4j.properties
├── ranger-admin-site.xml.append
└── krb5.conf
由于 Ranger 缺乏文档,强烈建议用户最初使用 MR3 发布版本中包含的配置文件以最少更改来运行 Ranger。 在让 Ranger 启动并运行后,用户可以逐步调整配置以满足特定需求。否则用户可能需要通过阅读 Ranger 的源代码来修复配置。
我们假设未启用 SSL。(在没有 Kerberos 的情况下运行 Ranger 时,不应启用 SSL。)在 ranger-key/solr.in.sh 中将 SOLR_SSL_ENABLED 设置为 false。
vi ranger-key/solr.in.sh
SOLR_SSL_ENABLED=false
Kerberos 密钥表文件(可选)
使用 Kerberos 身份验证时,我们建议用户创建三个具有以下名称的 Kerberos 密钥表文件。在我们的示例中,我们假设 indigo20 是分配给 Ranger 服务的 Service 的主机名,RED 是 Kerberos 领域。用户应将密钥表文件复制到目录 ranger-key。
rangeradmin.keytab具有管理服务主体rangeradmin/indigo20@RED。实例(例如indigo20)必须与 Ranger 的主机名匹配。spnego.service.keytab具有 SPNEGO 服务主体HTTP/indigo20@RED。服务名称必须是HTTP,实例(例如indigo20)必须与 Ranger 的主机名匹配。rangerlookup.keytab具有查找主体rangerlookup@RED。普通主体(没有实例)也可以使用。
install.properties
DB_FLAVOR和SQL_CONNECTOR_JAR应与数据库连接器 jar 文件匹配。
vi ranger-key/install.properties
DB_FLAVOR=MYSQL
SQL_CONNECTOR_JAR=/opt/mr3-run/lib/mysql-connector-java-8.0.28.jar
# for PostgreSQL:
# DB_FLAVOR=POSTGRES
# SQL_CONNECTOR_JAR=/opt/mr3-run/lib/postgresql-42.3.2.jar
# for MS SQL:
# DB_FLAVOR=MSSQL
# SQL_CONNECTOR_JAR=/opt/mr3-run/lib/mssql-jdbc-10.2.0.jre8.jar
使用 MySQL 服务器时,Ranger 会自动从 https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-8.0.28.tar.gz 下载 MySQL 连接器,SQL_CONNECTOR_JAR 可以按上述方式设置。
如果应使用自定义数据库连接器,用户可以将连接器 jar 文件复制到 PersistentVolume 的子目录中,并将 SQL_CONNECTOR_JAR 设置为指向该文件(例如 SQL_CONNECTOR_JAR=/opt/mr3-run/ranger/work-dir/lib/mysql-connector-java-8.0.12.jar)。这样,Ranger 可以使用用户提供的自定义数据库连接器。
db_root_user和db_root_password应设置为 MySQL for Ranger 的 root 用户的 ID 和密码。
vi ranger-key/install.properties
db_root_user=root
db_root_password=passwd
db_host应设置为 MySQL for Ranger 的 IP 地址或主机名。
vi ranger-key/install.properties
db_host=indigo0
db_password指定用户rangeradmin的密码。
vi ranger-key/install.properties
db_password=password
rangerAdmin_password指定 Ranger Admin UI 上用户 admin 的初始密码。
vi ranger-key/install.properties
rangerAdmin_password=rangeradmin1
RANGER_ADMIN_LOG_DIR指定日志目录。默认情况下,Ranger 使用挂载了 emptyDir 卷的本地目录。
vi ranger-key/install.properties
RANGER_ADMIN_LOG_DIR=/opt/mr3-run/ranger/work-local-dir/log/ranger-admin
- 设置变量
audit_solr_urls为配置键ranger.audit.solr.urls的地址。删除(不要只是设置为空)两个与审计身份验证相关的变量:audit_solr_user和audit_solr_password。
vi ranger-key/install.properties
audit_solr_urls=http://indigo20:6083/solr/ranger_audits
# audit_solr_user
# audit_solr_password
policymgr_external_url应设置为 Ranger admin URL。policymgr_http_enabled应设置为 true。
vi ranger-key/install.properties
policymgr_external_url=http://indigo20:6080
policymgr_http_enabled=true
- 使用 Kerberos 身份验证时,将以下变量设置为 Kerberos 主体。
vi ranger-key/install.properties
admin_principal=rangeradmin/indigo20@RED
spnego_principal=HTTP/indigo20@RED
lookup_principal=rangerlookup@RED
solr.in.sh
使用 Kerberos 身份验证时,环境变量 SOLR_AUTHENTICATION_OPTS 应使用运行 Ranger 的主机、SPNEGO 服务主体及其服务密钥表。
vi ranger-key/solr.in.sh
SOLR_AUTH_TYPE="kerberos"
SOLR_AUTHENTICATION_OPTS="\-Djava.security.krb5.conf=/opt/mr3-run/ranger/conf/krb5.conf \-Dsolr.kerberos.cookie.domain=indigo20 \-Dsolr.kerberos.principal=HTTP/indigo20@RED \-Dsolr.kerberos.keytab=/opt/mr3-run/ranger/key/spnego.service.keytab"
如果未使用 Kerberos,按如下方式设置。
vi ranger-key/solr.in.sh
SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:solrRocks"
core-site.xml
将配置键 hadoop.security.authentication 设置为 kerberos 以启用 Kerberos 身份验证。
vi ranger-conf/core-site.xml
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
将其设置为 simple 以禁用 Kerberos 身份验证。
vi ranger-conf/core-site.xml
<property>
<name>hadoop.security.authentication</name>
<value>simple</value>
</property>
solr-security.json
此文件设置 Solr 中的身份验证和授权配置。使用 Kerberos 身份验证时,user-role 部分应指定 HiveServer2 的服务主体和 Ranger 的管理服务主体。
vi ranger-conf/solr-security.json
"authentication": {
"class": "org.apache.solr.security.KerberosPlugin"
},
"authorization": {
...
"user-role": {
"hive/indigo20@RED": "updater",
"rangeradmin/indigo20@RED": "reader",
}
}
如果未使用 Kerberos,按如下方式设置。
vi ranger-conf/solr-security.json
{
"authentication": {
"blockUnknown": false,
"class": "solr.BasicAuthPlugin",
"credentials":{
"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="
}
},
"authorization": {
"class": "solr.RuleBasedAuthorizationPlugin"
}
}
由于 authentication/blockUnknown 设置为 false,Solr 接受没有凭证的审计请求。(Ranger 不使用对应于用户 solr 和密码 solrRocks 的凭证。)
ranger-admin-site.xml.append
使用 Kerberos 身份验证时,将配置键 xasecure.audit.jaas.Client.option.principal 设置为管理服务主体。
vi ranger-conf/ranger-admin-site.xml.append
<property>
<name>xasecure.audit.jaas.Client.option.principal</name>
<value>rangeradmin/indigo20@RED</value>
</property>
如果未使用 Kerberos,清除内容,只保留最后一行。
vi ranger-conf/ranger-admin-site.xml.append</configuration>
krb5.conf
使用 Kerberos 身份验证时,此文件应包含 Kerberos 配置的信息。通常使用 conf/krb5.conf 的副本就够了。
重新配置 HiveServer2
为了使用 Ranger,应重新配置 HiveServer2 以便与 Ranger 通信。
yaml/hive.yaml
spec.hostAliases 字段应包含在 Kubernetes 集群内部运行 Ranger 的主机。
conf/hive-site.xml
应设置以下配置键。
vi conf/hive-site.xml
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactory</value>
</property>
conf/ranger-hive-audit.xml
配置键 xasecure.audit.destination.solr.urls 应使用分配给 Ranger 的主机名。
vi conf/ranger-hive-audit.xml
<property>
<name>xasecure.audit.destination.solr.urls</name>
<value>http://indigo20:6083/solr/ranger_audits</value>
</property>
conf/ranger-hive-security.xml
配置键 ranger.plugin.hive.policy.rest.url 应使用分配给 Ranger 的主机名。需要注意的是,端口号应匹配 yaml/ranger-service.yaml 中的 port 字段,而不是 targetPort,因为 HiveServer2 通过将 Ranger 暴露到 Kubernetes 集群外部的 Service 进行连接。
vi conf/ranger-hive-security.xml
<property>
<name>ranger.plugin.hive.policy.rest.url</name>
<value>http://indigo20:6080</value>
</property>
配置键 ranger.plugin.hive.service.name 应使用 HiveServer2 的 Ranger 服务。
vi conf/ranger-hive-security.xml
<property>
<name>ranger.plugin.hive.service.name</name>
<value>INDIGO_hive</value>
</property>
创建 Ranger 服务
启动 Ranger 后,连接到 Ranger 网页并创建在 kubernetes/conf/ranger-hive-security.xml 中指定的 Ranger 服务。然后填写 JDBC URL(例如 jdbc:hive2://indigo20:9852/;principal=hive/indigo20@RED;)并将 policy.download.auth.users 设置为用户 hive,或 HiveServer2 的所有者。这样,Ranger 可以检查 HiveServer2 管理的元数据(例如数据库、表、用户),同时 HiveServer2 可以检索其 Ranger 服务配置文件。
