如何限制通过SUDOERS在特定目录中运行命令?


13

我可以配置sudo(通过sudoers文件),以允许用户在系统中的任何文件或目录上运行chownand chmod命令。但是,我只想授予用户权限以对/var/www/html目录下的文件运行这些命令。

如何限制特权命令,使用户只能在预先指定的目录中运行特权命令?

例如:以下命令向index.html文件授予777权限。

sudo chmod 777 /var/www/html/index.html

现在我要执行两个动作

  1. 限制sudo,使得用户可以仅运行chmodchown从内/var/www/html

  2. 禁止用户在系统中的其他位置执行这些命令(例如,命令无法在/var/www或中运行/var/ftp



7
这真的是正确的方法吗?www-data一群人消除chmod/ chown什么需要怎么样?
sr_

凉。这样,您可以很容易地扎根。放弃是一个非常糟糕的主意chown。除此之外,我认为没有理由chmod必须以root用户身份运行。
尼尔斯2012年

Answers:


13

您要问的是困难的,即使不是不可能的。即使您确实限制了特定目录下文件的应用chown和限制chmod,某人仍然可以传递符号链接,从而影响他们喜欢的任何位置的文件。

幸运的是,您极有可能试图做的并不是解决实际问题的正确方法,并且还有另一种方法可以起作用。

通常,需要其他权限才能在其下创建和修改文件的用户/var/www被添加到一个组中(通常为www-data,或者对于站点的不同部分,您可能具有不同的组)。您可以使用组所有权和setgid目录:chgrp www-data /var/www/html; chmod g+ws /var/www/html允许www-data组中的每个人都可以写入/var/www/html目录,并且在该目录中创建的文件将归该www-data组所有,而不是创建文件的用户的主要组。但是,这不是很灵活。

您可能应该做的是为设置文件的访问控制列表/var/www。首先,确保启用了ACL:/var/www必须使用该acl选项挂载打开的文件系统。请参阅使目录中的所有新文件可供组访问以获取相关帮助。还要安装ACL实用程序(getfaclsetfacl)。然后,向/var/www/html应该拥有树的用户授予树下的额外权限。您可以设置每个用户的ACL,但是将具有相同权限的用户放在文件系统的一部分中通常更容易,并为该组设置ACL。例如,如果组中的用户html-writers应该对以下目录下的树具有读写访问权限/var/www/html

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html

关于“这不是很灵活”(在第3款末)–为什么不这样?是因为人们需要属于某个群体吗?(我对权限,ACL和相关内容
一无所知

3
@KajMagnus这是不灵活的,因为root必须管理组,并且文件只能属于一个组。ACL允许任何用户选择谁可以访问他们拥有的文件,并且ACL中可以提及多个用户和组。
吉尔斯(Gilles)'所以

2

您可以使用/etc/sudoers命令visudoadd将文件中的所有参数限制为“ myuser” 使用的命令:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

为添加的每个操作启用日志记录:

Defaults logfile=/var/log/sudo.log

样本输出:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

使用sudo时,前提是“ myuser”是受信任的人。注意文件权限,没有简单的方法可以阻止恶意sudo用户从外部资源链接文件并进行更改。


我之前曾尝试过,但它给出的错误为:对不起,不允许用户prashant以prashant.xyz.com的根用户身份执行'/ bin / chmod 777 / var / www / html / a'。
PrashantB 2012年

您是否用su - prashant或切换过用户su prashant
tombolinux

是的,我正在由多用户执行命令。我读过论坛,他们说命令在系统范围内运行。没有人写过这样的问题。
PrashantB 2012年

我运行它哦:)。但这将是静态命令。我们可以将其通用化,以便我可以对/ var / www / html下的任何文件应用任何权限吗?
PrashantB 2012年

3
这是完全不安全的:sudo /bin/chmod 666 /var/www/html/../../../etc/passwd而且,如果您以某种方式解决了该问题,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
吉尔斯(Gilles)“别这么邪恶”

1

实际上,通过创建Bash(或您选择的外壳)脚本来限制对特定文件或目录所做的修改,实际上是一种相当简单的方法。

在您的示例中,它看起来像这样:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

然后,您将更改sudoers文件,以允许www-data执行/ usr / local / bin / mychmod。

但是请记住,允许用户在该空间中输入(例如,允许用户更改更改文件或目录的方式)是非常危险的,并且如果您要执行类似的操作,则需要知道如何过滤注入攻击那。攻击者可以通过这种方式轻松地以root用户身份执行任何命令,从而有效损害了系统的安全性。


这是非常危险的,而且真的无法解决问题……
SomeGuy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.