OpenLDAP+iRedMail+GitLab统一身份认证邮件代码仓库系统的解决方案

news/2024/7/24 12:32:50

前言: iRedMail官方提供有各平台的自动安装脚本,整个安装过程并不复杂,重点在于安装后接入LDAP的配置。OpenLDAP的配置是出了名的恶心,尤其是网上大部分文档过于老旧,大多数情况下并不适用于当下。

一、说明

本文档操作环境如下:

操作系统: Ubuntu 22.04.1 LTS

硬件资源: AWS EC2 2Core 8GB

软件版本: iRedMail 1.6.2 , OpenLDAP 2.5.13 , GitLab latest

域名:mydomain.com

服务器private IP: 172.31.16.124

二、配置iRedMail

iRedMail是一个基于Linux/BSD 系统的企业级邮件服务器解决方案。最重要的是它是开源,免费的项目,可进行二次开发,安装过程也比较简单。它的官方完整安装文档在https://docs.iredmail.org/,(基础内容有中文版本,详细配置只有英文,英语阅读能力较强的同学可以根据官方文档进行安装和配置。)这里我们按照Install iRedMail on Debian or Ubuntu Linux的章节进行配置。

注意:

(1)阿里云、腾讯云均禁止使用邮件服务所必须的 25 端口提供邮件服务,因此您不能在 它们的云服务器部署邮件服务器。经测试AWS EC2同样限制了25端口,如需解除限制可以开个case说明情况。

(2)iRedMail 只针对全新安装的操作系统设计,它要求你的操作系统上 没有 事先 安装邮件服务相关的组件,例如 MySQL,OpenLDAP,Postfix,Amavisd,等。 iRedMail 会自动安装和配置邮件服务所需的组件,因此如果操作系统上已有相关 组件,iRedMail 可能会打乱你的配置并造成服务无法正常启动。

1、配置前准备

设置主机完整域名(FQDN):

修改文件/etc/hostname,内容为:

mx

修改文件/etc/hosts,定义主机名和 IP 地址的对应关系

127.0.0.1   mx.mydomain.com mx localhost localhost.localdomain

重启服务器

sudo reboot

防火墙需开放端口: 22 25 80 110 143 389 443 2222 8888 8099

2、安装iRedMail

(1)安装依赖组件

sudo apt-get install gzip dialog

(2)下载iRedMail安装工具包

访问https://www.iredmail.org/download.html找到下载链接

sudo su
cd /root
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.6.2.tar.gz
tar zxf 1.6.2.tar.gz
cd iRedMail-1.6.2
bash iRedMail.sh

(3)安装配置iRedMail

安装过程会以交换形式进行,需要注意的地方有

Choose preferred backend used to store mail accounts 选择 OpenLDAP

LDAP suffix (root dn) 输入 dc=mydomain,dc=com

Your first mail domain name 输入 mydomain.com

Password for the mail domain administrator 输入 12345678

安装完成后查看文件 /root/iRedMail-1.6.2/iRedMail.tips, 这里记录会所有iRedMail相关服务和组件的信息。

(4)设置DNS解析

在你的域名提供商那里,设置如下DNS解析:

主机记录记录类型值

@                A        <public ip>    
mail             A        <public ip>    
@                MX       mail.mydomain.com    
gitlab           A        <public ip>        

(5)配置 SSL 证书

配置前准备:

sudo vim /etc/nginx/sites-enabled/00-default-ssl.conf  

修改server_name这一行为:

server_name mail.mydomain.com;

停止nginx

sudo service nginx stop 

如果不配置nginx的server_name和停止nginx服务,certbot会安装失败。

使用 Let's Encrypt 提供免费的 SSL 证书,访问https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal根据官方文档进行操作

由于Ubuntu22.04自带snap,可以跳过snap的安装,直接更新snap

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo certbot --nginx

配置过程中会提示你输入证书域名: mail.mydomain.com

配置结束后启动nginx

sudo service nginx start

(6)在浏览器中访问https://mail.mydomain.com/mail

邮箱管理员账号为 postmaster@mydomain.com

密码是安装iRedMail时输入的密码12345678,当然也可以在/root/iRedMail-1.6.2/iRedMail.tips文件中找到

登入成功表示iRedMail服务搭建完毕。

注意:由于机房限制25端口,在未解除限制前,邮件服务器仅能接收和本域名范围内发送邮件。

2、安装GitLab

(1)安装

创建工作目录:

mkdir -p /home/ubuntu/work/gitlab && cd /home/ubuntu/work/gitlab

创建docker-compose.yml文件,内容为:

