科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何在非root状态下用root身份执行命令

如何在非root状态下用root身份执行命令

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

大多数人犯下的第一个错误是:一开始就以root身份运行X,无意中一切都变得非常简单——能够直接访问到所有的文件,系统管理任务可以轻松地搞定,能够安装新的软件,等等。 >Emeg4?N {

作者:ccidnet 来源:ccidnet 2007年10月16日

关键字: 命令 状态 root Linux

  • 评论
  • 分享微博
  • 分享邮件
用非root身份运行X YhBTV%ql  
J_w9~Xa {  
  大多数人犯下的第一个错误是:一开始就以root身份运行X,无意中一切都变得非常简单——能够直接访问到所有的文件,系统管理任务可以轻松地搞定,能够安装新的软件,等等。 >Emeg4?N {  
O'"H_\29r  
  问题在于有许多程序是不应该用root身份运行的。如果你用自己的身份(非root身份)启动文件管理器,然后删除/home,你会丢失自己的所有文件,然后一边寻找备份文件一边不停地抱怨自己。万幸的是所有其他用户的文件都还安然无恙。但是,如果你用root来做同样的事情,马上就会陷入众人的抱怨和诅咒之中。 a1G?3b4OC  
;SV!h'V&  
  文件共享程序也同样不应该用root身份运行。如果有人找出了Irc或者Gnutella程序的漏洞,他们最多只能偷窃你自己的文件。但如果你用root来运行这些程序,所有用户的文件将完全暴露在他们的眼前,包括最最重要的/etc/shadow密码文件,以及你同事的私人邮件。这可不是什么好事。 zQt;z MY 5  
-A*=6U'  
  所以,请务必用你自己的帐号来运行X,用本文下面介绍的方法来运行那些必须使用root才能运行的任务。 u:6qZ0 O@  
bX\'E6^v  
su和su - S<.(NeDP  
u1x=1mp.  
  假设有人占据了拨号线路,我们想知道那个家伙到底是谁。tcpdump会显示出线路上的数据包传输情况,我们来试试下面这个命令: hOnl=?   
,^lL5Y^>K  
[wstearns@sparrow wstearns]$ tcpdump -i ppp0 -qtn  $vAJ7  
tcpdump: socket: Operation not permitted &mb;Gdk,  
e^:IUM  
Uw(^](@  
hwc;"Y  
  哦,对了。这个shell和所有其他X下的程序一样,都用wstearns运行。你会想我可以从命令行提示看出来,不是吗?:-) XviuoQs_g  
lnc~EW$  
  不过,我可不想只为了一个命令从X完全退出。su命令让我们用另外一个用户临时地替代当前用户。如果不指定自己想成为哪一个用户,则su默认我们想成为root。不要吓起哄说什么黑客技术,除非当前用户就是root,否则还是老老实实给su提供目标用户的密码。:-) TX@jiA3H  
Vaqh8 .i  
[wstearns@sparrow wstearns]$ tcpdump -i ppp0 -qtn 1a H86d%6  
tcpdump: socket: Operation not permitted 4dLk&Z3  
[wstearns@sparrow wstearns]$ su - Password: < 输入root的密码 > Du?^VEo2j  
[root@sparrow /root]# tcpdump -i ppp0 -qt UyAlIq]  
User level filter, protocol ALL, datagram packet socket E3G7kTjNB  
tcpdump: listening on ppp0 ;X@ bV  
< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10] D4?a;rp  
> ME.33085 > reflectix.xs4all.nl.29788: tcp 0 (DF) !^A2a>  
< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10] >WA>]'k|`  
> ME.33085 > reflectix.xs4all.nl.29788: tcp 0 (DF) a}nnnc]d  
< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10] fb&QBsm.e@  
> ME.33085 > reflectix.xs4all.nl.29788: tcp 0 (DF) $AY__bVaxJ  
< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10] xW ObeF  
*^&%ZkD#  
7 packets received by filter ^e4=~I)  
[root@sparrow /root]# exit mYHgyY2R  
[wstearns@sparrow wstearns]$ (MLG'*i5  
X7M+7k<  
Ah8=Xff99  
kAT74 T~L  
  哦,原来是我自己下载文件占用了拨号线路。呵呵。 w8\ii  
=dw` LMev  
  你或许已经注意到,上面这个例子使用的是su -而不是su。“-”将提供目标用户的环境来替代当前用户的环境。下面这个例子很明确地说明了这一点,不用su -时shell不能在/sbin和/usr/sbin下找到我们要执行的命令: "^fFO~l!1i  
Mfd\\u  
[wstearns@sparrow wstearns]$ su T} aC)k  
Password: < 输入root的密码 > ZzL!oLI  
[root@sparrow wstearns]# tcpdump -i ppp0 -qt hH;doSW;  
bash: tcpdump: command not found ^eg8 g  
[root@sparrow wstearns]# exit ?t>Mu}"?N  
[wstearns@sparrow wstearns]$ df)N  
ojuSaf  
4"aKk=H  
O-pagUU+P  
  在这个例子中,我仍旧留在当前的wstearns目录,没有进入root的默认目录。另外,由于/usr/sbin不在我的路径中,我得指定tcpdump的完整路径。这样看来,一般情况下还是使用“su -”更方便一点。 3GBj)n \<\  
h8{~uj.  
su - -c <命令> fD[h! 1  
N$Q8O| Kl  
  如果你确实只需执行一个命令,下面还有一种更快的方法。-c选项告诉su运行指定的命令然后立即返回到原来的用户: [yzUo  
]I) f!X%D  
[wstearns@sparrow wstearns]$ whoami "L +;YT}Io  
wstearns ^] X2  
[wstearns@sparrow wstearns]$ su - -c whoami yx`1sX)  
Password: < 输入root的密码 >  (kl?.2;  
root RNaYOcM >  
[wstearns@sparrow wstearns]$ 7XZCh0LmF  
$KRrd@D 8  
v"I!3,jFM  
65o;\Se|x  
  su的man文档有关于该命令及其命令行选项的更多说明。 !gBIW}"  
