使用C API修改文件许可权

问题描述:

我有一个从文件中读取其配置的服务器组件。配置文件也由管理组件读取和写入。这些组件是独立的程序,它们将在不同的帐户下运行。我想将配置文件上的ACL更改为:使用C API修改文件许可权

application: read 
administration: read and write 

由于应用程序打开侦听套接字,因此从应用程序中删除写入很重要。也就是说,它的风险很高,我想尽可能地包含它。

经过一番搜索,它看起来像ioctl是用来做什么的C. ioctl_list提供的控制代码,但它不是明显给我一个名单如何将两个用户添加到配置文件在不同的权限。 die.net的在线手册页未深入讨论权限或提供示例代码。例如,单词“perm”(“许可”的根)在讨论中仅出现一次。

在Windows上,减少允许兑现最小权限的权限已被提取出来,但它非常直接(Richter在他的Advanced Windows编程系列中提供了很好的示例)。

如何更改使用C API的Linux文件的权限?什么控制代码将被使用?

在此先感谢。

+0

'man 2 chmod'顺便说一句:我不明白与听套接字的问题。 BTW2:这是UNIX的基本内容,甚至不是先进的。也许你应该先做一些阅读。 – wildplasser

+0

ACL使用linux中的acl API集。请参阅页码。 330 - 在'The Linux Programming Interface'M Kerrisk中。此页面包含API调用的代码,超链接到解释。 [Linux ACL](http://man7.org/tlpi/code/online/dist/acl/acl_update.c.html) –

+0

感谢wildplasser。我不确定你不明白,对不起。顺便说一下,'chmod'只需要一个路径和一个模式,而不是用户/组的高级属性(是的,我看着'chattr')。 – jww

这不是ioctl进行,而是用专门的系统调用:chmodchown,并chgrp为基本用户/组/另一套文件权限,以及对acl_*全面的ACL。您可能还想知道系统调用setuidsetgidsetgroups,这是您在运行的应用程序中删除权限的方式。

您只能使用基本的用户/组/其他权限来实现您的目标。配置您的系统如下:

  • 服务器应用程序有一个专用的用户ID和组;假设他们都被命名为nlserver(“nl”代表“noloader”)。
  • 管理组件还有一个专用的用户ID和组,比如说nladmin
  • 配置文件设置为模式0640(又名-rw-r-----),并由用户nladmin,组nlserver拥有。 (负责此操作的代码应该在管理组件中,而不是服务器本身。)
  • 当服务器启动后,在完成所有需要做的事情之后(如绑定低编号的端口),它将使用setgroupssetgidsetuid(在该命令中!)更改为用户nlserver,组nlserver,并清除补充组列表。只有在完成后才打开配置文件。
+0

谢谢扎克。我从未意识到这就是为什么群体和用户是混合和匹配的原因。我想我可以完全避免使用'acl_ *'API。所以我很清楚:如果第三个用户/组需要特殊访问,那么我需要使用'acl_ *'是否正确? – jww

+0

如果还有其他进程需要读取文件,你可以将它们添加到nlserver组中(进程可以同时分成多个组,这就是setgroups和getgroups的意义)。但是如果其他东西需要写入文件,并且它不适合作为'nladmin'或'root'用户运行,那么是的,你需要ACL。 – zwol

+0

完美,谢谢。 – jww