安全

安全详情

师成师成· 更新于 2026-09-28· 阅读 23 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Apache Atlas 的安全特性

概述

以下特性可用于增强平台的安全性:

  • SSL
  • 服务认证
  • 基于 SPNEGO 的 HTTP 认证

SSL

系统同时支持 SSL 单向(服务器认证)和双向(服务器与客户端认证)模式。以下应用属性(在 atlas-application.properties 文件中配置的属性)可用于配置 SSL:

  • atlas.enableTLS(false|true)[默认值:false] - 启用/禁用 SSL 监听器
  • keystore.file - 服务器所使用的密钥库文件路径。该文件包含服务器证书。
  • truststore.file - 信任库文件的路径。该文件包含其他受信任实体的证书(例如在启用双向 SSL 时客户端进程的证书)。在大多数情况下,该属性可以设置为与 keystore.file 属性相同的值(特别是在启用单向 SSL 时)。
  • client.auth.enabled(false|true)[默认值:false] - 启用/禁用客户端认证。如果启用,客户端必须在传输会话密钥创建过程中向服务器进行身份验证(即双向 SSL 生效)。
  • cert.stores.credential.provider.path - 凭据提供程序存储文件的路径。密钥库、信任库和服务器证书的口令都保存在这个安全文件中。可以使用 bin 目录中的 cputil 脚本(见下文)来将所需的口令写入该文件。
  • atlas.ssl.exclude.cipher.suites - 要排除的密码套件列表 - NULL.,.RC4.,.MD5.,.DES.,.DSS. 是默认被排除的弱密码套件且不安全。如果还需要排除其他密码套件,请将该属性设置为包含默认密码套件的形式,即 atlas.ssl.exclude.cipher.suites=.*NULL.*, .*RC4.*, .*MD5.*, .*DES.*, .*DSS.,然后以逗号作为分隔符将额外的密码套件追加到列表中。可以使用密码套件的完整名称或正则表达式来添加。atlas.ssl.exclude.cipher.suites 属性中列出的密码套件将优先于默认密码套件生效。为了安全起见,建议保留默认密码套件,同时再添加需要额外排除的密码套件。

凭据提供程序实用脚本

为了防止使用明文口令,Atlas 平台采用了凭据提供程序机制来安全地存储口令(有关该机制的更多信息,请参阅 Hadoop 凭据命令参考)。bin 目录中的 cputil 脚本可用于创建所需的口令存储。

为 Atlas 创建凭据提供程序:

  • 进入 bin 目录

  • 执行 ./cputil.py

  • 输入生成的凭据提供程序的路径。路径的格式为:

  • jceks://file/local/file/path/file.jceks 或 jceks://hdfs@namenodehost:port/path/in/hdfs/to/file.jceks。这些文件通常使用 ".jceks" 扩展名(例如 test.jceks)

  • 输入密钥库、信任库和服务器密钥的密码(这些密码必须与实际创建相关证书存储文件时所使用的密码一致)。

凭据提供程序将被生成并保存到所提供的路径。

服务认证

Atlas 平台在启动时会关联到一个经过认证的身份。在默认的非安全环境中,该身份与启动服务器的操作系统认证用户相同。然而,在使用 Kerberos 的安全集群中,最佳实践是配置 keytab 和 principal,以便平台能够向 KDC 进行认证。这使得该服务随后能够与其他安全集群服务(例如 HDFS)进行交互。

用于配置服务认证的属性如下:

  • atlas.authentication.method(simple|kerberos)[默认值:simple] — 要使用的认证方法。simple 将利用操作系统认证的身份,是默认机制。'kerberos' 表示服务需要利用所配置的 keytab 和 principal 向 KDC 进行认证。
  • atlas.authentication.keytab — keytab 文件的路径。
  • atlas.authentication.principal — 用于向 KDC 进行认证的 principal。principal 通常采用 "user/host@realm" 的形式。对于主机名可以使用 '_HOST' 令牌,运行时会将其替换为本地主机名(例如 "Atlas/_HOST@EXAMPLE.COM")。

注意,当在安全集群中将 Atlas 配置为以 HBase 作为存储后端时,图数据库(JanusGraph)需要足够的用户权限才能创建和访问 HBase 表。如需授予相应权限,请参阅 Graph persistence engine - Hbase。

JAAS 配置

在安全集群中,Atlas 交互的部分组件(例如 Kafka)要求 Atlas 使用 JAAS 对其进行自身认证。以下属性用于设置相应的 JAAS 配置。

  • atlas.jaas.client-id.loginModuleName — 该组件所使用的认证方法(例如 com.sun.security.auth.module.Krb5LoginModule)
  • atlas.jaas.client-id.loginModuleControlFlag(required|requisite|sufficient|optional)[默认值:required]
  • atlas.jaas.client-id.option.useKeyTab(true|false)
  • atlas.jaas.client-id.option.storeKey(true | false)
  • atlas.jaas.client-id.option.serviceName — 服务器组件的服务名称
  • atlas.jaas.client-id.option.keyTab = <atlas keytab>
  • atlas.jaas.client-id.option.principal = <atlas principal>

