关于docker:金瓯无缺江河一统Win10系统基于Docker和Python3搭建并维护统一认证系统OpenLdap

36次阅读

共计 5867 个字符,预计需要花费 15 分钟才能阅读完成。

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_180

OpenLdap(Lightweight Directory Access Protocol)是什么?它其实是一个开源的、具备工业规范个性的利用协定,能够应用 TCP 协定提供访问控制和保护分布式信息的目录信息。这是一个传统意义上的书面解释,是的,毫无疑问,你会一脸懵逼。好吧,让咱们变得理性一点,如果我每天早上应用 Twitter 想听听懂王又吹了什么牛,登录 Twitter 账号密码,紧接着又想上 Instagram 看看女神又 post 了什么新靓照,好的,登录 Instagram 账号密码,摸了一上午的鱼之后,忽然想起来要登录公司的邮箱,看看有没有新需要,是的,又须要那该死的账号和明码,甚至于查问社保、公积金提取、交罚款都须要各自零碎的账号和明码。设想一下,如果有一套零碎能够对立治理和保护所有上游利用的账号和权限,咱们不须要花工夫反复的注册新利用的账号,而只须要关注利用自身,从而实现账号集中认证治理,此时作为账号管理员的咱们只须保护 OpenLDAP 服务器条目即可,金瓯无缺江山一统,这就是 openladp 可能带给咱们的益处。

LDAP 是十分典型的层级构造,信息模型是建设在属性条目(entries)的根底上。一个属性条目是一些属性的汇合,并且具备一个全局惟一的 ” 可辨别名称 ”DN,一个条目能够通过 DN 来援用。每一个条目标属性具备一个类型和一个或者多个值。类型通常是容易记忆的名称,比方 ”cn” 是通用名称(common name),或者 ”mail” 是电子邮件地址。条目标值的语法取决于属性类型。比方,cn 属性可能具备一个值 ”jack joe”。一个 mail 属性可能蕴含 ”admin@v3u.cn”。一个 pngphoto 属性可能蕴含一幅 PNG(二进制)格局的图片。

这里简略介绍一下 openldap 罕用的层级关键字的解释:

dc:Domain Component 域名的范畴,其格局是将残缺的域名分成几局部,如域名为 v3u.cn 则写成 dc=v3u,dc=cn。

uid:User Id 用户 ID,比方自增长“1”。

ou:Organization Unit 组织单位,相似于文件系统中的子目录,它是一个容器对象,组织单位能够蕴含其余各种对象(包含其余组织单元),如“newgroup”。
cn:Common Name 公共名称,如“jack joe”。
sn:Surname 姓,如“joe”。
dn:Distinguished Name 惟一分别名,相似于文件系统中的绝对路径,每个对象都有一个惟一的名称,相似于 mysql 的全局惟一索引,如“uid= tom,ou=market,dc=example,dc=com”,记住在一个目录树中 DN 总是惟一的。

了解了概念,让咱们来实操一把,因为实际永远是测验真谛的唯一标准,首先装置 Docker,参照:win10 零碎下把玩折腾 DockerToolBox 以及更换国内镜像源(各种神坑)。

随后拉取 openldap 镜像:

docker pull osixia/openldap:1.3.0

这里咱们应用 1.3 稳定版,拉取胜利后查看本地镜像

docker images

能够看到只有 200mb 左右,十分玲珑:

liuyue:~ liuyue$ docker images  
REPOSITORY                  TAG                   IMAGE ID            CREATED             SIZE  
osixia/openldap             1.3.0                 faac9bb59f83        6 months ago        260MB

启动容器:

docker run -p 389:389 --name myopenldap --network bridge --hostname openldap-host --env LDAP_ORGANISATION="v3u" --env LDAP_DOMAIN="v3u.cn" --env LDAP_ADMIN_PASSWORD="admin" --detach osixia/openldap:1.3.0

这里咱们通过端口映射将 389 端口作为链接桥梁,同时配置 LDAP 组织者:–env LDAP\_ORGANISATION=”v3u”,配置 LDAP 域:–env LDAP\_DOMAIN=”v3u.cn”, 配置 LDAP 明码:–env LDAP\_ADMIN\_PASSWORD=”admin”,默认登录用户名:admin,并且开启后盾守护过程。

查看容器运行状态:

docker ps

能够看到曾经在后盾启动了:

liuyue:~ liuyue$ docker ps  
CONTAINER ID        IMAGE                   COMMAND                 CREATED             STATUS              PORTS                           NAMES  
b62d1f66c2b8        osixia/openldap:1.3.0   "/container/tool/run"   2 days ago          Up 2 days           0.0.0.0:389->389/tcp, 636/tcp   myopenldap  
liuyue:~ liuyue$

服务确认没问题之后,咱们通过 python 来进行逻辑的编写,首先装置依赖

pip3 install ldap3

随后编写测试脚本 test\_ldap.py , 首先测试一下链接 ldap 服务器:

from ldap3 import Server, Connection, ALL,MODIFY_REPLACE  
  
s = Server('localhost', get_info=ALL)    
  
c = Connection(s, user='cn=admin,dc=v3u,dc=cn', password='admin')  
c.bind()  
  
print(c.extend.standard.who_am_i())

这里的 localhost 是 docker 容器的 ip,同时应用账号 admin 登录,留神账号 (cn) 以及域 (dc) 不要写错,不出意外的话,零碎会返回以后验证的用户信息:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
dn:cn=admin,dc=v3u,dc=cn  
liuyue:mytornado liuyue$

