加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux中sudo的用法和配置方法

(2012-02-18 10:43:19)
标签:

linux中

sudo的

用法

配置

方法

it

分类: 操作系统

什么是sudo

sudolinux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。

用户获取root特权的传统方式是以root身份登录或者输入一条su命令并输入root口令。当普通用户在图形界面环境下执行某一条享有特权的命令时,系统将提示用户输入root口令。

Ubuntu安装之后没有提供root口令,从而达到将root账号锁定的目的。这种设置能够阻止任何人以root账号登录(除非启动系统进入恢复模式)。然而,系统中确实存在root账号,这个账号/用户是一些文件的所有者(输入命令ls -l /bin,看看输出结果),并且运行了一些进程(输入命令ps -ef,看看输出结果)。

sudo工具能够用来运行命令,就像以root身份运行该命令一样。

 

sudo的优势

当使用sudo时,它要求你输入口令(不是root口令),这样只需要记住一个口令即可。

sudo工具将它执行的所有命令记入日志,这种日志对于操作失误后的操作步骤回顾以及系统审计都非常有用。

sudo工具能够允许实现比使用suroot账号更细粒度的案例策略。通过使用sudo,可以允许特定的用户来执行特定的命令。

sudo的使用使得恶意用户获取系统访问机会变得更加困难。如果将root解锁,那么恶意用户在开始攻击之前就能够知道他想要破解的账号的用户名。而如果不将root解锁,该恶意用户就必须确定用户名和口令才能侵入系统。

 

sudo常见用法

选项

含义

作用

sudo -h

Help

列出使用方法,退出。

sudo -V

Version

显示版本信息,并退出。

sudo -l

List

列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。

sudo -u username|#uid

User

以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是#uid

sudo -k

Kill

清除入场卷上的时间,下次再使用sudo时要再输入密码。

sudo -K

Sure kill

-k类似,但是它还要撕毁入场卷,也就是删除时间戳文件。

sudo -b command

Background

在后台执行指定的命令。

sudo -p prompt command

Prompt

可以更改询问密码的提示语,其中%u会代换为使用者帐号名称,%h会显示主机名称。非常人性化的设计。

sudo -e file

Edit

不是执行命令,而是修改文件,相当于命令sudoedit

 

如何配置sudo

配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。 

visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:

>>> sudoers file: syntax error, line 22 <<<
What now? e

此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。 

现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件,可以看到类似下面几行: 

Runas alias specification

User privilege specification
root    ALL=(ALL) ALL

我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白): 

foobar  ALL=(ALL) ALL

保存退出后,切换到foobar用户,我们用它的身份执行命令: 

[foobar@localhost ~]$ ls /root
ls: /root: 权限不够
[foobar@localhost ~]$ sudo ls /root
Password:
anaconda-ks.cfg  Desktop  install.log  install.log.syslog

好了,我们限制一下foobar的权利,不让他为所欲为。比如我们只想让他像root那样使用lsifconfig,把那一行改为: 

foobar  localhost= /sbin/ifconfig,   /bin/ls

再来执行命令: 

[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.
[foobar@localhost ~]$ sudo /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:14:85:EC:E9:9B
...

现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让foobar用户在linux主机上以jimmyrene的身份执行kill命令,这样编写配置文件: 

foobar linux=(jimmy,rene) /bin/kill

但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo -u了,它正是用在这种时候。foobar可以使用sudo -u jimmy kill PID或者sudo -u rene kill PID,但这样挺麻烦,其实我们可以不必每次加-u,把renejimmy设为默认的目标用户即可。再在上面加一行: 

Defaults:foobar runas_default=rene

Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行: 

Defaults    env_reset

另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件: 

foobar  localhost=NOPASSWD:     /bin/cat, /bin/ls

再来sudo一下: 

[foobar@localhost ~]$ sudo ls /root
anaconda-ks.cfg  Desktop  install.log  install.log.syslog

当然,你也可以说“某些命令用户foobar不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有