我们能否在 Linux 机器上或特定目录(在我的例子中是 Scientific Linux)上设置权限,使其可以读取文件但不能复制、移动或删除它们?
更新:我的场景是,我们开发了一个 GUI 程序,其中包含一些我们花费大量时间和精力创建的图像。我们的目录结构是:
/GUI/program/GUI.exe
/GUI/images/A/A1.jpeg A2.png .... A200.png
/GUI/images/B/B1.png B2.png .... B200.png
.
.
/GUI/images/I/I1.png I2.png .... I200.png
不用说./GUI.exe
调用用户需要交互的图像。
现在我需要隐藏起来/GUI/images/*
。
有什么办法吗?
答案1
如果一个文件可以被读取,那么它就可以被复制。但是,您可以通过不向文件所在的目录授予写入权限来阻止文件被删除或移动。
由于问题已被修改,因此编辑了附加信息:
鉴于您现在添加到问题中的场景,您可以这样做:
- 创建一个仅用于该程序的用户,例如
guiuser
- 将 /GUI/images 目录的所有权更改为例如
guiuser
- 更改目录及其内文件的权限,使其仅
guiuser
具有读取权限 - 将程序 GUI.exe 的所有者更改为
guiuser
- 更改程序的运行权限 setuid (
chmod u+s /GUI/program/GUI.exe
)
当您的用户运行该程序时,该程序将具有 的访问权限guiuser
,因此即使普通用户没有权限,该程序也将能够读取文件。
答案2
复制并不神奇:它只是读取文件,然后将您读取的内容保存到其他地方。因此,本质上,如果您可以读取文件,则可以复制它。
但是,根据您正在做的事情,您也许可以通过制作数据来实现您的目标普通用户无法读取,并且只能通过特殊程序访问(过去是 setuid 程序;现在,Web 应用程序可能更合适)。该程序将根据请求分发部分数据,而不是整个文件。由于固有的问题仍然存在,这不能防止复制,但它可能会使其变得更加困难,因为您可以具有对请求进行速率限制或类似的逻辑。或者,您可以在 in 中呈现数据有损的方式,而不是提供原始信息。例如,如果源采用 HTML 格式,则发送呈现的纯文本。坚定的用户可以猜测并重建原始内容,但不太可能获得准确的结果。
答案3
如果您要显示这些图像,它们需要可读。如果它们可以被读取,那么它们就可以被复制,因为复制包括读取某些内容并将其写入其他地方。无论您是在自定义应用程序中还是通过网络将它们显示为由 mattdm 建议。当网络浏览器显示图像时,它首先需要下载(如果不下载图像,它就不知道要显示什么)。
您可以授予您的程序额外的权限,并使图像只能通过这些额外的权限访问,如下所示由珍妮 D 建议。但是,如果不从头开始设计安全的应用程序,您就不可能做到这一点。此外,系统管理员无论如何都可以访问这些图像。
几乎可以肯定,您正在尝试通过技术解决社会问题。众所周知,这是行不通的。让您的用户签署一份合同,声明他们不会复制图像。这称为许可证。
答案4
与副本无关。复制文件的工具只是读取文件,系统无法判断读取的目的是什么。
除非你完全消除用户的写入能力任何地方,一个相当有能力的用户会找到一种方法来复制文件,如果他/她可以读取它。