初始状态下,LDAP 是一个空目录,即没有任何数据。可通过程序代码向目录数据库中增加数据,也可应用 ldap3 库的 ldapadd 命令来实现增加数据的操作,该命令可将一个 LDIF 文件中的条目增加到目录:

这里咱们来增加一个 OU,也就是组织(OrganizationalUnit)。

# 增加组织  

res = c.add('OU=v3u_users,dc=v3u,dc=cn', object_class='OrganizationalUnit')  
print(res)  
print(c.result)

能够看到增加胜利:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
True  
{'result': 0, 'description': 'success', 'dn': '','message':'', 'referrals': None, 'type': 'addResponse'}

随后能够为该组织增加一个群组(group):

# 增加群组  
ldap_attr = {}  
ldap_attr['objectClass'] = ['top', 'posixGroup']  
ldap_attr['gidNumber'] = '1'  
  
c.add('cn=mygroup,dc=v3u,dc=cn',attributes=ldap_attr)  
print(c.result)

返回:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
{'result': 0, 'description': 'success', 'dn': '','message':'', 'referrals': None, 'type': 'addResponse'}  
liuyue:mytornado liuyue$

紧接着就是增加人员了:

# 增加用户  
ldap_attr = {}  
ldap_attr['cn'] = "test user1"  
ldap_attr['sn'] = "测试"  
ldap_attr['userPassword'] = "1234"  
  
user_dn = "cn=testuser1,cn=mygroup,dc=v3u,dc=cn"  
  
c.add(dn=user_dn,object_class='inetOrgPerson',attributes=ldap_attr)  
print(c.result)

这里的 cn 能够了解为用户名,sn 为姓,userPassword 顾名思义就是该用户的明码,dn 则是该用户在零碎中的惟一标识,留神指定刚刚建设的群组 mygroup,返回:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
{'result': 0, 'description': 'success', 'dn': '','message':'', 'referrals': None, 'type': 'addResponse'}  
liuyue:mytornado liuyue$

此时,咱们能够查问一下刚刚建设好的用户:

print(c.search("dc=v3u,dc=cn", '(&(cn=testuser1))', attributes=['*']))  
print(c.entries)

就能够看到用户的具体信息:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
True  
[DN: cn=testuser1,cn=mygroup,dc=v3u,dc=cn - STATUS: Read - READ TIME: 2020-11-23T17:58:08.569044  
    cn: test user1  
        testuser1  
    objectClass: inetOrgPerson  
    sn: 测试  
    userPassword: b'1234'  
]  
liuyue:mytornado liuyue$

如果咱们要批改用户信息,能够应用 modify 办法:

# 批改用户  
c.modify('cn=testuser1,cn=mygroup,dc=v3u,dc=cn',{'uid':[(MODIFY_REPLACE, ['1'])]})  
print(c.result)

这里批改用户的 uid 属性,返回:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
{'result': 0, 'description': 'success', 'dn': '','message':'', 'referrals': None, 'type': 'modifyResponse'}  
liuyue:mytornado liuyue$

再次搜寻该用户:

print(c.search("dc=v3u,dc=cn", '(&(cn=testuser1))', attributes=['*']))  
print(c.entries)

能够看到 uid 曾经被增加好了:

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
True  
[DN: cn=testuser1,cn=mygroup,dc=v3u,dc=cn - STATUS: Read - READ TIME: 2020-11-23T18:02:47.080555  
    cn: test user1  
        testuser1  
    objectClass: inetOrgPerson  
    sn: 测试  
    uid: 1  
    userPassword: b'1234'  
]

最初,如果员工到职的话,公司内所有账号和权限应该被回收,所以进行删除操作:

# 删除用户  
c.delete(dn='cn=testuser1,cn=mygroup,dc=v3u,dc=cn')  
print(c.result)

返回:

{'result': 0, 'description': 'success', 'dn': '','message':'', 'referrals': None, 'type': 'delResponse'}

再次查问曾经获取不到记录:

print(c.search("dc=v3u,dc=cn", '(&(cn=testuser1))', attributes=['*']))  
print(c.entries)

liuyue:mytornado liuyue$ python3 "/Users/liuyue/wodfan/work/mytornado/test_ldap.py"  
False  
[] 

至此,咱们就基于 openldap 的树形构造将组织以及用户信息别离进行存储和 CURD(增删改查)操作,在树的 root(根)个别定义总域(c=v3u)或者域名后缀(dc=cn),其次往往定义一个或多个组织(organization,o)或组织单元(organization unit,ou)。一个组织单元能够蕴含人员、设施信息(服务器、电脑等)相干信息。例如 uid=testuser1,ou=v3u\_users,dc=v3u,dc=cn,如图所示:

除此以外,OpenLDAP 还是一种典型的分布式构造,提供复制同步,可将主服务器上的数据通过推或拉的机制实现在从服务器上更新,实现数据的同步,从而防止 OpenLDAP 服务器呈现单点故障,实现了高可用架构。

OpenLdap 目录层级构造是一个专门为搜寻和浏览而设计的数据库,尽管也反对简略的插入、删除、批改性能。然而咱们能够了解为它是为浏览和搜寻而生的,它的查问速度很快,相同插入速度较慢,和关系型数据库相比,它并不反对事务和回滚以及简单的插入、更新等连贯操作性能,这一点和 Elasticsearch 有几分类似,然而,古人云:“射不主皮,力不同科”,如果您的零碎扩容频繁,上游利用层出不穷,那么您就能够思考用它来做对立用户治理,为您的利用保驾护航。

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_180

正文完
 0