1. 安装Ranger
- 安装JDK(略)
- 编译Ranger(略)
- 安装MySQL(略)
- 创建名为ranger的数据库(
CREATE USER 'ranger'@'%' IDENTIFIED BY 'ranger';
)。 - 创建名为ranger的用户,并授权ranger数据库所有权限给ranger(
GRANT ALL PRIVILEGES ON ranger.* TO 'ranger'@'%';
) - 刷新生效(
FLUSH PRIVILEGES;
)
- 安装Ranger
- 解压ranger-2.0.0-admin.tar.gz
- 安装内置solr
- 编辑solr安装配置文件:
vim $RANGER_ADMIN_HOME/contrib/solr_for_audit_setup/install.properties
JAVA_HOME=/opt/jdk1.8.0_201
SOLR_USER=solr
SOLR_GROUP=solr
SOLR_INSTALL=true #设置为true标示自动安装
SOLR_DOWNLOAD_URL=http://mirror.bit.edu.cn/apache/lucene/solr/8.5.1/solr-8.5.1.tgz # 修改solr安装包下载地址
SOLR_INSTALL_FOLDER=/opt/solr # 安装目录
SOLR_RANGER_HOME=/opt/solr/ranger_audit_server
SOLR_RANGER_PORT=6083
SOLR_DEPLOYMENT=standalone
SOLR_RANGER_DATA_FOLDER=/opt/solr/ranger_audit_server/data
- 执行
$RANGER_ADMIN_HOME/contrib/solr_for_audit_setup/setup.sh
进行solr安装。 - 切换到solr用户启动solr
/opt/solr/ranger_audit_server/scripts/start_solr.sh
(停止solr命令为相同目录下的stop_solr.sh) - 访问
http://hostname:6083
,如果能正常访问页面,表示solr安装成功。
- ranger-admin安装。
- 修改ranger-admin配置文件。需要修改项如下,其他保持默认。
# DB
DB_FLAVOR=MYSQL
SQL_CONNECTOR_JAR=${your path}/mysql-connector-java-8.0.16.jar
db_root_user=root
db_root_password=root
db_host=${your mysql server host}:3306
#
# DB UserId used for the Ranger schema
#
db_name=ranger
db_user=ranger
db_password=ranger
audit_store=solr
audit_solr_urls=http://${your solr server host}:6083/solr/ranger_audits
- 执行初始化脚本
$RANGER_ADMIN_HOME/setup.sh
- 启动ranger-admin
ranger-admin start
- 访问
http://hostname:6080/
,如果能正常访问,表示ranger安装成功。 - 用admin/admin登录ranger。
2. 安装Kafka(略)
3. 安装 Ranger kafka 插件
- 编译ranger-kafka 插件(略)
- 解压kafka 插件 ranger-2.0.0-kafka-plugin.tar
- 配置install.properties,修改或添加如下项,其他保持默认
vim $ranger-2.0.0-kafka-plugin-HOME/install.properties
COMPONENT_INSTALL_DIR_NAME=$KAFKA_HOME
POLICY_MGR_URL=http://${your ranger server hostname}:6080/ # ranger
SQL_CONNECTOR_JAR=${your path}/mysql-connector-java-8.0.16.jar
XAAUDIT.SOLR.ENABLE=true
XAAUDIT.SOLR.URL=http://${your solr server hostname}:6083/solr/ranger_audits
JAVA_HOME=/opt/jdk1.8.0_201
REPOSITORY_NAME=kafkadev
XAAUDIT.SUMMARY.ENABLE=true
XAAUDIT.SOLR.SOLR_URL=http://${your solr server hostname:6083/solr/ranger_audits
CUSTOM_USER=${username}
CUSTOM_GROUP=${username}
- 拷贝配置好的ranger-2.0.0-kafka-plugin到其他kafka broker节点。
- 在各个kafka broker节点执行ranger-kafka 插件中的脚本
${ranger-2.0.0-kafka-plugin_HOME}/enable-kafka-plugin.sh
,插件会自动拷贝(创建软连接)插件目录下lib下的包到kafka的libs目录下,并在kafka的config目录下创建对应的以ranger开头的配置文件。 - 查看插件下的lib包是否已经拷贝(建立软连接)到kafka libs下。
- 查看配置文件是否已经创建(ranger开头的文件)。
3. 安装Kerberos
- Kerberos概念以及介绍(略)
- 安装Kerberos 服务器(只需要安装一个机器)。
sudo yum install -y krb5-server
- 安装Kerberos 客户端 (需要使用Kerberos认证的节点都需要安装,如kafka 的各个broker所在的节也需要安装)。
yum install -y krb5-workstation
- 修改kdc配置文件。
vim /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
BUGBOY.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
}
- 修改
/var/kerberos/krb5kdc/kadm5.acl
文件
*/admin@BUGBOY.COM *
- 修改
/etc/krb5.kdc
,并拷贝到其他客户端/etc 目录下
# 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 = BUGBOY.COM
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
BUGBOY.COM = { # 修改域名为自己设置的域名
kdc = kdchost.bugboy.com #kdchost为kdc 服务器所在的主机名
admin_server = kdchost.bugboy.com #kdchost为kadmin 所在的主机名
}
# 修改域名为自己设置的域名
[domain_realm]
.bugboy.com = BUGBOY.COM
bugboy.com = BUGBOY.COM
- 修改kdc服务器所在主机的hosts ,并在其他客户端的hosts下也添加上。
# ip 地址为kdc服务器的ip地址
192.168.254.66 kdchost kdchost.bugboy.com
- 配置kdc、kadmin服务开机启动。
sudo systemctl enable krb5kdc.service
或者sudo chkconfig --level 35 krb5kdc on
sudo systemctl enable kadmin.service
或者sudo chkconfig --level 35 kadmin on
- 创建Kerberos数据库
kdb5_util create -s -r BUGBOY.COM
- 启动krb5kdc 服务和 kadmin 服务。
sudo systemctl start krb5kdc.service
或者sudo service krb5kdc start
sudo systemctl start kadmin.service
或者sudo service kadmin start
- 进入kadmin命令行,
sudo kadmin.local
- 创建管理员主体
addprinc -randkey root/admin
- 创建kafka主体,其中broker1、broker2、broker3为kakfa broker的hostname:
addprinc -randkey kafka/broker1@BUGBOY.COM
addprinc -randkey kafka/broker2@BUGBOY.COM
addprinc -randkey kafka/broker3@BUGBOY.COM
- 导出keytab文件到kafka.keytab,导出的kafka.keytab文件就在运行kadmin.local时的目录下。
xst -k kafka.keytab kafka/broker1@BUGBOY.COM
xst -k kafka.keytab kafka/broker2@BUGBOY.COM
xst -k kafka.keytab kafka/broker3@BUGBOY.COM
- 测试认证。
sudo kinit -kt kafka.keytab路径 kafka/broker1@BUGBOY.COM
- 在kafka home 下新建keytabs目录,并将kafka.keytab拷贝到该目录下,并同步到其他broker节点。
- 在kafka home 下新建jassconf目录,并在该目录下新建kafka_server_jaas.conf文件,内容如下:
KafkaServer {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="${KAFKA_HOME/keytabs/kafka.keytab}" # KAFKA_HOME需要修改为KAFKA安装目录的路径
principal="kafka/beoker1@BUGBOY.COM";
};
- 将jassconf拷贝到各个broker的kafka 安装目录下。并修改kafka_server_jaas.conf中的principal="kafka/beoker1@BUGBOY.COM"为当前节点对应的principal
- 修改kafka bin目录下的kafka-run-class.sh,在
# JVM performance options
的地方即KAFKA_JVM_PERFORMANCE_OPTS追加-Djava.security.krb5.conf=/etc/krb5.conf $KAFKA_JAAS,并拷贝到其他broker对应目录下。结果如下:
# JVM performance options
if [ -z "$KAFKA_JVM_PERFORMANCE_OPTS" ]; then
KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true -Djava.security.krb5.conf=/etc/krb5.conf $KAFKA_JAAS"
fi
- 修改kafka bin目录下的kafka-server-start.sh,在如下位置添加如下内容。并拷贝到其他broker对应目录下。
EXTRA_ARGS=${EXTRA_ARGS-'-name kafkaServer -loggc'}
COMMAND=$1
case $COMMAND in
-daemon)
EXTRA_ARGS="-daemon "$EXTRA_ARGS
shift
;;
*)
;;
esac
# 增加kafka server对应的KAFKA_JAAS变量,其中$KAFKA_HOME需要保证为有效路径。
export KAFKA_JAAS="-Djava.security.auth.login.config=$KAFKA_HOME/jassconf/kafka_server_jaas.conf"
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
- 每个broker修改kafka config 下的server.properties,将下面内容追加到文件末尾。注意,SASL_PLAINTEXT后面的地址为当前broker的主机地址
authorizer.class.name=org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer
advertised.listeners=SASL_PLAINTEXT://broker1:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.service.name=kafka
listeners=SASL_PLAINTEXT://broker1:9092
- 启动kafka。
- 查看ranger中是否有kafka的插件,以及审计日志是否正常。
4. 使用kafka 客户端(Topic创建,生产数据以及消费)时的认证和用户切换
- 用kadmin创建两个Kerberos的Principal,分别为client1,clinet2。
addprinc -randkey client1/broker1@BUGBOY.COM
addprinc -randkey client2/broker1@BUGBOY.COM
- 分别导出其keytab为client1.keytab、client2.keytab。并将client1.keytab、client2.keytab放到${KAFKA_HOME}/keytabs目录下。
- 为client1新建kafka_client1_jaas.conf文件并放到${KAFKA_HOME}/jassconf目录下,内容如下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="${KAFKA_HOME}/keytabs/client1.keytab" #KAFKA_HOME需要修改为绝对路径
principal="client1/broker1@BUGBOY.COM";
};
- 为client2新建kafka_client2_jaas.conf文件并放到${KAFKA_HOME}/jassconf目录下,内容如下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="${KAFKA_HOME}/keytabs/client2.keytab" #KAFKA_HOME需要修改为绝对路径
principal="client2/broker1@BUGBOY.COM";
};
- 在KAFKA_HOME目录下新建一个userConf目录,并新建一个client.conf文件,内容如下:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
- 用kafka principal新建一个名为test-topic的topic。主要,根据自己的情况将KAFKA_HOME替换为自己的目录
- 在shell中执行
export KAFKA_JAAS="-Djava.security.auth.login.config=${KKAFKA_HOME}/jaasconf/kafka_server_jaas.conf"
- 创建 topic:
$AKFKA_HOME/bin/kafka-topics.sh --create --bootstrap-server broker1:9092 --topic test-topic --partitions 3 --replication-factor 2 --command-config $AKFKA_HOME/userConf/client.conf
- 查看ranger的审计日志
- 在ranger中新建两个用户,分别为client1,client1,并授予向 test-topic生产数据的权限。
- 使用client1 的principal生产数据使用kafka的脚本进行生产数据。
- 在shell 中执行
export KAFKA_JAAS="-Djava.security.auth.login.config=${KKAFKA_HOME}/jaasconf/kafka_client1_jaas.conf"
- 往test-topic中生产数据
$AKFKA_HOME/bin/k/kafka-console-producer.sh --broker-list broker1:9092 --topic test-topic --producer.config $AKFKA_HOME/config/userConf/client.conf
- 使用client2 的principal生产数据使用kafka的脚本进行生产数据。
- 在shell 中执行
export KAFKA_JAAS="-Djava.security.auth.login.config=${KKAFKA_HOME}/jaasconf/kafka_client2_jaas.conf"
- 往test-topic中生产数据
$AKFKA_HOME/bin/k/kafka-console-producer.sh --broker-list broker1:9092 --topic test-topic --producer.config $AKFKA_HOME/config/userConf/client.conf
- 查看Ranger的审计日志。
- 在ranger中将client2的权限修改为拒绝。
- 再使用client2 的principal生产数据使用kafka的脚本进行生产数据。
- 在shell 中执行
export KAFKA_JAAS="-Djava.security.auth.login.config=${KKAFKA_HOME}/jaasconf/kafka_client2_jaas.conf"
- 往test-topic中生产数据
$AKFKA_HOME/bin/k/kafka-console-producer.sh --broker-list broker1:9092 --topic test-topic --producer.config $AKFKA_HOME/config/userConf/client.conf
- 查看Ranger的审计日志,出现如图表示kerberos对kafka认证成功,以及ranger能对kafka有效的权限控制。