LDAP是一款轻量级目录访问协议(Lightweight Directory Access Protocol,简称LDAP),属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。
一般会将svn,git,VPN,等一系列账号做一个统一管理,ldap是非常好的选择
1.启动ldap和Web UI管理工具,如果想通过浏览器控制 OpenLDAP ,可以使用 phpldapadmin
#启动openladp docker run \ --restart=always \ -v /etc/localtime:/etc/localtime:ro \ -p 389:389 \ -p 636:636 \ --name myopenldap \ --env LDAP_ORGANISATION="ilovesally" \ --env LDAP_DOMAIN="ilovesally.com" \ --env LDAP_ADMIN_PASSWORD="123456" \ -v /openldap/data:/var/lib/ldap \ -v /openldap/conf:/etc/ldap/slapd.d \ --detach osixia/openldap:1.5.0 #启动phpldapadmin(管理工具) docker run \ --restart=always \ -v /etc/localtime:/etc/localtime:ro \ -p 1111:80 \ --name myphpldapadmin \ --env PHPLDAPADMIN_HTTPS=false \ --env PHPLDAPADMIN_LDAP_HOSTS=10.10.20.236 \ --detach osixia/phpldapadmin:0.9.0
由于新建的ldap是没有初始化数据的,所以就需要我们手工创建初始化数据
具体使用方法,可以参考:https://wiki.shileizcc.com/confluence/pages/viewpage.action?pageId=39223519
#查看ldap的版本和加载的模块
#查看ldap的配置
slapcat -b cn=config
常用的ldif文件操作
a.企业架构
#企业的组织架构 cat schema.ldif dn: ou=qzing,dc=ilovelluvia,dc=com ou: qzing objectClass: top objectClass: organizationalUnit dn: ou=beijing,ou=qzing,dc=ilovelluvia,dc=com ou: beijing objectClass: top objectClass: organizationalUnit dn: ou=wuhan,ou=qzing,dc=ilovelluvia,dc=com ou: wuhan objectClass: top objectClass: organizationalUnit dn: ou=shenzhen,ou=qzing,dc=ilovelluvia,dc=com ou: shenzhen objectClass: top objectClass: organizationalUnit dn: ou=amoy,ou=qzing,dc=ilovelluvia,dc=com ou: amoy objectClass: top objectClass: organizationalUnit dn: ou=server,ou=qzing,dc=ilovelluvia,dc=com ou: server objectClass: top objectClass: organizationalUnit dn: ou=svn,ou=server,ou=qzing,dc=ilovelluvia,dc=com ou: svn objectClass: top objectClass: organizationalUnit dn: ou=vpn,ou=server,ou=qzing,dc=ilovelluvia,dc=com ou: vpn objectClass: top objectClass: organizationalUnit dn: ou=git,ou=server,ou=qzing,dc=ilovelluvia,dc=com ou: git objectClass: top objectClass: organizationalUnit dn: ou=samba,ou=server,ou=qzing,dc=ilovelluvia,dc=com ou: git objectClass: top objectClass: organizationalUnit
b.创建一个用户,并把其加入到某个组中
#创建用户密码
root@6c3f3669b4bf:/var/lib/ldap/ldif# slappasswd -h {SHA} -s 111111
{SHA}PU8r8H3BvjiyDNbkaUmhBx+dDj0=
#创建导入文件
root@6c3f3669b4bf:/var/lib/ldap/ldif# cat addperson.ldif
dn: uid=luzhihua,ou=devops,ou=amoy,ou=qzing,dc=ilovelluvia,dc=com
uid: luzhihua
cn: luzhihua
sn: luzhihua
givenName: luzhihua
displayName: luzhihua
objectClass: posixAccount
objectClass: top
objectClass: person
objectClass: shadowAccount
objectClass: inetOrgPerson
objectclass: organizationalperson
uidNumber: 1000
gidNumber: 1000
loginShell: /bin/bash
homeDirectory: /home/luzhihua
userPassword: {SHA}PU8r8H3BvjiyDNbkaUmhBx+dDj0=
shadowLastChange: 17654
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
employeeNumber: A10
homePhone: 0592-xxxxxxxx
mobile: 152xxxxxxxxx
mail: [email protected]
postalAddress: BeiJing
initials: Test
#导入
root@6c3f3669b4bf:/var/lib/ldap/ldif# ldapmodify -x -h 127.0.0.1 -p 389 -D cn=admin,dc=ilovelluvia,dc=com -w 123456 -a -f addperson.ldif
adding new entry "uid=luzhihua,ou=devops,ou=amoy,ou=qzing,dc=ilovelluvia,dc=com"
#创建导入文件
cat >>add_group.ldif<<EOF
dn: cn=projectA,ou=qzing,dc=ilovelluvia,dc=com
objectClass: groupOfUniqueNames
cn: projectA
description: ProjectA all users
uniquemember: uid=luzhihua,ou=devops,ou=amoy,ou=qzing,dc=ilovelluvia,dc=com
EOF
#导入
root@6c3f3669b4bf:/var/lib/ldap/ldif# ldapmodify -x -h 127.0.0.1 -p 389 -D cn=admin,dc=ilovelluvia,dc=com -w 123456 -a -f add_group.ldif
adding new entry "cn=project1,ou=qzing,dc=ilovelluvia,dc=com"
#验证
root@6c3f3669b4bf:/var/lib/ldap/ldif# ldapsearch -LL -Y EXTERNAL -H ldapi:/// "(uid=luzhihua)" -b dc=ilovelluvia,dc=com memberOf
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
version: 1
dn: uid=luzhihua,ou=devops,ou=amoy,ou=qzing,dc=ilovelluvia,dc=com
memberOf: cn=projectA,ou=qzing,dc=ilovelluvia,dc=com
2.制作nginx镜像,加上ldap模块,其中nginx-auth-ldap模块的下载地址是:https://github.com/kvspb/nginx-auth-ldap.git
[root@10-10-20-236 nginx]# cat Dockerfile FROM centos:7.9.2009 MAINTAINER teddylu<[email protected]> # 安装软件 RUN yum -y update && yum -y install epel-release openssl openssl-devel zlib zlib-devel pcre pcre-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel wget libevent-devel libevent uuid-devel uuid gmake libxml2 libxml2-devel libxslt-devel GeoIP GeoIP-devel GeoIP-data gcc gdb strace gcc-c++ autoconf unzip openldap openldap-devel # 创建用户 #RUN groupadd teddylu #RUN useradd -g teddylu teddylu -s /bin/false # 定义Nginx版本号 ENV VERSION 1.21.1 # 下载并解压文件 RUN mkdir -p /soft && cd /soft && wget http://nginx.org/download/nginx-$VERSION.tar.gz && tar xf nginx-$VERSION.tar.gz # 创建安装目录 ENV NGINX_HOME /application/nginx-1.21.1 RUN mkdir -p $NGINX_HOME #RUN chown -R teddylu:teddylu $NGINX_HOME ADD nginx-auth-ldap-master.zip /soft RUN cd /soft/ && unzip nginx-auth-ldap-master.zip # 进入解压目录 WORKDIR /soft/nginx-$VERSION # 编译安装 RUN ./configure \ --user=root \ --group=root \ --prefix=$NGINX_HOME \ --with-http_ssl_module \ --with-http_v2_module \ --with-threads \ --with-stream \ --with-stream_realip_module \ --with-stream_ssl_module \ --with-stream_ssl_preread_module \ --with-http_realip_module \ --add-module=/soft/nginx-auth-ldap-master \ --with-http_gzip_static_module \ --with-http_stub_status_module RUN make && make install # 设置环境变量 ENV PATH /application/nginx-1.21.1/sbin:$PATH # 暴露端口 EXPOSE 80 EXPOSE 443 # 清理压缩包与解压文件 RUN rm -rf /soft CMD $NGINX_HOME/sbin/nginx -g 'daemon off;' -c $NGINX_HOME/conf/nginx.conf
3.启动nginx(注意需要提前将/application/nginx-1.21.1复制到宿主机中)
docker run \ --name mynginx-ldap \ --restart=always \ -v /etc/localtime:/etc/localtime:ro \ -p 80:80 \ -p 443:443 \ -v /application/nginx-1.21.1/:/application/nginx-1.21.1/ \ -d mynginx-ldap:v1.0
4.nginx配置文件(window2012的AD安装跳过)
#这个是window2012AD的配置
ldap_server openldap {
url ldap://10.10.20.72:389/ou=it,dc=ilovesally,dc=xyz?sAMAccountName?sub?(objectClass=person);
binddn "ilovesally\Administrator";
binddn_passwd xmasp1@admin
connections 10;
satisfy any;
group_attribute memberOf;
group_attribute memberuid;
group_attribute uniquemember;
group_attribute it;
group_attribute_is_dn on;
require valid_user;
}
#这个是openLDAP的配置
url ldap://10.10.20.236:389/dc=ilovesally,dc=com?uid?sub?(objectClass=person);
binddn "cn=admin,dc=ilovesally,dc=com";
binddn_passwd "123456";
#虚拟机配置(这里做了一个反向代理)
[root@10-10-20-236 conf]# cat vhosts/mkdocs.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://10.10.20.236:9999;
auth_ldap "LDAP Authentication!!!!!";
auth_ldap_servers openldap;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_read_timeout 1200s;
}
}
5.看实际效果,一些web服务需要身份验证,这个ldap是非常不错的实现方式
6.自助修改或重置密码服务Self Service Password
Self Service Password是一个PHP应用程序,允许用户在LDAP目录中更改其密码。
该应用程序可以在标准LDAPv3目录(OpenLDAP,OpenDS,ApacheDS,389 DS,RHDS, Sun Oracle DSEE,Novell等)以及Active Directory上。
它具有以下功能:
Samba模式更改Samba密码
活动目录模式
本地密码策略:
最小/最大长度
禁止字符
大写,小写,数字或特殊字符计数器
重用旧密码检查
复杂度(不同类别的字符)
帮助信息
按问题重置
通过邮件重置(通过邮件发送令牌)
通过短信重置(通过外部电子邮件2短信服务)
验证码(Google API)
更改密码后的邮件通知
docker run \ --restart=always \ -v /etc/localtime:/etc/localtime:ro \ -p 1234:80 \ --name myself-service-password \ -v /ssp/conf/:/var/www/conf \ -d ltbproject/self-service-password:1.4.3
配置文件如下:(主要是修改ldap和邮箱的设置)
[root@10-10-20-236 conf]# cat config.inc.php
<?php
$debug = false;
$ldap_url = "ldap://10.10.20.236:389";
$ldap_starttls = false;
$ldap_binddn = "cn=admin,dc=ilovesally,dc=com";
$ldap_bindpw = '123456';
$ldap_base = "ou=People,dc=ilovesally,dc=com";
$ldap_login_attribute = "uid";
$ldap_fullname_attribute = "cn";
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
$ldap_use_exop_passwd = false;
$ldap_use_ppolicy_control = false;
$ad_mode = false;
$ad_options['force_unlock'] = false;
$ad_options['force_pwd_change'] = false;
$ad_options['change_expired_password'] = false;
$samba_mode = false;
$shadow_options['update_shadowLastChange'] = false;
$shadow_options['update_shadowExpire'] = false;
$shadow_options['shadow_expire_days'] = -1;
$hash = "clear";
$hash_options['crypt_salt_prefix'] = "$6$";
$hash_options['crypt_salt_length'] = "6";
$use_ratelimit = false;
$max_attempts_per_user = 2;
$max_attempts_per_ip = 2;
$max_attempts_block_seconds = "60";
$client_ip_header = 'REMOTE_ADDR';
$pwd_min_length = 0;
$pwd_max_length = 0;
$pwd_min_lower = 0;
$pwd_min_upper = 0;
$pwd_min_digit = 0;
$pwd_min_special = 0;
$pwd_special_chars = "^a-zA-Z0-9";
$pwd_no_reuse = true;
$pwd_diff_login = true;
$pwd_diff_last_min_chars = 0;
$pwd_forbidden_words = array();
$pwd_forbidden_ldap_fields = array();
$pwd_complexity = 0;
$use_pwnedpasswords = false;
$pwd_show_policy = "never";
$pwd_show_policy_pos = "above";
$pwd_no_special_at_ends = false;
$who_change_password = "user";
$show_extended_error = false;
$use_change = true;
$change_sshkey = false;
$change_sshkey_attribute = "sshPublicKey";
$who_change_sshkey = "user";
$notify_on_sshkey_change = false;
$use_questions = true;
$multiple_answers = false;
$multiple_answers_one_str = false;
$answer_objectClass = "extensibleObject";
$answer_attribute = "info";
$crypt_answers = true;
$questions_use_default = true;
$questions_count = 1;
$question_populate_enable = false;
$use_tokens = true;
$crypt_tokens = true;
$token_lifetime = "3600";
$mail_attribute = "mail";
$mail_address_use_ldap = false;
$mail_from = "[email protected]";
$mail_from_name = "Self Service Password";
$mail_signature = "";
$notify_on_change = false;
$mail_sendmailpath = '/usr/sbin/sendmail';
$mail_protocol = 'smtp';
$mail_smtp_debug = 0;
$mail_debug_format = 'error_log';
$mail_smtp_host = 'smtps://smtp.qq.com';
$mail_smtp_auth = false;
$mail_smtp_user = '[email protected]';
$mail_smtp_pass = 'vrwlmydtgagacfjj';
$mail_smtp_port = 465;
$mail_smtp_timeout = 30;
$mail_smtp_keepalive = false;
$mail_smtp_secure = 'tls';
$mail_smtp_autotls = true;
$mail_smtp_options = array();
$mail_contenttype = 'text/plain';
$mail_wordwrap = 0;
$mail_charset = 'utf-8';
$mail_priority = 3;
$use_sms = true;
$sms_method = "mail";
$sms_api_lib = "lib/smsapi.inc.php";
$sms_attribute = "mobile";
$sms_partially_hide_number = true;
$smsmailto = "{sms_attribute}@service.provider.com";
$smsmail_subject = "Provider code";
$sms_message = "{smsresetmessage} {smstoken}";
$sms_sanitize_number = false;
$sms_truncate_number = false;
$sms_truncate_number_length = 10;
$sms_token_length = 6;
$max_attempts = 3;
$keyphrase = "ilovesally";
$show_help = true;
$lang = "en";
$allowed_lang = array();
$show_menu = true;
$logo = "images/ltb-logo.png";
$background_image = "images/unsplash-space.jpeg";
$custom_css = "";
$display_footer = true;
$login_forbidden_chars = "*()&|";
$use_captcha = false;
$default_action = "change";
$use_restapi = false;
if (file_exists (__DIR__ . '/config.inc.local.php')) {
require __DIR__ . '/config.inc.local.php';
}
if (!defined("SMARTY")) {
define("SMARTY", "/usr/share/php/smarty3/Smarty.class.php");
}
$presetLogin = "";
if (isset($header_name_preset_login)) {
$presetLoginKey = "HTTP_".strtoupper(str_replace('-','_',$header_name_preset_login));
if (array_key_exists($presetLoginKey, $_SERVER)) {
$presetLogin = preg_replace("/[^a-zA-Z0-9-_@\.]+/", "", filter_var($_SERVER[$presetLoginKey], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH));
}
}
if (isset($header_name_extra_config)) {
$extraConfigKey = "HTTP_".strtoupper(str_replace('-','_',$header_name_extra_config));
if (array_key_exists($extraConfigKey, $_SERVER)) {
$extraConfig = preg_replace("/[^a-zA-Z0-9-_]+/", "", filter_var($_SERVER[$extraConfigKey], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH));
if (strlen($extraConfig) > 0 && file_exists (__DIR__ . "/config.inc.".$extraConfig.".php")) {
require __DIR__ . "/config.inc.".$extraConfig.".php";
}
}
}
7.svn使用ldap登录(AD域控)
#安装软件 yum install -y subversion cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain #修改sasl的用户验证方式为ldap cp /etc/sysconfig/saslauthd /etc/sysconfig/saslauthd.save sed -i 's/MECH=pam/MECH=ldap/' /etc/sysconfig/saslauthd #修改sasl配置文件/etc/saslauthd.conf cat >>/etc/saslauthd.conf<<EOF ldap_servers: ldap://10.10.20.72 ldap_default_domain: ilovesally.xyz ldap_search_base: DC=ilovesally,dc=xyz ldap_bind_dn: ilovesally\Administrator ldap_password: xmasp1@admin ldap_deref: never ldap_restart: yes ldap_scope: sub ldap_use_sasl: no ldap_start_tls: no ldap_version: 3 ldap_auth_method: bind ldap_mech: DIGEST-MD5 ldap_filter:sAMAccountName=%u ldap_password_attr:userPassword ldap_timeout: 10 ldap_cache_ttl: 30 ldap_cache_mem: 32786 EOF #重启sasl服务以应用配置文件并测试是否通过 systemctl restart saslauthd.service testsaslauthd -u user -p 'password' [root@10-10-20-237 ~]# testsaslauthd -u luzhihua -p 'zxc123?!' 0: OK "Success." #修改SVN的sasl配置文件/etc/sasl/svn.conf cat >>/etc/sasl2/svn.conf<<EOF pwcheck_method:saslauthd #用户验证方法 mech_list: plain login #用户验证信息怎么传输 EOF #修SVN的配置并重启 vim /yourrepository/conf/svnserve.conf [general] anon-access = none auth-access = write #password-db = passwd #关闭passwd authz-db = authz #如果要对版本库进行权限控制,开启authz [sasl] use-sasl = true #开启sasl用户验证
参考:
1.https://www.digitalocean.com/community/tutorials/how-to-use-ldif-files-to-make-changes-to-an-openldap-system
2.https://www.liuwg.com/archives/docker-openldap
3.https://github.com/osixia/docker-openldap
4.https://github.com/osixia/docker-phpLDAPadmin5.
5.https://www.liuwg.com/archives/self-service-password
6.https://blog.51cto.com/yht1990/2633627
7.https://amos-x.com/index.php/amos/archives/centos7-nginx-ldap/
8.https://github.com/kvspb/nginx-auth-ldap
9.https://www.ilanni.com/?p=14214
10.https://amos-x.com/index.php/amos/archives/centos7-nginx-add-module/
11.https://www.cnblogs.com/wilburxu/p/9174353.html
12.https://github.com/kvspb/nginx-auth-ldap/blob/master/example.conf
13.https://stackoverflow.com/questions/51149921/how-to-authenticate-nginx-with-ldap
14.https://www.flftuu.com/2019/09/24/nginx-ldap/
15.https://docs.nginx.com/nginx-controller/platform/access-management/manage-active-directory-auth-provider/
16.http://www.liuwq.com/views/%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7/svn-ldap.html#%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/






