Linux下sudo配置详解
配置sudo日志:
vim /etc/sudoers
Defaults logfile=/var/log/sudo.log
touch /var/log/sudo.log
chmod 640 /var/log/sudo.log
vim /etc/rsyslog.conf
# Save sudo messages also to sudo.log local2.debug /var/log/sudo.log
service rsyslog restart
sudo警告提醒:
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] matrix 的密码:
sudoers配置文件
sudoers文件由三部分组成:
sudoers的默认配置,主要设置sudo的一些缺省值(本文不会对这些默认配置进行介绍,若有兴趣可以自己man 5 sudoers然后搜defaults)
alias(别名),可以看作是变量的定义啦,本文也会全面的说说别名的定义。
规则定义,sudoers文件的重点啦,本文会着重说明规则的定义。
Alias(别名)
一共有四种类型的别名,这些类型可以看作它们是数据类型啦哈。
User_Alias
Runas_Alias
Host_Alias
Cmnd_Alias
定义这些Alias,语法如下:
User_Alias NAME=User_List
Runas_Alias NAME=Runas_List
Host_Alias NAME=Host_List
Cmnd_Alias NAME=Cmnd_List
这里的NAME就可以看作是变量名咯。注意,NAME必须是要以大写字母开头,而且只能包含有大写字母,数字,下划线呢。那么User_List,Runas_List,
Host_List,Cmnd_List又是什么呢?其实就是以“,"分隔的一个数组啦,只不过这四个别名表示的数组内容都会不同啦。
现在分别看看User_List,Runas_List,Host_List,Cmnd_List的每个数组元素可以是些什么值吧!
User:[!][username |#uid |%groupname | +netgroup |%:nonunix_group |User_Alias]
Runas:[!][username|#uid |%groupname | +netgroup |Runas_Alias]
Host:[!][hostname | ip_addr | network(/netmask)? | netgroup | Host_Alias]
Cmnd:[!][commandname| directory| "sudoedit" | Cmnd_Alias]
叹号'!'表示取反的意思啦。
每个元素都可以是之前定义过的别名变量啦,所以会有User_List,Runas_List,Host_List,Cmnd_List这些元素啦。
directory表示有可以进入该目录并执行命令的权限啦
"sudoedit"表示允许用户使用sudo -e选项。
如果还没搞懂的话,可以看下面的别名定义的例子:
User_Alias USER_TEST=tim,#501,%svn,+webgroup,%:nonunix,!nouser
Runas_Alias RUNAS_TEST=tim,#501,%svn,!+webgroup
Host_Alias HOST_TEST=!www.baidu.com,localhost,127.0.0.1
Cmnd_Alias CMND_TEST=Cmnd_Alias CMDS=/bin/passwd,/bin/ls,/home/svn
User Specification(用户规则)
用户规则定义的语法如下:
User_List Host_List=(Runas_List1:Runas_List2) SELinux_Spec Tag_Spec Cmnd_List,...
下面对上面的语法进行说明一下:
User_List(必填项):指的是该规则是针对哪些用户的。
Host_List(必填项):指的是该规则针对来自哪些主机的用户。
Runas_List1(可选项):表示可以用sudo -u来切换的用户
Runas_List2(可选项):表示可以用sudo -g来切换的用户组
SELinux_Spec(可选项):表示SELinux相关的选项,可选值为ROLE=role 或 TYPE=type。本人对SELinux不太熟,以后再补充这里吧。
Tag_Spec(可选项):用于控制后面Cmnd_List的一些选项啦,可选值有下面这些,具体自己man一下吧,这里就不啰嗦了。
'NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:'
...(可选项):表示可以有多个(Runas_List1:Runas_List2) SELinux_Spec Tag_Spec Cmnd_List段的意思了。
Notice:如果Runas_List1和Runas_List2都没填的话,默认是以root用户执行
杂项
sudoers文件下的通配符
通配符只可以用在主机名、文件路径、命令行的参数列表中。下面是可用的通配符:
*:匹配任意数量的字符
?:匹配一个任意字符
[...]:匹配在范围内的一个字符
[!...]:匹配不在范围内的一个字符
\x:用于转义特殊字符
在使用通配符时有以下的注意点:
1.使用[:alpha:]等通配符时,要转义冒号':',如:[\:alpha\:]
2.当通配符用于文件路径时,不能跨'/'匹配,如:/usr/bin/*能匹配/usr/bin/who但不能匹配/usr/bin/X11/xterm
3.如果指令的参数列表是""时,匹配不包含任何参数的指令。
4.ALL这个关键字表示匹配所有情况。
man sudoers下的例子解析
# 用户别名定义
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
#用户切换别名定义
Runas_Alias OP = root, operator
Runas_Alias DB = Oracle, sybase
Runas_Alias ADMINGRP = adm, oper
#主机别名定义
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
#指令别名定义
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt
Cmnd_Alias REBOOT = /usr/sbin/reboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less
#开始定义规则
#root用户及wheel用户组下的所有用户都可以从任何主机连接进来以任意身份执行任意命令
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
#FULLTIMERS这个用户别名中定义的用户可以从任何主机连接进来以任意身份执行任意命令,而且在切换用户或用户组时不需要输入密码
FULLTIMERS ALL = NOPASSWD: ALL
#PARTTIMERS这个用户别名中定义的用户可以从任何主机连接进来以root身份执行任意命令。
PARTTIMERS ALL = ALL
#The user jack may run any command on the machines in the CSNETS alias (the networks 128.138.243.0, 128.138.204.0, and 128.138.242.0). Of those
#networks, only 128.138.204.0 has an explicit netmask (in CIDR notation) indicating it is a class C network. For the other networks in CSNETS,
# the local machine’s netmask will be used during matching.
jack CSNETS = ALL
#lisa这个用户可以从CUNETS中定义的主机连接进来以root身份执行任意指令。
lisa CUNETS = ALL
#oprator这个用户可以从任何主机连接进来以root身份执行DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,sudoedit /etc/printcap, /usr/oper/bin/定义的指令
operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING, sudoedit /etc/printcap, /usr/oper/bin/
#joe这个用户可以从任何主机连接进来,并且只能执行su operator指令
joe ALL = /usr/bin/su operator
#pete这个用户可以从HPPA定义的主机中连接进来并以root身份执行passwd的所有命令,除了passwd root
pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
#opers这个用户组下的所有用户可以从任何主机连接进来,并可以切换至ADMINGRP中定义的用户组进入/usr/sbin并执行命令
%opers ALL = (: ADMINGRP) /usr/sbin/
#bob这个用户可以从SPARC和SGI中定义的主机连接进来,并可以OP定义的用户执行任意指令
bob SPARC = (OP) ALL : SGI = (OP) ALL
#jim这个用户可以从biglab这个netgroup中连接进来,并执行任意指令
jim +biglab = ALL
#secretaries这个netgroup下的所有用户可以从任意主机连接进来,并以root身份执行PRINTING,/usr/bin/adduser, /usr/bin/rmuser中定义的指令
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
#fred这个用户可以从任何主机连接进来并以DB别名定义的用户来执行所有指令,并且不需要输入密码
fred ALL = (DB) NOPASSWD: ALL
#john这个用户可以从ALPHA定义的主机中连接进来,并可以以root身份执行su指令,但不能执行su root和使用任何su选项
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
#jen这个用户可以从任何主机(除了SERVERS中定义的主机)连接进来,并以root身份执行任意指令
jen ALL, !SERVERS = ALL
#jill这个用户可以从SERVERS定义的主机连接进来,并以root身份进入/usr/bin/执行指令,但不能执行SU和SHELLS中定义的命令
jill SERVERS = /usr/bin/, !SU, !SHELLS
#steve这个用户可以从CSNETS中定义的主机连接进来,并以operator这个用户可以进入/usr/local/op_commands/执行指令
steve CSNETS = (operator) /usr/local/op_commands/
-----------------------
## Host Aliases
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2
## User Aliases
# User_Alias ADMINS = jsmith, mikem
## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe
Cmnd_Alias DENYCMD = !/bin/su - root, !/bin/su - root, !/bin/bash, !/sbin/reboot, !/sbin/service, !/sbin/poweroff, !/sbin/shutdown, !/sbin/halt, !/usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root, !/usr/bin/passwd, !/sbin/fdisk, !/bin/vi, !/usr/bin/vim
Cmnd_Alias JZ = /usr/sbin/useradd
# Defaults specification
## Allow root to run any commands anywhere
rootALL=(ALL) ALL
matrixALL=(ALL) ALL 需要密码
matrixALL=(ALL) NOPASSWD:ALL, DENYCMD, !JZ 不需要密码,
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
# %wheelALL=(ALL)ALL
## Same thing without a password
# %wheelALL=(ALL)NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
-------------------------
Linux禁止普通用户su至root的解决方法
一、概述
为禁止普通用户su至root,需要分别修改/etc/pam.d/su和/etc/login.defs两个配置文件。
二、详细配置
(1)去除/etc/pam.d/su文件中如下行的注释:
#auth required pam_wheel.so use_uid
(2)在/etc/login.defs文件中加入如下配置项:
SU_WHEEL_ONLY yes
经过上述配置后,普通用户将被禁止su至root,如果希望指定普通用户su至root,可以执行如下命令将该用户添加至wheel组中:
usermod -G wheel username
三、示例
[root@titan ~]# id apple
uid=1001(apple) gid=1001(fruit) 组=1001(fruit),10(wheel)
[root@titan ~]# id banana
uid=1002(banana) gid=1001(fruit) 组=1001(fruit)
[apple@titan ~]$ su - root
密码:
[root@titan ~]#
[banana@titan ~]$ su - root
密码:
su: 拒绝权限
[banana@titan ~]$
linux 普通用户切换成root免密码的实现
root@ok ~]# vim /etc/pam.d/su
下面是/etc/pam.d/su文件的内容
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
auth include system-auth
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session optional pam_xauth.so
将第4行的#号去掉,然后将登陆用户加入 wheel组
[root@ok ok]# usermod -G wheel ok
[ok@ok ~]$ su
[root@ok ok]#
su直接切换成root
linux普通用户获取管理员权限
测试环境:CentOS 5.5
1、添加用户,首先用adduser命令添加一个普通用户,命令如下:
#adduser tommy
//添加一个名为tommy的用户
#passwd tommy //修改密码
Changing password for user tommy.
New UNIX password: //在这里输入新密码
Retype new UNIX password: //再次输入新密码
passwd: all authentication tokens updated successfully.
2、赋予root权限
方法一: 修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
然后修改用户,使其属于root组(wheel),命令如下:
#usermod -g root tommy
修改完毕,现在可以用tommy帐号登录,然后用命令 su - ,即可获得root权限进行操作。
方法二: 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tommy ALL=(ALL) ALL
修改完毕,现在可以用tommy帐号登录,然后用命令 su - ,即可获得root权限进行操作。
方法三: 修改 /etc/passwd 文件,找到如下行,把用户ID修改为 0 ,如下所示:
tommy:x:500:500:tommy:/home/tommy:/bin/bash
修改后如下
tommy:x:0:500:tommy:/home/tommy:/bin/bash
保存,用tommy账户登录后,直接获取的就是root帐号的权限。
友情提醒:虽然方法三看上去简单方便,但一般不推荐使用,推荐使用方法二。
---------------------
sudoers文件谈“拒绝”与“允许”
##Cmnd_Alias by umbe##
Cmnd_Alias USERCMD = !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
Cmnd_Alias USERCMD = !/usr/bin/passwd
sudo passwd =>不加任何参数也是拒绝
sudo passwd root =>加参数也拒绝
结论:如果仅有一个!/usr/bin/passwd选项,他的作用.拒绝用户执行passwd命令,不管有没有参数 。
Cmnd_Alias USERCMD = !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*
sudo /usr/bin/passwd root =>匹配后面这个参数可以更改以字母开头账户的密码
sudo /usr/bin/passwd =>不接用户拒绝执行
结论:“/usr/bin/passwd [A-Za-z]*” 这个选项的作用是:如果使用passwd命令,后面必须接用户且这个用户必须是以字母开头的用户,
如果passwd后面不带用户或者是以数字开头的用户,passwd命令拒绝执行 !
Cmnd_Alias USERCMD =!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
sudo /usr/bin/passwd root =>不允许更改root密码
sudo /usr/bin/passwd =>不接用户拒绝执行
sudo /usr/bin/passwd oldboy =>可以更改其他以字母开头用户的密码
结论:!/usr/bin/passwd root 的作用是用户不能更改root的密码。
Cmnd_Alias USERCMD = /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
sudo /usr/bin/passwd =>配置文件没有匹配项所以拒绝执行
sudo /usr/bin/passwd 001 =>只允许字母开头的账户,所以数字开头账户拒绝
sudo /usr/bin/passwd root =>配置文件明确表示不能更改root 所以拒绝
sudo /usr/bin/passwd oldboy =>可以更改字母开头账户的密码
结论:配置文件中如果没有命令的匹配路径,默认也是拒绝执行这个命令,但是我们为什么还要加上!/usr/bin/passwd 这个命令呢?为了考虑全面!
---------------------------
二、命令选项顺序对执行结果的影响
1.配置文件为:
Cmnd_Alias USERCMD =!/usr/bin/passwd root, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd
sudo /usr/bin/passwd oldboy =>拒绝
sudo /usr/bin/passwd root =>拒绝
sudo /usr/bin/passwd =>拒绝
结论:
1.sudoers中命令的读取顺序是从后向前读
2.通过更改!/usr/bin/passwd 顺序发现,如果!/usr/bin/passwd放到最后,就会全部决绝执行passwd命令
----------------------------------------------------------------------
2.配置文件为:
Cmnd_Alias USERCMD =!/usr/bin/passwd,!/usr/bin/passwd root, /usr/bin/passwd [A-Za-z]*
sudo /usr/bin/passwd oldboy =>允许更改以字母头的用户
sudo passwd root =>也允许更改root
sudo /usr/bin/passwd =>后面不接用户不允许执行
结论:
1.sudoers中命令的读取顺序是从后向前读
2.如果先读取允许参数,再读取拒绝参数。允许生效,拒绝失效,这也是为什么!/usr/bin/passwd 要放在/usr/bin/passwd [A-Za-z]*的后面
-----------------------
结论:
1.配置文件中如果没有命令的匹配路径,默认也是拒绝执行这个命令;虽说是拒绝执行,一是为了考虑全面,二是还是自己亲自写上比较放心!
2.sudoers中命令的读取顺序是从后向前读
3.通过更改!/usr/bin/passwd 顺序发现,如果!/usr/bin/passwd放到最后,就会全部决绝执行passwd命令,
4.命令相同,参数不同,参数范围越小,放的位置越靠后!(不论拒绝还是允许只要你的范围小你就得靠后,区别于包含关系)
!/usr/bin/passwd,!/usr/bin/passwd [A-Za-z]*, /usr/bin/passwd root 这三个命令的参数都在/usr/bin/passwd 这个范围内(不是包含关系)
!/usr/bin/passwd =>不允许执行passwd命令,不管有没有参数,全部拒绝
/usr/bin/passwd [A-Za-z]* =>执行passwd命令,但是只能更改以字母开头的账户密码
!/usr/bin/passwd root =>不允许更改root用户的密码
其中!/usr/bin/passwd =>的意思是全部拒绝,他的范围最大所以要放在最前面
/usr/bin/passwd [A-Za-z]* =>范围其次,只能更改以字母开头账户的密码,范围要比!/usr/bin/passwd 要小
!/usr/bin/passwd root =>这个命令已经定义到用户,所以他的范围比 /usr/bin/passwd [A-Za-z]*范围要小,所以要放在最后
4.定义命令执行的范围要一级级定义不能跨级否则命令就会失效。
三、包含关系
包含关系中:前面允许,后面拒绝 拒绝生效
前面拒绝,后面允许 拒绝失效
读取顺序由后向前读 =>这个很重要
以这个为例:
1.Cmnd_Alias USERCMD =!/usr/bin/passwd root, /usr/bin/passwd [A-Za-z]*
拒绝在前,允许在后
注:/usr/bin/passwd root 包含于 usr/bin/passwd [A-Za-z]*
sudo /usr/bin/passwd root =>可以更改root密码
2.Cmnd_Alias USERCMD =/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root,
允许在前,拒绝在后
sudo /usr/bin/passwd root =>不能更改root密码
本文暂时没有评论,来添加一个吧(●'◡'●)