使用Kerberos认证
使用Kerberos认证¶
您可以使用Kerberos认证服务器控制对SeaboxMPP数据库的访问。
SeaboxMPP数据库支持使用Kerberos认证的通用安全服务应用程序接口(GSSAPI)。GSSAPI为支持它的系统提供了自动身份认证(单点登录)功能。可以在SeaboxMPP数据库配置文件sd_hba.conf中指定需要Kerberos身份认证的SeaboxMPP数据库用户或角色。当角色尝试登录SeaboxMPP数据库时,如果Kerberos身份认证不可用,则登录失败。
Kerberos提供一种安全的、加密的认证服务。 它不加密客户端和数据库之间传输的数据,不提供授权服务。如果要网络传输的数据,可以使用SSL连接。如果要管理SeaboxMPP数据库及对象的访问权限,可以在sd_hba.conf文件中进行设置,为数据库中的SeaboxMPP数据库用户和角色的授权。
先决条件说明¶
在为SeaboxMPP数据库配置Kerberos身份认证之前,请确保
-
您可以识别用于Kerberos身份认证的KDC服务器和用于SeaboxMPP数据库系统的Kerberos域。
-
系统时间在Kerberos密钥分发中心(KDC)服务器和SeaboxMPP数据库主服务器之间是同步的。 例如,在两台服务器上安装NTP
ntp
软件包。 -
在KDC服务器和SeaboxMPP数据库coordinator节点之间网络联通正常。
-
所有SeaboxMPP数据库主机上都安装了Java 1.7.0_17或更高版本。 在Red Hat Enterprise Linux 6.x或7.x上使用要使用Kerberos认证的JDBC,需要安装Java 1.7.0_17或更高版本。
在KDC数据库中创建数据库主体(Principal)¶
创建服务主体,为SeaboxMPP数据库服务和Kerberos管理主体,用于以seabox用户身份管理KDC数据库。
-
以root用户身份登录Kerberos KDC服务器。
$ ssh root@<kdc-server>
-
为SeaboxMPP数据库服务创建一个主体。
# kadmin.local -q "addprinc -randkey seaboxsql/mdw@SCDB.KRB"
-randkey
选项可防止命令提示输入密码。主体名称中
seaboxsql
部分,匹配SeaboxMPP数据库krb_srvname
配置参数的值,默认情况值为seaboxsql
即可。主体名称中主机名部分(译者注,示例中的mdw部分),必须匹配SeaboxMPP数据库coordinator主机上
hostname
命令的输出结果。如果
hostname
命令显示的是完全限定域名(FQDN),例如显示mdw.example.com,应用到主体名称则为seaboxsql/mdw.example.com@SCDB.KRB
。主体名称中
SCDB.KRB
部分,是Kerberos域(realm)的名称 -
为seabox/admin角色创建一个主体。
# kadmin.local -q "addprinc seabox/admin@SCDB.KRB"
此主体允许您以seabox身份登录时,管理KDC数据库。确保Kerberos的
kadm.acl
配置文件包含用于向此主体授予权限的ACL。例如,此ACL为SCDB.KRB域中所有管理员用户,授予所有权限。*/admin@SCDB.KRB *
-
使用
kadmin.local
创建密钥表(keytab)文件。以下示例在当前目录中创建密钥表文件scdb-kerberos.keytab
,并包含SeaboxMPP数据库服务主体和seabox/admin主体的身份认证信息。# kadmin.local -q "ktadd -k scdb-kerberos.keytab seaboxsql/mdw@SCDB.KRB gadmin/admin@scdb.KRB"
-
将密钥表文件复制到coordinator主机。
# scp scdb-kerberos.keytab seabox@mdw:~
Coordinator节点安装Kerberos客户端¶
在SeaboxMPP数据库coordinator服务器上安装Kerberos客户端实用程序和依赖库。
-
在SeaboxMPP数据库coordinator服务器上安装Kerberos软件包。
$ sudo yum install krb5-libs krb5-workstation
-
从KDC服务器拷贝
/etc/krb5.conf
文件到SeaboxMPPm数据库aster主机相同目录下。
使用Kerberos身份认证配置数据库¶
使用Kerberos配置SeaboxMPP数据库。
-
以seabox用户身份登录SeaboxMPP数据库coordinator主机。
$ ssh seabox@<coordinator> $ source /usr/local/seaboxmpp/seaboxmpp-db/seaboxmpp_path.sh
-
设置从KDC服务器复制的密钥表文件的所有者和权限。
$ chown seabox:seabox /home/seabox/scdb-kerberos.keytab $ chmod 400 /home/seabox/scdb-kerberos.keytab
-
通过设置SeaboxMPP数据库
krb_server_keyfile
服务器配置参数,配置密钥表文件的位置。、该seabox config命令指定将/home/seabox文件夹为为密钥表文件scdb-kerberos.keytab的位置。
$ seabox config -c krb_server_keyfile -v '/home/seabox/scdb-kerberos.keytab'
-
修改SeaboxMPP数据库的
sd_hba.conf
文件,启用Kerberos支持。例如,添加以下行到sd_hba.conf
文件,为来自同一网络上的所有用户和主机的连接请求添加GSSAPI和Kerberos身份认证支持。host all all 0.0.0.0/0 gss include_realm=0 krb_realm=scdb.KRB
设置
krb_realm
选项为某个域名称,确保只有该域下的用户才能使用Kerberos成功进行身份认证。设置
include_realm
选项为0
为身份认证通过的用户名去除域部分。 -
更新
krb_server_keyfile
和sd_hba.conf
后,重启SeaboxMPP数据库。$ seabox stop -ar
-
创建SeaboxMPP数据库超级用户角色seabox/admin。
$ createuser seabox/admin Shall the new role be a superuser? (y/n) y
此数据库角色的Kerberos密钥文件可以从KDC服务器复制。
-
使用
kinit
创建票据,使用klist
显示Kerberos票证缓存中所有票据。$ LD_LIBRARY_PATH= kinit -k -t /home/seabox/scdb-kerberos.keytab seabox/admin@scdb.KRB $ LD_LIBRARY_PATH= klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: seabox/admin@scdb.KRB Valid starting Expires Service principal 06/13/2018 17:37:35 06/14/2018 17:37:35 krbtgt/scdb.KRB@scdb.KRB
LD_LIBRARY_PATH 环境变量设置为包含SeaboxMPP数据库LIB目录,包括Kerberos库。这可能会导致Kerberos工具的命令,如使用kinit 和 klist的由于版本冲突而失败。解决方案是在您获取Kerberos实用程序之前运行Kerberos实用程序seaboxmpp_path.sh 文件或暂时取消设置 LD_LIBRARY_PATH 执行Kerberos实用程序时的变量,如示例中所示。
注意:
通过加载seaboxmpp_path.sh脚本来设置SeaboxMPP数据库环境时,环境变量LD_LIBRARY_PATH
被设置为包含SeaboxMPP数据库的lib
目录,目录中包含Kerberos库文件。
可能会导致Kerberos工具命令,如kinit
何klist
因为版本冲突而执行失败。 解决方案是在加载seaboxmpp_path.sh脚本之前运行Kerberos工具程序,或暂时取消设置LD_LIBRARY_PATH
变量再执行如上Kerberos工具程序。
-
作为测试,使用
seabox/admin
角色登录seaboxsql数据库:$ ssql -U "seabox/admin" -h scnode1 seaboxsql ssql (9.4.20) Type "help" for help. seaboxsql=# select current_user; current_user --------------- seabox/admin (1 row)
注意: 当您在coordinator主机启动
ssql
时,必须包含-h <coordinator-hostname>
选项, 强制使用TCP连接,因为使用本地连接时Kerberos认证不生效。
如果Kerberos主体不是SeaboxMPP数据库用户, 用户尝试登录数据库时,则会显示类似的以下内容的消息显示在的ssql
命令行:
ssql: krb5_sendauth: Bad response
必须将主体添加为SeaboxMPP数据库用户。
将Kerberos主体映射为数据库角色¶
要连接到启用了Kerberos身份认证的SeaboxMPP数据库系统,用户首先使用kinit
命令从KDC服务器请求授予票证,期间需要输入密码或者提供密钥表文件。
随后当用户连接到启用Kerberos的SeaboxMPP数据库系统时,用户的Kerberos主题名称将是SeaboxMPP数据库角色名称。
具体名称根据SeaboxMPP数据库sd_hba.conf
中受到在gss
选项进行转换:
-
如果
krb_realm=<realm>
选项存在, SeaboxMPP数据库只接收指定域名下的Kerberos主体。 -
如果
include_realm=0
选项存在,数据库角色名是Kerberos主体名去除Kerberos域后部分。如果include_realm=1
选项被指定,Kerberos域不会从SeaboxMPP数据库角色名中被剔除。 角色名必须使用SeaboxMPP数据库的CREATE ROLE
命令创建。 -
如果
map=<map-name>
选项被指定,将Kerberos主体名称与coordinator实例的配置文件sd_ident.conf
中指定的<map-name>
标记匹配,根据第一个匹配项替换为SeaboxMPP数据库角色名。
用户名称映射被定义在coordinator实例的配置文件sd_ident.conf
中。
以下示例定义了一个名为的映射MyMap中有两个条目。示例中使用两条mymap
记录,定义了两个名称映射。
## MAPNAME SYSTEM-USERNAME SC-USERNAME
mymap /^admin@scdb.KRB$ seabox
mymap /^(.*)_sc)@scdb.KRB$ \1
名称映射被指定在sd_hba.conf
文件的Kerberos记录的可选项中
host all all 0.0.0.0/0 gss include_realm=0 krb_realm=scdb.KRB map=mymap
第一个映射条目匹配Kerberos主体admin@scdb.KRB,并替换为SeaboxMPP数据库的seabox角色名。
第二个条目使用通配符匹配scdb.KRB域下名称是_gp
结尾的的Kerberos主体,并替换为Kerberos主体名称的开始部分。
SeaboxMPP数据库使用sd_ident.conf
文件中第一个匹配的映射条目,因此条目的顺序很重要。
配置数据库JDBC连接的Kerberos身份认证¶
使用JDBC访问启用Kerberos证的SeaboxMPP数据库。
您可以配置SeaboxMPP数据库使用Kerberos运行用户定义的Java函数。
-
确保在SeaboxMPP数据库主机中,已经安装并配置了Kerberos。
-
在
/home/seabox
文件夹下创建.java.login.config文件,并在文件中添加如下内容:sdjdbc { com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=true useTicketCache=true debug=true client=true; };
-
创建一个Java应用,使用Kerberos认证连接到SeaboxMPP数据库。
如下示例中数据库连接URL使用SeaboxSQL的JDBC驱动,并指定了用于Kerberos认证的参数:
jdbc:seaboxsql://scnode1:3000/mytest?kerberosServerName=seaboxsql&jaasApplicationName=sdjdbc&user=seabox/scdb-kdc
指定的参数名和参数值取决于Java应用如何执行Kerberos认证。
-
运行Java应用示例,测试使用Kerberos登录SeaboxMPP数据库。
安装和配置Kerberos KDC服务器¶
在Red Hat Enterprise Linux上,为SeaboxMPP设置Kerberos密钥分发中心(KDC)服务器的步骤。
如果您没有KDC,参考如下步骤,在Red Hat Enterprise Linux主机上安装配置一个KDC服务,其域为scdb.KRB
。
本示例中KDC服务器的主机名是scdb-kdc。
-
安装Kerberos服务器客户端软件包:
$ sudo yum install krb5-libs krb5-server krb5-workstation
-
编辑/etc/krb5.conf配置文件。如下示例展示的包含默认
scdb.KRB
域配置的Kerberos服务。[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = scdb.KRB dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true default_tgs_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5 default_tkt_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5 permitted_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5 [realms] scdb.KRB = { kdc = scdb-kdc:88 admin_server = scdb-kdc:749 default_domain = scdb.krb } [domain_realm] .scdb.krb = scdb.KRB scdb.krb = scdb.KRB [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false }
在
[realms]
分布,kdc
和admin_server
键指定了Kerberos服务运行的域名(scdb-kdc
)和端口。可以用IP地址来代替主机名。如果该Kerberos服务器还管理者其他域的认证, 需要在
kdc.conf
文件[realms]
和[domain_realm]
部分添加scdb.KRB
域配置。 -
运行
kdb5_util
,创建Kerberos数据库。# kdb5_util create -s
其
kdb5_util
的create子命令创建数据库,为KDC服务器所管理的Kerberos域存储密钥。其-s选项创建一个隐藏文件。如果没有这个隐藏文件,每次启动KDC服务时都需要输入密码 -
使用
kadmin.local
工具增加一个管理员用户到KDC数据库中。因为工具本身并不依赖于Kerberos认证,kadmin.local
工具允许您为本地的Kerberos服务器增加一个初始的管理员用户。运行如下命令,添加用户
seabox
作为管理员用户到KDC数据库中:# kadmin.local -q "addprinc seabox/admin"
大部分用户不需要对Kerberos服务器的管理访问。 他们可以使用
kadmin
来管理自己的主体(例如,更改自己的密码)。 -
如果需要,编辑/var/kerberos/krb5kdc/kadm5.acl文件,为
seabox
授予适当的权限。 -
启动Kerberos守护进程:
# /sbin/service krb5kdc start# /sbin/service kadmin start
-
设置Kerberos自启动:
# /sbin/chkconfig krb5kdc on # /sbin/chkconfig kadmin on