openldap-sasl身份认证镜像

背景

在这篇文章中,AD域信息同步至openLDAP我们使用了SASL将身份验证从OpenLDAP委托给AD”这种方案,本文主要来构建此方案的docker镜像。

sasl官网:Cyrus SASL

bitnami/openldap镜像地址:containers/Dockerfile

bitnami/openldap镜像集成 sasl文档说明(主要在14.5章节):[OpenLDAP Software 2.5 Administrator’s Guide](https://www.openldap.org/doc/admin25/guide.html#Using SASL)

其他镜像参考:openldap-sasl-proxy-authorization-docker

sasl验证原理

在openldap中,如果用户的userpassword包含{SASL}那么这种用户在访问openldap的时候,其身份验证就会呗sasl截取,去AD验证了,如果不包含,则走openldap自己的验证

其流程为:

在这里插入图片描述

/etc/saslauthd.conf为sasl的配置文件

其中,{SASL}的密码被拦截后,会去配置文件中的ldap_filter字段去AD服务器进行条件匹配,如果符合要求,则会验证密码;

OpenLDAP docker 部署

镜像
热度比较高的有两个镜像:osixia/openldap、bitnami/openldap

osixia/openldap:

集成了 TLS 安全认证,默认开启
个人维护
6个月前更新

bitnami/openldap:

没有做签名认证
团队维护
7天前更新
两者都没有做 SSL 安全认证,没有开 memberOf 功能,没有开账号安全策略,没有设置用户自主改密码

综合两者的优缺点,最终选择了 bitnami/openldap,没做的功能自己做

目录树

├── sh                
│   ├── docker                     # 部署需要的文件
│   │   ├── entrypoint.sh           # entrypoint.sh文件
│   │   ├── saslauthd.sh            # sasl文件             
├── Dockerfile                      # dockerfile

详情

Dockerfile文件

FROM bitnami/openldap:2.6.3

LABEL maintainer="xxxx"

ENV OPENLDAP_VERSION="2.6.7" \
    SASLAUTHD_VERSION="2.1.28" \
    LDAP_AD_SERVERS="ldap://ad.example.com:389/" \
    LDAP_AD_SEARCH_BASE="CN=DomainUsers,DC=example,DC=com" \
    LDAP_AD_TIMEOUT="10" \
    LDAP_AD_FILTER="(sAMAccountName=%U)" \
    LDAP_AD_BIND_DN="CN=admin,CN=Users,DC=example,DC=com" \
    LDAP_AD_PASSWORD="ADpassword"

USER root

COPY sh/docker/saslauthd.sh     /opt/bitnami/scripts/openldap/saslauthd.sh
COPY sh/docker/entrypoint.sh    /opt/bitnami/scripts/openldap/entrypoint.sh

RUN chmod +x /opt/bitnami/scripts/openldap/saslauthd.sh
RUN chmod +x /opt/bitnami/scripts/openldap/entrypoint.sh

RUN sed -i s@/deb.debian.org/@/mirrors.163.com/@g /etc/apt/sources.list

RUN apt-get clean \
    && apt-get update \
    && apt-get install -q -y sasl2-bin \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN chmod g+rwX /opt/bitnami

entrypoint.sh文件

#!/bin/bash

# shellcheck disable=SC1091

set -o errexit
set -o nounset
set -o pipefail

# Load libraries
. /opt/bitnami/scripts/liblog.sh

if [[ "$1" = "/opt/bitnami/scripts/openldap/run.sh" ]]; then
    info "** Starting LDAP setup **"
    /opt/bitnami/scripts/openldap/setup.sh
    info "** LDAP setup finished! **"
fi
# 执行 sasl 相关文件
sh /opt/bitnami/scripts/openldap/saslauthd.sh
echo ""
exec "$@"

saslauthd.sh文件

#!/bin/bash
cat > /etc/saslauthd.conf << EOF
ldap_servers: ${LDAP_AD_SERVERS}
ldap_search_base: ${LDAP_AD_SEARCH_BASE}
ldap_timeout: ${LDAP_AD_TIMEOUT}
ldap_filter: ${LDAP_AD_FILTER}
ldap_bind_dn: ${LDAP_AD_BIND_DN}
ldap_password: ${LDAP_AD_PASSWORD}
ldap_deref: never
ldap_restart: yes
ldap_scope: sub
ldap_use_sasl: no
ldap_start_tls: no
ldap_version: 3
ldap_auth_method: bind
EOF

sed -i 's/MECHANISMS="pam"/MECHANISMS="ldap"/' /etc/default/saslauthd 
sed -i 's/START=no/START=yes/' /etc/default/saslauthd
echo "chmod -R 777 /var/run/saslauthd" >> /etc/init.d/saslauthd

echo "mech_list: plain EXTERNAL" >> /usr/lib/sasl2/slapd.conf 
echo "pwcheck_method: saslauthd" >> /usr/lib/sasl2/slapd.conf 
echo "saslauthd_path: /var/run/saslauthd/mux" >> /usr/lib/sasl2/slapd.conf

/etc/init.d/saslauthd start
echo "==========saslauthd start =========="

Docker命令

构建镜像

# 进入与Dockerfile同级的目录执行
docker build -t openldap-sasl2:v1.0 -f Dockerfile .

docker启动

docker run -d --name openldap2 -p 389:1389 \
-u root \
--restart=always \
-e LDAP_ADMIN_USERNAME='admin' \
-e LDAP_ROOT='dc=abc,dc=com' \
-e LDAP_ADMIN_PASSWORD='123456' \
-e LDAP_AD_SERVERS='ldap://xx.xx.xx:389' \
-e LDAP_AD_SEARCH_BASE='OU=users,DC=def,DC=com' \
-e LDAP_AD_TIMEOUT=10 \
-e LDAP_AD_FILTER='(|(cn=%u)(userPrincipalName=%u)(sAMAccountName=%u)(telephoneNumber=%u))' \
-e LDAP_AD_BIND_DN='CN=admin,CN=Users,DC=def,DC=com' \
-e LDAP_AD_PASSWORD='111111' \
openldap-sasl2:v1.0

进入容器

docker exec -it 容器id /bin/bash

验证sasl服务(账户为AD用户以及AD密码)

testsaslauthd -u user01@def.com -p 22222

验证openldap服务(账户为openldap用户以及openldap密码)

ldapwhoami -x -H ldap://127.0.0.1:1389 -D cn=admin,dc=abc,dc=com -w 123456

给openldap添加用户

cat >> user1.ldif <<EOF
dn: uid=user01,ou=users,dc=abc,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
uid: user01
cn: user01
sn: user01
userpassword: {SASL}user01@def.com
givenname: user01
mail: user01@def.com
EOF



ldapadd -x -H ldap://127.0.0.1:1389 -w "123456" -D "cn=admin,dc=abc,dc=com" -f user1.ldif

使用AD的密码去验证用户

ldapwhoami -x -H ldap://127.0.0.1:1389 -D uid=user01,ou=users,dc=abc,dc=com -w 22222

动态查询docker日志

docker logs -f -t --since="2023-02-23" --tail=50 97

AD搜索语句

ldapsearch -x -H ldap://xxx.xx.xx.xx:389/ -D CN=admin,CN=Users,DC=def,DC=com -w 111111  -b "ou=xxx,ou=xxxx,ou=xxx,dc=def,dc=com" "(userPrincipalName=user01@def.com)"

踩坑点

运行docker容器报错

standard_init_linux.go:228: exec user process caused: no such file or directory。

这是由于编码环境是Windows系统,而容器运行或镜像编译环境是Linux系统,换行格式不同造成的

解决方案:

可以使用代码编辑器(以VScode为例),修改文件格式。在打开文件时,软件右下角会有“选择行尾序列选项”,把CRLF(Windows)更改为LF(Linux)就好了。

docker使用entrypoint执行时报permission denied错误

在Dockerfile中使用指令ENTRYPOINT来执行项目下entrypoint.shshell文件,如下:

ENTRYPOINT ["./entrypoint.sh"]

时报错提示:

Exec: "./entrypoint.sh": permission denied

很明显问题在于用户没有文件的执行权限。

解决方案:

添加:

RUN chmod +x /opt/bitnami/scripts/openldap/xxx.sh

sasl验证的时候日志报错(Failure: cannot connect to saslauthd server: Permission denied)

明显是个权限问题

解决方案

在saslauthd.sh文件中添加

echo "chmod -R 777 /var/run/saslauthd" >> /etc/init.d/saslauthd

sasl验证的时候报错(Invalid credentials (49))

这种情况分为两种:

  1. 仔细核对dn以及密码,确保密码正确;
  2. 编码问题,有可能是window和linux系统编码不一致,所以在linux输入!!!!!!!!!(这个问题极其蛋疼)

参考文献

OpenLDAP docker 部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/156690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React升级到18版本

前言 升级前react版本是16.9.0&#xff0c;react-dom版本为16.9.0&#xff0c;react-router-dom为5.1.2版本。 安装 // npm npm install react react-dom// yarn yarn add react react-dom// pnpm pnpm install react react-dom启动项目 此时&#xff0c;项目可以正常运行&…

计算机领域十大天神

✍️作者简介&#xff1a;沫小北/码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&…

CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

【导师不教&#xff1f;我来教&#xff01;】同济计算机博士半小时就教会了我五大深度神经网络&#xff0c;CNN/RNN/GAN/transformer/LSTM一次学会&#xff0c;简直不要太强&#xff01;_哔哩哔哩_bilibili了解的五大神经网络&#xff0c;整理笔记如下&#xff1a; 视频是唐宇…

git的简单使用

git 的简单使用 前言&#xff1a; 为了方便理解&#xff0c;文中一些内容表达的不是十分准确&#xff0c;如有错误&#xff0c;欢迎大家友善的指出。 接下来就开始了&#xff01;&#xff01; 使用git其实就是围绕下面这个图展开的&#xff0c;大家可以先看下图&#xff0c…

到站上海!见证这座零碳园区的绿色低碳新选择

不知不觉中&#xff0c;科士达新能源的零碳足迹已遍布五洲四海&#xff0c;为全球各地&#xff0c;千行百业、千家万户&#xff0c;带去了源源不断的绿色能源和低碳新选择。再次启航&#xff0c;这一站&#xff0c;抵达上海世博园。 小机身&#xff0c;大配置&#xff0c;灵活适…

【开源】基于Vue.js的社区买菜系统的设计和实现

项目编号&#xff1a; S 011 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S011&#xff0c;文末获取源码。} 项目编号&#xff1a;S011&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1…

Pandas 将DataFrame中单元格内的字典dict拆分成单独的列

核心是应用 pd.Series&#xff0c; 具体操作如下&#xff1a; import pandas as pddata {years: [2025],week: [{f"week_{i}": i for i in range(3)}]} df pd.DataFrame(data) print(df)df pd.concat([df, df[week].apply(pd.Series)], axis1).drop(week, axis1)…

java学习part03基本类型

22-变量与运算符-标识符的使用_哔哩哔哩_bilibili 1.标识符&#xff08;变量&#xff09;命名规则 2.变量类型 3.整型 4.浮点型 5.char字符 6.布尔boolean 7.基本类型的自动提升 8.强制转换 9.String String只能连接 会把其他类型的表面量转成字符串比如"true" &…

C++--第一个代码hello world

本篇开启C之旅... 先上代码&#xff1a; #include<iostream> using namespace std; int main() {cout << "hello world\n";return 0; }一. #include <iostream> 类比C语言中的#include<stdio.h>, #include <iostream>也是预处理指令…

喜讯 客户工艺线顺利通线

带你了解CiMEMS微纳制造工艺线 随着国内智能网联汽车、智能终端、可穿戴设备与消费电子的高速发展&#xff0c;以集成微纳系统&#xff08;Micro-electro-mechanical Systems&#xff0c;MEMS&#xff09;为代表的主要应用于激光雷达、汽车电子、环境感知与智能传感器的芯片&a…

[CISCN 2023 华北]pysym

源码如下 from flask import Flask, render_template, request, send_from_directory import os import random import string app Flask(__name__) app.config[UPLOAD_FOLDER]uploads app.route(/, methods[GET]) def index():return render_template(index.html) app.route…

Wordpress页面生成器:Elementor 插件制作网站页面教程(图文完整)

本文来教大家怎么使用Wordpress Elementor页面编辑器插件来自由创建我们的网页内容。很多同学在面对建站的时候,一开始都是热血沸腾信心满满的,等到实际上手的时候就会发现有很多问题都是无法解决的,希望本篇Elementor插件使用指南能够帮助到你。 Wordpress Elementor页面编…

【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)

