linux - 在现代 Linux 上永久删除 root 权限

标签 linux security root

启动后,我希望我的 Linux 程序放弃 root 权限并切换到非特权帐户。我在网上找到了各种示例,但没有一个符合我的要求,具体来说:

  1. 这是永久掉落
  2. (e)uid 和 (e)gid 都应该切换到非 root
  3. 仅支持 Linux(内核 > 2.6.32)
  4. 不需要补充组

我发现的最佳方法是:

uid_t new_uid = ...;
gid_t new_gid = ...;

gid_t rgid, egid, sgid;
if (setresgid(new_gid, new_gid, new_gid) < 0)
{
    perror("setresgid");
    exit(EXIT_FAILURE);
}
if (getresgid(&rgid, &egid, &sgid) < 0)
{
    perror("getresgid");
    exit(EXIT_FAILURE);
}
if (rgid != new_gid || egid != new_gid || sgid != new_gid)
{
    printf("unexpected gid");
    exit(EXIT_FAILURE);
}

if (setgroups(0, 0) != 0)
{
    perror("setgroups");
    exit(EXIT_FAILURE);
}

uid_t ruid, euid, suid;
if (setresuid(new_uid, new_uid, new_uid) < 0)
{
    perror("setresuid");
    exit(EXIT_FAILURE);
}
if (getresuid(&ruid, &euid, &suid) < 0)
{
    perror("getresuid");
    exit(EXIT_FAILURE);
}
if (ruid != new_uid || euid != new_uid || suid != new_uid)
{
    printf("unexpected uid");
    exit(EXIT_FAILURE);
}

我可以将它包装在一个 exe 中并证明 uid 和 gid 显示正确,使用:

ps -eO user,uid,ruid,suid,group,gid,rgid,sgid

该程序无法绑定(bind)到特权端口或操作大多数 root 拥有的文件,所以这一切都很好。

我还找到了 captest程序(包含在 libcap-ng-utils 中)验证进程没有任何意外 capabilities(7) .

但是,由于安全是一个问题,我想更加确信我已经正确地放弃了所有非必要的权限。我怎么能确定?

谢谢。

最佳答案

D.J.Bernstein 在他的“setuidgid”代码中实现了“规范”的方法,该代码最初用于他的 QMail 程序,现在包含在“daemontools”中。

GNU coreutils 中使用的实际代码基于 DJB 对程序的描述,其代码可见此处 https://github.com/wertarbyte/coreutils/blob/master/src/setuidgid.c

关于linux - 在现代 Linux 上永久删除 root 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12287327/

相关文章:

linux - 查找和排序目录

linux - 如何在 bash shell 中在另一个文件的开头插入一个文件

php - strip_tags() 是否容易受到脚本攻击?

security - 如何将CSRF token 从服务器传递到客户端?

android - 在Android上模拟鼠标

linux - 在特定时间后自动远程运行脚本

linux - 如何在linux shell下获取每个创建表的第n个字段引用另一个文件?

Java http 客户端和 POODLE

java - 我需要授予 java 应用程序 super 用户访问权限以查看 Mac 上 protected 文件

android - 在windows上查看android的root权限文件/文件夹