前言:公司用openldap搭了一套ldap認(rèn)證系統(tǒng),用于統(tǒng)一內(nèi)部各個(gè)系統(tǒng)的賬戶,避免每次添加或刪除用戶還得一個(gè)個(gè)登陸上去操作汰规,使賬戶密碼統(tǒng)一,能減輕很多工作和保證安全性物邑,今天是想把ldap與zabbix進(jìn)行結(jié)合溜哮。
一滔金、配置zabbix
安裝php-ldap模塊
php需要這個(gè)模塊來(lái)進(jìn)行l(wèi)dap認(rèn)證,安裝方法網(wǎng)上都有這里不多述茂嗓;
> /usr/local/php/bin/php -m|grep ldap
ldap
zabbix頁(yè)面配置
LDAP host:訪問(wèn)DC的地址餐茵。格式:ldap://ip地址
Port:默認(rèn)389
Base DN: dc=tencent,dc=com,也就是域名(tencent.com)
Search attribute: uid,屬性值述吸,網(wǎng)上有填sAMAccountName忿族。
Bind DN: cn=Admin, ou=People, dc=tencent, dc=com。 cn就是在DC中創(chuàng)建的LDAPuser用戶蝌矛, ou就是LDAPuser屬于哪個(gè)ou道批,dc=tencent和dc=com不在解釋。
Bind password:xxxx 入撒,改密碼為L(zhǎng)DAPuser用戶的密碼
Login:Admin
User password:在DC中創(chuàng)建Admin用戶的密碼
點(diǎn)擊"Test"屹徘。如果沒(méi)有報(bào)什么錯(cuò)誤,就可以點(diǎn)擊"Save"⌒平穑現(xiàn)在ZABBIX的LDAP認(rèn)證方式就已經(jīng)配置完成了噪伊。
二、python導(dǎo)入ldap用戶
上述配置完成后已經(jīng)把ldap和zabbix打通了氮唯,用戶登錄zabbix時(shí)鉴吹,會(huì)先到ldap認(rèn)證,判斷用戶是否有效惩琉;但是zabbix不會(huì)把ldap的用戶同步過(guò)了豆励,你要登錄,得先在zabbix上創(chuàng)建和ldap內(nèi)同名的用戶才行瞒渠,這個(gè)顯得很被動(dòng)了良蒸,于是寫個(gè)腳本,定時(shí)往zabbix數(shù)據(jù)庫(kù)插入用戶伍玖,這樣就免去手工創(chuàng)建的用戶的煩惱嫩痰。下面是腳本:(環(huán)境是python2.6)
ldap命令看到的數(shù)據(jù)
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服務(wù)器把用戶數(shù)據(jù)導(dǎo)入文件
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)
# 因?yàn)閦abbix的表沒(méi)有自增id窍箍,所以每次操作都會(huì)記錄下id串纺,并遞增
idfile = '/usr/local/zabbix/sh/userid'
# 處理元數(shù)據(jù),把文件里的每行數(shù)據(jù)轉(zhuǎn)化成方便使用的格式
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() #這步很必要椰棘,不然插入的數(shù)據(jù)不生效
cur.close()
conn.close()
fe = open(idfile,'w')
fe.write(str(n))
fe.close()
if __name__ == '__main__':
insert_user()
執(zhí)行
> python insert_sql.py
User ying.liu Add Succed!
insert into users(userid,name,alias) values ('2691','劉穎','ying.liu');
再去user下看纺棺,可以看到新增了很多用戶
登錄下,認(rèn)證是成功的邪狞,接下來(lái)祷蝌,你可以對(duì)用戶進(jìn)行分組和授權(quán)了
~ zabbix使用ldap認(rèn)證完成