Windows Server Core 管理与 PowerShell 笔记(四)———— 本地访问控制

2019-04-05 windows powershell

Windows Server Core 管理与 PowerShell 笔记(四)———— 本地访问控制

在上一篇文章中,我们介绍了关于 Windows 用户和用户组的相关操作。Windows 中最常用的登陆方式,就是基于用户口令的身份鉴别机制。 在本文中,我们将会进一步介绍 Windows 的访问控制策略。其中主要包括对于文件和其他各种系统资源的权限控制。

一、Windows 的文件访问权限策略

1.1 安全标识符(SID)

Windows 对于所有的主体(包括用户、组、计算机等)都分配一个安全标识符,这类似于 Linux 中的 uid, gid, pid 等相关概念。 每一个安全标识符都对应了一个安全主体。

Windows 的 SID 由字母 S 开头,而后紧跟多个数字。分别代表了修订级别、颁发机构、子颁发机构、其余颁发机构以及相对标识符构成。

1.2 NTFS 文件权限

NTFS 和 ReFS 的文件权限基本类似,主要分为标准访问权限和特殊访问权限。简单的来说,标注访问权限的细粒度较粗,是多个特殊访问权限的结合, 在一般情况下使用标准访问权限就能够很好的对文件进行访问控制。特殊访问权限的划分非常细致,当有特殊需求的时候,可以使用特殊访问权限加以控制。 由于篇幅原因,我们只重点记录标准访问权限。

在 Windows 中,对于文件的标准访问控制权限主要有以下五种:

  1. 读取:读取文件内容、属性、扩展属性、权限。
  2. 写入:写入或者附加内容,写入属性和扩展属性。
  3. 读取和执行:比写入多了执行文件权限。
  4. 修改:除了读取、写入、执行权限之外,还能够删除该文件。
  5. 完全控制:上述所有权限,外加修改权限和获得所有权。

对于文件夹的标准访问控制权限主要有一下六种:

  1. 读取:列出该文件夹、读取属性、扩展属性以及权限。
  2. 写入:在文件夹内创建新的文件和文件夹,写入属性和扩展属性。
  3. 列出文件夹内容:比读取多一个列出该文件夹中内容的权限。
  4. 读取和执行:具有的权限与“列出文件夹内容”权限一样。但是在继承时有区别,所有文件夹都能继承该属性,而只有子文件夹才能继承“列出文件夹内容”属性。
  5. 修改:具有读取和写入的权限,外加删除该文件夹的权限。(但是没有删除子文件夹和文件的权限)
  6. 完全控制: 具有上述所有权限以及删除子文件夹、文件,更改权限、获得所有权。

1.3 文件权限的运算规则

  1. 权限最小化原则:尽量给用户分配最小的权限,而不分配过多权限。
  2. 累加原则:将用户以及用户所在的所用组的权限叠加,作为用户的权限。
  3. 拒绝有限:当用户某一个组具有拒绝权限时,则直接拒绝该权限。
  4. 继承原则:一个文件夹中的权限默认继承自该文件夹。当然,我们也可以设置权限不继承。注意之前有提到文件夹继承的特殊性。

另外,当使用 SMB 分享文件时,文件同时具有分享权限和NTFS权限。此时对权限取交集。

1.4 Windows 访问控制列表(ACL)

回顾 Linux 的文件权限控制。传统的 Linux 的访问控制,主要是划分为 属主、属组、其他人 三类来进行权限管理,当然还有其他机制在这里暂且不提。 在最近的发行版之中,开始加入了对于访问控制列表(ACL)的更加细致的文件访问控制方法。

Windows 原生使用访问控制列表(ACL)来对文件进行控制。这个列表主要记录了某一个主体(SID)对于这个客体(文件等)的具体访问权限。每一种权限都有允许、拒绝、空三种状态。

我们使用 Get-ACL 来获取某一个文件的访问控制列表,从其中可以看到具体的文件名、拥有者以及具体的访问控制列表。

