企业sudo权限规划详解 (实测一个堆命令搞定)
企业sudo权限规划详解 (实测一个堆命令搞定)
简述问题:
随着公司的服务器越来越多,人员流动性也开始与日俱增,以往管理服务器的陈旧思想应当摒弃,公司需要有
更好更完善的权限体系,经过多轮沟通和协商,公司一致决定重新整理规划权限体系,主管明确指出权限存在的问
题,并需要解决以往的root权限泛滥问题.
我作为本次权限规划的发起人,我了解到了公司现状后,经过多次与相关员工及领导沟通,确认了公司存在的
部分问题: 运维部基本入职离职流程中存在一些账号问题: 如 离职不报备,系统权限不回收.账号密码过于简单化
这样无疑给公司的服务器及数据安全造成了不小的隐患.因此下文将详解此次关于权限划分的方案.
公司有多个部门使用我们提供的linux服务器以及开通的账号:安全权限没有进行合理规划.,因此我提出更加
安全的账号管理方式: sudo授权形式.
优势: 它可以对账号进行详细的权限分层划分,给服务器带来了更好的安全保障
公司有级别不同的运维人员,我们需要对其权限整理划分,根据职责能力我们规划权限为 初级运维 中级运维
高级运维.他们拥有的权限分别为:
权限规划
运维部:
级别 | 权限 |
初级运维: | 查看系统信息,查看网络状态: /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 |
开发部:
级别 | 权限 |
初级开发 | root的查看权限,对应服务查看日志的权限 /usr/bin/tail/app/log*,/bin/grep/app/log*,/bin/cat,/bin/ls |
高级开发 | root的查看权限,对应服务查看日志的权限,重启对应服务的权限 /sbin/service,/sbin/chkconfig,tail /app/log*,grep /app/log*,/bin/cat,/bin/ls, /bin/sh ~/scripts/deploy.sh |
开发经理 | 项目所在服务器的ALL权限,不能修改root密码 ALL,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root |
架构组:
级别 | 权限 |
架构工程师 | 普通用户的权限 不加入sudo列表 |
DBA组:
级别 | 权限 |
初级DBA | 普通用户的权限 不加入sudo列 |
高级DBA | 项目所在数据库服务器的ALL权限 ALL, /usr/bin/passwd [A-Za-z]* !/usr/bin/passwd root, !/usr/sbin/visudo, |
网络组
级别 | 权限 |
初级网络 | 普通用户权限 不加入sudo列靓 |
高级网络 | 项目所在数据库服务器的ALL权限 /sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net, /sbin/iptables,/usr/bin/rfcomm,/usr/bin/wvdial,/sbin/iwconfig, /sbin/mii-tool,/bin/cat,/var/log/* |
公司现在有的运维人员:
运维组:5个初级运维,2个高级运维,1个运维经理
开发组:3个初级开发人员,1个高级开发,1个开发经理
架构组:2个架构工程师(架构组不加入sudo)
DBA组:3个初级DBA(初级DBA不加入sudo),1个高级DBA
网络组:2个初级网管(初级DBA不加入sudo),1个高级网管
基础命令说明(后面不详细讲解了):
useradd yun1 && echo "123456" | password --stdin yun1 这个是创建yun1用户 然后 输出一个123456交给 passwd 然后passwd把这一串字符作为了 yun1 的密码
for n in `seq 21 25`;do useradd usern;echo"usern;echo"usern`echo usern|md5sum|cut−c4−8‘"|passwd−−stdinusern|md5sum|cut−c4−8‘"|passwd−−stdinusern;done 这里用的for循环来创建用户账号和密码: seq 21 25 创建5个数字 n 就代表这5个数字 后面的创建用户接着 user$n 就是以user开头接n
然后 echo 输出yoghurt名的md5 使用cut 取出 4-8块的自字符交给 password --stdin 来为每位用户没配置不同的密码,他们的密码都是用户名的md5值 详细请看下面的参考
开始创建用户:
useradd yun1 && echo "123456" | password --stdin yun1 ##基础创建方法
使用for循环来创建用户和密码3(参考)
for n in `seq 21 25`;do useradd usern;echo"usern;echo"usern`echo usern|md5sum|cut−c4−8‘"|passwd−−stdinusern|md5sum|cut−c4−8‘"|passwd−−stdinusern;done ##批量创建用户方式
运维组:5个初级运维,2个高级运维,1个运维经理 for n in `seq 21 25`;do useradd chuyunn;echo"usern;echo"usern`echo usern|md5sum|cut−c4−8‘"|passwd−−stdinusern|md5sum|cut−c4−8‘"|passwd−−stdinusern;done #创建5个初级运维,密码是md5的4-8位 ----------------------------------------------------- for n in `seq 1 5`;do useradd chujin;echo"123456"|passwd−−stdinchujin;echo"123456"|passwd−−stdinchujin;done #推荐用这个创建账户和密码,创建了 5个初级运维账户并配置了密码 for n in `seq 1 2`;do useradd gaojin;echo"123456"|passwd−−stdingaojin;echo"123456"|passwd−−stdingaojin;done #创建高级运维的用户和密码 useradd jingli && echo 123456 | passwd --stdin jingli ## 创建经理的账号和密码 for n in `seq 1 2`;do useradd jiagoun;echo"123456"|passwd−−stdinjiagoun;echo"123456"|passwd−−stdinjiagoun;done #创建2个架构师 账号和密码 for n in `seq 1 3`;do useradd chujidban;echo"123456"|passwd−−stdinchujidban;echo"123456"|passwd−−stdinchujidban;done #创建初级dba 账号和密码 useradd gaojidba && echo 123456 | passwd --stdin gaojidba ##创建高级dba账号和密码 for n in `seq 1 2`;do useradd wangguann;echo"123456"|passwd−−stdinwangguann;echo"123456"|passwd−−stdinwangguann;done ## 创建初级网管 useradd superwangguan1 && echo 123456 | passwd --stdin superwangguan ## 创建高级网管 useradd jingli && echo 123456 | passwd --stdin jingli #创建运维经理 ----------------------------------------------------- 开发组:3个初级开发人员,1个高级开发,1个开发经理 for n in `seq 1 5`;do useradd chujin;echo"123456"|passwd−−stdinchujin;echo"123456"|passwd−−stdinchujin;done 架构组:2个架构工程师(架构组不加入sudo) DBA组:3个初级DBA(初级DBA不加入sudo),1个高级DBA 网络组:2个初级网管(初级DBA不加入sudo),1个高级网管 |
与本次权限规划无关======批量删除用户方式:
参考: 批量创建用户,创建随机密码 for n in `seq 21 25`;do useradd usern;echo"usern;echo"usern`echo usern|md5sum|cut−c4−8‘"|passwd−−stdinusern|md5sum|cut−c4−8‘"|passwd−−stdinusern;done #取用户的md5 的 4-8位字符作为密码. 以上密码怎么看? ---- 通过 echo user的用户名来查看md5值.上面截取的就是md5值得4−8位那么准确获取密码的方法就是(user的用户名来查看md5值.上面截取的就是md5值得4−8位那么准确获取密码的方法就是(user 是赋值的) 如是user21 echo user21|md5sum|cut -c4-8 # 这种方式比较麻烦 我们可以字节使用批量创建用户指定密码.如下 批量创建用户,创建指定密码 for n in `seq 1 5`;do useradd chen是赋值的) 如是user21 echo user21|md5sum|cut -c4-8 # 这种方式比较麻烦 我们可以字节使用批量创建用户指定密码.如下 批量创建用户,创建指定密码 for n in `seq 1 5`;do useradd chenn;echo "123456" | passwd --stdin chenn;done批量删除用户:fornin‘seq2125‘;douserdel−rusern;done批量删除用户:fornin‘seq2125‘;douserdel−rusern;done ## 尾部的user$中 user 就是你的用户名前缀 21-25 是后缀. 批量创建用户删除用户都有这个 |
开始创建相关用户: 运维组:5个初级运维,2个高级运维,1个运维经理 开发组:3个初级开发人员,1个高级开发,1个开发经理 for n in `seq 1 5`;do useradd chujin;echo"123456"|passwd−−stdinchujin;echo"123456"|passwd−−stdinchujin;done 架构组:2个架构工程师(架构组不加入sudo) DBA组:3个初级DBA(初级DBA不加入sudo),1个高级DBA 网络组:2个初级网管(初级DBA不加入sudo),1个高级网管 下列命令直接复制粘贴即可完成创建 for n in `seq 1 5`;do useradd chujiyunwein;echo"123456"|passwd−−stdinchujiyunwein;echo"123456"|passwd−−stdinchujiyunwein;done for n in `seq 1 2`;do useradd gaojiyunwein;echo"123456"|passwd−−stdingaojiyunwein;echo"123456"|passwd−−stdingaojiyunwein;done useradd yunweijingli && echo 123456 | passwd --stdin yunweijingli for n in `seq 1 3`;do useradd chujikaifan;echo"123456"|passwd−−stdinchujikaifan;echo"123456"|passwd−−stdinchujikaifan;done useradd gaojikaifa && echo 123456 | passwd --stdin gaojikaifa useradd kaifajingli && echo 123456 | passwd --stdin kaifajingli for n in `seq 1 2`;do useradd jiagoun;echo"123456"|passwd−−stdinjiagoun;echo"123456"|passwd−−stdinjiagoun;done for n in `seq 1 3`;do useradd chujidban;echo"123456"|passwd−−stdinchujidban;echo"123456"|passwd−−stdinchujidban;done useradd gaojidba && echo 123456 | passwd --stdin gaojidba for n in `seq 1 2`;do useradd wangguann;echo"123456"|passwd−−stdinwangguann;echo"123456"|passwd−−stdinwangguann;done useradd gaojiwangguan1 && echo 123456 | passwd --stdin gaojiwangguan1 总计用户: yunweijingli #(创建运维经理 useradd gaojiwangguan1 && echo 123456 | passwd --stdin gaojiwangguan1) gaojiyunwei1 gaojiyunwei2 (#创建高级运维: (for n in `seq 1 2`;do useradd gaojiyunwein;echo"123456"|passwd−−stdingaojiyunwein;echo"123456"|passwd−−stdingaojiyunwein;done)) chujiyunwei1 chujiyunwei2 chujiyunwei3 chujiyunwei5 chujiyunwei5 #创建处及运维: (for n in `seq 1 5`;do useradd chujiyunwein;echo"123456"|passwd−−stdinchujiyunwein;echo"123456"|passwd−−stdinchujiyunwein;done) kaifajinlgi ##(创建开发经理 useradd kaifajingli && echo 123456 | passwd --stdin kaifajingli) gaojikaifa1 ##(创建高级开发 useradd gaojikaifa && echo 123456 | passwd --stdin gaojikaifa) chujikaifa1 chujikaifa2 chujikaifa3 ##创建初级开发 ( for n in `seq 1 3`;do useradd chujikaifan;echo"123456"|passwd−−stdinchujikaifan;echo"123456"|passwd−−stdinchujikaifan;done ) jiagoushi1 jiagoushi2 ##(创建架构师 for n in `seq 1 2`;do useradd jiagoushin;echo"123456"|passwd−−stdinjiagoushin;echo"123456"|passwd−−stdinjiagoushin;done) dba1 dba2 ##(创建架构师 for n in `seq 1 2`;do useradd dban;echo"123456"|passwd−−stdindban;echo"123456"|passwd−−stdindban;done) dba3 gaojidba #创建高级DBA useradd DBA && echo 123456 | passwd --stdin DBA wangguan1 wangguan2 ##(创建网管 for n in `seq 1 2`;do useradd wangguann;echo"123456"|passwd−−stdinwangguann;echo"123456"|passwd−−stdinwangguann;done) gaojiwanguan #创建高级网管 useradd gaojiwangguan && echo 123456 | passwd --stdin wangjiwangguan |
用户权限规划:
高级运维: %gaojiyunwei 初级运维: %yunwei 开发: %kaifa 网络组: %net #配置命令: User_Alias NET = %net User_Alias KAIFA = %kaifa User_Alias YUNWEI = %yunwei User_Alias GAOJIYUNWEI = %gaojiyunwei ----------------------- #创建用户 useradd net1 && echo '123456' | passwd --stdin net1 useradd yunwei1 && echo '123456' | passwd --stdin yunwei1 useradd gaojiyunwei1 && echo '123456' | passwd --stdin gaojiyunwei1 useradd kaifa1 && echo '123456' | passwd --stdin kaifa1 创建组: (groupadd) groupadd net groupadd kaifa groupadd yunwei groupadd gaojiyunwei 加入组:(usermod -g 组 用户) usermod -g yunwei yunwei1 usermod -g gaojiyunwei gaojiyunwei1 usermod -g net net1 usermod -g kaifa kaifa1 |
用户别名分类:
User_Alias NET = %net User_Alias KAIFA = %kaifa User_Alias YUNWEI = %yunwei User_Alias GAOJIYUNWEI = %gaojiyunwei |
命令别名管理
#网络工程师命令别名组 Cmnd_Alias NET_CMD = /bin/vi, /bin/ping, /bin/traceroute, /sbin/route, /bin/netstat, /bin/ps #开发命令别名组 Cmnd_Alias KAIFA_CMD = /bin/grep, /usr/bin/vim, /bin/vi, /usr/bin/tail, /usr/bin/wc, /bin/ps #运维命令别名组 Cmnd_Alias YUNWEI_CMD = /bin/chmod, /usr/bin/chattr, /usr/sbin/useradd, /usr/sbin/groupadd, /bin/touch, /bin/mkdir, /usr/bin/passwd[A-Za-z], !/usr/bin/passwd root #高级运维命令别名组 Cmnd_Alias GAOJIYUNWEI_CMD = /bin/chmod, /usr/bin/chattr, /usr/sbin/useradd, /usr/sbin/groupadd, /bin/touch, /bin/mkdir, /usr/bin/passwd[A-Za-z], /usr/sbin/usermod, /usr/sbin/userdel |
权限管理
#能获取到的权限 Runas_Alias NET = root Runas_Alias KAIFA = root Runas_Alias YUNWEI = root Runas_Alias GAOJIYUNWEI = root |
#对应关系 #权限分组 User_Alias NET = %net User_Alias KAIFA = %kaifa User_Alias YUNWEI = %yunwei User_Alias GAOJIYUNWEI = %gaojiyunwei #网络工程师命令别名组 Cmnd_Alias NET_CMD = /bin/vi, /bin/ping, /bin/traceroute, /sbin/route, /bin/netstat, /bin/ps #开发命令别名组 Cmnd_Alias KAIFA_CMD = /bin/grep, /usr/bin/vim, /bin/vi, /usr/bin/tail, /usr/bin/wc, /bin/ps #运维命令别名组 Cmnd_Alias YUNWEI_CMD = /bin/chmod, /usr/bin/chattr, /usr/sbin/useradd, /usr/sbin/groupadd, /bin/touch, /bin/mkdir, /usr/bin/passwd[A-Za-z], !/usr/bin/passwd root #高级运维命令别名组 Cmnd_Alias GAOJIYUNWEI_CMD = /bin/chmod, /usr/bin/chattr, /usr/sbin/useradd, /usr/sbin/groupadd, /bin/touch, /bin/mkdir, /usr/bin/passwd[A-Za-z], /usr/sbin/usermod, /usr/sbin/userdel #能获取到的权限 Runas_Alias NET = root Runas_Alias KAIFA = root Runas_Alias YUNWEI = root Runas_Alias GAOJIYUNWEI = root #Runas_Alias OP = root #对应关系 NET ALL=(NET) NET_CMD KAIFA ALL=(KAIFA) KAIFA_CMD YUNWEI ALL=(YUNWEI) YUNWEI_CMD GAOJIYUNWEI ALL=(GAOJIYUNWEI) GAOJIYUNWEI_CMD |
一个脚本全部搞定权限(实测无问题,权限全部搞定 sudo -l 查看获得的权限)
useradd net1 && echo '123456' | passwd --stdin net1 useradd yunwei1 && echo '123456' | passwd --stdin yunwei1 useradd gaojiyunwei1 && echo '123456' | passwd --stdin gaojiyunwei1 useradd kaifa1 && echo '123456' | passwd --stdin kaifa1 groupadd net groupadd kaifa groupadd yunwei groupadd gaojiyunwei usermod -g yunwei yunwei1 usermod -g gaojiyunwei gaojiyunwei1 usermod -g net net1 usermod -g kaifa kaifa1 cat >>/etc/sudoers <<eof User_Alias NET = %net User_Alias KAIFA = %kaifa User_Alias YUNWEI = %yunwei User_Alias GAOJIYUNWEI = %gaojiyunwei ##network-- Cmnd_Alias NET_CMD = /bin/vi, /bin/ping, /bin/traceroute, /sbin/route, /bin/netstat, /bin/ps ##kaifamingling-- Cmnd_Alias KAIFA_CMD = /bin/grep, /usr/bin/vim, /bin/vi, /usr/bin/tail, /usr/bin/wc, /bin/ps ##yunweimingling-- Cmnd_Alias YUNWEI_CMD = /bin/chmod, /usr/bin/chattr, /usr/sbin/useradd, /usr/sbin/groupadd, /bin/touch, /bin/mkdir, /usr/bin/passwd[A-Za-z], !/usr/bin/passwd root ##gaojiyunweimingling-- Cmnd_Alias GAOJIYUNWEI_CMD = /bin/chmod, /usr/bin/chattr, /usr/sbin/useradd, /usr/sbin/groupadd, /bin/touch, /bin/mkdir, /usr/bin/passwd[A-Za-z], /usr/sbin/usermod, /usr/sbin/userdel ##quanxian-- Runas_Alias NET = root Runas_Alias KAIFA = root Runas_Alias YUNWEI = root Runas_Alias GAOJIYUNWEI = root ##Runas_Alias OP = root #guanxi-- NET ALL=(NET) NET_CMD KAIFA ALL=(KAIFA) KAIFA_CMD YUNWEI ALL=(YUNWEI) YUNWEI_CMD GAOJIYUNWEI ALL=(GAOJIYUNWEI) GAOJIYUNWEI_CMD eof |