title: 企业生产环境用户权限集中管理项目方案 tags: 权限管理,权限集中,sudo


企业生产环境用户权限集中管理项目方案

1. 问题现状

当前我们公司服务器上百台,每个服务器上的管理人员很多(开发+运维+DBA+产品+市场),在大家登陆Linux 服务器时,不同职能的员工水平不同,因此导致操作很不规范,root 权限泛滥(几乎大部分人员都有root权限),经常导致文件等莫名其妙的丢失,老员工和新员工对服务器的熟知程度也不一样,这样使得公司服务器安全存在很大的不稳定性,及操作安全隐患,调查企业服务器环境,50%以上的安全问题来自内部而不是外部。为了解决上述问题,单个用户管理权限过大现状,现提出针对Linux服务器用户权限集中管理的解决方案。

2. 项目需求

我们希望超级用户密码掌握在少数或者唯一的管理员手中,又希望多个系统管理员或相关权限的人员,能 够完成更多更复杂的自身职能相关的工作,又不至于越权操作导致系统安全隐患。 linux最小化原则:1 安装软件最小化 。2 目录文件权限最小化。3用户权限最小化。 4 程序权限运行最小化 那么,如何解决多个系统管理员都能管理系统而又不让超级权限泛滥的需求呢?这就需要sudo来替代管理或结合 su命令来完成这样的苛刻且必要的企业服务器用户管理需求。

3. 具体实现

针对公司里不同部门,根据员工的具体工作职能(例如:开发,运维,数据库管理员)。分等级、分层次的实现对linux服务器管理的权限最小化、规范化。这样即使减少了运维管理成本,消除了安全隐患,又提高了工作效率,实现了高质量的、快速化的完成项目进度,以及日常系统维护。

4. 实施方案

说明:实施方案一般是由积极主动发现问题的运维人员提出问题,然后写好方案,在召集大家讨论最后确定的方案,实施部署,最后后期总结维护。 思想:在提出问题之前,一定要想到如何解决,一并发出来解决方案。 信息采集(含整个方案流程)

  1. 开会取得大佬支持,运维经理或总监,CTO技术总监,各部门的老大。

  2. 取得大佬支持后通过邮件获取相关员工的权限信息,比如各部门经理整理归类本部门需要登录linux系统权限的人员名单,职位,及负责的业务及权限,如果说不清楚权限细节,就说负责的业务细节,这样运维人员就可以确定需要啥权限了。

  3. 按照需要执行的linux命令程序及公司业务服务来规划权限和人员对应配置,主要是运维人员根据上面收集的人员名单,需要的业务及权限角色,对应账号配置权限,实际就是配置sudo配置文件

  4. 权限方案一旦实施后,所有员工必须通过《员工linux服务器管理权限申请表》来申请对应的权限,确定审批流程,规范化管理。这里实施后把住权限申请流程很重要

  5. 写操作说明,对各部门人员进行操作讲解,sudo执行命令,涉及到PATH变量问题,运维提前处理好。

  6. 具体权限分配如下:

  7. 模拟创建3个初级运维账号,一个高级运维,一个网络工程师,一个运维经理,密码统一为11111111

[root@maiyat ~]# for n in chuji001 chuji002 chuji003 net001 manager001 ; do useradd $n ; echo "11111111" |passwd --stdin $n ;done;
[root@maiyat ~]# useradd GY01 
[root@maiyat ~]# echo "11111111" |passwd --stdin GY01
[root@maiyat ~]# useradd senior001
[root@maiyat ~]# echo "11111111" |passwd --stdin senior001

建立五个开发属于python组

[root@maiyat ~]# groupadd -g 888 python
[root@maiyat ~]# for n in `seq -f kaifa%02g 5` ; do useradd -g 888 $n ;echo "11111111" |passwd --stdin $n; done;

建立开发经理和高级开发账号

[root@maiyat ~]# useradd kaifamanager |echo "11111111" |passwd --stdin kaifamanager
[root@maiyat ~]# useradd senior002
[root@maiyat ~]# echo "11111111" |passwd --stdin senior001

