Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3491382
  • 博文数量: 534
  • 博客积分: 11595
  • 博客等级: 上将
  • 技术积分: 5785
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-22 17:00
文章分类

全部博文(534)

文章存档

2015年(4)

2014年(27)

2013年(15)

2012年(38)

2011年(36)

2010年(85)

2009年(63)

2008年(142)

2007年(124)

分类: LINUX

2010-01-16 17:15:38

sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆 和管理时间,同样也提高了安全性。Sudo不是对shell的一个代替,它是面向每个命令的。它的特性主要有这样几点:

  § sudo能够限制用户只在某台主机上运行某些命令。

  § sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。

  § sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。

  § sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0411。

sudo的使用

       权限:在 /etc/sudoers 中有出现的使用者

  使用方式:sudo -V

  sudo -h

  sudo -l

  sudo -v

  sudo -k

  sudo -s

  sudo -H

  sudo [ -b ] [ -p prompt ] [ -u username/#uid] -s

  用法:sudo command

  说明:以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行

  参数:

  -V 显示版本编号

  -h 会显示版本编号及指令的使用方式说明

  -l 显示出自己(执行 sudo 的使用者)的权限

  -v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码

  -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)

  -b 将要执行的指令放在背景执行

  -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称

  -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)

  -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell

  -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )

  command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

  范例:

  sudo -l 列出目前的权限

  sudo -V 列出 sudo 的版本资讯

  指令名称:sudoers(在fc5下显示不能找到此命令,但用man可以查到其用法。)

  用来显示可以使用sudo的用户

sudoers的配置

sudoers是sudo的主要配置文件,linux下通常在/etc目录下,如果是solaris,缺省不装sudo的,编译安装后通常在安装目录的etc目录下,不过不管sudoers文件在哪儿,sudo都提供了一个编辑该文件的命令:visudo来对该文件进行修改。强烈推荐使用该命令修改 sudoers,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。
言归正传,下面介绍如何配置sudoers
首先写sudoers的缺省配置:
#############################################################
# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# User privilege specification
root    ALL=(ALL) ALL
# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
# Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now
##################################################################
1. 最简单的配置,让普通用户support具有root的所有权限
执行visudo之后,可以看见缺省只有一条配置:
root    ALL=(ALL) ALL
那么你就在下边再加一条配置:
support ALL=(ALL) ALL
这样,普通用户support就能够执行root权限的所有命令
以support用户登录之后,执行:
sudo su -
然后输入support用户自己的密码,就可以切换成root用户了
2. 让普通用户support只能在某几台服务器上,执行root能执行的某些命令
首先需要配置一些Alias,这样在下面配置权限时,会方便一些,不用写大段大段的配置。Alias主要分成4种
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias
1) 配置Host_Alias:就是主机的列表
Host_Alias      HOST_FLAG = hostname1, hostname2, hostname3
2) 配置Cmnd_Alias:就是允许执行的命令的列表,命令前加上!表示不能执行此命令.

命令一定要使用绝对路径,避免其他目录的同名命令被执行,造成安全隐患 ,因此使用的时候也是使用绝对路径!
Cmnd_Alias      COMMAND_FLAG = command1, command2, command3 ,!command4
3) 配置User_Alias:就是具有sudo权限的用户的列表
User_Alias USER_FLAG = user1, user2, user3
4) 配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
5) 配置权限
配置权限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密码验证的话,则按照这样的格式来配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
配置示例:
############################################################################
# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
Host_Alias      EPG = 192.168.1.1, 192.168.1.2
# User alias specification
# Cmnd alias specification
Cmnd_Alias      SQUID = /opt/vtbin/squid_refresh, !/sbin/service, /bin/rm

Cmnd_Alias      ADMPW = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd, !/usr/bin/passwd root
# Defaults specification
# User privilege specification
root    ALL=(ALL) ALL
support EPG=(ALL) NOPASSWD: SQUID
support EPG=(ALL) NOPASSWD: ADMPW
# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
# Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now
###############################################################

visudo编辑sudoers配置文件,不过也可以直接通过修改sudoers文件实现,不过编辑之前最好看一下它的sample.sudoers文件,里面有一个相当详细的例子可以参考。    

