你好! 这是本人第一次写博客,请大家多多包涵

1.使用并安装docker

安装docker主要分四步,先卸载本机中已经有的docker包,然后下载必要的组件,加入yum源,最后安装docker

sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2
sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io

由于国内官网的docker源比较慢,这里采用阿里源,并且关闭防火墙,当然生产环境建议设置ip白名单,ldap默认389端口,ldap-admin使用4389端口

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://vbd65v07.mirror.aliyuncs.com"],"log-opts": {"max-size":"500m", "max-file":"3"}
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable dockerfirewall-cmd --add-port=389/tcp --permanent
firewall-cmd --add-port=4389/tcp --permanent
sudo systemctl restart firewalld

到了这里docker环境就安装完毕了

2.拉取docker镜像

镜像包涵两个一个是openldap镜像一个是lam-admin图形化的镜像

docker pull osixia/openldap
docker pull ldapaccountmanager/lam

3.接下来就是运行容器了

首先需要设置rsyslog用于记录容器中的日志,用于记录容器状态,和用户访问日志生成的目录保存在宿主机的/var/log/messages下

echo "\$ModLoad imtcp" >> /etc/rsyslog.conf
echo "\$InputTCPServerRun 514" >> /etc/rsyslog.conf
systemctl restart  rsyslog
netstat -ntul |grep 514

执行定时任务对日志进行备份,每个月1号0点0分进行日志备份和清理,备份的目录为/openldap/log

crontab -e
0 0 1 * * root sh /log/copy.shecho "0 0 1 * * root sh /log/copy.sh" >> /etc/crontab
mkdir /log
touch /log/copy.sh
cat>/log/copy.sh<<EOF
#!bin/bash
time2=\$(date "+%Y%m%d%H%M.log")
cp /var/log/massage /log/\$time2
rm -f /var/log/massage
find /log/ -mtime +1100 -name "*.log" -exec rm -rf {} \;
systemctl restart  rsyslog
EOF
systemctl enable crond.service
service crond restart
service crond status -l

在第一台机器ldap1.example.com上运行,/openldap目录用于存放日志,数据库和overlay信息。

mkdir /openldap
mkdir /openldap/log
mkdir /openldap/ldap
mkdir /openldap/slapd.d
docker run -v /openldap/slapd.d:/etc/ldap/slapd.d -v /openldap/ldap:/var/lib/ldap -v /openldap/log:/var/log --log-driver syslog --log-opt syslog-address=tcp://127.0.0.1:514 --log-opt tag=ldap1 --name ldap1 --restart=always --hostname ldap1.example.com --add-host ldap1.example.com:192.168.137.128 --add-host ldap2.example.com:192.168.137.129 --env LDAP_ORGANISATION="example" --env LDAP_DOMAIN="example.com" --env LDAP_REPLICATION_HOSTS="#PYTHON2BASH:['ldap://ldap1.example.com','ldap://ldap2.example.com']" --env LDAP_REPLICATION=true --env LDAP_ADMIN_PASSWORD="111111" -p 389:389 --detach osixia/openldap:latest
docker run -d --restart=always --name ldap-account-manager -p 4389:80 --detach ldapaccountmanager/lam:latest

这里的example.com为openldap的域名,111111为admin的密码,192.168.137.129为第二台机器的ip地址用于两台机器的通讯互通。

在第二台机器ldap2.example.com上以同样的方式运行

echo "\$ModLoad imtcp" >> /etc/rsyslog.conf
echo "\$InputTCPServerRun 514" >> /etc/rsyslog.conf
systemctl restart  rsyslog
netstat -ntul |grep 514mkdir /openldap
mkdir /openldap/log
mkdir /openldap/ldap
mkdir /openldap/slapd.d
docker run -v /openldap/slapd.d:/etc/ldap/slapd.d -v /openldap/ldap:/var/lib/ldap -v /openldap/log:/var/log --name ldap2 --restart=always --log-driver syslog --log-opt syslog-address=tcp://127.0.0.1:514 --log-opt tag=ldap2 --hostname ldap2.example.com --add-host ldap1.example.com:192.168.137.128 --add-host ldap2.example.com:192.168.137.129 --env LDAP_ORGANISATION="example" --env LDAP_DOMAIN="example.com" --env LDAP_REPLICATION_HOSTS="#PYTHON2BASH:['ldap://ldap1.example.com','ldap://ldap2.example.com']" --env LDAP_REPLICATION=true --env LDAP_ADMIN_PASSWORD="111111" -p 389:389 --detach osixia/openldap:latest
docker run -d --restart=always --name ldap-account-manager -p 4389:80 --detach ldapaccountmanager/lam:latest

这里的example.com为openldap的域名,111111为admin的密码,192.168.138.128为第一台机器的ip地址用于两台机器的通讯互通。

