背景
最近使用的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后台添加普通用户账号后,就可以进行登陆认证了。其他小伙伴就不能愉快的玩耍了。