version: '3.6'
services:
  web:
    container_name: 'gitlab'
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    hostname: 'mx.mydomain.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://mail.mydomain.com:8888'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        gitlab_rails['ldap_enabled'] = true
        gitlab_rails['ldap_servers'] = {
          'main' => {
            'label' => 'LDAP',
            'host' =>  '172.31.16.124',// 注意替换为自己服务器的private IP
            'port' => 389,
            'uid' => 'uid',
            'encryption' => 'plain',
            'allow_username_or_email_login' => true,
            'user_filter' => '(memberof=cn=GitLab,ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com)',      // GitLab组的成员可以登入
            'block_auto_created_users' => false,
            'lowercase_usernames' => false,
            'bind_dn' => 'cn=vmail,dc=mydomain,dc=com',
            'password' => '<vmail password>',
            'base' => 'ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com'
          }
        }
    ports:
      - '8888:8888'
      - '2222:22'
    volumes:
      - '/home/ubuntu/work/gitlab/config:/etc/gitlab'
      - '/home/ubuntu/work/gitlab/logs:/var/log/gitlab'
      - '/home/ubuntu/work/gitlab/data:/var/opt/gitlab'
    shm_size: '256m'

启动容器:

docker compose up -d 

(2)配置

创建GitLab本地管理员账号:

sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

获取密码后在网页上登录:http://gitlab.mydomain.com:8888 (登录框中选择Standard)

登录成功则说明GitLab安装成功。

3、配置OpenLDAP

(1)安装phpldapadmin

由于iRedMail在安装过程中会自动安装OpenLDAP并将其各组件接入OpenLDAP,且iRedMail的LDAP规则过于复杂,不建议新手单独创建OpenLDAP服务并配置接入。

OpenLDAP的命令行配置过于反人类,需要安装phpldapadmin救命。因为iRedMail自动安装了web服务,为避免冲突这里使用docker安装phpldapadmin

创建工作目录:

mkdir -p /home/ubuntu/ici/work/phpldapadmin
cd /home/ubuntu/work/phpldapadmin

创建docker-compose.yml文件,内容为:

version: "3"
services:
  phpldapadmin:
    container_name: phpldapadmin-single
    image: osixia/phpldapadmin:0.9.0-amd64
    restart: always
    ports:
      - 8099:80
    volumes:
      - /etc/localtime:/etc/localtime
    environment:
      - PHPLDAPADMIN_LDAP_HOSTS=172.31.16.124// 注意替换为自己服务器的private IP
      - PHPLDAPADMIN_HTTPS=false
    deploy:
      resources:
        limits:
           memory: 1G
        reservations:
           memory: 256M

启动容器:

docker compose up -d

如提示docker-compose命令不存在,可以用 apt install docker-compose 来安装命令。

启动完成后,通过http://mail.mydomain.com:8099访问LDAP页面。

管理员账号信息在/root/iRedMail-1.6.2/iRedMail.tips文件中可以找到,类似于

* LDAP root dn: cn=Manager,dc=mydomain,dc=com, password: xxxxxxxxxxxxxxxxxxxxxxxxxxx

注意:账号不要只输入 Manager 要输入完整信息:cn=Manager,dc=mydomain,dc=com

(2)启用memberOf模块

默认情况下,OpenLDAP的用户组属性为Posixgroup,起与用户之间没有实际对应关系,这会导致LDAP无法根据用户与组之间的隶属关系做查询。而在实际的项目和组织架构管理中,这种隶属关系的应用很普遍,所以需要启用LDAP的memberOf模块。普遍情况下启动memberOf模块并不复杂,网上的教程和文档也很多,但由于这里的OpenLDAP是由iRedMail自动安装和配置的,网上的资源完全无法使用。为什么会出现这种情况?

OpenLDAP是在iRedMail的自动安装脚本过程中自动被安装的,我们无法控制这一过程,我曾尝试先安装配置OpenLDAP后再将iRedMail手动接入,但由于iRedMail所包含的组件较多,涉及到LDAP的相关配置很复杂最终放弃。在这种情况下我们只有一条路可以走,那就是使用iRedMail自动配置好的OpenLDAP策略,这会导致一个问题,OpenLDAP的静态配置和动态配置问题,所谓静态配置:我想修改LDAP的配置,我只能修改/etc/ldap/slapd.conf这配置文件,删除slapd.d目录后,通过slaptest重新生成子配置文件,重启OpenLDAP生效。动态配置:使用ldapadd通过编辑ldif文件内容执行OpenLDAP配置,这需要执行一条命令,不需要重启服务。不幸的是iRedMail安装的OpenLDAP使用的是静态配置,而网上的教程采用的是动态配置。所以不管你怎么执行动态配置的命令,都无法修改slapd.d目录下的内容,也就无法添加memberof模块。

静态配置memberof模块的方法如下:

修改/etc/ldap/slapd.conf文件:在moduleload back_monitor的下一行插入2行:

moduleload memberof
moduleload refint

