最佳实践:将文件写入 C:\ProgramData 只有管理员可读
Best practice: Write files to C:\ProgramData only readable by administrators
我正在开发一个作为服务运行的程序,需要保留一些动态文件。我决定在 %ALLUSERSPROFILE%\MyFolder 中创建一个文件夹,即 C:\ProgramData\MyFolder 并将我的文件放在那里(在子文件夹中)。
文件中的数据可能很敏感,因此只有管理员才能读取它们,普通用户不能读取,这一点很重要。
到目前为止,我刚刚在安装过程中使用 CreateDirectory API 创建了 C:\ProgramData\MyFolder 并指定了一个限制性安全描述符。我创建的所有文件和文件夹都继承了这个安全描述符,它似乎工作正常。
但是,我怀疑这并不是真的安全:我怀疑恶意用户可能会在我的应用程序安装之前创建文件夹 C:\ProgramData\MyFolder。他可以让自己成为该文件夹的所有者,然后设置他认为合适的权限。
那么我应该怎么做才能避免这个问题呢?
如果文件夹存在,我可以在安装过程中尝试在 C:\ProgramData\MyFolder 上调用 SetNamedSecurityInfo。但要做到这一点看起来有些困难。例如,SetNamedSecurityInfo 采用不同于 CreateDirectory 等函数的另一种格式的安全描述符。并且有很多标志似乎以各种复杂的方式控制继承。
我可以尝试在安装过程中删除 C:\ProgramData\MyFolder 以及其中包含的所有内容,然后重新创建。但是,不管内容如何,只删除整个子文件夹对我来说似乎非常具有侵略性。
我可以使用 CREATE_ALWAYS 标志和我的限制性安全描述符在 C:\ProgramData\MyFolder 和子文件夹中创建我的所有文件。这样我就不会依赖继承了。然而,这似乎有些不雅:如果管理员想在我的程序安装后授予每个人对 C:\ProgramData\MyFolder 的读取权限怎么办?这是不可能的,因为我的程序会定期重写文件。
如有指导,我将不胜感激!
调用SetNamedSecurityInfo
并不比CreateDirectory
难,基本的安全描述符成员是一样的,只是希望它们作为单独的参数。给定 SECURITY_DESCRIPTOR
用于 CreateDirectory
,只需调用 GetSecurityDescriptorDacl
获取 DACL 指针等
还有SetFileSecurity
,它只需要一个SECURITY_DESCRIPTOR
作为输入。此函数可能仅遵循 NT4 DACL 规则,因此调用 SetNamedSecurityInfo
可能是最佳选择。
我正在开发一个作为服务运行的程序,需要保留一些动态文件。我决定在 %ALLUSERSPROFILE%\MyFolder 中创建一个文件夹,即 C:\ProgramData\MyFolder 并将我的文件放在那里(在子文件夹中)。
文件中的数据可能很敏感,因此只有管理员才能读取它们,普通用户不能读取,这一点很重要。
到目前为止,我刚刚在安装过程中使用 CreateDirectory API 创建了 C:\ProgramData\MyFolder 并指定了一个限制性安全描述符。我创建的所有文件和文件夹都继承了这个安全描述符,它似乎工作正常。
但是,我怀疑这并不是真的安全:我怀疑恶意用户可能会在我的应用程序安装之前创建文件夹 C:\ProgramData\MyFolder。他可以让自己成为该文件夹的所有者,然后设置他认为合适的权限。
那么我应该怎么做才能避免这个问题呢?
如果文件夹存在,我可以在安装过程中尝试在 C:\ProgramData\MyFolder 上调用 SetNamedSecurityInfo。但要做到这一点看起来有些困难。例如,SetNamedSecurityInfo 采用不同于 CreateDirectory 等函数的另一种格式的安全描述符。并且有很多标志似乎以各种复杂的方式控制继承。
我可以尝试在安装过程中删除 C:\ProgramData\MyFolder 以及其中包含的所有内容,然后重新创建。但是,不管内容如何,只删除整个子文件夹对我来说似乎非常具有侵略性。
我可以使用 CREATE_ALWAYS 标志和我的限制性安全描述符在 C:\ProgramData\MyFolder 和子文件夹中创建我的所有文件。这样我就不会依赖继承了。然而,这似乎有些不雅:如果管理员想在我的程序安装后授予每个人对 C:\ProgramData\MyFolder 的读取权限怎么办?这是不可能的,因为我的程序会定期重写文件。
如有指导,我将不胜感激!
调用SetNamedSecurityInfo
并不比CreateDirectory
难,基本的安全描述符成员是一样的,只是希望它们作为单独的参数。给定 SECURITY_DESCRIPTOR
用于 CreateDirectory
,只需调用 GetSecurityDescriptorDacl
获取 DACL 指针等
还有SetFileSecurity
,它只需要一个SECURITY_DESCRIPTOR
作为输入。此函数可能仅遵循 NT4 DACL 规则,因此调用 SetNamedSecurityInfo
可能是最佳选择。