1. 概念理解 逻辑回归&#xff0c;简称LR&#xff0c;它的特点是能够将我们的特征输入集合转化为0和1这两类的概率。一般来说&#xff0c;回归不用在分类问题上&#xff0c;但逻辑回归却能在二分类(即分成两类问题)上表现很好。 逻辑回归本质上是线性回归&#xff0c;只是在特…

【开源】基于JAVA的服装店库存管理系统

项目编号&#xff1a; S 052 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S052&#xff0c;文末获取源码。} 项目编号&#xff1a;S052&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

通过内网穿透技术实现USB设备共享(USB Redirector)逆向共享

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

Leetcode—2760.最长奇偶子数组【简单】

2023每日刷题&#xff08;三十一&#xff09; Leetcode—2760.最长奇偶子数组 实现代码 #define MAX(a, b) ((a > b) ? (a): (b)) int longestAlternatingSubarray(int* nums, int numsSize, int threshold){int ans 0;int i 0;while(i < numsSize) {if(nums[i] >…

Nginx的使用

Nginx的使用 1、反向代理一 实现效果&#xff1a;使用 nginx 反向代理&#xff0c;访问 www.123.com 直接跳转到 127.0.0.1:8080 准备工作 : &#xff08;1&#xff09;在 linux 系统安装 tomcat&#xff0c;使用默认端口 8080 &#xff08;2&#xff09;tomcat 安装文件放…

基于Vue+SpringBoot的大学计算机课程管理平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

2023数维杯数学建模C题完整版本

已经完成全部版本&#xff0c;获取请查看文末下方名片 摘要 随着人工智能在多个领域的快速发展&#xff0c;其在文本生成上的应用引起了广泛关注。本研究聚焦于辨识人工智能&#xff08;AI&#xff09;生成文本的基本规则&#xff0c;并探究AI文本的检测及其与人类文本的区分…

BlockCanary

卡顿检测框架,比如Activity Service ,BroadcastResoleve等,或者有延时执行造成卡顿 针对这些情况进行监控 引用: 初始化: 捕获异常结果: 源码: 使用双重锁的单例模式,enable 跳转到通知 主线程的监视器 Loop循环调用消息 根据dispathMessage判断是否造成卡顿,也就是消息的间…