Windows(XP) 是否有等效的 set uid?'run as' 选项每次运行时都需要管理员密码。我希望用户能够在不知道管理员密码的情况下运行该特定的可执行文件。我对 windows 领域很陌生。:(
我正在阅读维基百科上关于 setuid 的描述 http://en.wikipedia.org/wiki/Setuid
我无法理解 chroot 如何与 setuid 相关,如维基百科的以下段落所述
setuid 可执行文件的存在解释了为什么 chroot 系统调用对 Unix 上的非 root 用户不可用。有关更多详细信息,请参阅 chroot 的限制。
出于一个我不太明白的原因,每个人都想要 sudo 。在工作中,我们甚至有与读取日志文件的方法一样多的条目(head/tail/cat/more,...)。
我认为,sudo 在这里失败了。
我宁愿混合使用 setgid/setuid 目录并在这里和那里添加 ACL,但我真的需要在开始之前知道什么是最佳实践。
我们的服务器有 %admin、%production、%dba、%users——即许多组和许多用户。每个服务(mysql、apache 等)都有自己的安装权限的方式,但 %production 组的成员必须能够查阅配置文件甚至日志文件。仍然有解决方案将它们添加到正确的组(mysql ...)并设置好权限。但我不想 usermod 所有用户,我不想修改标准权限,因为它可以在每次升级后更改。
另一方面,在目录上设置 acls 和/或混合 setuid/setgid 是我可以轻松完成的事情,而无需“破坏”标准发行版。
你怎么看待这件事 ?
以 mysql 为例,它看起来像这样:
setfacl d:g:production:rx,d:other::---,g:production:rx,other::--- /var/log/mysql /etc/mysql
Run Code Online (Sandbox Code Playgroud)
你认为这是一个好习惯还是我应该定义 usermod -G mysql 并使用标准权限系统?
谢谢
我跑了
$ sudo chown -R $USER /usr/bin
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试在 /usr/bin 路径下以 sudo 身份运行程序时,我得到了
sudo:must be setuid root
Run Code Online (Sandbox Code Playgroud)
如果我想恢复 chown 应该怎么做?
我确信对此有一个众所周知的答案,但我似乎找不到它。
我如何使用户的 PHP 脚本(~user/public_html例如,在 中)以所有者身份运行而不是作为(例如)运行www-data?
假设使用 Apache、Linux 和 PHP 5。
我们公司的服务器运行 Ubuntu 12.04 (Precise) 和 Apache 2。我们安装了一个自定义的内部 Web 应用程序。我有一个 bash 脚本,可以将该应用程序的任何更新从源代码管理拉到服务器。系统上只有一个用户(脚本文件的所有者)拥有连接到源代码管理所需的 SSH 密钥,但我希望系统上的任何用户都能够运行此脚本来更新应用程序。
我做了一些研究,看起来这正是设计 setuid 位的目的,以便系统上的任何用户都可以运行脚本,并且脚本将使用脚本所有者的用户 ID 运行. 然而,现代发行版似乎忽略了脚本的 setuid 位,因为如果执行由 root 拥有的脚本会带来安全风险。
我以为我可以通过将它变成一个 perl 脚本来解决这个问题,但是从 Precise 开始,也不再有 suid-perl 包了。看起来这已被弃用。
我发现一些网站建议通过将用户添加到 sudoers 文件来解决这个问题,但是我的脚本不需要 root 权限来运行,并且它不会对文件系统的任何部分进行任何更改,除了网站,所以我宁愿不授予任何人 sudoer 权限。该脚本只需要脚本所有者的权限才能正常运行。
那么,使用(不同的、非 root、非 sudo)用户的 UID 执行脚本的首选现代方法是什么?
最近更新到 CentOS 6.4 后,两台机器都有 setuid() 限制,它们的作用类似于功能或 selinux,但是两者都被禁用。例如以下失败:
[root@host statd]# perl -e 'use POSIX; POSIX::setuid(99);system("id")'
[root@host statd]# echo $?
0
Run Code Online (Sandbox Code Playgroud)
什么时候应该返回类似的东西:
host:~# perl -e 'use POSIX; POSIX::setuid(99);system("id")'
uid=99(nobody) gid=0(root) groups=99(nobody),0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Run Code Online (Sandbox Code Playgroud)
跟踪 perl 的调用,setuid() 调用成功,但是 system() 子项立即退出,就像它被 selinux 或类似的终止一样。但是,即使在 semodule -DB 之后,/var/log/audit/audit.log 中也没有日志条目。
setuid32(99) = 0
getuid32() = 99
geteuid32() = 99
pipe([3, 4]) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7705728) = 10073
close(4) = 0
rt_sigaction(SIGINT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, …Run Code Online (Sandbox Code Playgroud) 这是代码:
(根:)
# mkdir /test
# cp /bin/bash /test/sbash
# chmod a+s /test/sbash
Run Code Online (Sandbox Code Playgroud)
(用户 1:)
$ cd /test
$ ./sbash
$ mkdir trycreate
mkdir: cannot create directory `trycreate': Permission denied
Run Code Online (Sandbox Code Playgroud)
设置了 setuid 位的 bash 脚本也不起作用。
顺便说一句,我的 setuid perl 脚本有效:
test.pl:(设置了 setuid 位,owner=root)
#!/usr/bin/perl
mkdir('/test/tryperlcreate') or die 'failed';
Run Code Online (Sandbox Code Playgroud)
由 user1 执行 test.pl 将创建 root 拥有的目录。
我正在开发一个最近从 CentOS 4.9 迁移到 CentOS 6 的系统。旧系统上存在来自 Windows 2008 服务器的 CIFS 挂载。原始挂载点有 777 个目录权限。
[root@Bootylicious ~]# ls -ld /images/
drwxrwxrwx 2 root root 4096 Jul 23 22:49 /images/
Run Code Online (Sandbox Code Playgroud)
当挂载处于活动状态时,权限为:
[root@Bootylicious ~]# ls -ld /images/
drwxr-xr-x 1 root root 327680 Aug 16 08:45 /images/
Run Code Online (Sandbox Code Playgroud)
root 以外的用户无法写入共享或创建文件。查看旧服务器,同一共享中的文件和子目录的权限具有 setuid 位。新系统上不存在这一点。看起来/etc/fstab像:
//172.16.30.32/images /images cifs username=blah,password=blah,domain=abc123.net 0 0
Run Code Online (Sandbox Code Playgroud)
CentOS 4/5 和 6 版本之间发生了哪些变化对此产生了影响?这显然与 setuid 有关,但我不确定最干净的修复是什么。
问题:我有一个脚本,它以 root 身份通过 cron 作业定期运行,但我想给人们一种通过网页异步启动它的方法。(将编写脚本以确保它不会运行重叠实例等。)
我不需要用户登录或拥有帐户,他们只需单击一个按钮,如果脚本准备好运行,它就会运行。用户可以为脚本选择参数(作为输入进行了大量过滤),但为简单起见,我们会说他们只有选择按下的按钮。
作为一个简单的测试,我在 cgi-bin 中创建了一个 Python 脚本。chown-ing 到 root:root 然后对它应用 "chmod ug+" 没有得到预期的结果:它仍然认为它具有网络服务器帐户的有效组......据我所知,这不是允许。
我读到用编译的 cgi 程序包装它可以完成这项工作,所以我创建了一个 C 包装器来调用我的脚本(它的权限恢复到正常)并给可执行文件根权限和 setuid 位。那行得通……脚本运行起来就像 root 运行它一样。
我的主要问题是,这是否正常(需要二进制包装器来完成工作),这是安全的方法吗?它不是面向世界的,但我仍然想学习最佳实践。
更广泛地说,我经常想知道为什么编译后的二进制文件在实践中比脚本更“可信”?我认为你会信任一个人类可读的文件,而不是一个神秘的二进制文件。如果攻击者可以编辑文件,那么您就已经有麻烦了,如果是您无法轻松检查的文件,则更是如此。简而言之,我希望它在此基础上反过来。你的意见?