Difference between revisions of "Sudo (简体中文)"

From ArchWiki
Jump to: navigation, search
m (Change to iproute2 ss)
m (pacman-color package is gone.)
Line 90: Line 90:
 
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill
 
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill
 
Cmnd_Alias EDITS = /usr/bin/vim, /usr/bin/nano, /usr/bin/cat, /usr/bin/vi
 
Cmnd_Alias EDITS = /usr/bin/vim, /usr/bin/nano, /usr/bin/cat, /usr/bin/vi
Cmnd_Alias ARCHLINUX = /usr/sbin/gparted, /usr/bin/pacman, /usr/bin/pacman-color
+
Cmnd_Alias ARCHLINUX = /usr/sbin/gparted, /usr/bin/pacman
  
 
root ALL = (ALL) ALL
 
root ALL = (ALL) ALL

Revision as of 11:22, 5 April 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary end

sudo(superuser "do")使得系统管理员可以授权允许特定用户(或用户组)作为root或其他用户执行某些(或所有)命令,同时能够对命令及其参数提供审核跟踪。[1]

合理性

用户也可以通过su切换到root用户运行命令。然而与su的启动一个root shell允许用户运行之后的所有的命令不同,sudo可以针对单个命令授予临时权限。sudo仅在需要时授予用户权限,减少了用户因为错误执行命令损坏系统的可能性。sudo也可以用来以其他用户身份执行命令。此外,sudo可以记录用户执行的命令,以及失败的特权获取。

安装

安装 sudo 软件包,可以在官方源找到。在配置之前,普通用户还无法使用sudo。所以请认真阅读配置部分。

使用

普通用户只需在命令前加上sudo,即可使用root(或其他用户)特权执行命令:

$ sudo pacman -Syu

参见:sudo manual

配置

使用 visudo

sudo的配置文件是/etc/sudoers。应当永远使用visudo命令编辑/etc/sudoers文件。visudo会锁住sudoers文件,保存修改到临时文件,然后检查文件格式,确保正确后才会覆盖sudoers文件。必须保证sudoers格式正确,否则sudo将无法运行。

警告: /etc/sudoers格式错误会导致sudo不可用。必须使用visudo编辑该文件防止出错。

visudo调用的默认编辑器是vi。如果要使用其他编辑器,在该命令前加上EDITOR环境变量即可。例如,要使用 vim,用root运行以下命令:

# EDITOR="/usr/bin/vim -p -X" visudo

可以通过设置环境变量永久性改变默认编辑器。以vim为例,将:

export EDITOR="/usr/bin/vim -p -X"

加入用户主目录下的~/.bashrc文件即可。注意:改变不会应用到已经打开的shell。

此外,也可以通过修改/etc/sudoers永久更改默认编辑器。使用visudo打开该文件,加入以下内容(以vim为例):

# Defaults specification
# Reset environment by default
Defaults      env_reset
# Set default EDITOR to vim, and do not allow visudo to use EDITOR/VISUAL.
Defaults      editor=/usr/bin/vim, !env_editor

要为某个用户提供特权,使其可以使用sudo执行所有命令,在配置文件中加入:

用户名   ALL=(ALL) ALL

如果只想允许本地登陆的用户使用sudo:

用户名   主机名=(ALL) ALL

允许wheel用户组成员无密码使用sudo:

%wheel      ALL=(ALL) NOPASSWD: ALL

请把用户名替换为实际用户名称。

只为用户启用部分特权:

用户名 主机名=/sbin/halt,/sbin/poweroff,/sbin/reboot,/usr/bin/pacman -Syu

该用户只能使用sudo执行halt、poweroff、reboot,以及使用pacman升级系统。

更详细的sudoers范例,参见本页。此外,更多信息参见:sudoers manual

sudoers文件默认权限

sudoers文件的属主和属组ID必须都是0,文件权限位是0440(-r--r-----)。如果你不小心改变了默认权限,应当立即恢复它们:

# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers

密码过期时间

用户可以修改sudo记录密码的时间。使用visudo命令将如下内容加入/etc/sudoers

Defaults:用户名 timestamp_timeout=20

对该用户,sudo将记录密码20分钟。时间值也可以是小数。

提示: 如果timestamp_timeout设置为0,sudo总是询问密码。

使用技巧

sudoers 范例

该配置针对使用终端复用器(screen、tmux或者ratpoison):

/etc/sudoers
Cmnd_Alias WHEELER = /usr/sbin/lsof, /bin/nice, /bin/ps, /usr/bin/top, /usr/local/bin/nano, /usr/sbin/ss, /usr/bin/locate, /usr/bin/find, /usr/bin/rsync
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill
Cmnd_Alias EDITS = /usr/bin/vim, /usr/bin/nano, /usr/bin/cat, /usr/bin/vi
Cmnd_Alias ARCHLINUX = /usr/sbin/gparted, /usr/bin/pacman

root ALL = (ALL) ALL
yourusename ALL = (ALL) ALL, NOPASSWD: WHEELER, NOPASSWD: PROCESSES, NOPASSWD: ARCHLINUX, NOPASSWD: EDITS
 
Defaults !requiretty, !tty_tickets, !umask
Defaults visiblepw, path_info, insults, lecture=always
Defaults loglinelen = 0, logfile =/var/log/sudo.log, log_year, log_host, syslog=auth
Defaults mailto=webmaster@foobar.com, mail_badpass, mail_no_user, mail_no_perms
Defaults passwd_tries = 8, passwd_timeout = 1
Defaults env_reset, always_set_home, set_home, set_logname
Defaults !env_editor, editor="/usr/bin/vim:/usr/bin/vi:/usr/bin/nano"
Defaults timestamp_timeout=360
Defaults passprompt="Sudo invoked by [%u] on [%H] - Cmd run as %U - Password for user %p:"

bash 自动补全支持

默认情况下,bash可以补全普通命令:

fire<TAB>

shell补全为:

firefox

但如果在前面加上sudo:

sudo fire<TAB>

shell就不能补全了。

要开启sudo的自动补全,将以下内容加入用户的~/.bashrc即可:

complete -cf sudo

此外,还可以安装bash-completion软件包,它对包括sudo在内的很多命令提供补全支持。详情参见:bash#Auto-completion

使用sudo运行X11程序

要使用sudo运行X11图形界面程序,需要使用visudo在配置文件中加入:

Defaults env_keep += "HOME"

跨终端sudo

警告: 此举使得所有进程都使用同一个sudo任务。

如果不想每次启动新终端都重新输入密码,在配置文件中禁止tty_tickets即可:

Defaults !tty_tickets

环境变量

当前用户的环境变量不会应用到sudo启动的程序,除非使用-E选项:

$ sudo -E pacman -Syu

如果经常需要这样做,可以在~/.bashrc(或其他shell配置文件)中加入命令别名:

alias sudo="sudo -E"

/etc/sudoers中添加以下内容作用相同:

Defaults !env_reset

如果只需要传递*_proxy变量,在配置文件中加入:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

直接运行 /sbin 和 /usr/sbin 中的命令

sudo中默认无法直接运行/sbin/usr/sbin中的系统管理命令,必须使用绝对路径。调整该设置的方法是使用visudo添加如下配置:

Defaults secure_path="/bin:/sbin:/usr/bin:/usr/sbin" 

这样就可以使用:

$ sudo command

而非:

$ sudo /sbin/command
$ sudo /usr/sbin/command

传递命令别名

当前用户的命令别名不会应用到sudo。如果需要这样,只需在~/.bashrc或者/etc/bash.bashrc中加入:

alias sudo='sudo '

扯淡

用户输入密码不正确时,sudo会提示“Sorry, try again.”。在配置文件的“Defaults”部分加入以下内容,会得到更有趣的错误提示:

#Defaults specification
Defaults insults

