回顾前两节,在 001 中介绍了怎么添加用户及用户组,在 010 中介绍了从 client 端 ssh 到 server 的详细过程,那么接下来要介绍的就是是登陆到 server 之后如何切换用户了。
留一道真题: server 中有三个用户 lianhua,huasheng 和 lianhuasheng。lianhua 想把自己提权成 root,它自己没有权限去改 root 的文件,不过 huasheng 可以执行一些属于 root 的命令,试问这时候要怎么做才能让 lianhua 提权到 root?
 
su 
提权到 root 有两种方式,第一种就是 su 了,查看 su 的解释:
[root@controller-0 sudoers.d]# su --help
Usage:
su [options] [-] [USER [arg]...] Change the effective user id and group id to that of USER.
A mere - implies -l. If USER not given, assume root. Options:
-m, -p, --preserve-environment do not reset environment variables
-g, --group <group> specify the primary group
-G, --supp-group <group> specify a supplemental group -, -l, --login make the shell a login shell
-c, --command <command> pass a single command to the shell with -c
--session-command <command> pass a single command to the shell with -c
and do not create a new session
-f, --fast pass -f to the shell (for csh or tcsh)
-s, --shell <shell> run shell if /etc/shells allows it -h, --help display this help and exit
-V, --version output version information and exit
 
通过 su 加指定 user 的方式将当前用户提权到指定用户(一般是 root)。su 提示输的密码是要提权用户的密码:
[lianhua@***n ~]$ su - root
Password:
Last login: Sat Mar 7 17:55:48 CST 2020 on pts/0
[root@*** ~]# env
XDG_SESSION_ID=5763
HOSTNAME=***
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
http_proxy=http://10.110.***.***
USER=root
LS_COLORS=36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/bin/env
之所以登陆之后要 show 环境变量 env 的原因是因为加了 - 的提权方式是 login shell 的,也就是提权到指定用户之后环境变量都会变成指定用户的环境变量,如果不用 - 的话,会出现这样的情况:
[lianhua@*** ~]$ su root
Password:
[root@*** ~]# env
XDG_SESSION_ID=5763
HOSTNAME=***
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
USER=lianhua
http_proxy=http://10.110.***.***
LS_COLORS=36:*.xspf=01;36:
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lianhua/.local/bin:/home/lianhua/bin
MAIL=/var/spool/mail/lianhua
PWD=/home/lianhua
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=lianhua
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/bin/env
可以看到虽然提前到 root 了,但是环境变量还是 huasheng 的,这也意味着要使用一些 root 用户才能用的命令需要使用绝对路径来指定该命令,相当麻烦!
 
虽然 su 可以提权到 root , 但是通过 su 提权需要知道 root 的密码,如果用户多的话,很容易泄露 root 账号的密码,这是很危险的。针对这种情况,一个更安全的提权方式 sudo 就派上用场了。
 
 
sudo
 
sudo 可以让非 root 用户在不需要知道 root 用户密码的情况下,提权到 root 执行 root 用户才能执行的命令。
 
查看 sudo 选项:
Options:
-A, --askpass use a helper program for password prompting
-b, --background run command in the background
-C, --close-from=num close all file descriptors >= num
-E, --preserve-env preserve user environment when running command
--preserve-env=list preserve specific environment variables
-e, --edit edit files instead of running a command
-g, --group=group run command as the specified group name or ID
-H, --set-home set HOME variable to target user's home dir
-h, --help display help message and exit
-h, --host=host run command on host (if supported by plugin)
-i, --login run login shell as the target user; a command may also be specified
-K, --remove-timestamp remove timestamp file completely
-k, --reset-timestamp invalidate timestamp file
-l, --list list user's privileges or check a specific command; use twice for longer format
-n, --non-interactive non-interactive mode, no prompts are used
-P, --preserve-groups preserve group vector instead of setting to target's
-p, --prompt=prompt use the specified password prompt
-r, --role=role create SELinux security context with specified role
-S, --stdin read password from standard input
-s, --shell run shell as the target user; a command may also be specified
-t, --type=type create SELinux security context with specified type
-T, --command-timeout=timeout terminate command after the specified time limit
-U, --other-user=user in list mode, display privileges for user
-u, --user=user run command (or edit file) as specified user name or ID
-V, --version display version information and exit
-v, --validate update user's timestamp without running a command
-- stop processing command line arguments
 
可以通过 sudo -u <user> <command> 的方式来指定要提权的 user 所执行的 command,如果不指定 user 的话默认提权到 root。
 