到这里就完成了高可用openldap的搭建,接下来就要添加sudo模块和ppolicy模块

4.sudo模块添加

以下内容需要在两台机器上分别执行,本教程以ldap1为例
进入容器

docker exec -it ldap1 /bin/bash

填加sudo的overlay模块

cat<<EOF|ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo
olcAttributeTypes: {0}( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may  run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {2}( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {3}( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {4}( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {5}( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {6}( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {7}( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Start of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: {8}( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: {9}( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an integer to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcObjectClasses: {0}( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'SudoerEntries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand$ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ sudoNotBefore $ sudoNotAfter $ description ) )
EOF

添加sudo功能

cat<<EOF|ldapadd -x -W -D "cn=admin,dc=example,dc=com"
dn: ou=SUDOers,dc=example,dc=com
ou: SUDOers
objectClass: top
objectClass: organizationalUnitdn: cn=defaults,ou=SUDOers,dc=example,dc=com
objectClass: sudoRole
cn: defaults
sudoOption: requiretty
sudoOption: !visiblepw
sudoOption: always_set_home
sudoOption: env_reset
sudoOption: env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
sudoOption: env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
sudoOption: env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
sudoOption: env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
sudoOption: env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
sudoOption: secure_path = /sbin:/bin:/usr/sbin:/usr/bin
sudoOption: logfile = /var/log/sudo
EOF

并输入admin的密码111111,最后添加一个sudo的目录。用户为800001,之后用户可以用图形化的方法更改

cat<<EOF|ldapadd -x -W -D "cn=admin,dc=example,dc=com"
dn: cn=sudo_ops_role,ou=SUDOers,dc=example,dc=com
objectClass: sudoRole
cn: sudo_ops_role
sudoOption: !authenticate
sudoRunAsUser: root
sudoCommand: ALL
sudoHost: ALL
sudoUser: 800001
EOF

5.ppolicy密码模块

由于默认的ldap密码策略无法满足苛刻的生产环境于是乎需要添加ppolicy模块

cat<<EOF|ldapmodify -Y EXTERNAL -H ldapi:///
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy.la
EOFcat<<EOF|ldapmodify -Y EXTERNAL -H ldapi:///
dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
changeType: add
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=ppolicy,dc=example,dc=com
olcPPolicyHashCleartext: TRUE
EOF

创建默认策略

cat<<EOF|ldapadd -x -W -D "cn=admin,dc=example,dc=com"
dn: ou=ppolicy,dc=example,dc=com
objectClass: organizationalUnit
objectClass: top
ou: ppolicydn: cn=default,ou=ppolicy,dc=example,dc=com
cn: default
objectClass: top
objectClass: device
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdCheckQuality: 2
pwdExpireWarning: 604800
pwdFailureCountInterval: 0
pwdGraceAuthnLimit: 5
pwdInHistory: 5
pwdLockout: TRUE
pwdLockoutDuration: 600
pwdMaxAge: 0
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 8
pwdMustChange: FALSE
pwdSafeModify: FALSE
pwdCheckModule: check_password.so
EOF

添加密码审计功能

cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: auditlogdn: olcOverlay=auditlog,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcAuditLogConfig
olcAuditlogFile: /var/log/slapd/auditlog.log
EOFcat << EOF | ldapmodify -c -Y EXTERNAL -Q -H ldapi:///
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=example,dc=com" write by anonymous auth by * read
olcAccess: {1}to * by self write by dn="cn=admin,dc=example,dc=com" write by * read
EOF

至此就完成了服务器端的搭建接下来,就来介绍一下lam-admin的web管理

6.客户端访问 (对应客户端服务的ip+端口)

http://127.0.0.1:4389
登录前请进行相关设置,请参考以下设置规则

(1)先进行登录前的设置,点击右上角 LAM configuration 菜单进行设置

(2)点击 Edit server profiles 菜单,进行相关设置, 默认密码为 lam

(3)设置对应服务端IP和LDAP域名(IP为容器对应容器IP,内网ip:192.168.44.147或者公网IP,验证数据同步时,设置不同容器IP连接即可,LDAP域名要和容器运行时候设置 LDAP_DOMAIN 一致,格式为 dc=example,dc=com),和客户端管理员用户(默认admin)

(4)默认初始化两个组(这个可以不设置,注意格式为:ou=people,dc=example,dc=com ,ou可以自定义,dc要和容器运行时候设置 LDAP_DOMAIN 一致)

(5)点击模块设置建议勾选memberUid不然设置用户组时会报错

(6)设置完成后,进入首页进行登录,密码为容器运行时候设置 LDAP_ADMIN_PASSWORD 密码 111111

到这里服务器端配置就全部做完了,至于访问控制部分,建议还是通过堡垒机的方式去管理,经过测试目前有两种方式能通过openldap进行访问控制(基于主机名和基于用户组)。
基于主机名的话1.动态host经过测试有,host添加组后,由于bug无法成功同步到人。2.静态host的方式在实际管理起来过于复杂。
基于用户组的话一旦发生团队变动(合并或解散)时,需要更改所有服务器的客户端的配置,上千台生产服务器去动风险太大,不建议采用。
而通过堡垒机管理的话只需要在客户机上access文件上指定堡垒机的ip即可,省下的交给堡垒机即可。

基于docker的高可用openldap(包含lam-admin网页和sudo,ppolicy模块)相关推荐

  1. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    大家一定非常熟悉如何利用Docker启动单个Redis容器用于开发环境,本文将介绍如何利用Docker Compose模板在本机和云端部署基于Sentinel的高可用Redis 3集群. Redis集 ...

  2. s19.基于 Kubernetes v1.25 (kubeadm) 和 Docker 部署高可用集群(一)

    基于 Kubernetes v1.25 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成 容器运行时 CRI Kubernetes v1.25 新特性 Kubernete ...

  3. s20.基于 Kubernetes v1.25 (kubeadm) 和 Docker 部署高可用集群(二)

    4.4 安装 Docker master和node安装docker-ce: [root@k8s-master01 ~]# cat install_docker.sh #!/bin/bash # #** ...

  4. 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群

    1.总结Underlay和Overlay网络的的区别及优缺点 Overlay网络:  Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的 基础之上叠加实现新的虚拟网络,即可使网络的中的容器可 ...

  5. 轻松实现基于Heartbeat的高可用web服务集群

    高可用集群就是为了保证某项服务能够时时在线,我们可以通过几个9来衡量一个高可用集群提供服务的稳定性,例如5个9的高可用集群必须保证服务一年在线的时间占99.999%,也就是说一年的时间中仅允许服务电线 ...

  6. 实现基于Keepalived主从高可用集群网站架构

    背景 上一期我们实现了基于lvs负载均衡集群的电商网站架构,随着业务的发展,网站的访问量越来越大,网站访问量已经从原来的1000QPS,变为3000QPS,目前业务已经通过集群LVS架构可做到随时拓展 ...

  7. MaxCompute,基于Serverless的高可用大数据服务

    2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的"阿里云栖开发者沙龙大数据技术专场"走近北京联合大学,本次技术沙龙上,阿里巴巴高级技术专家吴永 ...

  8. MaxCompute,基于Serverless的高可用大数据服务 1

    为什么80%的码农都做不了架构师?>>>    摘要:2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的"阿里云栖开发者沙龙大数据技术专 ...

  9. Kafka基于Zookeeper搭建高可用集群实战

    Kafka基于Zookeeper搭建高可用集群实战 1 前言 1.1 高可用的由来 为何需要Replication? 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Bro ...

最新文章

  1. Windows Live Writer新版新功能试用
  2. Object C学习笔记20-结构体
  3. 下载恶意pcap包的网站汇总
  4. mybatis配置ehcache缓存
  5. AWS_EC2_Oracle安装教程
  6. mysql replication 配置_MySQL Replication配置主从的教程
  7. boost::graph模块实现closeness中心性的测试程序
  8. 数据结构与算法(一):排序算法之 - 快速排序(详细步骤图解,附代码)
  9. Holedox Moving
  10. 数据结构--汉诺塔--借助栈实现非递归---Java
  11. python代码封装加密_静态编译python源代码,使用Nuitka加密你的py源码
  12. OLTP和OLAP的区别
  13. Linux面试题100道
  14. java final对象_JAVA final 与 不可变对象
  15. WEB前端资源项目整合
  16. Go的研习笔记-day11(以Java的视角学习Go)
  17. 计算机之父图灵获英女王赦免
  18. FCPX注释解说文字标题插件:motionVFX mCallouts Simple 2
  19. 无线传感器网络的时钟同步估计问题(Matlab代码实现)
  20. PHP编程54条必知

热门文章

  1. matlab调整legend大小,【MATLAB】调整legend的大小位置
  2. qzwxecasd测试1234
  3. 2、[python]编辑器
  4. 大数据 是把“双刃剑”
  5. JAVA商城项目(微服务框架)——第7天nginx+cors解决跨域+品牌+分类查询
  6. 年薪30万+!卖菜小哥到高薪程序员之路,我的三种人生境界
  7. win10文件夹变成exe病毒的解决方法
  8. Artstudio Pro Mac版 绘图与图片编辑软件
  9. 魔方大数据系列圆桌论坛(22)之 “数据智能助力产业升级“ 暨国内首个大数据微应用实验室落户上海超级计算中心签约仪式
  10. java 库存出入货物程序设计