输入sudo -K清空密码缓存,然后测试。

使用root密码

默认sudo询问用户密码。添加rootpw到配置文件的“Defaults”部分,可以让sudo询问root密码:

Defaults timestamp_timeout=0,rootpw

禁止root登陆

警告: ArchLinux用户最好不要禁用root用户,出问题就麻烦大了。

有了sudo,用户也许希望禁止使用root登陆。没有了root用户,黑客就不知道管理员账户的名字了。

警告: 务必在禁用root之前配置好其他用户的权限!

使用passwd命令锁住root用户:

# passwd -l root

下列命令解锁root用户:

$ sudo passwd -u root

或者,编辑/etc/shadow文件,将root的加密口令列替换为“!”:

root:!:12345::::::

要再次启用sudo,重新设置其密码即可:

$ sudo passwd root

kdesu

KDE下常用kdesu以root权限执行GUI程序。默认情况下,即使root账户被禁用,kdesu仍会尝试使用su切换root。需要配置kdesu以使用sudo,创建/编辑/usr/share/config/kdesurc加入:

[super-user-command]
super-user-command=sudo

Policykit

禁用root账户后,将无法修改PolicyKit本地权限配置。编辑/etc/polkit-1/localauthority.conf.d/50-localauthority.conf,找到以下内容:

AdminIdentities=unix-user:0

根据实际情况进行修改。可以修改成一组用户和用户组,例如:

AdminIdentities=unix-group:wheel

或者:

AdminIdentities=unix-user:me;unixuser:mom;unix-group:wheel

更多信息,参见:man pklocalauthority

疑难解答

SSH TTY 问题

远程执行命令时,SSH默认不会分配tty。没有tty,sudo就无法在获取密码时关闭回显。使用-tt选项强制SSH分配tty(使用两次-tt)。

另一方面,sudoers中的Defaults选项requiretty要求只有拥有tty的用户才能使用sudo。可以通过visudo编辑配置文件,禁用这个选项:

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. 
# You have to run "ssh -t hostname sudo <cmd>".
#
# Defaults    requiretty

显示用户权限

通过下列命令查看用户权限:

 sudo -lU 用户名

仅查看自己的权限:

 sudo -l

输出:

Matching Defaults entries for yourusename on this host:
    loglinelen=0, logfile=/var/log/sudo.log, log_year, syslog=auth, mailto=sqpt.webmaster@gmail.com, mail_badpass, mail_no_user, mail_no_perms, env_reset, always_set_home, tty_tickets, lecture=always, pwfeedback, rootpw, set_home

User yourusename may run the following commands on this host:
    (ALL) ALL, 
    (ALL) NOPASSWD: /usr/sbin/lsof, /bin/nice, /usr/sbin/ss, /usr/bin/su, /usr/bin/locate, /usr/bin/find, /usr/bin/rsync, /usr/bin/strace, 
    (ALL) /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill, 
    (ALL) /usr/sbin/gparted, /usr/bin/pacman
    (ALL) /usr/local/bin/synergyc, /usr/local/bin/synergys, 
    (ALL) /usr/bin/vim, /usr/bin/nano, /usr/bin/cat
    (root) NOPASSWD: /usr/local/bin/synergyc

权限 Umask

Sudo 会统一用户的 umask 值和它自己的 umask (默认是 0022)。这会阻止 sudo 创建比该用户的 umask 允许的打开权限更多的文件。这默认是合理的,因为没有使用自定义 umask。但是这可能导致用sudo运行一个命令和root运行一个命令建立的文件权限不同。如果这导致了问题,sudo 提供了一个方法来修复 umask,即使想要的 umask 比用户指定的 umask 权限还要多。添加下面内容 (使用 visudo) 会覆盖 sudo 的默认行为:

Defaults umask = 0022
Defaults umask_override

这会将 sudo 的 umask 设置为 root 的默认 umask (0022),覆盖掉默认行为,无论用户的umask设置成什么都会使用这里设定的值。