科技行者

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

知识库

知识库 安全导航

至顶网安全频道理解setuid和setgid权限对提高安全性的作用

理解setuid和setgid权限对提高安全性的作用

  • 扫一扫
    分享文章到微信

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

在类Unix系统中理解setuid 和 setgid权限的工作方式是非常重要的,在本文中,我们不但要了解何时使用这两个权限,还要知道如何避免错误的使用它们。

作者:ZDNet安全牌频道 来源:ZDNet安全频道【原创】 2010年3月22日

关键字: setuid setgid unix 安全

  • 评论
  • 分享微博
  • 分享邮件
ZDNet安全频道原创翻译 转载请注明作者以及出处

  在类Unix系统中理解setuid 和 setgid权限的工作方式是非常重要的,在本文中,我们不但要了解何时使用这两个权限,还要知道如何避免错误的使用它们。

-------------------------------------------------------------------------------------------------

  在之前的文章《理解基本的Unix文件权限》中,我们讨论了为什么基本的Unix权限系统对于安全性来说那么重要,同时希望帮助读者学会如何设置一般的Unix特权分离模式。之后,我们又讲到了《通过adduser和umask 管理默认的Unix文件权限》。 当然,为了确保Unix系统安全,我们还要学习更多有关Unix文件权限系统的知识。

  在提到高级Unix文件权限管理时,有两个权限不得不提,那就是setuid以及setgid权限。之所以如此重要,是因为用好了这两个权限,可以有效的提高系统安全性,但是对于初级管理员来说,能够用好这两个权限确实不容易。如果不够细心,或者错误的使用了这两种权限,将会给Unix系统带来严重的安全风险。

  每个进程都有两种不同方法分类的UID。一种是“真实”UID,另一种是“有效” UID。 真实 UID是开启进程的用户账户的UID,有效UID是用户特权附加到进程后的用户UID。一般情况下,真实UID和有效UID是相同的,而setuid 和 setgid 权限允许你修改这个行为。

  当用户运行一个程序,实际上就是开启了一个新的进程,用户拥有这个进程,同时用户的UID就是这个进程的真实UID。但同时这个程序也可以被其他用户运行。比如root用户可以通过命令行形式运行ls,其他用户也可以运行这个程序。下面是root运行 ls -l 命令:

  > ls -l /bin/ls

  -r-xr-xr-x 1 root wheel 25312 May 1 2009 /bin/ls

  正如我们在前一篇文章《理解基本的Unix文件权限》中说明的,这个输出结果表示root用户拥有ls,wheel是ls的组拥有者。同时该结果还显示r-x 是root帐户拥有者,组帐户拥有者,以及所有其他用户的权限。这意味着用户 foo也可以读取和执行ls命令。当用户loo执行ls命令时,ls进程的拥有者就是foo,尽管之前root已经运行过ls。.

  设置以上权限可以通过 chmod命令,如下:

  > chmod 555 /bin/ls

  (注:最好不要随便修改你自己系统上的ls权限。任何一项修改都是在必要的情况下进行的。)

  这是设置文件权限的最常见方法。另外,在555前面增加数字可以设置该文件的其它权限。添加数字4可以设置setuid权限。当然,尽管ls是root下危险性最低的程序,但是设置这个权限仍然是不明智的。本文中的修改只是为了做演示,大家不要效仿:

  > chmod 4555 /bin/ls

  修改后使用 ls -l 查看权限,将变成:

  > ls -l /bin/ls

  -r-sr-xr-x 1 root wheel 25312 May 1 2009 /bin/ls

  Setgid权限的设置方法相同,只是把数字4改成了数字2:

  > chmod 2555 /bin/ls

  这个修改和之前的setuid修改一样,不同之处在于这里修改的是组拥有者,而不是用户账户拥有者的权限:

  > ls -l /bin/ls

  -r-xr-sr-x 1 root wheel 25312 May 1 2009 /bin/ls

  如果想解除 setuid 或 setgid权限设定,可以使用数字0:

  > chmod 0555 /bin/ls

  不过使用这个0时一定要小心,如果要修改权限的文件或文件夹有“sticky bit”设置,就不能用0来去除setuid 和setgid权限。如果用ls –l命令查看文件,看到权限后面跟了一个“t”,就意味着该文件有“sticky bit”设置:

  > ls -l / | grep tmp

  drwxrwxrwt 18 root wheel 4096 Dec 16 00:00 tmp

  sticky bit 不在本文讨论的范围,因此我们只需要记住,如果遇到了这种情况,就是用数字1来代替数字0,消除setuid 或setgid权限。在本例中,我们可以使用以下命令来改变ls-l权限:

  > chmod 1777 /tmp

  良好的安全性

  在之前的文章《不安全的内存FAQ》中,setuid权限可以被用来提高特定环境的安全性。在GnuPG 环境,它可以用来确保程序可以使用安全内存,因为非特权UID无法访问安全内存。使用安全内存可以让攻击者更难以从RAM中获取你的GnuPG密码。

  在其他情况下,那些需要root级特权的服务器程序为了避免使用root级别的特权,也可以将其设置为setuid 权限,这样它们以root特权启动后会降低特权等级,以更低级的UID运行。这样做可以确保服务器进程能够按照原先所需的设定正常启动,接下来放弃root特权的UID又能保证在接下来的运行过程中不会因为被攻击而让黑客获取root权限。

  不过在大多数情况下,你都不必手动设置文件的setuid或setgid权限。少数的几个常用又需要设置setuid权限的程序实际上在它们安装时就进行了自动设置。因此只有极少数的情况下需要我们设置setuid 或 setgid权限,但是要极为小心。

  不佳的安全性

  对于几乎全部程序来说,设置setuid 位都会带来少许安全风险。比如为ls设置setuid,将使得用户可以访问那些他原本没有权利访问的文件夹中的内容。

  这就已经足够引发更严重的结果了。比如,能修改文件系统的应用程序如果拥有了root权限,就可以修改任意文件系统了。如果某个程序被设置了setuid root权限,一旦这个程序被黑客掌握,系统中的重要文件就有可能被删除,移动或者拷贝。

  同样糟糕的情况是为那些可以执行命令的程序设置权限。比如, Vim文本编辑器可以运行shell命令。如果Vim设置了setuid root权限,那么就算是特权等级最低的普通用户也可以用Vim通过shell方式以root用户身份登录。

  正是出于以上有利或不利的原因,有些人觉得使用setuid 和 setgid权限有好处,而更多的人则选择不同的方法达到同样的效果。

  首选方案

  使用setuid 和 setgid的首选方案就是“不要使用它”。仅在极少的情况下,正确的使用这个权限,能起到提高系统安全性的作用,而更多情况下,使用setuid 或 setgid权限都将导致严重的安全问题。

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

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

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