如何使用 Active Directory/NTFS 模拟 WORM 环境

如何使用 Active Directory/NTFS 模拟 WORM 环境

在 NTFS/Active Directory 中,假设我有两个驱动器映射:

H:\
I:\

用户可以编辑 H:\ 中的文件,但不能编辑 I:\ 中的文件。我希望用户能够使用脚本将他们的文件移动到 I:\ 驱动器,除非发生覆盖。复制文件后,脚本将删除对 I:\ 中复制文件的写入权限,这样用户就无法再更改权限,并且 I:\ 上的文件在某种意义上将成为永久文件。

我该如何以安全的方式进行设置?

答案1

经过多次反复尝试后,这个 powershell 脚本似乎可以做到这一点:

$worm="C:\WORM"
mkdir -Force $worm
cd $worm

<#  https://serverfault.com/a/17869

SYSTEM - Full Control - Apply onto: This folder, subfolders, and files
Administrators - Full Control - Apply onto: This folder, subfolders, and files
Authenticated Users - Read - Apply onto: This folder, subfolders, and files
Authenticated Users - Create Files / Write Data - Apply onto: This folder and subfolders

#>

$acl  = Get-Acl $worm
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'Users', `
        'CreateDirectories, CreateFiles, ListDirectory, Read', `
        'ContainerInherit, ObjectInherit', `
        'None', `
        'Allow'
$acl.AddAccessRule($ace1)
Set-Acl -AclObject $acl -Path $worm

$acl  = Get-Acl $worm
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'Users', `
        'DeleteSubdirectoriesAndFiles,Delete', `
        'ContainerInherit, ObjectInherit', `
        'None', `
        'Deny'
$acl.AddAccessRule($ace1)
Set-Acl -AclObject $acl -Path $worm

$acl  = Get-Acl $worm
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'Users', `
        'WriteData', `
        'ObjectInherit', `
        'InheritOnly', `
        'Deny'
$acl.AddAccessRule($ace1)
Set-Acl -AclObject $acl -Path $worm

但它并不是万无一失的,因为管理员可以通过以下方式重新夺回控制权:

icacls C:\WORM /T /Q /C /RESET

我想说的是,如果您需要符合 SEC 合规性或其他要求的工业级解决方案,您可能必须投资 NetApp 和 SnapLock:

https://library.netapp.com/ecmdocs/ECMP1196889/html/GUID-7334EEB5-94E9-4500-BA40-681DEC572420.html

答案2

据我所知,存在一个问题,如果脚本以用户身份运行,他们需要有写入 I 驱动器的权限。

也许您可以运行一个计划任务,在 I 驱动器上以写入权限运行,以提取文件。也许他们可以创建一个名为“readytocopy.txt”或类似的文件。当计划任务在用户目录中找到该文件时,它会复制文件(readytocopy.txt 除外)。

您要解决什么具体问题?

答案3

这可以通过脚本、计划任务和 NTFS 权限的组合来实现。

假设您没有子文件夹,只有单个文件夹中的文件,那么实现方法如下:

群组

  • 设置用户组
  • 设置管理员组

(如果愿意,可以使用内置的)

目标文件夹的 NTFS 权限 (I:)

  • 读取、列出文件夹内容、执行、写入 - 仅限此文件夹,针对用户组
  • 完全控制 - 此文件夹、子文件夹、文件属于管理员组

计划任务

  • 删除每个具有写权限的文件的所有写权限的脚本
  • 可以是使用 icacls.exe、Powershell、vbscript 等任何脚本的批处理脚本
  • 将任务设置为手动启动
  • 需要以对文件夹和文件具有完全控制权的用户身份运行(管理员组)
  • 授予用户组适当的权限来启动计划任务(可以是本地计算机上的任务,也可以是远程计算机上的任务)

脚本

  • 几乎可以是任何语言(PS 可能是首选)
  • 仅当文件不存在时才复制
  • 复制后,使用 Powershell 调用 Start-ScheduledTask,或者如果使用其他脚本语言,则使用 schtasks.exe 启动计划任务。可在本地或远程计算机上运行。

有一段时间文件仍然可以由用户写入,具体取决于脚本的编码方式、文件夹中有多少个文件等等,该时间最短为几毫秒。

答案4

您应该能够使用普通的 NTFS 权限执行此操作。我找到了这篇文章。它大约有 10 年的历史了,但它非常清楚地显示了这个例子:

https://technet.microsoft.com/en-us/magazine/2006.01.howitworksntfs.aspx

  1. 将“仅此文件夹”(在“应用到”列表中选择)的“读取和执行”以及“写入”权限授予您希望有权访问该文件夹的用户。
  2. 仅向同一用户授予子文件夹和文件的读取和执行权限。
  3. 向特殊用户 Creator Owner 授予写入权限。

这样做的效果是,所有用户都能够向文件夹添加文件并读取彼此的文件,但只有创建文件的用户才能修改它。

相关内容