空格部分用tab键代替

  #第一部分:用户定义,将用户分为FULLTIMERS、PARTTIMERS和WEBMASTERS三类。    

  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    

  #第三部分,将主机分类。这些都是随便分得,目的是为了更好地管理。    

  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,   /usr/sbin/fasthalt    

  Cmnd_Alias   REBOOT   =   /usr/sbin/reboot,   /usr/sbin/fastboot    

  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    

 #这里是针对不同的用户采用不同地策略,比如默认所有的syslog直接通过auth   输出。FULLTIMERS组不用看到lecture(第一次运行时产生的消息);用户millert使用sudo时不用输入密码;以及logfile的路径在/var/log/sudo.log而且每一行日志中必须包括年。    

  Defaults   syslog=auth    

  Defaults:FULLTIMERS   !lecture    

  Defaults:millert   !authenticate    

     log_year,   logfile=/var/log/sudo.log    

  #root和wheel组的成员拥有任何权利。    

  root   ALL   =   (ALL)   ALL    

  %wheel   ALL   =   (ALL)   ALL    

 #FULLTIMERS可以运行任何命令在任何主机而不用输入自己的密码    

  FULLTIMERS   ALL   =   NOPASSWD:   ALL    

  #PARTTIMERS可以运行任何命令在任何主机,但是必须先验证自己的密码。    

  PARTTIMERS   ALL   =   ALL    

  #jack可以运行任何命令在定义地CSNET(128.138.243.0,   128.138.242.0和128.138.204.0/24的子网)中,不过注意前两个不需要匹配子网掩码,而后一个必须匹配掩码。    

  jack   CSNETS   =   ALL    

  #lisa可以运行任何命令在定义为CUNETS(128.138.0.0)的子网中主机上。    

  lisa   CUNETS   =   ALL    

  #用户operator可以运行DUMPS,KILL,PRINTING,SHUTDOWN,HALT,REBOOT以及在/usr/oper/bin中的所有命令。    

  operator   ALL   =   DUMPS,   KILL,   PRINTING,   SHUTDOWN,   HALT,   REBOOT,    

  /usr/oper/bin/    

  #joe可以运行su   operator命令    

  joe   ALL   =   /usr/bin/su   operator    

  #pete可以为除root之外地用户修改密码。    

  pete   HPPA   =   /usr/bin/passwd   [A-z]*,   !/usr/bin/passwd   root    

  #bob可以在SPARC和SGI机器上和OP用户组中的root和operator一样运行如何命令。    

  bob   SPARC   =   (OP)   ALL   :   SGI   =   (OP)   ALL    

 #jim可以运行任何命令在biglab网络组中。Sudo默认“+”是一个网络组地前缀。    

  jim   +biglab   =   ALL    

  #在secretaries中地用户帮助管理打印机,并且可以运行adduser和rmuser命令。    

  +secretaries   ALL   =   PRINTING,   /usr/bin/adduser,   /usr/bin/rmuser    

  #fred能够直接运行oracle或者sybase数据库。    

  fred   ALL   =   (DB)   NOPASSWD:   ALL    

  #john可以在ALPHA机器上,su除了root之外地所有人。    

  john   ALPHA   =   /usr/bin/su   [!-]*,   !/usr/bin/su   *root*    

  #jen可以在除了SERVERS主机组的机器上运行任何命令。    

  jen   ALL,   !SERVERS   =   ALL    

  #jill可以在SERVERS上运行/usr/bin/中的除了su和shell命令之外的所有命令。    

  jill   SERVERS   =   /usr/bin/,   !SU,   !SHELLS    

  #steve可以作为普通用户运行在CSNETS主机上的/usr/local/op_commands/内的任何命令。    

  steve   CSNETS   =   (operator)   /usr/local/op_commands/    

 #matt可以在他的个人工作站上运行kill命令。    

  matt   valkyrie   =   KILL    

  #WEBMASTERS用户组中的用户可以以www的用户名运行任何命令或者可以su   www。    

  WEBMASTERS   www   =   (www)   ALL,   (root)   /usr/bin/su   www    

  #任何用户可以mount或者umount一个cd-rom在CDROM主机上,而不用输入密码。    

  ALL   CDROM   =   NOPASSWD:   /sbin/umount   /CDROM,    

  /sbin/mount   -o   nosuid,nodev   /dev/cd0a   /CDROM    

   

  10)   我的sudoers   配置文件是这样的    

  User_Alias   ADMIN   =   root,username    

  Runas_Alias   OP   =   username    

  Cmnd_Alias   IPCHAINS   =   /usr/bin/ipchains    

  Cmnd_Alias   EDIT   =   /bin/vi    

  Cmnd_Alias   SHUTDOWN   =/sbin/shutdown    

  Cmnd_Alias   HALT   =   /usr/bin/halt    

  Cmnd_Alias   DEL   =   /bin/rm    

  Cmnd_Alias   COPY=   /bin/cp    

  Cmnd_Alias   SU=/bin/su    

  Cmnd_Alias   SLEEP=   /bin/sleep    

  Cmnd_Alias   REBOOT   =   /usr/bin/reboot    

  Cmnd_Alias   CHMOD=/bin/chmod    

  Cmnd_Alias   HWCLOCK=/sbin/hwclock    

  Cmnd_Alias   TRACET=/usr/sbin/traceroute    

  Cmnd_Alias   VIPW   =   /sbin/route    

  Cmnd_Alias   PASSWD=/usr/bin/passwd    

  Cmnd_Alias   IPSEC=/usr/local/sbin/ipsec    

  Cmnd_Alias   ARP=/sbin/arp    

  Cmnd_Alias   HOSTNAME=/bin/hostname    

  root   ALL   =   (ALL)   ALL    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:HOSTNAME    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:ARP    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:HWCLOCK    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:IPCHAINS    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:HALT    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:SHUTDOWN    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:REBOOT    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:CHMOD    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:IPSEC    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:PASSWD    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:TRACET    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:DEL    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:COPY    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:SU    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:EDIT    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:SLEEP    

  ADMIN   SERVERNAME=(ALL)   NOPASSWD:ROUTE    

   

  sudo的使用相对地简单,只要将sudo和sudoers命令拷贝到相应的路径即可。Sudo命令可以rename成你所喜欢的名字,sudoers也一样。

阅读(1220) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~