我有一个包含秘密的文件和一个生成器应用程序,该应用程序读取该文件并生成类似于许可证的内容。
该 Linux 计算机上的用户被允许使用该应用程序。
由于该应用程序读取该秘密文件,因此这些用户必须拥有该文件的读取权限。
有没有办法删除这些用户的读取权限 - 只需让应用程序仅在这些用户运行该应用程序时通过该应用程序读取该文件?
我只想让运行该应用程序的人能够读取该文件,并且只能通过该文件。不仅仅是cat
它,还要观看它的内容。
- 我看到了一种解决它的方法
chmod 400 secret_file
chmod 110 generator
chmod u+s generator
这样同组的用户generator
可以执行generator
但不能读取secret_file
。
但因为generator
有了setuid
便generator
可以阅读secret_file
。
这是一个很好的解决方案,但我想在 中包含用户名generator
,并且使用该解决方案我总是可以获得所有者的姓名。
这是我从 c/cpp 应用程序获取用户名的方法:
#include <pwd.h>
uid_t uid = geteuid();
struct passwd *pw = getpwuid(uid);
std::string user_name = pw->pw_name;
还有其他方法可以解决这个问题吗?
可以apparmor
帮忙吗? (我无法理解)
后续问题 - 有没有办法使文件只能通过特定脚本执行?我的意思是我不想generator
从 shell 中执行。我希望它仅从另一个generator.sh
调用的脚本执行generator
,因为我在generator.sh
.我希望直率跑步的人generator
会失败,而跑步的人generator.sh
会成功。
答案1
使用getuid()
代替geteuid()
。
来自execve()
手册页:
如果在路径名引用的程序文件上设置了 set-user-ID 位,则有效用户ID调用进程的名称更改为程序文件所有者的名称。
返回的“真实”用户 IDgetuid()
是不变的,即启动该进程的用户的 UID。
另一件事:
我不希望从 shell 执行生成器。我希望它仅从另一个调用generator的脚本generator.sh执行,因为我在generator.sh中做了更多的事情。
更难,因为你不能有 setuid 脚本。但是您可以有一个运行脚本(而不是其他)的 setuid 包装器,然后该脚本可以运行最终的二进制文件。或者使用 sudo 运行脚本。不过,您可能会遇到 shell 不喜欢 setuid 的问题,请参阅setuid 位似乎对 bash 没有影响和允许在 shell 脚本上设置 setuid。
另请注意包括 shell 可能会带来更多可能的安全问题,对于任何 setuid 程序,您应该小心确保执行环境是干净的。这包括环境变量和文件描述符,但也可能包括其他可继承的功能。使用 sudo 的原因之一是它至少尝试处理此类问题。
另一种可能更好的方法是将特权进程实现为网络服务,并让用户只运行一个简单的哑客户端程序。