基于ldap的nginx用户访问认证

背景

最近使用的APM系统skywalking在升级后,其将UI的用户认证功能去掉了(开发者基于安全考虑)。这个后台虽然也没多重要,但多少还是需要一个用户认证的功能。结合公司统一登陆的需求,就想着用nginx+ldap的方式进行鉴权,于是就找到了这个方案:

https://github.com/kvspb/nginx-auth-ldap

系统环境:centos7

所需软件:nginx 1.16、openldap-server、

插件:nginx-auth-ldap(需openssl>1.0.2,所以用centos7系统)

一、OpenLDAP

前期调研,就自己搭了一个ldap,简单记录下安装过程:

1、安装软件包

yum install openldap openldap-clients openldap-servers -y

2、配置文件目录介绍

/etc/openldap/slapd.conf    #ldap的主配置文件,可从自带的模版文件/usr/share/openldap-servers/slapd.conf.obsolete复制即可

/var/lib/ldap/DB_CONFIG     #ldap的数据库配置文件,也提供了模版文件/usr/share/openldap-servers/DB_CONFIG.example

/etc/openldap/slapd.d/        #该目录下保存了从slapd.conf生成的一些ldap格式的配置文件

3、复制配置文件

cp  /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf 

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

4、生成管理员账号密码

$slappasswd -s Your_PassWord

{SSHA}T4LCsZI3PR+rKVmPcN4cHUnGguy+bAq7

5、修改配置文件

##配置用户密码访问权限,用户自己和manager管理员可写,

access to attrs=userPassword

    by self write

    by dn="cn=manager,dc=test,dc=com" write

    by anonymous auth

    by * none

##管理员可读写,其他用户只读

access to *

    by self read

    by dn="cn=manager,dc=test,dc=com" write

    by * read

##其他一些属性的配置,只给manager管理员权限

database monitor

access to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage

by dn.base="cn=manager,dc=test,dc=com" manage

by * none

database config

access to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage

by dn.base="cn=manager,dc=test,dc=com" manage

by * none

##基础配置信息

database bdb

suffix  "dc=test,dc=com"      

checkpoint      1024 15

rootdn  "cn=manager,dc=test,dc=com"    #管理员域

rootpw {SSHA}T4LCsZI3PR+rKVmPcN4cHUnGguy+bAq7   #前面使用slappasswd生成的管理员密码,中间使用tab隔开

directory      /var/lib/ldap

6、测试配置

 $slaptest -f /etc/openldap/slapd.conf

7、使用配置文件生成配置信息,并启动服务

$rm -rf /etc/openldap/slapd.d/*

$slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

$chown ldap:ldap /etc/openldap/slapd.d

$systemctl restart slapd

8、导入配置

使用apache Directory studio登陆ldap后,导入一下配置

dn: dc=test,dc=com

objectClass: dcObject

objectClass: organization

dc: test

o: test

dn: ou=user,dc=test,dc=com

objectClass: organizationalUnit

ou: user

将以上信息保存到user.ldif文件,再通过directory studio的import方式导入后,即可在改根域下创建用户。

二、nginx-auth-ldap

1、下载安装包

$wget http://nginx.org/download/nginx-1.16.0.tar.gz

$git clone https://github.com/kvspb/nginx-auth-ldap.git

$git clone https://github.com/vozlt/nginx-module-vts.git

这里增加了一个nginx-vts模块用来监控nginx

2、安装编译环境和依赖

$yum -y install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel openldap openldap-devel libxml2 libxml2-devel libxslt libxslt-devel gd gd-devel perl-devel perl-ExtUtils-Embed GeoIP GeoIP-devel gperftools

$groupadd www

$useradd www -g www    #创建nginx运行用户和组

3、解压并编译安装

$cd /Your_nginx_directory

$./configure --user=www --group=www --prefix=/usr/local/nginx --add-module=../nginx-auth-ldap/ --add-module=../nginx-module-vts --with-threads --with-file-aio --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-pcre --with-pcre-jit --with-stream --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-google_perftools_module 

$make -j16   #多核编译

$make install

没有报错就已经安装完成

4、配置nginx

根据nginx-auth-ldap文档,分别需要在http块和server块中增加相关配置;

http {

......

ldap_server nginx_auth {

        auth_ldap_cache_enabled on;

        auth_ldap_cache_expiration_time 10000;

        auth_ldap_cache_size 1000;

        connect_timeout 5s;      #一些请求LDAP的超时配置

        bind_timeout 5s;

        request_timeout 5s;

        satisfy any;

        url ldap://Your_ldap_Server:389/dc=test,dc=com?uid?sub?(objectClass=account);    #Ldap访问地址

        binddn "cn=manager,dc=test,dc=com";        #Ldap的管理员账号

        binddn_passwd ttttt;                                         #Ldap管理员密码

        group_attribute uniquemember;

        group_attribute_is_dn on;

        require valid_user;

    }

    server{

    ......

    location / {

            proxy_pass http://upstream;

            auth_ldap "Forbidden";

            auth_ldap_servers nginx_auth;      #上面定义的ldap_server名称

        }

    }

}

Over

至此,所有的安装和配置都已经完成,在ldap后台添加普通用户账号后,就可以进行登陆认证了。其他小伙伴就不能愉快的玩耍了。

你可能感兴趣的:(基于ldap的nginx用户访问认证)