对 lianhua 进行提权执行 passwd 命令:
[lianhua@*** ~]$ sudo passwd
[sudo] password for lianhua:
Sorry, user lianhua is not allowed to execute '/bin/passwd' as root on controller-0-forestgreen.
与 su 提权输入密码不一样的是:这里 sudo 需要输入的密码是 lianhua 密码,这点要注意。
那么问题来了,为什么 lianhua 不能执行 passwd 命令呢?
原因在于文件 /etc/sudoers 需要修改相应的配置才能让 lianhua 执行 passwd。
 
通过 visudo 工具查看 /etc/sudoers ,这个工具会检查 /etc/sudoers 有没有修改,修改的格式对不对。
[root@test ~]visudo
...
root ALL=(ALL) ALL
...
主要参数是 root ALL=(ALL) ALL 这一项,列出来单独讨论。
 
每项表示的意义是:
用户账号   登陆者的来源主机名=[可切换的身份] 可执行的命令
root ALL = (ALL) ALL
 
用户账号: 要使用 sudo 命令的账号;
登陆者的来源主机名: 表示允许登陆的主机,如果不为 ALL 则表示授权用户只能在指定主机上登陆 server 执行 sudo 命令。
可切换的身份: 当前用户可以这个身份来执行后面的命令,默认提权到 root。
可执行的命令: 切换的身份可以执行的命令,这个命令是绝对路径,不能用相对路径!试想如果一个用户造了一个命令也叫 passwd,如果执行命令用相对路径,用户执行 passwd 的话执行到这个造出来的 passwd 命令,那是相当危险的!
 
查看 huasheng 这个用户在 /etc/sudoers 里的配置:
[root@*** ~]visudo
...
huasheng ALL=(ALL) NOPASSWD:/usr/sbin/visudo
...
与前面有一点点不一样的是,huasheng 多了一个 NOPASSWD 字段,这是因为使用 sudo 提权执行命令的时候会提示输入当前用户的密码,很麻烦,所以管理员也就是我给它加了个 NOPASSWD 字段,这样就不用每次输密码了。
 
好了,那我们好好玩一玩 huasheng,首先把登陆者的来源主机名改掉,改成 hostname 对应的 ip,然后把这个 ip 加到 huasheng 的登陆者来源主机名中:
[root@*** ~]# hostname
test
[root@*** ~]# hostname -I
10.57.0.1
[root@*** ~]# visudo
...
huasheng 10.57.0.1=(ALL) NOPASSWD:/usr/sbin/visudo
...
[root@*** ~]# su - huasheng
Last login: Sat Mar 7 16:06:10 CST 2020 on pts/0
[huasheng@*** ~]$ sudo visudo
visudo: /etc/sudoers.tmp unchanged
<关于 hostname 详解可看这里>
 
把这个 ip 改成其它主机的 ip 看看能不能执行 visudo:
[huasheng@*** ~]# visudo
...
huasheng 10.57.1.1=(ALL) NOPASSWD:/usr/sbin/visudo
...
[huasheng@*** ~]$ sudo visudo
[sudo] password for huasheng:
huasheng is not allowed to run sudo on test. This incident will be reported.
提示 hausheng 不能在当前主机 test 上执行这个 visudo 命令!
 
把 ip 改回来,把 huasheng 的可切换身份改为 lianhua 执行 visudo 看看:
[root@test ~]# visudo
[root@test ~]# su - huasheng
Last login: Sat Mar 7 19:27:29 CST 2020 on pts/0
[huasheng@test ~]$ sudo visudo
[sudo] password for huasheng:
Sorry, user huasheng is not allowed to execute '/sbin/visudo' as root on test.
提示的很明显,huasheng 没有提权到 root,所以不能执行 visudo 命令!
 
 
真题演练
折腾半天 huasheng 了,也得看看 lianhua 咋滴了,他还是没法提权切不了 root 。再回看开头的问题,结合前面的分析应该知道怎么提权了,直接给答案:
[lianhua@test ~]$ su - huasheng
Password:
Last login: Sat Mar 7 19:52:44 CST 2020 on pts/0
[huasheng@test ~]$ which su
/bin/su
[huasheng@controller-0-forestgreen ~]$ sudo visudo
...
lianhua ALL=(ALL) NOPASSWD: /bin/su
... [huasheng@test ~]$ exit
logout
[lianhua@test ~]$ sudo su
[root@test lianhua]#
 
