su、sudo和sudoer
某个普通用户如user1想执行一些root用户才有权执行shell命令时,shell会提示权限不够无法执行。
怎么办?
办法一:用su命令切换到root用户下,执行所有命令。
su命令格式:su [options] [-] [<user> [<argument>...]]
当<user>为root时,可以省略不写,即最常用的命令"su -"
注意:root 用户切换普通用户不需要密码验证,而普通用户切换到 root 用户时需要输入当前用户的登录密码进行验证。
su
命令与用户名之间有一个减号(-)时,表示把环境变量也切换为<user>的,不保留当前用户的环境变量;没有减号时,保留环境变量不切换。
办法二:不切换用户,在当前shell下使用sudo命令,提升权限到root用户权限执行命令。
sudo的主要功能:
认证:执行命令时输入当前登录用户的密码进行验证,验证密码后5分钟内(默认值)用户用户无需输入密码执行命令;
授权:对用户/用户组、主机、执行的命令或命令组等进行权限限制;
审计:用户执行的每条命令都会被记录,便于管理员审计安全性;
配置管理:通过/etc/sudioers配置文件
进行认证、授权、审计等配置管理
通常,只需在命令行前加sudo执行,执行时输入自己(user1)的密码验证通过后,就能正常执行,无需知道root等用户的密码,比较安全。
sudo执行命令时输入正确密码后,密码会有一个有效期(默认为5分钟),在有效期内用sudo执行其它命令,不会再要求输入密码,否则每执行一次命令都要求输入密码,还不得烦死
sudo命令的常用格式:sudo [选项] [-u <用户名>] [<命令>]
sudo命令的常用选项有:
-k选项:清空密码的有效期,下次执行 sudo 时需要再次进行密码验证;
-b选项:让命令在后台执行;
-p选项:修改询问密码的提示语
强烈建议用visudo命令编辑sudoers文件,因为visudo能自动检查sudoers文件的语法参数错误并报错,禁止多人同时编辑sudoers,
但是只有 root 用户才有权限使用 visudo
命令。
下面看看sudoers文件具体内容:
主要分为三类:
- 第1类:用default指令设置一些默认行为,如环境复位,输入密码时回显特殊字符,密码超时时间戳等:
Defaults env_reset, pwfeedback,timestamp_timeout=1
- 第2类:以别名方式设置主机、用户、命令别名,目的是把多个主机、多个用户、多条命令组织为组的方式,便于下面第3类格式中进行整体引用进行控制,如下:
1、主机别名:把多个主机名、主机ip以别名方式组织在一起:
# Host alias specification
## Groups of machines. You may prefer to use hostnames (perhaps using wildcards for entire domains) or IP addresses instead.
Host_Alias FILESERVERS = fs1, fs2,192.168.1.254
2、用户别名: 把某些用户组织为用户别名便于整体引用这些用户名
# User alias specification
## User Aliases
## These aren't often necessary, as you can use regular groups (ie, from files, LDAP, NIS, etc) in this file - just use %groupname rather than USERALIAS
User_Alias ADMINS = jsmith, mikem
3、命令别名:把不同命令组织成组便于整体引用进行集中设置权限,通常按命令的用途分类进行组织,注意命令需要以绝对路径形式给出
# Cmnd alias specification
## Command Aliases
## These are groups of related commands...
## Networking
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
## Installation and management of software
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services
Cmnd_Alias SERVICES = /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable
## Updating the locate database
Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage
Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Delegating permissions
Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
## Processes
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
## Drivers
Cmnd_Alias DRIVERS = /sbin/modprobe
- 第3类:用户权限指定,这是最关键的部分:
设置哪些用户/用户组、哪些主机、可切换到哪些用户/用户组,是否输入密码、执行/禁止执行哪些命令。
语法格式结构:
字段1 字段2 =[(字段3)] [字段4] 字段5
对应最简单的语法格式:user MACHINE=COMMANDS
对应完整语法格式:授权用户/组 主机 =[(切换到哪些用户或组)] [NOPASSWD] 命令1,命令2,命令n
其中字段3、字段4,是可以省略的。
如果字段3存在,必须用小括号括起来,省略
字段3
则相当于字段3为(root),字段4固定为NOPASSWD,省略时表示执行命令时必须输入密码验证
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL