身份切换与sudo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份切换与sudo相关的知识,希望对你有一定的参考价值。

su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。以root身份切换至普通用户则不需要输入密码


su

功能描述:

身份切换,替代用户和组ID运行指令

格式:

su –l username –c ‘command‘

su username

su - username

默认:


Centos 6 命令位置 /bin/su

Centos 7 命令位置 /usr/bin/su   /bin 软链接至 usr/bin

版本

选项

说明

示例

6

- 或 -l

变更身份时,变更环境变量为用户的



-c 指令

执行完指定的指令后,即恢复原来的身份



--session-command=COMMAND

与-c一致,只是不创建新的会话



-m 或 -p

变更身份时,不变更环境变量



-s

指定要执行的shell




su变更时须输入所要变更的用户帐号与密码,这在实际使用中会因为密码而导致安全上的问题,因此,就引出了sudo的实用性。

? sudo能够授权指定用户在指定主机上运行某些命令。 如果未授权用户尝试使用 sudo,会提示联系管理员

? sudo可以提供日志,记录每个用户使用sudo操作

? sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机

? sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”


sudo

功能描述:

授权使用指用命令

格式:

sudo [-u user] COMMAND

默认:


版本

选项

说明

示例

6

-u user

切换至指定用户, 默认为root



-l 或 -ll

列出用户在主机上可用的和被禁止的命令



-f

指定sudoers文件



-V

显示配置信息



-v

再延长密码有效期限5分钟,更新时间戳



-k

清除时间戳(变为1970-01-01),下次需要重新输密码



-K

与-k一致,同时删除时间戳文件



-b

在后面执行指令



-p

改变询问密码的提示符

如:-p ”password on %h for user %p:"



sudo配置

? 配置文件

/etc/sudoers

/etc/sudoers.d/

sudo 可以解析 /etc/sudoers.d/ 目录中的文件,这样就不需要编辑单一的 /etc/sudoers 文件,可以单独修改一个设置然后放入此目录。目录中配置的格式和 /etc/sudoers一样, 优点包括:

a.可以按指定分类创建文件

b.如果新配置有问题,可以删除这个文件,而不用编辑 /etc/sudoers.

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

#visudo -f /etc/sudoers.d/hunk    读取并编辑/etc/sudoers.d/指定文件

技术分享图片技术分享图片


#visudo –c 检查语法

/etc/sudoers: parsed OK

出错的时候,会提示如下信息,按 e 可以直接定位到出现错误的行

技术分享图片技术分享图片

#visudo -c

/etc/sudoers: parsed OK

/etc/sudoers.d/hunk: bad permissions, should be mode 0440

/etc/sudoers配置文件

技术分享图片技术分享图片


说明 :

1:授权规则

2:授权wheel组在任何位置执行任何指令。

3:设置sudo时免密码

4:这一行并不是注释,在/etc/sudoers.d/目录的文件会一并加载,这样做的好处是,每个用户生成 一个配置文件,方便管理。

配置文件更改后,立即生效


? 时间戳文件

/var/db/sudo


? 日志文件

/var/log/secure

#tail /var/log/secure

技术分享图片技术分享图片

? 配置文件支持使用通配符glob

?: 任意单一字符

* : 匹配任意长度字符

[wxc]: 匹配其中一个字符

[!wxc]: 除了这三个字符的其它字符

\x : 转义

[[alpha]] : 字母 示例: /bin/ls [[alpha]]*

更多请参考以前笔记


? 配置文件规则有两类

1、别名定义:不是必须的

2、授权规则:必须的


授权规则格式:

语法格式:

用户 登入主机=(代表用户) 命令

user host=(runas) command

root ALL=(ALL) ALL

技术分享图片

技术分享图片

? 格式说明:

user: 运行命令者的身份

host: 允许在哪些主机

(runas):以哪个用户的身份,此用户应当有权限运行后面的指令,否则没有意义。

command: 运行哪些命令,这里建议使用绝对路径。使用 逗号; 实现多行指令

其中,command一栏中的sudoedit比较特别,是授权用户编辑文件,而且在普通用户执行时,只需要这样使用:$sudoedit /etc/sudoers.d/hunk