8 . 更改/etc/sudoers文件 在sudoers后面加入下列内容:

# Cmnd_Alias by Ouyoung
Cmnd_Alias CYCMD1 = /usr/bin/free, /usr/bin/iostat, /usr/bin/top, /bin/hostname, /bin/netstat, /sbin/ifconfig, /sbin/route
Cmnd_Alias GYCMD1 = /usr/bin/free, /usr/bin/iostat, /usr/bin/top, /bin/hostname, /bin/netstat, /sbin/ifconfig, /sbin/route, \
 /sbin/iptables, /etc/init.d/*, /bin/nice, /bin/kill
Cmnd_Alias CKCMD1 = /usr/bin/tail /app/log*, /bin/grep /app/log/*, /bin/cat, /bin/ls
Cmnd_Alias GKCMD1 = /sbin/service, /sbin/chkconfig, /usr/bin/tail /app/log*, /bin/grep /app/log/*, /bin/cat, /bin/ls
Cmnd_Alias KMCMD1 = ALL, /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root, !/bin/vi /etc/sudoers, !/usr/bin/vim /etc/sudoers, !/usr/sbin/visudo
Cmnd_Alias GWCMD1 = /bin/hostname, /bin/netstat, /sbin/ifconfig, /sbin/route, /sbin/iptables, /bin/ping, /usr/bin/netstat
# User Aliases by Ouyoung
User_Alias CYUSER = chuji001, chuji002, chuji003, chuji004, chuji005
User_Alias GYUSER = GY01, senior001
User_Alias CKUSER = %python
User_Alias GKUSER = senior002
User_Alias MANUSER = kaifamanager
User_Alias GWUSER = net001
# config
CYUSER ALL=(ALL) CYCMD1
GYUSER ALL=(ALL) GYCMD1
CKUSER ALL=(ALL) CKCMD1
GKUSER ALL=(ALL) GKCMD1
MANUSER ALL=(ALL) NOPASSWD: KMCMD1
GWUSER ALL=(ALL) GWCMD1

9 . 验证配置如下:

用户 kaifamanager 可以在该主机上运行以下命令:
    (ALL) NOPASSWD: ALL, /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root, !/bin/vi /etc/sudoers, !/usr/bin/vim, !/usr/sbin/visudo
	用户 kaifa01 可以在该主机上运行以下命令:
    (ALL) /usr/bin/tail /app/log*, /bin/grep /app/log/*, /bin/cat, /bin/ls
用户 kaifa02 可以在该主机上运行以下命令:
    (ALL) /usr/bin/tail /app/log*, /bin/grep /app/log/*, /bin/cat, /bin/ls

10 . 验证成功后发邮件知所有有关的人员权限配置成功,并附带操作说明,有必要的话培训讲解 11 . 制定权限申请流程及申请表 12 . 后期维护,不是特别紧急的需求,一律需要走申请流程。 服务器多了,如果同业务的服务器,且用户管理需求一样,可以通过分发工具批量分发/etc/sudoers(注意用户,组及权限),注意授权ALL再进行排除时有时候会让我们防不胜防,这种先开后关的策略不是好的策略

5. sudo配置注意事项

  1. 别名必须全部大写。
  2. 命令别名下的成员必须是文件或目录的绝对路径。
  3. 一个别名下有多个成员,成员与成员之间用空格分开,每个成员后面接逗号,成员必须是有效实际存在的。
  4. 别名成员受别名类型 User_Alias,Cmnd_Alias,Host_Alias,Runas_Alias制约,定义什么类型别名,就要有什么类型的成员相配。
  5. 别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过“\”来续行。
  6. 指定切换的用户要用()括号括起来,如果省略括号,则默认为root用户;如果括号里是ALL,则代表能切换到所有用户;
  7. 如果不需要密码直接运行命令的,应该加NOPASSWD:参数。
  8. 禁止某类程序或命令执行,要在命令动作前面加!号,并且放在允许执行命令的后面。
  9. 用户组前面必须加%号