zabbix自动同步ldap帐号到数据库
转载来源 :
zabbix自动同步ldap帐号到数据库 : https://blog.csdn.net/qq_22543991/article/details/82344301
zabbix配置ldap认证
环境:
centos6.6
zabbix3.0.3
域控服务器:windows-active server 2008
背景:之前公司已经在使用zabbix了 并且使用了ldap 验证 但是公司人数过多,为了集中管理,整合公司的用户密码,所以把zabbix系统也通过域认证登录。
描述:
LDAP 的作用:通过LDAP验证,将zabbix 和windows 域控联系在一起,只有域控中有的用户才能登录zabbix
依赖:
zabbix配置ldap认证需要zabbix server这个服务器的php安装ldap插件。
服务器执行命令:
php -m|grep ldap
如果有输出 说明安装了,否则需要单独安装。
如果需要细节,可以先看方法一配置。
通过zabbix管理员配置,需要知道域控的同名Admin账号的账号密码,如果没有该账号还需要创建账号,很不方便。方法一可以帮助你理解zabbix的ldap认证过程。
方法一:
系统管理员直接配置
通过Admin用户登录zabbix的web页面,点击Administrator,点击Authentication,点击LDAP
然后填写相关配置信息
配置界面:
注意:
- LDAP host:域控ip #例10.12.3.30
- Port:端口 # 默认不要动,你可以telnet 域控ip 这个端口是否通
- Base DN:OU=信息技术中心,OU=神秘公司,DC=corp,DC=shenmigongsi,DC=com,DC=cn
#这里就是base域,定义域控的范围 - Search attribute: sAMAccountName #域控服务器里面有该字段
- Bind DN:
CN=张三,OU=运维技术部,OU=信息技术中心,OU=神秘公司,DC=corp,DC=shenmigongsi,DC=com,DC=cn
#此处 “张三” 为一个域账号(你在配置的时候用任意域控账号都可以,我是直接用自己的域账号,因为我叫张三,哈哈) - Bind password:张三对应的域账号密码 #我的图 显示change password ,是因为我已经验证通过
- Login:Admin
#这里显示的帐号是当前浏览器登录zabbix的用户,我是用Admin用户在配置,所以这里显示的是Admin用户,如果你也是通过Admin用户添加的,则你的域控服务器中需要有同名的Admin这个域账号,否则会配置失败。
#此处建议你把你自己的域账号“张三”也设置成超级管理员,然后登录“张三”配置ldap认证,这样就不用在域控中添加Admin用户了,因为此时Login显示的就是张三这个用户了。 - User password:这里填写的是Login处的这个账号对应的域控中的这个账号的密码 #在域控中Admin用户 的密码
然后Test 就可以看到 测试成功的返回信息
然后点击Update 就设置完毕了。
这里有一个至关重要的一个说明,如果你想域控中已有的帐号登录zabbix ,就必须手动在zabbix 新建一个域里面的同名帐号
建议通过数据库的方式直接导入域控账号。
方法2:
简单靠谱的方式配置:
准备工作:
1.公司里面我的域控账号叫张三,有权限访问域控
2.在zabbix平台添加了该同名账号,而且设置为了超级管理员。
3.通过超级管理员张三配置域控登录。(注意如果php服务没有安装ldap扩展是会配置失败的,开始卡了很久就是不知道是这个问题)
注意:
LDAP host:10.12.3.30
Port:389
Base DN:OU=信息技术中心,OU=神秘公司,DC=corp,DC=shenmigongsi,DC=com,DC=cn
Search attribute: sAMAccountName
Bind DN: CN=张三,OU=运维技术部,OU=信息技术中心,OU=神秘公司,DC=corp,DC=shenmigongsi,DC=com,DC=cn
Bind password:张三的域账号密码
Login:张三 #这里显示的帐号是当前浏览器登录zabbix的用户,我是用“张三”用户在配置,所以这里显示的是张三
User password:张三的域账号密码
**然后Test 就可以看到 测试成功的返回信息
然后点击Update 就设置完毕了。**
这里有一个至关重要的一个说明,如果你想域控中已有的帐号登录zabbix ,就必须手动在zabbix 新建一个域里面的同名帐号。
建议通过数据库的方式直接导入域控账号。
插入用户的SQL如下:
insert into users(userid,name,alias) values ('%s','%s','%s');" % (n,$name,$name)
需要用到组管理的话,可以组的映射信息
插入关联用户组的SQL:
"insert into users_groups (id,usrgrpid,userid) values ('%s','%s','%s');" % (n,grouplist[group_name],userlist[name])
users 用户表
users_groups 用户组的表
usrgrp 用户-组,映射关系表
#ldap查询命令,获取用户的用户名,和组名
# 先从ldap服务器把用户数据导入文件
ldapsearch -x -LLL -D "CN=张三,OU=运维技术部,OU=信息技术中心,OU=神秘公司,DC=corp,DC=shenmi,DC=com,DC=cn" -b "OU=运维技术部,OU=信息技术中心,OU=神秘公司,DC=corp,DC=shenmi,DC=com,DC=cn" givenName -H ldap://10.12.3.30:389 -w asdfasdfa sAMAccountName | egrep -v '^$|givenName'
zabbix 同步ldap帐号脚本
mysql导入ldap帐号信息
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#此脚本用于自动同步ldap帐号到zabbix数据库
import pymysql
import subprocess
class Add_User(object):
def __init__(self):
self.wesearch = subprocess.getstatusoutput(“ldapsearch -x -LLL -D cn=****,dc=****,dc=**** -w ***** -H ldap://******* -b dc=****,dc=***** | sed ‘1,12’d|sed ‘/^$/d’|egrep -v ‘ou=vPeople’|grep uid| egrep -v ‘[1,2,3,4,5,6,7,8,9]’| awk -F ‘: ‘ ‘{print $2}'”)
self.welist = self.wesearch[1].split(‘\n’)
def insert_user(self):
conn=pymysql.connect(host=’*********’, port=3306, user=’zabbix’, passwd=’zabbix_1′, db=’zabbix’, charset=’utf8′)
cur = conn.cursor()
n=4
w=10
for user in self.welist:
n=n+1
w=w+1
search = cur.execute(“””select * from users where alias = %s””” ,(user,))
if not search: #每天同步增加的部分所以要先做判断是否能查到
sql = “insert into users(userid,lang,name,alias,theme) values (‘%s’,’%s’,’%s’,’%s’,’dark-theme’)” %(n,’zh_CN’,user,user)
cur.execute(sql)
sql = “insert into users_groups(id,usrgrpid,userid) values (‘%s’,’%s’,’%s’)” %(w,8,n)
cur.execute(sql)
if sql:
print(sql)
conn.commit()
cur.close()
conn.close()
if __name__ == ‘__main__’:
a=Add_User()
a.insert_user()
脚本2
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
import commands
import base64
import sys
from datetime import datetime
reload(sys)
sys.setdefaultencoding('utf-8')
mysql_host='xxx.internal.xxx.com'
mysql_port=3306
mysql_user='zabbix'
mysql_passwd='zabbix'
mysql_db='zabbix'
def get_user_from_ldap ():
ldap_users=commands.getoutput("ldapsearch -x -LLL -H ldap://xxx.xxx.xxx.xxx-b dc=xx,dc=com givenName|sed '1,12'd|sed '/^$/d'|egrep -v 'ou=Group|ou=machines'").strip().splitlines()
return ldap_users
def get_value():
values = {}
lines = get_user_from_ldap()
for index,line in enumerate(lines):
if line.startswith("dn: cn="):
if (index+1)<len(lines) and lines[index+1].startswith("givenName:"):
strcount = lines[index+1].strip().split()[0].count(':')
if strcount == 2:
sourcename = lines[index+1].strip().split()[1]
name = base64.b64decode(sourcename)
else:
name = lines[index+1].strip().split()[1]
alias = lines[index].strip().split('=')[1].split(',')[0]
values[alias] = name
else:
print "The user [%s] set error on ldap server !" % line
return values
def get_id():
conn = pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, passwd=mysql_passwd, db=mysql_db, charset='utf8')
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute("select userid from users order by userid desc limit 1")
id = cur.fetchone().values()[0]
cur.close()
conn.close()
return id
def get_mysql_data():
conn = pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, passwd=mysql_passwd, db=mysql_db, charset='utf8')
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute("select userid from users order by userid desc limit 1")
id = cur.fetchone().values()[0]
cur.close()
cur_user = conn.cursor(cursor=pymysql.cursors.DictCursor)
cur_user.execute("select alias from users")
user_data = cur_user.fetchall()
user_name = [name['alias'] for name in user_data]
cur_user.close()
conn.close()
return id,user_name
def insert_data():
conn = pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, passwd=mysql_passwd, db=mysql_db, charset='utf8')
cur = conn.cursor()
n, zabbix_user = get_mysql_data()
# del_name = []
data = get_value()
ldap_name = data.keys()
for alias, name in data.items():
search = cur.execute("select * from users where alias = %s", (alias, ))
if not search:
n += 1
sql = "insert into users(userid,name,alias) values ('%s','%s','%s');" % (n,name,alias)
insert = cur.execute(sql)
if insert:
with open ('/opt/ldap.log', 'a') as log:
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
str = "User %s Name's %s and Userid's %s Add Succeed at %s" % (alias,name,n,time)
log.write(str+'\n')
del_cur = conn.cursor()
for name in zabbix_user:
if name not in ldap_name:
if name.lower() != 'zabbix' or name.lower() != 'guest':
# del_name.append(name)
try:
del_data = del_cur.execute("delete from users where alias = %s", (name,))
if del_data:
with open ('/opt/ldap.log', 'a') as del_log:
del_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
del_str = "User %s del succeed at %s" % (name, del_time)
del_log.write(del_str+'\n')
except (Exception), error_str:
print error_str
print "when del %s failed" % name
# print del_name
conn.commit()
cur.close()
conn.close()
if __name__ == '__main__':
insert_data()
参考链接 :
zabbix配置ldap认证 :https://blog.csdn.net/qq_37960324/article/details/94004999?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
zabbix 同步ldap帐号脚本 : https://blog.csdn.net/weixin_33862993/article/details/93650259?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
上一篇: 天兔Lepus数据库监控的搭建
下一篇: 安装centry
推荐阅读