sudo - 以其他用户身份执行一条命令
sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
sudo 是一种权限管理机制,管理员可以给一些普通用户授权去执行一些 root 执行的操作,而不需要知道 root 的密码。
sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo 支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作。默认的安全策略记录在 /etc/sudoers 文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。
usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user]
[command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p
prompt] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p
prompt] [-u user] file ...
选项:
-A, --askpass 使用助手程序进行密码提示
-b, --background 在后台运行命令
-C, --close-from=num 关闭所有 >= num 的文件描述符
-E, --preserve-env 在执行命令时保留用户环境
-e, --edit 编辑文件而非执行命令
-g, --group=group 以指定的用户组或 ID 执行命令
-H, --set-home 将 HOME 变量设为目标用户的主目录。
-h, --help 显示帮助消息并退出
-h, --host=host 在主机上运行命令(如果插件支持)
-i, --login 以目标用户身份运行一个登录
shell;可同时指定一条命令
-K, --remove-timestamp 完全移除时间戳文件
-k, --reset-timestamp 无效的时间戳文件
-l, --list
列出用户权限或检查某个特定命令;对于长格式,使用两次
-n, --non-interactive 非交互模式,不提示
-P, --preserve-groups
保留组向量,而非设置为目标的组向量
-p, --prompt=prompt 使用指定的密码提示
-r, --role=role 以指定的角色创建 SELinux 安全环境
-S, --stdin 从标准输入读取密码
-s, --shell 以目标用户运行
shell;可同时指定一条命令
-t, --type=type 以指定的类型创建 SELinux 安全环境
-U, --other-user=user 在列表模式中显示用户的权限
-u, --user=user 以指定用户或 ID
运行命令(或编辑文件)
-V, --version 显示版本信息并退出
-v, --validate 更新用户的时间戳而不执行命令
-- 停止处理命令行参数
[deng@itcast ~]$ sudo -l
匹配 %2$s 上 %1$s 的默认条目:
!visiblepw, always_set_home, match_group_by_gid, env_reset,
env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 deng 可以在 itcast 上运行以下命令:
(ALL) ALL
[deng@itcast ~]$
[deng@itcast ~]$ sudo -k
[deng@itcast ~]$ sudo useradd test1
[sudo] deng 的密码:
有效期结束后,执行特殊命令,需重新验证密码
sudo命令输入密码默认是不可见的。
[deng@itcast ~]$ sudo -u tom ls /home/tom
[deng@itcast ~]$
[deng@itcast ~]$ sudo touch file
[deng@itcast ~]$ ls -l file
-rw-r--r-- 1 root root 0 8月 3 17:10 file
[deng@itcast ~]$
[deng@itcast ~]$ sudo !!
sudo ls
bak oracle_client_11gR2.tar.gz share test.cpp 图片 桌面
bj34 oradiag_deng sz12 公共 文档
file projects test 模板 下载
instantclient_11_2 scott_data.sql test.c 视频 音乐
[deng@itcast ~]$
这里普及以下:如果上一条命令我执行的是gcc(编译)
我又要执行他,中间没有其他命令,可以 !g,表示执行上一条gcc~ 相同命令。
[deng@itcast ~]$ sudo -V
Sudo 版本 1.8.19p2
Sudoers 策略插件版本 1.8.19p2
Sudoers 文件语法版本 45
Sudoers I/O plugin version 1.8.19p2
[deng@itcast ~]$
[root@itcast ~]# visudo
仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白)
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 tom ALL=(ALL) ALL
第一个ALL是指网络中的主机。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。
保存退出后,切换到deng用户测试
[deng@itcast ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[deng@itcast ~]$ sudo ls /root
[sudo] deng 的密码:
anaconda-ks.cfg openssl-1.1.1-pre6-dev.zip test.cpp 图片 桌面
bak openssl-master 公共 文档
initial-setup-ks.cfg oracle_client_11gR2.tar.gz 模板 下载
instantclient_11_2 share 视频 音乐
[deng@itcast ~]$
限制一下tom的权限。比如我们只想让他像root那样使用执行lastb,把那一行改为:
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 tom localhost=/usr/bin/lastb
测试:
[deng@itcast ~]$ lastb
lastb: /var/log/btmp: Permission denied
[deng@itcast ~]$ sudo lastb
root pts/2 Sat Aug 3 19:15 - 19:15 (00:00)
root pts/2 Sat Aug 3 15:52 - 15:52 (00:00)
root pts/1 Fri Aug 2 21:00 - 21:00 (00:00)
root pts/1 Thu Aug 1 21:27 - 21:27 (00:00)
btmp begins Thu Aug 1 21:27:11 2019
[deng@itcast ~]$
例如,我们想让tom用户在linux主机上以deng或itcast的身份执行kill命令,这样编写配置文件:
tom linux=(deng,itcast) /bin/kill
但这还有个问题,tom到底以deng还是itcast的身份执行?这时我们应该想到了sudo -u了,它正是用在这种时候。 tom可以使用sudo -u deng kill PID或者sudo -u itcast kill PID,但这样挺麻烦,其实我们可以不必每次加-u,把deng或itcast设为默认的目标用户即可。再在上面加一行:
Defaults:foobar runas_default=itcast
Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:
Defaults env_reset
另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:
tom localhost=NOPASSWD: /bin/cat, /bin/ls
sudo为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。
touch /var/log/sudo
vi /etc/syslog.conf
在syslog.conf最后面加一行(必须用tab分割开)并保存:
local2.debug /var/log/sudo
重启日志守候进程
ps aux grep syslogd
把得到的syslogd进程的PID(输出的第二列是PID)填入下面
kill –HUP PID
sudo就可以写日志了:
[deng@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo: deng :
TTY=pts/1 ; pwd=/home/deng ; USER=root ; command=/bin/ls /root
sudo 有自己的方式来保护安全。以root的身份执行sudo-V,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。
文章借鉴自:https://blog.csdn.net/dengjin20104042056/article/details/98369403
下一篇介绍sudoers命令,sudo的高级用法,可更改配置文件。
版权声明:转载请注明出处,谢谢!