Kerberos 针对设备提供强大的加密身份验证,使客户端和服务器能够以更安全的方式进行通信。从而解决了网络安全问题。
您的系统必须安装和配置一个或多个 Kerberos 密钥分发中心 (KDC)。必须可以从 Vertica 分析型数据库群集中的每个节点访问 KDC。
KDC 必须使用 GSS-API 支持 Kerberos 5。有关详细信息,请参阅 MIT Kerberos 分发页面。
Kerberos 针对设备提供强大的加密身份验证,使客户端和服务器能够以更安全的方式进行通信。从而解决了网络安全问题。
您的系统必须安装和配置一个或多个 Kerberos 密钥分发中心 (KDC)。必须可以从 Vertica 分析型数据库群集中的每个节点访问 KDC。
KDC 必须使用 GSS-API 支持 Kerberos 5。有关详细信息,请参阅 MIT Kerberos 分发页面。
Vertica 使用服务主体进行系统级别的操作。这些主体用于标识 Vertica 服务,并按如下方式使用:
当 Kerberized Vertica 客户端向数据库进行身份验证时,它们会请求访问此服务。
Tuple Mover 等系统进程向 Hadoop 等外部服务进行身份验证时,它们会使用此标识。
按如下所示创建主体和密钥:
启动 Kerberos 5 数据库管理实用程序(kadmin
或 kadmin.local
)可在 Linux KDC 中创建 Vertica 主体。
如果要访问远程服务器中的 KDC,请使用 kadmin
。如果掌握 Kerberos 管理员密码,则可以在安装了 Kerberos 5 客户端包的任何计算机上使用 kadmin
。启动 kadmin
时,实用程序会提示您输入 Kerberos 管理员密码。您可能需要具备客户端的 root 权限才能运行 kadmin
。
在以下情况下可以使用 kadmin.local
:
KDC 位于您当前已登录的计算机中。
您对该服务器具有 root 权限。
kadmin.local
不需要管理员登录凭据。
有关 kadmin
和 kadmin.local
命令的详细信息,请参阅 kadmin 文档。
在每个节点中,为 Vertica 创建一个服务主体。主机名必须与操作系统提供的值匹配。以下示例为名为 vertica
的节点创建了服务主体 v_vmart_node0001.example.com
:
$ sudo /usr/kerberos/sbin/kadmin.local
kadmin.local add_principal vertica/v_vmart_node0001.example.com
为每个主体重复执行一次 ktadd
命令。您可以为每个主体用户创建单独的 Keytab,也可以将它们全部添加到一个 Keytab 文件(例如 krb5.keytab)。如要使用一个文件,请参阅 MIT Kerberos 文档中有关 -glob 选项的文档。
您必须为使用 Kerberos 身份验证的每个 Vertica 分析数据库用户创建一个用户主体。例如:
$ sudo /usr/kerberos/sbin/kadmin.local
kadmin.local add_principal [options] VerticaUser1
将每个 Keytab 文件复制到相应群集节点中的 /etc
文件夹。在所有节点中使用相同的路径和文件名。
在每个节点中,让 Keytab 文件可供正在运行数据库进程的文件所有者(通常是 Linux dbadmin 用户)读取。例如,您可以按照以下方式,将这些文件的所有权更改为 dbadmin:
$ sudo chown dbadmin *.keytab
创建 Keytab 文件之后,可以使用 klist
命令查看存储在文件中的密钥:
$ sudo /usr/kerberos/bin/klist -ke -t
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ------------------- --------------------------------------------------------------------------
4 08/15/2017 7:35:41 vertica/v_vmart_node0001.example.com@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
4 08/15/2017 7:35:41 vertica/v_vmart_node0001.example.com@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
在 Vertica 上运行以下命令,以确保正确设置 Kerberos 参数:
=> select parameter_name, current_value from configuration_parameters where parameter_name like 'Ker%';
parameter_name | current_value
-----------------------+---------------------------------------------------------------------
KerberosHostname | v_vmart_node0001.example.com
KerberosKeytabFile | /etc/krb5.keytab
KerberosRealm | EXAMPLE.COM
KerberosTicketDuration | 0
KerberosServiceName | vertica
(5 rows)
确保所有客户端都使用 gss 身份验证方法。
从 Vertica:
=> CREATE USER bob;
CREATE USER
=> CREATE AUTHENTICATION v_kerberos method 'gss' host '0.0.0.0/0';
CREATE AUTHENTICATION
=> ALTER AUTHENTICATION v_kerberos enable;
ALTER AUTHENTICATION
=> GRANT AUTHENTICATION v_kerberos to bob;
GRANT AUTHENTICATION
从操作系统命令行:
$ kinit bob
$ vsql -U bob -k vertica -K v_vmart_node0001.example.com -h v_vmart_node0001 -c "select client_authentication_name,
authentication_method from sessions;"
client_authentication_name | authentication_method--
----------------------------+-----------------------
v_kerberos | GSS-Kerberos
(1 row)
在 Vertica 上,运行 KERBEROS_CONFIG_CHECK 以验证 Kerberos 配置。KERBEROS_CONFIG_CHECK 验证以下内容:
kinit 和 kb5.conf 文件是否存在。
keytab 文件是否存在且已设置
数据库中设置的 Kerberos 配置参数:
KerberosServiceName
KerberosHostname
KerberosRealm
Vertica 主体
Kerberos 可以读取 Vertica 密钥
Kerberos 可以获得 Vertica 主体的票证
Vertica 可以使用 kinit 初始化密钥
Kerberos 领域中的每个客户端和 Vertica 分析型数据库服务器都必须具有有效且配置相同的 Kerberos 配置 (krb5.conf
) 文件。如果没有该文件,客户端不知道如何到达 KDC。
如果使用 Microsoft Active Directory,则无需执行此步骤。请参阅适用于您的平台的 Kerberos 文档,详细了解有关在 Active Directory 上的 Kerberos 配置文件信息。
您至少需要在 krb5.conf
文件中配置以下部分。
libdefaults
]—Kerberos 5 库使用的设置realms
]—领域专用联系信息和设置domain_realm
]—将服务器主机名映射到 Kerberos 领域请参阅 Kerberos 文档,了解有关此配置文件中其它部分的信息。
您必须更新 /etc/krb5.conf
文件以反映您的站点的 Kerberos 配置。在 Kerberos 领域中的所有客户端与服务器当中强制执行一致性的最简单办法,就是从 KDC 复制 /etc/krb5.conf
文件。然后,将该文件放入每个 Vertica 群集节点上的 /etc
目录内。
按照以下步骤通知 Vertica 有关主体名称和 keytab 位置的信息。
有关您在此过程中需要设置的参数的信息,请参阅 Kerberos 参数。
以管理员身份(通常为 dbadmin)登录到数据库。
设置 KerberosKeyTabFile
配置参数,以指向 keytab 文件的位置:
=> ALTER DATABASE DEFAULT SET PARAMETER KerberosKeytabFile = '/etc/krb5.keytab';
在所有节点上,keytab 文件必须在相同位置(在此示例中为 /etc/krb5.keytab
)。
设置 Vertica 主体的服务名称;例如,vertica
:
=> ALTER DATABASE DEFAULT SET PARAMETER KerberosServiceName = 'vertica';
提供主体的领域部分,例如,EXAMPLE.COM
。
=> ALTER DATABASE DEFAULT SET PARAMETER KerberosRealm = 'EXAMPLE.COM'
为了确保所有客户端均使用 gss 身份验证方法,请运行以下语句:
=> CREATE AUTHENTICATION <method_name> METHOD 'gss' HOST '0.0.0.0/0';
=> GRANT AUTHENTICATION <method_name> TO Public;
有关详细信息,请参阅实施客户端身份验证。
Active Directory 存储有关 Windows 域成员的信息,包括用户和主机。
Vertica 使用 Kerberos 协议访问此信息,以便对 Vertica 数据库的 Windows 用户进行身份验证。Kerberos 协议使用主体来识别用户,并使用 keytab 文件来存储他们的加密信息。您需要将 keytab 文件安装到 Vertica 中,使 Vertica 数据库能够以加密方式验证 Windows 用户。
此过程描述:
创建 Vertica 服务主体。
导出这些主体的 keytab 文件
在 Vertica 数据库中安装 keytab 文件。这将允许 Vertica 对 Windows 用户进行身份验证,并授予其访问 Vertica 数据库的权限。
为 Vertica 服务创建一个 Windows 帐户(主体),并为群集中的每个节点/主机创建一个 Vertica 主机。此过程将为在该节点上运行的主机 verticanode01
和服务 vertica
创建 Windows 帐户。
创建这些帐户时,请选择以下选项:
用户无法更改密码
密码永不过期
如果您在 HDFS 上使用受 Kerberos 身份验证保护的外部表,则必须启用“委派 (Delegation)”。为此,请访问 Active Directory 用户和计算机对话框,右键单击 Vertica
服务的 Windows 帐户(主体),然后选择“委派 (Delegation)”。信任此用户以委派给任何服务。
运行以下命令为主机 verticanode01.dc.com
节点/主机创建密钥表:
$ ktpass -out ./host.verticanode01.dc.com.keytab -princ host/verticanode01.dc.com@DC.COM -mapuser verticanode01
-mapop set -pass secret -ptype KRB5_NT_SRV_HST
运行以下命令为 vertica
服务创建 Keytab:
$ ktpass -out ./vertica.verticanode01dc.com.keytab -princ vertica/verticanode01.dc.com@DC.COM -mapuser vertica
-mapop set -pass secret -ptype KRB5_NT_PRINCIPAL
有关 Keytab 文件的详细信息,请参阅 Technet.Microsoft.com
运行以下命令以验证服务主体名称是否正确映射。您必须为群集中的每个节点运行以下命令:
$ setspn -L vertica
Registered ServicePrincipalNamefor CN=vertica,CN=Users,DC=dc,DC=com
vertica/verticanode01.dc.com
$ setspn -L verticanode01
Registered ServicePrincipalNamefor CN=verticanode01,CN=Users,DC=dc,DC=com
host/verticanode01.dc.com
将您刚才创建的密钥表 vertica.verticanode01.dc.com.keytab
和 host.verticanode01.dc.com.keytab
复制到 Linux 主机 verticanode01.dc.com
。
将多个 Keytab 文件组合成一个 Keytab:
[release@vertica krbTest]$ /usr/kerberos/sbin/ktutil
ktutil: rkt host.verticanode01.dc.com.keytab
ktutil: rkt vertica.verticanode01.dc.com.keytab
ktutil: list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
1 3 host/verticanode01.dc.com@DC.COM
2 16 vertica/verticanode01.dc.com@DC.COM
ktutil: wkt verticanode01.dc.com.keytab
ktutil: exit
这将创建一个 Keytab 文件,其中包含用于身份验证的服务器主体。
将新的 Keytab 文件复制到编录目录。例如:
$ cp verticanode01.dc.com.keytab /home/dbadmin/VMart/v_vmart_nodennnn_catalog
测试 Keytab 文件检索票证的能力,确保它可以从 Vertica 节点运行:
$ kinit vertica/verticanode01.dc.com -k -t verticanode01.dc.com.keytab
$ klist
Ticket cache: KFILE:/tmp/krb_ccache_1003
Default principal: vertica/verticanode01.dc.com@DC.COM
Valid starting Expires Service principal
04/08/2017 13:35:25 04/08/2017 23:35:25 krbtgt/DC.COM@DC.COM
renew until 04/15/2017 14:35:25
当票证过期或未自动取回时,您需要手动运行 kinit 命令。请参阅获取 Kerberos 票证并对 Vertica 进行身份验证。
对 Keytab 文件设置正确的权限和所有权:
$ chmod 600 verticanode01.dc.com.keytab
$ chown dbadmin:verticadba verticanode01.dc.com.keytab
使用 ALTER DATABASE 设置以下 Kerberos 参数 通知 Vertica 有关 Kerberos 主体的信息:
KerberosKeytabFile=<CATALOGDIR>/verticanode01.dc.com.keytab
KerberosRealm=DC.COM
KerberosServiceName=vertica
KerberosTicketDuration = 0
KerberosHostname=verticanode01.dc.com
重新启动 Vertica 服务器。
按如下所示测试 Kerberos 设置,确保所有客户端都使用 gss 身份验证方法。
从 Vertica:
=> CREATE USER windowsuser1;
CREATE USER
=> CREATE AUTHENTICATION v_kerberos method 'gss' host '0.0.0.0/0';
CREATE AUTHENTICATION
=> ALTER AUTHENTICATION v_kerberos enable;
ALTER AUTHENTICATION
=> GRANT AUTHENTICATION v_kerberos to windowsuser1;
GRANT AUTHENTICATION
从操作系统命令行:
$ kinit windowsuser1
$ vsql -U windowsuser1 -k vertica -K verticanode01.dc.com -h verticanode01.dc.com -c "select client_authentication_name,
authentication_method from sessions;"
client_authentication_name | authentication_method--
----------------------------+-----------------------
v_kerberos | GSS-Kerberos
(1 row)
运行 KERBEROS_CONFIG_CHECK 以验证 Kerberos 配置。KERBEROS_CONFIG_CHECK 验证以下内容:
kinit 和 kb5.conf 文件是否存在。
keytab 文件是否存在且已设置
数据库中设置的 Kerberos 配置参数:
KerberosServiceName
KerberosHostname
KerberosRealm
Vertica 主体
Kerberos 可以读取 Vertica 密钥
Kerberos 可以获得 Vertica 主体的票证
Vertica 可以使用 kinit 初始化密钥
如果您的机构使用 Kerberos 作为登录过程的一部分,在登录时会自动检索 Kerberos 票证。否则,您需要运行 kinit
来检索 kerberos 票证。
以下示例显示如何使用 kinit
命令检索票证并通过 KDC 对 Vertica 分析型数据库进行身份验证。域名为 EXAMPLE.COM。您必须使用该域名及您的用户名来检索 Kerberos 票证。请参阅指定 KDC 信息并配置领域。
$ kinit
Password for principal_user@EXAMPLE.COM: kpasswd
将会提示您当您创建主体和密钥文件(请参阅 在 Linux KDC 中创建 Vertica 主体和 Keytab)时创建的主体用户名的密码。
Kerberos 票证在预设时间长度内被缓存。请参阅 Kerberos 文档中的票证管理获取有关过期参数设置的更多信息。
过期后,您需要再次运行 kinit
指令来检索另外一张 Kerberos 票证。