sudo简单命令语法及配置

参考:http://yangrong.blog.51cto.com/6945369/1289452, https://wiki.archlinux.org/index.php/Sudo_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

 

sudo : 以他人身份执行命令,默认为root。可在文件/etc/sudoers中配置。

若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入当前用户密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

1. sudo命令语法

语法:

sudo [-bhHpV][-s ][-u <用户>][指令] sudo [-klv]  或

 sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value]
            [-i|-s] [<command>]
参数:

 

 

 参数 参数别名

描述

-A

--askpass

密码提示使用辅助程序

-b

--background

在后台执行指令

-C

--close-from=num

关闭所有文件描述符 >=num

-E

--preserve-env

运行命令时保存用户环境

-e

--edit

编辑文件,代替执行命令

-g

--group=group

以指定的用户组名或ID执行命令

-H

--set-home

HOME环境变量设为新身份的HOME环境变量

-h

--help

显示帮助信息和文本

-h

--hoe=host

在主机上运行命令(如果插件支持)

-k

--reset-timestamp

无效的时间戳文件 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码

-K

--remove-timestamp

-k, 彻底删除文件的时间戳

-l

--list

列出目前用户可执行与无法执行的指令;列出用户的权限或检查一个特定的命令;使用两次更长的格式

-n

--non-interactive

非交互模式,无提示使用

-P

--preserve-groups

保存组向量,而不是设置为目标的

-p

--prompt=prompt

改变询问密码的提示符号

-S

--stdin

从标准输入读取密码

-s

--shell

执行指定的shell

-t

-type=type

创建指定类型的SELinux的安全上下文

-U

--other-user=user

在列表模式下,显示用户的权限

-u

--user=user

以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份

-v

--version

延长密码有效期限5分钟

-V

--validate

显示版本信息

--

 

停止处理命令行参数

 

 2. sudo工作流程

1)当用户执行 sudo 时,系统于 /etc/sudoers 档案中搜寻该使用者是否有执行 sudo 的权限;

2)若使用者具有可执行 sudo 的权限后,便让使用者输入用户自己的密码来确认(是否需要输入密码,可配置);

3)若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码)

4)若欲切换的身份与执行者身份相同,那也不需要输入密码。

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的密码

 

4. visudo利用群组授权

[root@www ~]# visudo

....(前面省略)....

%test ALL=(ALL) ALL

# 在最左边加上 % ,代表后面接的是一个群组,格式和单用户授权一样

[root@www ~]# usermod -a -G test test #<==test 加入root 的组中

任何加入test这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令

 

不需要密码即可使用 sudo

[root@www ~]# visudo

....(前面省略)....

%wheel ALL=(ALL) NOPASSWD: ALL

#在指令处加入NOPASSWD:ALL即可

 

5. 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 #指定用户别名里的成员,拥有命令别名里的权限

 

6. 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)查看两个test1rootPATH变量

 

[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

 

注:centos6.4没有此问题

 

7. 配置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

centos6.4的日志服务为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

 

测试成功!

 

上述为简单的审计,复杂点的可以把日志集中存储,更复杂点的可以对用户行为做录像回放,过滤分析等。

 

posted @ 2016-07-01 17:48  寻找普拉多  阅读(11975)  评论(0编辑  收藏  举报