跳到主要内容

配置 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 可能找不到的主机的别名。通常包含三个主机就够了:
  1. 在 Kubernetes 集群外部运行 Ranger 的 MySQL 的主机;
  2. 在 Kubernetes 集群内部运行 HiveServer2 的主机;
  3. 在 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.requestsresources.limits 指定分配给 Ranger 容器和 Solr 容器的资源。
  • ports.containerPort 字段应与 ranger-service.yamltargetPort 字段指定的端口号匹配。
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-confranger-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_FLAVORSQL_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_userdb_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_useraudit_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 服务配置文件。

https://mr3docs.datamonad.com/assets/images/k8s/ranger.configure.png