例如,jaas-application.properties 文件中的以下属性设置

atlas.jaas.KafkaClient.loginModuleName = com.sun.security.auth.module.Krb5LoginModule
atlas.jaas.KafkaClient.loginModuleControlFlag = required
atlas.jaas.KafkaClient.option.useKeyTab = true
atlas.jaas.KafkaClient.option.storeKey = true
atlas.jaas.KafkaClient.option.serviceName = kafka
atlas.jaas.KafkaClient.option.keyTab = /etc/security/keytabs/kafka_client.keytab
atlas.jaas.KafkaClient.option.principal = kafka-client-1@EXAMPLE.COM
atlas.jaas.MyClient.0.loginModuleName = com.sun.security.auth.module.Krb5LoginModule
atlas.jaas.MyClient.0.loginModuleControlFlag = required
atlas.jaas.MyClient.0.option.useKeyTab = true
atlas.jaas.MyClient.0.option.storeKey = true
atlas.jaas.MyClient.0.option.serviceName = kafka
atlas.jaas.MyClient.0.option.keyTab = /etc/security/keytabs/kafka_client.keytab
atlas.jaas.MyClient.0.option.principal = kafka-client-1@EXAMPLE.COM
atlas.jaas.MyClient.1.loginModuleName = com.sun.security.auth.module.Krb5LoginModule
atlas.jaas.MyClient.1.loginModuleControlFlag = optional
atlas.jaas.MyClient.1.option.useKeyTab = true
atlas.jaas.MyClient.1.option.storeKey = true
atlas.jaas.MyClient.1.option.serviceName = kafka
atlas.jaas.MyClient.1.option.keyTab = /etc/security/keytabs/kafka_client.keytab
atlas.jaas.MyClient.1.option.principal = kafka-client-1@EXAMPLE.COM

将设置与以下 jaas.conf 文件条目等效的 JAAS 配置。

KafkaClient {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   serviceName=kafka
   keyTab="/etc/security/keytabs/kafka_client.keytab"
   principal="kafka-client-1@EXAMPLE.COM";
};
MyClient {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   serviceName=kafka keyTab="/etc/security/keytabs/kafka_client.keytab"
   principal="kafka-client-1@EXAMPLE.COM";
};
MyClient {
   com.sun.security.auth.module.Krb5LoginModule optional
   useKeyTab=true
   storeKey=true
   serviceName=kafka
   keyTab="/etc/security/keytabs/kafka_client.keytab"
   principal="kafka-client-1@EXAMPLE.COM";
};

基于 SPNEGO 的 HTTP 认证

通过启用平台的 SPNEGO 支持,可以保护对 Atlas 平台的 HTTP 访问。目前支持两种认证机制:

  • simple — 通过提供的用户名进行认证
  • kerberos — 利用 KDC 对客户端认证的身份来向服务器进行认证

Kerberos 支持要求访问服务器的客户端先向 KDC 进行认证(通常通过 kinit 命令完成)。认证完成后,用户即可访问服务器(认证后的身份将通过 SPNEGO 协商机制与服务器建立关联)。

配置 SPNEGO 支持的属性如下:

  • atlas.http.authentication.enabled(true|false)[默认值:false] — 该属性用于指示是否启用 HTTP 认证
  • atlas.http.authentication.type(simple|kerberos)[默认值:simple] — 认证类型
  • atlas.http.authentication.kerberos.principal — Web 应用的 Kerberos 主体名称。Kerberos 主体名称必须以 "HTTP/..." 开头,例如:"HTTP/localhost@LOCALHOST"。该属性没有默认值。
  • atlas.http.authentication.kerberos.keytab — 包含该 Kerberos 主体凭据的 keytab 文件的路径。
  • atlas.rest.address — <http/https>://<atlas-fqdn>:<atlas port>

有关 HTTP 认证机制的详细说明,请参阅 Hadoop Auth, Java HTTP SPNEGO 2.6.0 - Server Side Configuration。在 Atlas 认证实现中,该文档中引用的前缀为 "atlas.http.authentication"。

客户端安全配置

在使用 Atlas 客户端代码与配置了 SSL 传输和/或 Kerberos 认证的 Atlas 服务器通信时,需要提供 Atlas 客户端配置文件,其中包含用于与服务器通信或向服务器认证的安全属性。

请使用适当的设置更新 atlas-application.properties 文件(参见下文),并将其复制到客户端的类路径中,或复制到 "atlas.conf" 系统属性指定的目录中。

用于 SSL 通信的客户端属性如下:

  • atlas.enableTLS(false|true)[默认值:false] — 启用/禁用 SSL 客户端通信基础设施。
  • keystore.file — 客户端使用的密钥库文件的路径。仅当服务器启用了双向 SSL 时才需要此文件,其中包含客户端证书。
  • truststore.file — 信任库文件的路径。该文件包含受信任实体的证书(例如服务器的证书或共享的证书颁发机构的证书)。无论是单向 SSL 还是双向 SSL,都需要此文件。
  • cert.stores.credential.provider.path — 凭据提供程序存储文件的路径。密钥库、信任库和客户端证书的密码都保存在这个安全文件中。

