苏州市干将路303号创意产业园
0512-3565 6563
Jackjones@kuaidata.com
联系客服
数据中心托管服务/管理式网络
服务:
400 651 8888
微软云服务:
400 089 2448
markjune@kuaidata.com
内容分布式网络服务:
400 811 0278
云集成与合作:
cloud@kuaidata.com
2016-05-05
在企业创办初期,少于50台服务器的情况下基本不会遇到帐号管理的问题。
但是随着时间的推移,服务器数量增加及经常变更服务器密码,就会频繁导致有些服务器忘记密码,登录不上去的情况。
这个在大多数公司都是普遍存在的,给SA增加了不少烦恼。甚至有些企业内部员工一直在使用root帐号,开发人员及运维人员混用同一帐号进行管理。这会导致误操作的后果不堪设想,因此急需一套帐号密码管理制度和管理工具。
最初可能仅仅是为了能满足最简单的功能,但是随着时间的推移,问题与需求越来越多,系统不断的演变,最终将会形成一个什么样的系统呢?
下面跟大家分享下,我经历的统一身份认证系统(基于OpenLDAP)的整个发展及演变过程。
需求的产生往往都来自于故障
公司发生了一次故障,一台边缘系统服务不稳定,造成主系统的负载非常高,这个时候业务运维人员需要登录上服务器进行解决问题,可是发生了最不愿意看到的一幕:
“密!码!不!对!我!登!录!不!上!去!”
“我试试看,是不是之前改密码的时候漏掉了这台服务器……完了,我的也登录不上去….”
本来一个简简单单的故障,被延时了将近一个小时才登上服务器进行解决,结果被骂得狗血淋头,站都站不稳。
这个时候运维部门决定要搭建一套统一身份认证系统,避免类似问题再次发生。经过公司内多个部门的讨论,得出最初的需求:
a)为了员工能高效工作,需要只使用一个帐号密码就能登录所有服务器
场景A
A同事入职,申请登录服务器,这个时候需要管理员为他分配登录服务器的账号密码,并且以A的名字为命名账号,密码为初始密码。
b)同时更改一次帐号密码,所有服务器快速生效
场景B
A同事拿到分配的账号密码之后,项目比较着急,希望能马上登录服务器查看相应的应用情况。
出于安全考虑,需要修改账号密码,但是不希望有其他人知道,甚至是管理员。
c)所有人都能sudo到root用户,进行系统管理和业务调整(创业初期讲究短平快,使用root是相当常见的,不过这个不合理的需求在后面会解决)
根据讨论得出的需求及运维部门的考虑,我们考虑过两种方案:
第一、使用配置管理工具,将系统的Passwd、shadows等文件进行统一管理,达到账号密码的统一;
第二、使用工具OpenLDAP/Kerberos来实现账号密码信息的统一管理。
考虑到第一种方案风险较大,而且用户更改密码生效周期过长等因素,所以放弃了。
而至于在OpenLDAP与Kerberos之间的选择则完全是巧合,因为测试OpenLDAP过程非常顺利,而且容易上手( 请原谅我选择了容易上手的工具,大家请勿拍砖 ^_^)
最终确定实施方案:以 OpenLDAP 为核心工具,使用 sudo + pam 来辅助。下面阐述一下方案的概况:
账号信息管理:包括用户ID、用户账号、用户密码、OU账号(OpenLDAP以OU命名,区分角色组或者部门)、OU_ID等;
账号认证功能:用户通过OpenLDAP客户端,将账号密码传输到服务器端进行验证;
服务器登录验证模块:pam模块增加验证数据源的扩展,不仅在本地 passwd & shadow 文件中进行验证,还增加了到OpenLDAP源的验证过程。
提权功能:用户通过个人账号登录服务器之后,可以使用sudo来进行提权;
权限定义:权限定义分为默认权限和临时权限,默认权限是在OpenLDAP中定义,默认所有用户的权限都是
sudo su - root
前期如果考虑到数据库的权限比较特殊,安全级别比较高,可以让OpenLDAP不承载所有服务器类型的认证。
以WEB+CACHE+DB的业务类型为例,我们将WEB\CACHE业务的管理纳入到OpenLDAP中,而DB业务维持本地的账号密码+sudo权限管理。
a)需要实现每个人都有相对应的默认权限
场景C
A同事拿到分配的账号密码之后,向SA说明自己的需求,不希望拿到太大的权限,避免误操作承担过多的风险,只需要读的权限,不需要服务器和应用的操作权限。
b)需要在特定环境中获得一些特殊权限
场景D
A同事拿到只读权限登录上服务器之后,希望能拿到测试环境中自己负责模块的应用操作权限,但是不希望拿到BETA和生产环境的操作权限。同时以上的需求仍然需要满足。
c)所有拥有root的权限,非常的危险,必须对权限进行精细化管理
场景E
生产环境发生了一个故障,还是A同事在配合运维排查故障过程中,发现有这个服务配置的内存数量太小,导致服务运行效率非常低,这个时候A同事立马对配置进行更改,效果非常明显,服务恢复了!
但是这并没有结束,接下来是服务器ping得通了,但是服务宕机,连ssh登录都被拒绝了。原因是配置的内存超过了服务器的实际内存大小,服务器严重使用了内存及SWAP空间,最终SWAP空间被使用快速消耗完,并最终导致了服务器短时间内的宕机假象。
场景F
B同事,在根目录下,以为在自己的目录下,使用root的用户执行了一个shell命令: rm -rf ./*
思考:
在公司内部会有多个部门,而每个部门对权限的需求又有很多的不一致:
系统管理员要求必要时候可以获取Root权限;
业务管理员要求可以进行服务的操作,完成正常上线,但是又不能给他系统管理员权限;
网络管理员只要求能在每个机房用个人账号进行登录即可,不需要其他权限;
开发人员需要使用个人账号登录服务器,只能看业务日志,不能看系统日志和任何的系统、业务方面的操作;
数据库管理员要求只能在数据库服务器上获取数据库管理员的权限,而且数据库服务器只能由DBA才能登陆,其他人一律没有权限;
经过讨论得出:需要对所有的员工根据权限的不同进行分组,并对组进行授权,不同的组拥有不同的权限。
企业中的角色账号分类,具体如下:
1. 管理员角色:root(SA角色使用)
2. 业务角色:oracle(DBA角色使用)、service(OPS角色使用)
3. 观察角色:read_only(研发角色使用)
4. 个人角色:LDAP账号(个人账号)
在OpenLdap里面存在三种对象:
1. 用户(个人账户:people)
2. 用户组(部门组:OU)
3. sudoers组及权限
对象之间的关联关系如下:
用户账号通过在属性里面定义的gidNumber与用户组建立关联;
sudoers组通过属性中定义的cn与用户组建立关联;
就这样用户账号就与sudoers组产生了关联,而在sudoers组里包含了sudo权限。所以用户的权限也就确定了:
超级管理员:所有服务器
sudo su - root
业务管理员:应用类服务器
sudo su - service;
网络管理员:所有服务器
none
开发人员: 应用类服务器
sudo su - read_only
我们实际情况是如何使用的呢?
个人用户通过LDAP个人账号登录跳板机,然后再登录至目标服务器,最终在目标服务器上根据OpenLDAP内定义的权限,进行用户角色的切换(例如 sudo su - root ) ,这样就可以得到相应的许可权限。
是否支持多IDC分布式部署?
场景G
随着业务的发展,公司需要进行异地灾备,从一个IDC扩展成为多个IDC。
运维部门必须考虑到有多个IDC该如何处理,必须满足多IDC的分布式架构,才能满足数据同步及快速生效的需求,同时减轻管理上的成本;