当前我们公司里服务器上百台,各个服务器上的管理人员很多(开发+运维+架构+DBA+产品+市场),在大家登录使用linux服务器时,不同职能的员工水平不同,因此导致操作很不规范,root权限泛滥(几乎大部分人员都有root权限),经常导致文件等莫名其妙的丢失,老手和新手员工对服务器的熟知程度也不同,这样使得公司服务器安全存在很大的不稳定性、及操作安全隐患,据调查企业服务器环境,50%以上的安全问题都来自于内部,而不是外部。为了解决以上问题,单个用户管理权限过大现状,现提出针对linux服务器用户权限集中管理的解决方案
我们既希望超级用户root密码掌握在少数或唯一的管理员手中,又希望多个系统管理员或相关有权限的人员,能够完成更多更复杂的自身职能相关的工作,又不至于越权操作导致系统安全隐患。
最小化:1)安装软件最小化。2)目录文件权限最小化。3)用户权限最小化。4)程序运行权限最小化。
那么,如何解决多个系统管理员都能管理系统而又不让超级权限泛滥的需求呢?这就需要sudo管理来替代或结合su命令来完成这样的苛刻且必要的企业服务器用户管理需求。
针对公司里不同部门,根据员工的具体工作职能(例如:开发、运维、数据库管理员),分等级、分层次的实现对linux服务器管理的权限最小化、规范化。这样即减少了运维管理成本,消除了安全隐患,又提高了工作效率,实现了高质量的、快速化的完成项目进度,以及日常系统维护。
说明:实施方案一般是由积极主动发现问题的运维人员提出的问题,然后写好方案,在召集大家讨论可行性,最后确定方案,实施部署,最后后期总结维护。
思想:提出问题之前,一定要想到如何解决,一并发出来解决方案。
到此为止:你应该是已经写完了权限规划文档。
1.1 召集相关各部门领导通过会议讨论或是与各组领导沟通确定权限管理方案的可行性。需要支持的人员:运维经理或总监、CTO支持、各部门组的领导。我们作为运维人员,拿着类似老师这个项目方案,给大家讲解这个文档,通过会议形式做演讲,慷慨激昂的演说,取得大佬们的支持和认可,才是项目能够得以最终实施的前提,当然,即使不实施,那么,你的能力也得到了锻炼,老大对你的积极主动思考网站架构问题也会另眼看待的。
1.2 确定方案可行性后,会议负责人汇总、提交、审核所有相关员工对linux服务器的权限需求。
取得大佬们的支持后,通过发邮件或都联系相关人员取得需要的相关员工权限信息。比如说,请各个部门经理整理归类本部门需要登录linux权限的人员名单、职位、及负责的业务及权限,如里说不清楚权限细节,就说负责的业务细节,这样运维人员就可以确定需要啥权限了。
1.3 按照需要执行的linux命令程序及公司业务服务来规划权限和人员对应配置。主要是运维人员根据上面收集的人员名单,需要的业务及权限角色,对应账号配置权限,实际就是配置sudo配置文件。
1.4 权限方案一旦实施后,所有员工必须通过《员工Linux服务器管理权限申请表》来申请对应的权限,确定审批流程,规范化管理。这里实施后把住权限申请流程很重要,否则,大家不听话,方案实施完也泡汤的。
1.5 写操作说明,对各部门人员进行操作讲解。sudo执行命令,涉及到PATH变量问题,运维提前处理好。
此过程是召集大家开会确定,或者请各组领导安排人员进行统计汇总,人员及对应的工作职责,交给运维人员,由运维人员优化职位所对应的系统权限。
1) 运维组:
级别 | 权限 |
初级运维 | 查看系统信息,查看网络状态 |
/usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig, | |
/bin/netstat,/sbin/route | |
高级运维 | 查看系统信息,查看和修改网络配置,进程管理,软件包管理,存储管理 |
/usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig, | |
/bin/netstat,/sbin/route,/sbin/iptables,/etc/init.d/network,/bin/nice, | |
/bin/kill,/usr/bin/kill,/usr/bin/killall,/bin/rpm,/usr/bin/up2date,/usr/bin/yum, | |
/sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount | |
运维经理 | 超级用户所有权限 |
ALL |
2) 开发组:
级别 | 权限 |
初级开发 | root的查看权限,对应服务查看日志的权限 |
/usr/bin/tail /app/log*,/bin/grep /app/log*,/bin/cat,/bin/ls | |
高级开发 | root的查看权限,对应服务查看日志的权限,重启对应服务的权限 |
/sbin/service,/sbin/chkconfig,/usr/bin/tail /app/log*, | |
/bin/grep /app/log*,/bin/cat,/bin/ls | |
开发经理 | 项目所在服务器的ALL权限,不能修改root密码 |
ALL,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd | |
root,!/usr/sbin/visudo,!/usr/bin/vi * sudoer * |
权限分配:普通用户的权限,对应服务器的查看日志的权限,重启对应服务权限
大公司:项目负责制的规定。
Cmnd_Alias P_CMD_1 = /bin/cat ~/log/*,/bin/cat/var/log/messages,/bin/cat /app/log/*,/bin/sh ~/scripts/deploy.sh
3) 架构组:
级别 | 权限 |
架构工程师 | 普通用户的权限 |
不加入sudo列表 |
4) DBA组:
级别 | 权限 |
初级DBA | 普通用户的权限 |
不加入sudo列表 | |
高级DBA | 项目所在数据库服务器的ALL权限 |
ALL,/usr/bin/passwd[A-Za-z]*,!/usr/bin/passwd root,!/usr/sbin/visudo,!/usr/bin/vi *sudoer* |
5) 网络组:
级别 | 权限 |
初级网络 | 普通用户的权限 |
不加入sudo列表 | |
高级网络 | 项目所在数据库服务器的ALL权限 |
/sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net, | |
/sbin/iptables,/usr/bin/rfcom,/usr/bin/wvdial,/sbin/iwconfig, | |
/sbin/mii-tool,/bin/cat /var/log/* |
建立3个初级运维,一个高级运维,一个网络工程师,一个运维经理,密码统一是111111
for user in chuji001 chuji002 chuji003net001 senior001 manager001
do
useradd$user
echo“111111”|passwd --stdin $user
done
建立5个开发人员,属于phpers组,一个高级开发,一个开发经理
groupadd -g 999 phpers
for n in `seq 5`
do
useradd-g phpers php00$n
echo“111111”|passwd --stdin php00$n
done
for user in kaifamanager001 seniorphpers
do
useradd$user
echo“111111”|passwd --stdin $user
done
sudo配置内容
##Cmnd_Alias by oldboy##2017/1/26
Cmnd_Alias CY_CMD_1 = /usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig,/b
in/netstat,/sbin/route
Cmnd_Alias GY_CMD_1 = /usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig,/bin/netstat,/sbin/route,/sbin/iptables,/etc/init.d/network,/bin/nice,/bin/kill,/usr/bin/kill,/usr/bin/killall,/bin/rpm,/usr/bin/up2date,/usr/bin/yum,/sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount
Cmnd_Alias CK_CMD_1 = /usr/bin/tail/app/log*,/bin/grep /app/log*,/bin/cat,/bin/ls
Cmnd_Alias GK_CMD_1 = /sbin/service,/sbin/chkconfig,/usr/bin/tail/app/log*,/bin/grep /app/log*,/bin/cat,/bin/ls,/bin/sh ~/scripts/deploy.sh
Cmnd_AliasGW_CMD_1 =/sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net,/sbin/ipt
ables,/usr/bin/rfcom,/usr/bin/wvdial,/sbin/iwconfig,/sbin/mii-tool,/bin/cat/var/log/*
##User_Alias by oldboy##2017/1/26
User_Alias CHUJIADMINS = chuji001,chuji002,chuji003
User_Alias GWNETADMINS = net001
User_Alias CHUJI_KAIFA = %phpers # phpers组
##Runas_Alias by oldboy##2017/1/26
Runas_Alias OP = root # 普通用户使用root用户角色操作
##pri config
senior001 ALL=(OP) GY_CMD_1
manager001 ALL=(ALL) NOPASSWD:ALL
kaifamanager001 ALL=(ALL)ALL,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwdroot,!/usr/sbin/visudo,!/usr/bin/vi *sudoer*
seniorphpers ALL=(OP) GK_CMD_1
CHUJIADMINS ALL=(OP) CY_CMD_1
GWNETADMINS ALL=(OP) GW_CMD_1
CHUJI_KAIFA ALL=(OP) CK_CMD_1
#注意:
1) 别名要大宝
2) 命令路径要用全路径
3) 超过一行用“\” 换行
1、 实战调试测试。
2、 成功后发邮件周知所有人权限配置生效。并附操作说明。有必要的话,培训讲解。
3、 制定权限申请流程及申请表。
4、 后期维护:不是特别紧急的需求,一律走申请流程。
服务器多了,可以通过分发软件批量分发/etc/sudoers(注意权限和语法检查)。
除了权限上的控制,在账户有效时间上也进行限制,现在线上多数用户的权限为永久权限可以使用以下方式进行时间上的控制。
这样才能让安全最大化。http://oldboy.blog.51cto.com/2561410/1289144
/home/anca,/home/zuma,所有的程序都在账户目录下面。启动的时候也是通过这个账户。也可以不设置密码,禁止密码登陆。
提示:授权ALL在进行排除有时会让我们防不胜防,这种先开后关的策略并不是好的策略。
白名单机制
5、 sudo配置注意事项
命令别名下的成员必须是文件或目录的绝对路径。
别名名称是包含大写字母、数字、下划线,如果是字母都要大写。
一个别名下有多个成员,成员与成员之间,通过半角“,“号分隔;成员必须是有效实际存在的
别名成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias制约,定义什么类型的别名,就要什么类型的成员相配。
别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过”\”来续行。
指定切换的用户要用()括号括起来。如果省略括号,则默认为root用户;如果括号里是ALL,则代表切换到所有用户。
如果不需要密码直接运行命令的,应该加NOPASSED:参数。
禁止某类程序或命令执行,要在命令运作前面加上“!”号,并且放在允许执行命令的后面。
用户组前面必须加“%”号。
权限等级授予表格(暂定):如需要其它权限可根据实际情况进行
拥有权限 | 简要说明 | |
普通开发 | NOPASSWD:FCMD_3 | 查看等权限 |
高级开发 | NOPASSWD:FCMD_3,FCMD_4 | 查看和重启对应服务 |
开发经理 | NOPASSWD:ALL 权限 ,!/bin/su -,/usr/sbin/useradd | 无密码切换到分用户,切换负载均衡,重启服务 |
运维经理 | NOPASSWD:ALL | 所有权限 |
普通运维 | NOPASSWD:PROCESSES,/run/apache/bin/apachectl –k start | 用户杀死和启动进程 |
高级运维 | NOPASSWD:FCMD_0,FCMD_1,PROCESSES | |
架构人员 | 普通用户 |
本文出自 “小杨” 博客,请务必保留此出处http://aqiang.blog.51cto.com/6086626/1894337
原文:http://aqiang.blog.51cto.com/6086626/1894337