用于向服务器进行身份验证的属性(如果启用了身份验证):

  • atlas.http.authentication.type(simple|kerberos)[默认:simple] - 身份验证类型

SOLR Kerberos 配置

如果指定的身份验证类型为 'kerberos',则会访问 Kerberos 票据缓存来向服务器进行身份验证(因此,客户端需要先使用 'kinit' 或类似机制向 KDC 进行身份验证,然后再与服务器通信)。

参见 Apache SOLR Kerberos 配置。

  • 添加主体并为 Solr 生成 keytab 文件。为运行 Solr 的每台主机创建各自的 keytab,并在主体名称中使用主机名(例如 addprinc -randkey solr/${HOST1}@EXAMPLE.COM,请将 ${HOST1} 替换为实际的主机名)。
kadmin.local
kadmin.local:  addprinc -randkey solr/<hostname>@EXAMPLE.COM
kadmin.local:  xst -k solr.keytab solr/<hostname>@EXAMPLE.COM
kadmin.local:  quit
  • 添加主体(principal)并生成用于对 HTTP 请求进行认证的 keytab 文件。(注意:如果使用 Ambari 对集群进行 Kerberize,可以使用 keytab 文件 /etc/security/keytabs/spnego.service.keytab)
kadmin.local
kadmin.local:  addprinc -randkey HTTP/<hostname>@EXAMPLE.COM
kadmin.local:  xst -k HTTP.keytab HTTP/<hostname>@EXAMPLE.COM
kadmin.local:  quit
  • 将 keytab 文件复制到所有运行 Solr 的主机上。
cp solr.keytab /etc/security/keytabs/
chmod 400 /etc/security/keytabs/solr.keytab
cp HTTP.keytab /etc/security/keytabs/
chmod 400 /etc/security/keytabs/HTTP.keytab
  • 在 Zookeeper 中创建路径,用于存储 Solr 配置及其他参数。
$SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -zkhost $ZK_HOST:2181 -cmd makepath solr
  • 将配置上传到 Zookeeper。
$SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -cmd upconfig  -zkhost $ZK_HOST:2181/solr -confname basic_configs -confdir $SOLR_INSTALL_HOME/server/solr/configsets/_default/conf
  • 创建 JAAS 配置。
vi /etc/solr/conf/solr_jaas.conf
Client {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/etc/security/keytabs/solr.keytab"
  storeKey=true
  useTicketCache=true
  debug=true
  principal="solr/<hostname>@EXAMPLE.COM";
};
  • 将 /etc/solr/conf/solr\_jaas.conf 复制到所有运行 Solr 的主机上。
  • 编辑 $SOLR\_INSTALL\_HOME/bin/ 目录下的 solr.in.sh 文件。
vi $SOLR_INSTALL_HOME/bin/solr.in.sh
SOLR_JAAS_FILE=/etc/solr/conf/solr_jaas.conf
SOLR_HOST='hostname -f'
ZK_HOST="$ZK_HOST1:2181,$ZK_HOST2:2181,$ZK_HOST3:2181/solr"
KERBEROS_REALM="EXAMPLE.COM"
SOLR_KEYTAB=/etc/solr/conf/solr.keytab
SOLR_KERB_PRINCIPAL=HTTP@{KERBEROS_REALM}
SOLR_KERB_KEYTAB=/etc/solr/conf/HTTP.keytab
SOLR_AUTHENTICATION_CLIENT_CONFIGURER="org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer"
SOLR_AUTHENTICATION_OPTS=" -DauthenticationPlugin=org.apache.solr.security.KerberosPlugin -Djava.security.auth.login.config={SOLR_JAAS_FILE} -Dsolr.kerberos.principal={SOLR_KERB_PRINCIPAL} -Dsolr.kerberos.keytab={SOLR_KERB_KEYTAB} -Dsolr.kerberos.cookie.domain={SOLR_HOST} -Dhost={SOLR_HOST} -Dsolr.kerberos.name.rules=DEFAULT"
  • 将 solr.in.sh 复制到所有运行 Solr 的主机上。
  • 通过上传 security.json 来配置 Solr 使用 Kerberos 插件。
$SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -zkhost <zk host>:2181 -cmd put /security.json '{"authentication":{"class": "org.apache.solr.security.KerberosPlugin"}}'
  • 启动 Solr。
$SOLR_INSTALL_HOME/bin/solr start -cloud -z $ZK_HOST1:2181,$ZK_HOST2:2181,$ZK_HOST3:2181 -noprompt
  • 测试 Solr
kinit -k -t /etc/security/keytabs/HTTP.keytab HTTP/<host>@EXAMPLE.COM
curl --negotiate -u : "http://<host>:8983/solr/"
  • 创建与 Atlas 所用索引相对应的 Solr 集合,并按照安装步骤中所述,修改 Atlas 配置以指向已搭建的 Solr 实例。

评论

登录后参与评论

正在加载评论…