PS C:\Users\ertuil> Get-Acl .\Documents\readme.txt

    目录: C:\Users\ertuil\Documents
Path           Owner                  Access
----           -----                  ------
readme.txt WIN-DV9QMKNEK7H\ertuil WIN-DV9QMKNEK7H\test Deny  ReadAndExecute...

注意到其中的 Access 是一个 Powershell 列表对象,我们来详细列出其中的内容:

PS C:\Users\ertuil> (Get-Acl .\Documents\readme.txt).Access

FileSystemRights  : ReadAndExecute
AccessControlType : Deny
IdentityReference : WIN-DV9QMKNEK7H\test
IsInherited       : True
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : NT AUTHORITY\SYSTEM
IsInherited       : True
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : BUILTIN\Administrators
IsInherited       : True
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : WIN-DV9QMKNEK7H\ertuil
IsInherited       : True
InheritanceFlags  : None
PropagationFlags  : None

可以看到对 test 用户设置了“读取和执行”的拒绝权限,以及 ertuil 用户、 Administrators 组、 System 组的允许完全控制权限。

同理,我们使用 Set-ACL 来设置某一文件的访问控制列表。例如我们可以加上对于用户 test 的安全控制拒绝权限:

$account = "WIN-DV9QMKNEK7H\test"
$FileSystemRights = "FullControl"
$objType = [System.Security.AccessControl.AccessControlType]::Deny
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($account,$FileSystemRi
ghts,$objType)
$acl = Get-ACL Readme.txt
$acl.SetAccessRule($accessRule)
Set-Acl -Path Readme.txt -AclObject $acl

对于 ACL 对象来说,还有 RemoveAccessRule 函数可以用来删除一项内容。其接受的参数可以是 Access 列表中的具体某一个元素。

二、组策略和本地安全策略

当计算机没有加入域时,其主要策略由“本地组策略”进行设置。当计算机加入域时,域控制器可以对域内的计算机设置多个组,可以为每一个组单独建立“组策略”。

而“本地安全策略”则是“组策略”中非常重要的一部分,主要控制计算机的访问控制等相关设置。我们使用 “gpedit.msc” 来打开 “组策略编辑器”, 而后在“计算机配置” -> “安全设置” 即可查看本地安全策略相关设置。其中的主要设置有:

安全策略经常配置等项目有:

  1. 账户策略
    1. 密码策略:设置密码长度,使用期限等。
    2. 账户锁定策略:登陆失败时的锁定策略。
  2. 本地策略:
    1. 审核策略:各种审计功能是否打开
    2. 用户权限分配:对于特殊任务(关机、远程登录等),指定其所能执行的组和用户
    3. 安全选项:对于各种安全选项是否允许(未登录时关闭计算机等)
  3. 高级Windows Definder: 防火墙配置
  4. 软件限制策略、应用程序限制策略
  5. 高级审核策略:高级等审计是否打开

此外,在组策略的 “Windows 策略” 中,可以修改 DNS 服务器、启动和关机时脚本、打印机等配置。在组策略的“管理模版”中可以配置“控制面板“、“桌面”、“开始菜单”等系统组建的设置。

在 Windows Server Core 中,没有 gpedit.msc 因此我们只能够通过直接修改注册表,或者使用 secedit 命令行工具等,来修改本地安全策略。

三、总结

这里主要介绍了现代 Windows 系统对文件系统访问控制机制,以及安全策略的配置的相关方法。灵活使用这些配置,能够使得我们的系统更加稳定和可靠。 下一部分,将会介绍 Windows 的磁盘管理、进程管理、内存管理、文件共享的相关知识;另外,还将穿插 PowerShell 更加高级的使用方法, 在这一部分,你会发现基于对象的 PowerShell 强大之处。这一部分结束之后,基本已经可以熟练的进行系统的配置。此后,中心将会从系统配置专向网络的方向。