sudo配置参考文档:
http://linux.vbird.org/linux_basic/0410accountmanager.php#userswitch
http://www.cnblogs.com/ggjucheng/archive/2012/08/22/2650103.html
http://www.cnitblog.com/xijia0524/archive/2008/06/30/46168.aspx
sudo日志记录跟踪参考文档:
http://firerat.blog.51cto.com/2371183/455524/
1、为什么需要sudo?
当我的主机是多人共管的环境时,如果大家都使用 su 来切换成为 root 的身份,那么就得每个人知道 root 的密码,这样密码太多人知道可能会流出去,很不安全!怎办?透过 sudo 来处理即可!
sudo的执行则仅需要自己的密码 ,sudo 可以让你以其他用户的身份执行指令 (通常是使用 root 的身份来执行指令),因此并非所有人都能够执行 sudo ,而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令。
2、sudo命令用法
sudo可让用户以其他的身份来执行指定的指令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入当前用户密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
语法:
sudo [-bhHpV][-s ][-u <用户>][指令] 或 sudo [-klv]
参数:
参数 | 描述 |
-b | 在后台执行指令 |
-H | 将HOME环境变量设为新身份的HOME环境变量 |
-k | 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码 |
-K | 同-k |
-l | 列出目前用户可执行与无法执行的指令 |
-p | 改变询问密码的提示符号 |
-s | 执行指定的shell |
-u | 以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份 |
-v | 延长密码有效期限5分钟 |
-V | 显示版本信息 |
3、sudo工作流程
1)当用户执行 sudo 时,系统于 /etc/sudoers 档案中搜寻该使用者是否有执行 sudo 的权限;
2)若使用者具有可执行 sudo 的权限后,便让使用者输入用户自己的密码来确认;
3)若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);
4)若欲切换的身份与执行者身份相同,那也不需要输入密码。
此处有些简略,例如时间戳检查等,可以画逻辑图更清晰。
另c5.8和c6.4 sudo时间戳位置有不同。
4、visudo单用户授权
visudo是直接操作/etc/sudoers文件,我们也可以直接 vi /etc/sudoers,但是visudo命令的好处在于,退出/etc/sudoers文件时,系统会检查/etc/sudoers语法是否正确。
[root@www ~]# visudo
....(前面省略)....
root ALL=(ALL) ALL #<==找到这一行,大约在80 行左右
yang1 ALL=(ALL) ALL #<==新增这行!则yang1用户通过sudo拥有所有权限
....(前面省略)....
语法解释:
root | ALL=(ALL) | ALL |
使用者账号 | 登入者的来源主机名=(可切换的身份) | 可下达的指令 |
详细解释: | ||
使用者帐号 | 代表哪个用户使用sudo的权限 | |
来源主机名称 | 指定信任用户,即根据w查看[使用者帐号]的来源主机 | |
可切换的身份 | 代表可切换的用户角色,和sudo -u结合使用,默认是切换为root. | |
可下达的指令 | 用于权限设置,也可使用!来表示不可执行的命令 |
举例:
[root@www ~]# visudo
yang2 ALL=(root) !/usr/bin/passwd,!/usr/bin/passwd root
#允许yang2用户通过sudo来修改所有其它用户的密码,但不能修改root的密码
5、visudo利用群组授权
[root@www ~]# visudo
....(前面省略)....
%test ALL=(ALL) ALL
# 在最左边加上 % ,代表后面接的是一个群组,格式和单用户授权一样
[root@www ~]# usermod -a -G testtest #<==将test 加入root 的组中
任何加入test这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令
不需要密码即可使用 sudo
[root@www ~]# visudo
....(前面省略)....
%wheel ALL=(ALL) NOPASSWD: ALL
#在指令处加入NOPASSWD:ALL即可
6、visudo利用别名授权
公司有很多部门,要方便管理,就可使用别名的方式,如:开发部,运维部,技术支持部,每个部门里多个人,部门之间拥有的命令权限也不一样,同一部门权限一样。如果一条一条写的话,写也麻烦,改就更麻烦了。
别名的使用方法:
使用方法可通过 man sudoers后面的举例找到
root | ALL= | (ALL) | ALL |
使用者账号 | 登入者的来源主机名 | 可切换的身份 | 可下达的指令 |
User_Alias FULLTIMERS = millert, mikef, dowdy | Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0 | Runas_Alias OP = root, operator | Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm |
例:
[root@www ~]# visudo
User_Alias ADMPW = pro1,pro2, pro3, myuser1, myuser2 #配置用户别名ADMPW
Cmnd_Alias ADMPWCOM =!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
#配置命令别名ADMPWCOM
ADMPW ALL=(root) ADMPWCOM #指定用户别名里的成员,拥有命令别名里的权限
7、visudo与环境变量
1)现象描述:test1用户sudo命令已经有所有的权限,但不能查看网卡信息。
[test1@test ~]$ sudo -l
…省略…
User test1 may run thefollowing commands on this host:
(ALL) ALL
sudo权限已经全部有了
[test1@test ~]$ sudo ifconfig eth0
sudo: ifconfig: command notfound
不可以查看!提示这个命令找不到?为什么?这是因为系统环境变量导致的。
2) root环境变量与普通用户环境变量比较
test1用户找不到which命令在哪里,而root用户可以。
[test1@test ~]$ which ifconfig
/usr/bin/which: no ifconfig in(/application/mysql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/test1/bin)
[test1@test ~]$ su - root
Password:
[root@test ~]# which ifconfig
/sbin/ifconfig
这是为什么呢?
3)查看两个test1和root的PATH变量
[root@test ~]# echo $PATH
/application/mysql/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@test ~]# su - test1
[test1@test ~]$ echo $PATH
/application/mysql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/test1/bin
发现普通用户都没有sbin的路径,而很多命令都放在这些路径下。
4)在普通用户变量文件添加上述路径,cd ~ && vi ~.profile
在PATH后加入:/sbin:/usr/sbin:/usr/local/sbin
[test1@test ~]$ cat.bash_profile |grep PATH
PATH=$PATH:$HOME/bin:/sbin:/usr/sbin:/usr/local/sbin
[test1@test ~]$ source.bash_profile #使修改的变量文件生效
#修改变量后,接下来继续查看网卡信息
[test1@test ~]$ sudo ifconfigeth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:3B:DA:97
inet addr:10.0.0.239 Bcast:10.0.0.255 Mask:255.255.255.0
可以正常执行了!
5)为防止不出现用户找不到的命令,有两个方法
5.1)把上述路径添加到环境变量中,~/.bash_profile文件(普通用户可编辑),或/etc/profile全局文件(需root用户编辑)
5.2)执行命令用绝对路径,如: /sbin/ifconfig eth0
老男孩老师点评:上述为c5.8的PATH环境变量情况,c6.4无此问题。
8、配置sudo日志文件跟踪
操作步骤:
1)查询sample.sudoers文件位置
[root@yang1 ~]# rpm -ql sudo
/usr/share/doc/sudo-1.7.2p1/sample.sudoers
/usr/share/doc/sudo-1.7.2p1/sample.syslog.conf
2)查看sample.sudoers中的日志相关配置
sample.syslog.conf这个文件为官方配置sudo日志配置笔记
[root@yang1 ~]# cat/usr/share/doc/sudo-1.7.2p1/sample.sudoers|grep "log"
Defaults syslog=auth
Defaults>root !set_logname
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
3)创建日志文件
touch /var/log/sudo.log
4)把sudo日志文件加入系统日志
把下面命令添加到/etc/syslog.conf末尾
local2.debug /var/log/sudo.log
注:空白处不能用空格,必须用tab
老男孩老师点评:提示:c5.8和c6.4日志服务有不同syslog,rsyslog。
5)在/etc/sudoers中添加日志路径(也可用visudo编辑)
加在/etc/sudoers末尾:
echo 'Defaults logfile=/var/log/sudo.log' >> /etc/sudoers
6)测试
[root@yang1 ~]# cat/var/log/sudo.log #测试前sudo.log为空
[root@yang1 ~]# su - yang1 #进入普通用户(事先已授权)
[yang1@yang1 ~]$ sudo -l #查看当前用户sudo可执行的命令
[sudo] password for yang1:
Matching Defaults entries foryang1 on this host:
requiretty, !visiblepw, env_reset, env_keep="COLORS DISPLAYHOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2 QTDIR
USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATIONLC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC
LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSETXAUTHORITY", logfile=/var/log/sudo.log
Runas and Command-specificdefaults for yang1:
User yang1 may run the followingcommands on this host:
(ALL)!/usr/sbin/useradd, (ALL) !/usr/sbin/userdel, (ALL) /bin/touch #发现不能创建删除用户,能创建文件。
[yang1@yang1 ~]$ sudo touchyangrong #使用sudo创建一个文件
[yang1@yang1 ~]$ cat/var/log/sudo.log #查看sudo.log文件,已有记录,测试成功
9月 5 12:37:46 : yang1 : TTY=pts/2; PWD=/home/yang1 ; USER=root ; COMMAND=list
9月 5 12:38:05 : yang1 : TTY=pts/2; PWD=/home/yang1 ; USER=root ;
COMMAND=/bin/touch yangrong
测试成功!
服务器用户权限管理改造方案与实施项目步骤:
1.在了解公司业务流程后,提出权限整改解决方案改进公司超级权限root泛滥在现状
2.我首先撰写了方案后,给老大看,取得老大的支持后,召集大家开会讨论
3.讨论确定可行后,由我负责推进实施
4.实施后结果,公司的服务器权限管理更加清晰了(总结维护)
5.制定了账号权限申请流程及权限申请表格
问题现状:
当前我们公司里服务器上百台,各个服务器上的管理人员很多(开发+运维+架构+DBA+产品+市场),在大家登陆使用Linux服务器时,不同职能的员工水平不同,因为导致操作很不规范,root权限泛滥(几乎大部分人员都有root权限),经常导致文件等莫名其妙的丢失,老手和新手员工对服务器的熟知度也不同,这样使得公司服务器安全存在很大的不稳定性、及操作安全隐患,据调查企业服务器环境,50%以上的安全问题都来自于内部,而不是外部。为了解决以上问题,单个用户管理权限过大现状,现提出针对Linux服务器用户权限集中管理的解决方案:
项目需求:
我们既希望超级用户root密码掌握在少数或唯一的管理员手中,又希望多个系统管理员或相关有权限的人员,能够完成更多更复杂的自身职能相关的工作,又不至于越权操作导致系统安全隐患。
具体实现:
针对公司不同部门,根据员工的具体工作职能(例如:开发,运维,数据库管理员),分等级、分层次的实现对linux服务器管理权限最少化、规范化。这样即减少了运维管理成本,消除了安全隐患,又提高了工作效率,实现了高质量的、快速化的完成项目进度,以及日常系统维护。
实施方案:
说明:实施方案一般是由积极主动发现问题的运维人员提出方案,然后写好方案,在召集大家讨论可行性,最后确定方案,实施部署,最后后期总结维护。
思想:在提出问题之前,一定要想到如何解决,一并发出来解决方案。
信息采集:
召集相关各部门领导通过会议讨论或与各组领导沟通确定权限管理方案的可行性。
需要支持的人员:运维经理、CTO支持、各部门组的领导。我们作为运维人员,拿到类似这项目方案,给大家讲解这个文档,通过会谇形式做演讲,慷慨激昂的演说,取得大佬们的支持和认可,才是项目能够得以最终实施的前提,当然,即使不实施,那么你的能力也得到了锻炼,老大对你的积极主动思考网站架构问题也会另眼看待。
确定方案可行性后,会议负责人汇总、提交、审核所有相关员工对linux服务器的权限需求。
取得老大们的支持后,通过发邮件或者联系相关人员取得需要的相关员工权限信息。比如说,请名部门经理整理归类本部门需要登录linux权限的人员名单、职位、及负责的业务及权限,如果说不清楚权限细节,就说负责的业务细节,这样运维人员就可以确定需要啥权限了。
按照需要执行的linux命令程序及公司业务服务来规划权限和人员对应配置主要是运维人员根据上面收集的人员名单,需要的业务及权限角色,对应账号配置权限,实际就是配置sudo配置文件。
权限方案一旦实施后,所有员工必须通过《员工linux服务器管理权限申请表》来申请对应的权限,确定审批流程,规范化管理。这里实施后把住权限申请流程很重要,否则,大家不听说,方案实施完也会泡汤的。
写操作说明,对各部门人员进行操作讲解。sudo执行命令,涉及到PATH变量问题,运维提前处理好。
收集员工职能和对应权限
此过程是召集大家开会确定,或者请各组领导安排人员进行统计汇总,人员及对应的工作职责,交给运维人员,由运维人员优化职位所对应的系统权限。
如:
1)运维组
级别 | 权限 |
初级运维 | 查看系统信息,查看网络状态 |
/usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig, | |
高级运维 | 查看系统信息,查看和修改网格配置,进程管理,软件包管理,存储管理 |
/usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig, | |
运维经理 | 超级用户所有权限 |
ALL |
2)开发组:
级别 | 权限 |
初级开发 | 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, | |
开发经理 | 项目所在服务器的ALL权限,不能修改root密码 |
ALL,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root |
3)架构组
级别 | 权限 |
架构工程师 | 普通用户的权限 |
不加入sudo列表 |
4)DBA组:
级别 | 权限 |
初级DBA | 普通用户的权限 |
不加入sudo列靓 | |
高级DBA | 项目所在数据库服务器的ALL权限 |
ALL, /usr/bin/passwd [A-Za-z]* !/usr/bin/passwd root, !/usr/sbin/visudo, |
5)网络组
级别 | 权限 |
初级网络 | 普通用户权限 |
不加入sudo列靓 | |
高级网络 | 项目所在数据库服务器的ALL权限 |
/sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net, |
例如:本公司有
运维组:3个初级运维,