美文网首页
zabbix使用LDAP认证,并定时导入ldap用户到zabbi

zabbix使用LDAP认证,并定时导入ldap用户到zabbi

作者: 撸大师 | 来源:发表于2016-11-15 16:23 被阅读3794次

    前言:公司用openldap搭了一套ldap认证系统,用于统一内部各个系统的账户,避免每次添加或删除用户还得一个个登陆上去操作,使账户密码统一,能减轻很多工作和保证安全性,今天是想把ldap与zabbix进行结合。

    一、配置zabbix

    安装php-ldap模块
    php需要这个模块来进行ldap认证,安装方法网上都有这里不多述;

    > /usr/local/php/bin/php -m|grep ldap
    ldap
    

    zabbix页面配置

    zabix-ldap

    LDAP host:访问DC的地址。格式:ldap://ip地址
    Port:默认389
    Base DN: dc=tencent,dc=com,也就是域名(tencent.com)
    Search attribute: uid,属性值,网上有填sAMAccountName。

    Bind DN: cn=Admin, ou=People, dc=tencent, dc=com。 cn就是在DC中创建的LDAPuser用户, ou就是LDAPuser属于哪个ou,dc=tencent和dc=com不在解释。

    Bind password:xxxx ,改密码为LDAPuser用户的密码
    Login:Admin
    User password:在DC中创建Admin用户的密码

    点击"Test"。如果没有报什么错误,就可以点击"Save"。现在ZABBIX的LDAP认证方式就已经配置完成了。

    二、python导入ldap用户

    上述配置完成后已经把ldap和zabbix打通了,用户登录zabbix时,会先到ldap认证,判断用户是否有效;但是zabbix不会把ldap的用户同步过了,你要登录,得先在zabbix上创建和ldap内同名的用户才行,这个显得很被动了,于是写个脚本,定时往zabbix数据库插入用户,这样就免去手工创建的用户的烦恼。下面是脚本:(环境是python2.6)

    ldap命令看到的数据

    dn: cn=xiao.deng,ou=People,dc=weimob,dc=com
    givenName:: 6YKT5pmT
    dn: cn=chenhao.ma,ou=People,dc=weimob,dc=com
    givenName:: 6ams5pmo5piK
    dn: cn=ying.liu,ou=People,dc=weimob,dc=com
    givenName:: 5YiY6aKW
    ...
    

    cn是zabbix的alias字段,givenName需要base64解码成中文名

    > cat insert_sql.py 
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import pymysql
    import commands
    import re
    import base64
    import sys
    
    # 避免中文乱码
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    ldap_list='/usr/local/zabbix/sh/ldap.list'
    
    # 先从ldap服务器把用户数据导入文件
    ldap_users=commands.getoutput("ldapsearch -x -LLL -H ldap://1.1.1.1 -b dc=weimob,dc=com givenName|sed '1,12'd|sed '/^$/d'|egrep -v 'ou=Group|ou=machines'> %s" % ldap_list)
    
    # 因为zabbix的表没有自增id,所以每次操作都会记录下id,并递增
    idfile = '/usr/local/zabbix/sh/userid'
    
    # 处理元数据,把文件里的每行数据转化成方便使用的格式
    def get_item(fobj):
        item = ['', '', '']
        for no,line in enumerate(fobj):
            #print no,line
            slot = no % 2
            item[slot] = line.rstrip()
            if slot == 1:
                yield item
    
    def insert_user():
        conn = pymysql.connect(host='2.2.2.2', port=3306, user='zabbix', passwd='zabbix', db='zabbix', charset='utf8')
        cur = conn.cursor()
        fs = open(idfile,'r')
        n = int(fs.read())
        fs.close()
        with open(ldap_list) as fobj:
            for item in get_item(fobj):
                n += 1
                try:
                    s='{0}{1}{2}'.format(*item)
                    l = re.search('cn=(.*),ou.*:: (.*)',s)
                    name = base64.b64decode(l.group(2))
                    alias = l.group(1)
                    search = cur.execute("""select * from users where alias = %s""", (alias, ))
                    if not search:
                        sql = "insert into users(userid,name,alias) values ('%s','%s','%s');" % (n,name,alias)
                        insert = cur.execute(sql)
                        if sql:
                            print "User %s Add Succed!" % alias
                            print sql
                except AttributeError as e:
                    print e
        conn.commit()   #这步很必要,不然插入的数据不生效
        cur.close()
        conn.close()
        fe = open(idfile,'w')
        fe.write(str(n))
        fe.close()
    
    if __name__ == '__main__':
        insert_user()
    

    执行

    > python insert_sql.py
    User ying.liu Add Succed!
    insert into users(userid,name,alias) values ('2691','刘颖','ying.liu');
    

    再去user下看,可以看到新增了很多用户

    Paste_Image.png

    登录下,认证是成功的,接下来,你可以对用户进行分组和授权了


    ~ zabbix使用ldap认证完成

    相关文章

      网友评论

          本文标题:zabbix使用LDAP认证,并定时导入ldap用户到zabbi

          本文链接:https://www.haomeiwen.com/subject/qhzkpttx.html