示例:


一个普通用户并没有权限挂载光盘

[[email protected] ~]$mount /dev/sr0 /dvd

mount: only root can do that


设置sudo授权指定用户可以挂载光盘和卸载光盘

# visudo

#hunk   ALL=(root)  /usr/bin/mount /dev/cdrom /dvd,/usr/bin/umount /dvd


这种写法也可以,runas为空时,默认以root身份

#hunk    ALL= /usr/bin/mount /dev/cdrom /dvd,/usr/bin/umount /dvd


支持通配符

#hunk    ALL=/usr/bin/mount /dev/sr* /dvd,/usr/bin/mount /dev/cdrom /dvd,/usr/bin/umount /dvd

普通用户使用方式:


# sudo mount /dev/sr0 /dvd

第一次的时候,会验证密码,以后每隔5分钟会重新验证密码

技术分享图片技术分享图片

$sudo mount /dev/sr0 /dvd

mount: /dev/sr0 is write-protected, mounting read-only


注意:

sudo的字符串必须与sudoers配置文件要一模一样,否则就是不匹配

技术分享图片


一些特殊的写法:

rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm

NOPASSWD:不需要输入密码

PASSWD:需要输入密码

Defaults:hunk runas_default=user10


#1004    ALL=(root) /usr/sbin/,!/usr/sbin/ifconfig

! 排除或者理解为不能执行


Defaults:默认行为

[email protected]_List

Defaults:User_List

Defaults!Cmnd_List

Defaults>Runas_List


示例:

Defaults        syslog=auth

Defaults>root       !set_logname

Defaults:FULLTIMERS !lecture

Defaults:hunk   !authenticate   不进行身份验证

[email protected]    log_year, logfile=/var/log/sudo.log 指定这些主机的日志相关

Defaults!PAGERS     noexec


sudo别名


语法格式:

别名有四种类型:

别名关键字

赋值示例

User_Alias

User_Alias ADMINS = hunk, tom

Host_Alias

Host_Alias FILESERVERS = fs1, fs2

Host_Alias DNSSERVERS = 114.114.114.114,8.8.8.8

Runas_Alias

Runas_Alias OP = root

Cmnd_Alias

Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

Cmnd_Alias SERVICES =  /sbin/chkconfig, /usr/bin/systemctl start

别名格式:[A-Z]([A-Z][0-9]_)*


为sudo命令定义PATH环境变量

当你使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。所以当一个刚初始化的PATH变量中不包含你所要运行的程序所在的目录,用sudo去执行,你就会得到"command not found"的错误提示。

要想改变PATH在sudo会话中的初始值,用文本编辑器打开/etc/sudoers文件,找到"secure_path"一行,当你执行sudo 命令时,"secure_path"中包含的路径将被当做默认PATH变量使用。


Defaults    secure_path = $PATH:/sbin:/bin:/usr/sbin:/usr/bin


一些示例

授权 ls /usr/local/protected

$ sudo ls /usr/local/protected

以www的身份编辑指定的文件

$ sudoedit -u www ~www/htdocs/index.html

以组成员身份adm的查看日志

$ sudo -g adm more /var/log/syslog

以jim的身份且使用主组为audio的身份编辑指定文件

$ sudoedit -u jim -g audio ~jim/sound.txt

允许关机

$ sudo shutdown -r +15 "quick reboot"


在使用*号时,要特别注意安全问题

%operator ALL = /bin/cat /var/log/messages*

当以上规则时,可以匹配为

$ sudo cat /var/log/messages.1

也可以匹配为

$ sudo cat /var/log/messages /etc/shadow

是不是相当的危险?


可以这么设定

%operator ALL = /bin/cat /var/log/messages*,!/bin/cat /var/log/message* *


以上是关于身份切换与sudo的主要内容,如果未能解决你的问题,请参考以下文章

用户切换命令:su 与 sudo

sudo身份切换

su 与 sudo 区别

su和sudo命令的用法

linux命令su,sudo 使用和区别

linux切换到root用户,kali怎么切换root身份运行