2013-07-25 24 views
1

我正在研究Linux(Ubuntu)上的一个小项目,在那里我需要通过身份验证才能访问服务。我的想法是,这个身份验证应该与进程一起存储,它是儿童,而不是与linux用户本身一起存储。Linux,使用进程存储凭证,它是儿童,孙辈吗?

这个身份验证应该通过调用例如带有用户名,密码和脚本/应用程序(任何应用程序)的“myapplogin”来使用这些凭证运行。 我希望有可能将这些凭据保留在由此过程制作的任何儿童中,以及任何孙辈等。

我已经看过这个功能的几个选项。

  1. 在环境变量中存储登录ID或其他东西。据我所知,这是传给任何孩子的。 但是,环境变量可以由进程写入,从而允许它可能获得它应该没有的访问权限。

  2. 登录时,存储登录的进程的进程ID,然后存储对该服务的每个操作的进程ID,检查它是否具有存储的pid,或者存储的pid是否存在于其祖先的任何位置。 如果这个祖先变大,并且服务经常被访问,这可能会变得太慢。 然后,一个选项是缓存任何位于血统中的pid,但这可能会对操作系统中的pid重用产生安全隐患。

  3. 使用过程组和链接,一个登录,但也可以通过过程本身发生变化,允许它可能加入现有组无需实际登录。

有什么办法去做这个?优选地,它应该是与进程一起存储的东西,任何新的子进程都是继承的,不可能被进程覆盖,并且可以从内核模块外部读取。

也许我只是忽略了一些明显的东西?我是有这方面的投入感激=)

回答

1

我可以提供两种方法取决于什么样的“服务”你提到:

1.如果你提到的服务是这样的:网络管理,磁盘安装/ umounting等。以下内容:

Linux内核实现CAPABILITY机制。内核定义了各种功能。这些功能可以分配给不同的用户。能力的基本规则是:将最小权限集分配给一个用户来完成其任务。

所以,你可以使用能力的想法,你需要做的是:

(1)列出所有的服务,你需要的限制访问。 (2)为所列服务定义新功能或使用现有功能。 (3)更改内核源代码以检查一个进程在访问列出的服务时的功能。通常,这些检查位于系统调用条目中。

(4)当用户登录系统时,对init/login进程的源代码进行更改,根据访问控制规则为不同的用户分配必要的功能。

2.如果你提到的服务就像执行某种系统命令一样。 (1)创建一个文件,如watch_dog或者其他在/ etc /目录下,在这个文件中,可以定义一个格式来列出特定用户可以执行的特定命令。当然,文件格式可以很花哨,比如可以使用正则表达式。为了解析文件,可以使用Bison或Lex/Yacc。 (2)在Linux内核初始化期间,文件/ etc/watch_dog可以被解析。 (3)在进程fork()期间,将/ etc/watch_dog规则设置为与进程相关的task_struct。

(4)在exec()条目中,应用/ etc/watch_dog规则来检查它是否可以执行程序。

+0

感谢您花时间写这篇文章,但不幸的是我不是这个样子,我不知道我在做什么= /然而,你让我走上解决方案的道路,我认为这将是完美的=) – Wildex999

+0

解决方案我想我'我会去的是setgroups。它允许我通过将进程设置为辅助组来标记进程。将一个组设置为一个进程需要SETGID(或root)的功能,所以我可以在给出一个组后,停止更改/添加组。这些小组由儿童继承,但在使用sudo时丢失了。该组不属于一个用户,而是一个过程,这是我想要的。 现在我只需要找到一种方法从知道PID的内核模块中检索进程的组,但这应该是可能的,对吧? =) – Wildex999