dbR8I[[f  
sudo htw)n U>g  
VQOG73D)  
  上面的su命令也有缺点,这就是我们必须在每次运行某个命令的时候输入一下密码。更糟糕的是,要输入的密码还是root的密码! \+Q2g|z7P  
<IuE~ `.  
  如果要为级别较低的管理员授权,比如授予他们在系统中增加新用户的权限,应该怎么办?你可以让他们使用su,但如果你把root的密码也给了他们,他们马上就是高级管理员了。:-( ]+X"nMm  
Pnr%O'tH  
  sudo不仅解决了这个问题,而且还提供更多的功能。下面我们要在系统上安装一个新的rpm: [L=@F:?}  
mI3?A$Bf@  
[wstearns@sparrow updates-sparrow]$ rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpm v`~S?G  
cannot open Packages index using db3 - Permission denied (13) &J4.LW{  
s zh`   
-- >The rpm database cannot be opened in db3 format. I0%J:j{oh\  
  If you have just upgraded the rpm package you need to convert Y ^en  
  your database to db3 format by running "rpm --rebuilddb" as root. V8JxOn0|@  
S3Xns^2E  
error: cannot open Packages database in /var/lib/rpm hF $m*W0  
[wstearns@sparrow updates-sparrow]$ 2gT9/P  
O !rk8txb  
|7hVKd   
Rk<G8" o  
  rpm说不能打开数据库,所以不能安装新软件。 S)U+G`@^  
-T kCZ>U  
[wstearns@sparrow updates-sparrow]$ sudo rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpm hTK__y+Q  
Password: < 输入wstearns的密码 > op9u&AO  
cyrus-sasl       ################################################## pc]|fML:D  
[wstearns@sparrow updates-sparrow]$ 5>.[SA5b$9  
 v~[\n  
(?j47Ts  
x w!j}Th#  
  这看起来有点象su - -c,是吧?我在sudo命令中指定了要它执行的命令,sudo用root身份来执行这个命令。但这里我只要输入自己的密码,而不是root的密码。从这点来看,sudo是一个比su更有用的工具。 h^N_ D(1:#  
odiH^ b ?c  
  如果我在5分钟之内执行另外一个命令,不再需要输入自己的密码: IE$<5%N|  
#T*;|FjC  
[wstearns@sparrow updates-sparrow]$ sudo rpm --erase cyrus-sasl 6s:=Sn5*E  
[wstearns@sparrow updates-sparrow]$ B^MV8NZS3  
H&|?)KJA  
6&:`L+f#8  
J .l})N.J  
  sudo也把所有的命令记录到了/var/log/secure: itMN=yfrl  
3J hs|y  
Oct 29 22:26:49 sparrow sudo: wstearns : TTY=pts/21 ; PWD=/mnt/redhat ; USER=root ; COMMAND=/bin/rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpm k[\wE58  
Oct 29 22:30:03 sparrow sudo: wstearns : TTY=pts/21 ; PWD=/mnt/redhat ; USER=root ; COMMAND=/bin/rpm --erase cyrus-sasl W*1?87<'r  
m28WXd=Ot  
(iGU@M)2  
XDj)I?:Pm  
  在普通用户能够使用sudo之前,root必须声明哪些用户可以用root身份执行哪些命令。在下面这个例子中,假定root决定允许我安装新软件、卸下驱动器。root运行visudo命令编辑/etc/sudoers,修改完成后,visudo将检查该文件以保证不存在语法错误。下面是这个/etc/sudoers文件的内容: E00bSCW  
qdD{TZ!  
# User privilege specification ? mU :s 7  
root  ALL=(ALL) ALL wstearns ALL=(root) /bin/rpm,/bin/umount 3"5a/'z*#  
5xk'tp(  
y$$G PoA  
3n9>NY5->  
  如果我试图执行其他命令,sudo将拒绝执行命令并在/var/log/secure登记我的这一企图: Q*z"m |  
DD=|UxE  
[wstearns@sparrow wstearns]$ sudo mcedit test DloQ.  
Sorry, user wstearns is not allowed to execute '/usr/bin/mcedit test' as root on sparrow. yJ&U4\TlP  
[wstearns@sparrow wstearns]$ su - -c 'tail --lines=1 /var/log/secure' T7z-}^"  
Password: < 输入root的密码 > \1Xa-7"u[  
Oct 29 22:46:53 sparrow sudo: wstearns : command not allowed ; TTY=pts/21 ; PWD=/home/wstearns ; USER=root ; COMMAND=/usr/bin/mcedit test zHp\_@A 7H  
[wstearns@sparrow wstearns]$ i3~HFt*  
)%v[t,  
c9)`c4  
\`N VjYr  
  授予sudo权限时一定要小心。在上面这个例子中,root授权我安装和删除rpm软件包,此时如果我怀有恶意,就可以用带有特洛伊木马/bin/login的软件包取代系统上的正常软件包,下次root登录时,/bin/login就可以把root使用的密码发送给我。即使只授予某个用户在sudo下运行less的权限,也使得该用户能够从less通过!命令得到root身份的shell。 ,QS).$t/ y  
DV`m rT&~  
  在授予任何人通过sudo执行某个命令的权限之前,一定要仔细地考虑一下所有滥用该权限的可能。他们能够用自己的文件替换/etc/passwd或/etc/shadow吗?当运行dd、tar、ln和任何文本编辑器的用户是root时,它们都属于这类危险的命令。 b 'SVAh2?*  
;U@e jbj3  
  和su一样,请参见sudo、visudo、sudoers的man文档了解更多信息。 W 8S]R  
W!ae:W  
vlock -a t~?^o!Q  
uKS\L^$*  
  如果我同时登录了多个终端,现在想要离开一下去倒杯咖啡,却又不想从所有终端注销然后再在几分钟后重新登录,特别当那些终端上运行着程序时更是如此。为此,我可以在某个空闲的终端上运行vlock -a: 6J%w@o  
@H42xYd  
[wstearns@sparrow wstearns]$ vlock -a (]0v|HUQP  
The entire console display is now completely locked. -DpH_O  
You will not be able to switch to another virtual console. =4CwKX  
Please enter the password to unlock. q}4 o +  
wstearns's Password: < 输入wstearns的密码 > v$O4+J:  
[wstearns@sparrow wstearns]$ @h"<-I>  
zDJ]="F%0  
<dzSf~~5  
nRqmjBp  
  vlock并不使我从系统注销,也不会中止我正在运行的任何程序,它只是不让用户再在该终端上输入任何命令。另外,使用-a选项之后,vlock也禁止用户在输入密码之前切换到其他终端,这就保护了所有其他终端。 9 l 3 8a  
] )hYk]\  
  注意该操作要在控制台进行,-a选项不能在xterm下使用。请查看man vlock了解更多信息。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章