在database monitor的上一行添加:

database config
access to *
    by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
    by * none

在database mdb的下一行添加:

overlay memberof
overlay refint

保存文件后,退出

通过下面的命令刷新配置文件

sudo rm -r /etc/ldap/slapd.d
sudo mkdir /etc/ldap/slapd.d
sudo slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d
sudo chown -R openldap:openldap /etc/ldap/slapd.d
sudo service slapd restart

以上方法参考资料:https://www.openldap.org/doc/admin24/overlays.html

https://forum.iredmail.org/topic8673-general-ldap-setup-question.html

(3)创建组织架构

创建邮箱用户:

sudo su
cd /root/iRedMail-1.6.2/tools/

编辑create_mail_user_OpenLDAP.sh

修改信息为自己的:

LDAP_SUFFIX="dc=mydomain,dc=com"
BINDPW='<your_password>'

DEFAULT_PASSWD='888888'//固定的初始密码
USE_DEFAULT_PASSWD='YES'     //YES表示启用固定初始密码,NO表示不启用,密码默认为与账号相同

修改好后保存退出,使用命令创建用户:

bash create_mail_user_OpenLDAP.sh mydomain.com demo

创建git组,并把demo用户加到组里:

cat  > gitgroup.ldif << EOF
dn: cn=GitLab,ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
cn: GitLab
objectClass: groupOfNames
objectClass: top
Member: mail=demo@mydomain.com,ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
EOF

ldapadd -D "cn=Manager,dc=mydomain,dc=com" -w <your_password> -x -f  gitgroup.ldif

登录gitlab: http://gitlab.mydomain.com:8888 (选择LDAP方式登录)

输入账号: demo

密码: 888888

登入成功则说明GitLab接入LDAP成功。后续新建账号后,可在phpldapadmin上选择GitLab组,在member属性下加入用户。


http://www.niftyadmin.cn/n/172863.html

相关文章

‘/’ 和 ‘%’ 在编程中的作用【附加练习题】

‘/’和‘%’在编程中有非常重要的作用&#xff0c;使用它们可以说是在使用一种简单算法&#xff0c;不仅易于理解&#xff0c;而且会极大的减少你的代码量&#xff0c;让你的程序看起来高级一点点&#x1f92a;&#xff01;/ 除我们通常都是除10的倍数&#xff0c;比如‘10’只…

程序员的代码行数越少越好?

有些人可能会认为&#xff0c;应用程序中的代码行越少&#xff0c;就越容易阅读。这句话只有部分正确&#xff0c;我认为代码可读性的度量标准包括&#xff1a;代码应具备一致性代码应具备自我描述性代码应具备良好的文档代码应使用稳定的现代功能代码不应过于复杂代码的性能不…

十七、网上商城项目(3)

本章概要 商品列表 商品列表项组件商品列表组件 分类商品和搜索结果页面 Loading 组件Books 组件 17.4 商品列表 商品列表页面以列表形式显示所有商品&#xff0c;将商品列表和商品列表项分别定义为单独的组件&#xff0c;商品列表组件作为父组件在其内部循环渲染商品列表项…

AVL树大讲堂

1.基础概念介绍 首先在前面我们介绍了二叉搜索树&#xff0c;但是如果当存储的数据接近有序或者恰巧有序的时候&#xff0c;二叉搜索树将逐渐退化为单支树&#xff0c;导致搜索效率降低&#xff0c;因此我们的avl树便为了解决这一问题而诞生了。 基础性质&#xff1a;当向二叉…

HTTP协议详解(二)

目录 1.HTTP 响应详解 1.1认识状态码(status code) 1.2 认识响应报头(header) 1.3 认识响应正文(body) 2.构造 HTTP 请求 2.1 通过form表单构造请求 2.2 通过ajax构造请求 2.3 使用第三方工具构造请求 开始之前我们先复习一下http协议格式 1.HTTP 响应详解 我们先抓包…

xss-labs靶场分析及绕过

level1源码&#xff1a;图中框示的为注入点&#xff0c;下同payloadname<script>alert(1)</script>注入结果&#xff1a;原理&#xff1a;由于第一关没有做任何的过滤所以直接注入就行level2源码&#xff1a;payload&#xff1a;keyworda"><script>a…

python基础编程(Ⅲ)

文章目录1、循环介绍2、while循环的使用3、continue和break4、死循环5、循环嵌套6、循环嵌套案例&#xff1a;7、for循环8、for循环中的break 和continue9、for循环嵌套1、循环介绍 有条件的重复做相似的事情Python中循环分为while 和for 2、while循环的使用 格式&#xff1a…

2023年全国最新安全员精选真题及答案29

百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 81.&#xff08;单选题&#xff09;同一建筑施工企业在12个月内连续发生&#xff08;&…