安装配置 Kerberos,并以 Zookeeper 为案例使用 Kerberos
1. 搭建 Kerberos
1.1. 环境
- CentOS 7.2
1.2. 安装
1.2.1. 安装服务
$ yum install krb5-server
在安装完上述的软件之后,会生成配置文件/etc/krb5.conf
和/var/kerberos/krb5kdc/kdc.conf
1.2.3. 修改配置
kerberos 服务涉及到以下三个配置文件:
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kadm5.acl
/etc/krb5.conf
- 修改 kdc.conf
kdc 服务的配置信息
$ vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
HADOOP.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
补充:
HADOOP.COM
是 realm 名,kerberos 可以支持多个 realm 并且大小写敏感。
这里简单介绍一下 realm,realm 充当了 kerberos 与应用安全数据间的桥梁或者连接器。当对用户执行认证(登录)和鉴权(访问控制)时,kerberos 会从应用配置的 realm 中获取相应的安全数据(如用户、角色、权限)进行比较以确定用户身份以及验证用户操作是否合法。
当配置 kerberos 时,你必须至少指定一个 realm ,用于认证和(或)授权。
$ vi /var/kerberos/krb5kdc/kadm5.acl
*/admin@HADOOP.COM *
其实根据文件名,大家也能猜出来该文件内容的内容是 kadmin 管理帐号的acl。
Kadmin daemon 会使用该文件来管理对 kerberos database 的访问权限。
对于那些可能会对 pincipal 产生影响的操作,acl 文件也能控制哪些principal能操作哪些其他pricipals。
*/admin@HADOOP.COM
代表在 HADOOP.COM 域下 admin 组下的用户拥有所有权限。
- 修改 krb5.conf
Kerberos 的配置信息。例如 kdc 的位置,kadmin 的 realms 等
$ vi /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_realm = HADOOP.COM
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
HADOOP.COM = {
kdc = localhost
admin_server = localhost
}
[domain_realm]
.hadoop.com = HADOOP.COM
hadoop.com = HADOOP.COM
补充:
kdc:代表要 kdc 服务的地址。格式是机器:端口,端口可以不写默认88
1.2.4. 创建/初始化kerberos database
$ kdb5_util create -s -r HADOOP.COM
-s 表示生成 stash file,并在其中存储 master server key(krb5kdc)
-r 来指定为初始化哪一个 realm
补充:
该命令会在 /var/kerberos/krb5kdc/ 目录下创建 principal 数据库。
如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/ 目录下的 principal 的相关文件都删除掉。默认的数据库名字都是 principal,可以使用 -d 指定数据库名字。这里我们使用默认数据库名。
1.2.5. 添加kerberos管理员
关于 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至于使用哪个,取决于账户和访问权限:
- 如果有访问 kdc 服务器的 root 权限,但是没有 kerberos admin 账户,使用 kadmin.local。本地访问的意思。
- 如果没有访问 kdc 服务器的 root 权限,但是有 kerberos admin 账户,使用 kadmin。远程访问的意思。
根据kadm5.acl文件配置,由于指定了 admin 用户组下所有用户都具有所有权限,这里用户名可以随便使用。
为了方便起见,这里用户名也使用了 admin
$ kadmin.local -q "addprinc admin/admin"
1.3. 启动 kerberos
$ systemctl start krb5kdc
$ systemctl start kadmin
1.4. 测试 kerberos
1.4.1. 安装 kerberos 客户端
$ yum install krb5-workstation
1.4.2. 创建测试 principal 并生成 keytab
$ kadmin.local -q "addprinc test/admin"
$ kadmin.local -q "ktadd -k /tmp/test.keytab test/admin"
1.4.3. 销毁 ticket
$ kdestroy
1.4.5. 更新 ticket
使用密码:
$ kinit test/admin
或使用 keytab:
$ kinit -kt /tmp/test.keytab test/admin
1.4.6. 查看当前 ticket
$ klist
2. 配置 zookeeper 服务端
2.1. 创建 zookeeper 的 principal
$ kadmin.local -q "addprinc -randkey zookeeper/localhost@HADOOP.COM"
$ kadmin.local -q "ktadd -k zookeeper.keytab zookeeper/localhost@HADOOP.COM"
# 移动keytab到zookeeper的配置文件夹中,方便管理
$ mv zookeeper.keytab /usr/local/zookeeper/conf
2.2. 修改 zoo.cfg
在 zoo.cfg 文件中,添加以下内容:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
2.3. 创建 jass 文件
在 zk 的 conf 目录下创建 jass.conf 文件
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab = true
keyTab = "/usr/local/zookeeper/conf/zookeeper.keytab"
storeKey = true
useTicketCache = false
principal = "zookeeper/localhost@JAVACHEN.COM";
};
特别注意下最后两行的分号,没有的话会解析不了该 jass 文件
2.4. 开启kerberos
在开启 kerberos 之前,我们先看下 zk 启动脚本装载 jvm 过程:
- 根据 zk 启动脚本 zkServer.sh,可以发现启动 jvm 之前,会通过执行 zkEnv.sh 文件,设置一些环境变量。
- 接着获取 SERVER_JVMFLAGS 变量,并将其追加到 JVMFLAGS 变量中。
- 最后会在启动jvm过程中,将 JVMFLAGS 变量添加 jvm 参数中。
根据上述启动流程,我们可以将 java 配置 jass 文件,这个步骤通过 zkEnv.sh 生效,并且设置到 JVMFLAGS 这个变量中。
我们通过 zkEnv.sh 又可以发现,zkEnv.sh 会检测 conf 中是否存在java.env 文件,并执行他。
这是我们便可以在 conf 中创建 java.env 文件,并写入以下内容:
export JVMFLAGS="-Djava.security.auth.login.config=/usr/local/zookeepe/conf/jaas.conf"