题目还有个用户 lianhuasheng ,看看他的配置:
[root@test lianhua]# visudo
...
lianhuasheng ALL=(ALL) NOPASSWD: /bin/su
...
他的配置和 hausheng / lianhua 一样,那么把他们三个加到一个组,起名叫 ADMINGROUP ,这个组里的用户可以提权到 root。但是要给他们设置不能执行 passwd 和 passwd root 命令,不然他们就能把原来的 root 密码给改掉了,这样是很危险的! 
在 /etc/sudoers 中,组的配置是在组名前加 % 号表示,同时禁用某个命令是在命令前加 ! 号,* 号作为通配符表示可以执行目录下一系列命令。
[root@test lianhua]# groupadd ADMINGROUP
[root@test lianhua]# visudo
...
%ADMINGROUP ALL=(ALL) NOPASSWD: /bin/su, !/bin/passwd, !/bin/passwd root
...
[root@test lianhua]# usermod -G ADMINGROUP lianhua
[root@test lianhua]# usermod -G ADMINGROUP huasheng
[root@test lianhua]# usermod -G ADMINGROUP lianhuasheng
[root@test lianhua]# su - lianhua
Last login: Sat Mar 7 19:56:00 CST 2020 on pts/0
[lianhua@test ~]$ sudo su
[root@test lianhua]#
 
 
现在我们改提权的方式都是直接改的 /etc/sudoers 文件,但是系统推荐的更好的方式是在 /etc/sudoers.d/ 目录下新建配置的用户。/etc/sudoers 文件默认已经配置了该目录:
[root@test ~]# cat /etc/sudoers | grep sudoers.d
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
再把 ADMINGROUP 移到 /etc/sudoers.d 目录下,重新配置这三个用户:
[root@test lianhua]# cd /etc/sudoers.d/
[root@test sudoers.d]# vi ADMINGROUP
%ADMINGROUP ALL=(ALL) NOPASSWD: /bin/su
[root@test sudoers.d]# visudo
[root@test sudoers.d]# su - lianhua
Last login: Sat Mar 7 20:17:35 CST 2020 on pts/0
[lianhua@test ~]$ sudo su
[root@test lianhua]#
 
 
(完)

每天学五分钟 Liunx 011 | sudo的更多相关文章

  1. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  2. 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画

    原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...

  3. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  4. 《sed的流艺术之一》-linux命令五分钟系列之二十一

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  5. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  6. 一门能让你五分钟学会的语言-Brainfuck

    看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会? 其实我本来也是不相信的,但是学过了才知道这是真的. 1.Brainfuck 看到这个小标题,不要误会,我没有骂人. ...

  7. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  8. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  9. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  10. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

随机推荐

  1. 【已解决】nrm -g安装成功后不是全局应用(command not found: nrm)

    本机情况: 服务器系统:CentOS 8.1 nodejs版本:20 问题描述: 在命令行执行命令,npm install -g nrm,全局安装nrm. 安装之后,执行nrm ls 报command ...

  2. 16、strconv

    1.strconv是什么? strconv是用来处理字符串和基本类型之间的转换的 2.strconv的使用 /** * @author ly (个人博客:https://www.cnblogs.com ...

  3. ES索引误删的名场面

    ES索引误删的名场面 慌了3秒,果断发个邮件: 01 最近,在版本发布时: ES线上未备份的索引,被当场「误删」了: 对于新手来说,妥妥的社死名场面: 对于老手来说,慌它3秒表示一下态度: 当时的情况 ...

  4. Docker部署系列之Docker Compose安装Redis三主三从集群

    总结/朱季谦 在日常开发或者编程当中,经常需要用到redis集群,若是按照传统的方式,一个机器一个机器搭建,难免过于繁琐,故而可以通过dock er-compose编排方式,快速搭建.我在搭建过程当中 ...

  5. vivo 数据库备份恢复系统演化

    作者:vivo 互联网数据库团队 - Han Chaobing 介绍 vivo 数据库备份恢复功能的演化,以及对备份文件的功能扩展. 一.概述 vivo互联网领域拥有的数据库组件分别为 MySQL.M ...

  6. 10.elasticsearch集群red恢复损坏的索引

    背景 客户磁盘损坏,修复磁盘后,重启机器,发现elasticsearch启动成功,ES状态正常green,但是历史数据都没有加载进,查看ES存储数据目录,发现数据还在. 解决方案 首先,需要确认ind ...

  7. Flutter PageView(轮动图)

    Flutter中的轮动图以及抖音上下滑页切换视频功能等等,这些都可以通过 PageView 轻松实现 PageView常见属性: PageView 的使用 class MyPage extends S ...

  8. 揭秘GES超大规模图计算引擎HyG:图切分

    摘要:GES大规模图计算引擎HyG通过实现不同的点边分区算法,可以灵活地供用户选择多种多样的切分策略,进而达到更好的运算性能. 本文分享自华为云社区<GES超大规模图计算引擎HyG揭秘之图切分& ...

  9. 带你读AI论文丨用于细粒度分类的Transformer结构—TransFG

    摘要:本文解读了<TransFG: A Transformer Architecture for Fine-grained Recognition>,该论文针对细粒度分类任务,提出了对应的 ...

  10. 在springboot中,如何读取配置文件中的属性

    摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应 ...