使用Docker快速搭建Kerberos环境

2022-07-16 17:31:40 浏览数 (1)

简介

Kerberos认证在大数据场景下用的比较多,特别是在Hadoop生态下,认证基本用的都是Kerberos认证。一般来讲Kerberos认证相对于其他方式的认证安全很多,同样的认证的时候性能应该差一点。

国内某著名大数据平台MapReduce服务,也叫做云原生数据湖MRS(MapReduce Service),将大数据相关的软件做了整合,其中有部分软件,比如:Redis、Clickhouse等开源社区并没有支持Kerberos认证的软件,华为自己做了Kerberos认证。

本文简单介绍怎快快速搭建Kerberos认证,做一些简单的测试。后续课程会说明如何使用代码进行Kerberos认证。

前提条件

- 需要在Linux环境上安装Docker,对于怎么安装Docker,本文不做介绍。

- 准备好安装目录,比如:/home/zeekling/project/ling/dockerFiles/kerberos

环境搭建

步骤一:添加服务端配置

在准备好的路径下面新建子文件夹`server`用于存放Kerberos服务相关的配置文件。在`server`下面新建文件新建krb5.conf,在里面写入下面内容:

代码语言:javascript复制
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
TEST.COM = {
  #master_key_type = aes256-cts
  acl_file = /etc/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/krb5kdc/kadm5.keytab
  max_renewable_life = 7d 0h 0m 0s
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}

其中TEST.COM为Kerberos的域名。kdc的端口为88,可以按照实际需要修改。

在server下面新建文件新建kadm5.acl,在里面写入下面内容:

代码语言:javascript复制
*/admin@TEST.COM    *

步骤二:新增客户端配置

在准备好的路径下面新增`client`文件夹,在`client`下面新建文件新建krb5.conf,在里面写入下面内容:

代码语言:javascript复制
[[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = TEST.COM
default_ccache_name = FILE:/tmp/krb5cc_cli_%{uid}
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
TEST.COM = {
  kdc = krb5-kdc-server:88
  admin_server = krb5-kdc-serve
}

其中TEST.COM为域名,krb5-kdc-server为kdc对应的域名,也可以使用ip。

步骤三:Docker启动脚本

在Docker启动的时候,需要同步创建admin以及需要使用的业务用户。

在准备好的目录下面新建文件`start.sh`,写入下面内容:

代码语言:shell复制
#!/bin/bash
FQDN="test.com"
ADMIN="admin"
PASS="Admin12!"
KRB5_KTNAME=/etc/admin.keytab
cat /etc/hosts
echo "hostname: ${FQDN}"
inited="/app/inited"
function init_user() {
    if [ -f "${inited}" ];then
        echo "user inited"
            kadmin.local -q "xst -k /app/hadoop.keytab -norandkey server/hadoop.${FQDN}"
            kadmin.local -q "xst -k /app/cli.keytab -norandkey cli"
        return;
    fi
    echo "begin init user"
    # create kerberos database
    echo -e "${PASS}n${PASS}" | kdb5_util create -s
    # create admin
    echo -e "${PASS}n${PASS}" | kadmin.local -q "addprinc ${ADMIN}/admin"
    # create hadoop
    echo -e "${PASS}n${PASS}" | kadmin.local -q "addprinc cli"
    echo -e "${PASS}n${PASS}" | kadmin.local -q "addprinc  server/hadoop.${FQDN}"
    kadmin.local -q "ktadd -norandkey -k ${KRB5_KTNAME} cli"
    kadmin.local -q "ktadd -norandkey -k ${KRB5_KTNAME} server/hadoop.${FQDN}"
    kadmin.local -q "xst -k /app/hadoop.keytab -norandkey server/hadoop.${FQDN}"
    kadmin.local -q "xst -k /app/cli.keytab -norandkey cli"
    touch "${inited}"
    echo "user inite success"
}
function main() {
    init_use
    /usr/local/bin/supervisord -n -c /etc/supervisord.conf
}

以上用户创建了admin、cli、server/hadoop.test.com用户,并且将后面两个用户的keytab导出到/app下面,并且在重启Docker的时候可以重新下载Keytab。

步骤四:supervisord配置文件

在准备好的目录下面新增supervisord.conf,写入下面内容:

代码语言:javascript复制
[supervisord]
logfile=/var/log/supervisord/supervisord.log    ; supervisord log file
logfile_maxbytes=50MB                           ; maximum size of logfile before rotation
logfile_backups=10                              ; number of backed up logfiles
loglevel=error                                  ; info, debug, warn, trace
pidfile=/var/run/supervisord.pid                ; pidfile location
nodaemon=false                                  ; run supervisord as a daemon
minfds=1024                                     ; number of startup file descriptors
minprocs=200                                    ; number of process descriptors
user=root                                       ; default use
childlogdir=/var/log/supervisord/               ; where child log files will live
[program:krb5-kdc]
command=service krb5-kdc start
autostart=true
autorestart=true
[program:krb5-admin-server]
command=service krb5-admin-server start
autostart=true
autorestart=true
[supervisorctl]

步骤五:DockerFile创建

在准备好的目录下面新建DockerFile,写入下面内容:

代码语言:shell复制
FROM ubuntu:xenial
ENV DEBIAN_FRONTEND noninteractive
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt clean
RUN apt update
RUN apt install -y ntp python-dev python-pip python-wheel python-setuptools python-pkg-resources krb5-admin-server krb5-kdc
RUN apt install vim -y
RUN rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/log/supervisord/
RUN mkdir /app/
RUN pip install supervisor==4.2.4
COPY ./server/krb5.conf /etc/krb5kdc/kdc.conf
COPY ./server/kadm5.acl /etc/krb5kdc/kadm5.acl
COPY ./client/krb5.conf /etc/krb5.conf
COPY ./start.sh /app/start.sh
COPY ./supervisord.conf /etc/supervisord.conf
WORKDIR /app
CMD ["/bin/bash", "/app/start.sh"]

步骤六:编译打包Kerberos镜像

在已经准备好的目录下面执行下面命令打包镜像:

代码语言:shell复制
docker build -t kerberos:1.0.0 ./

步骤七:启动Docker镜像

使用下面命令启动Kerberos相关的镜像:

代码语言:shell复制
docker run -d --name=kerberos kerberos:1.0.0

步骤八:在镜像外面访问Kerbero服务

  • 新建文件夹/home/zeekling/project/ling/kerberosTest/client,将步骤二中客户端配置拷贝到新建的文件夹下面。
  • 将客户端配置krb5.conf`加到环境变量中:
代码语言:javascript复制
export KRB5_CONFIG=/home/zeekling/project/ling/kerberosTest/client/krb5.conf
  • kinit cli用户,并且输入密码

0 人点赞