• 学习笔记-ACL


    ACL


    什么是 ACL

    windows 系统中的 ACL(Access Control List),用来表示组与用户权限的列表。比如文件、注册表的权限都包括 ACL,它用来表示哪些组与用户具有操作权限,其实主要是一组规则,定义哪些组与用户等对特定 AD 对象具有哪些权限。

    ACL

    Access Control List,用来表示用户(组)权限的列表,包括 DACL 和 SACL;

    ACE

    Access Control Entry,ACL 中的元素;

    DACL

    Discretionary Access Control List,用来表示安全对象权限的列表;

    SACL

    System Access Control List,用来记录对安全对象访问的日志;


    具体实现对某个文件进行访问,系统将做以下判断:

    • 无 DACL,系统将允许访问,也就是系统内的所有组与用户都没有做限制;
    • 有 DACL,无 ACE,系统将拒绝所有访问,也就是系统内的组与用户有限制,但是没有 ACE 也就是不允许任何操作;
    • 有 DACL,有 ACE,将就是按照 ACE 的内容去执行相应组与用户的限制,只有对应的 ACE 可以进行操作;

    查看文件的 ACL

    选择一条 DACL 包含多个 ACE,表示具有的权限如下


    针对 ACL 的操作

    icacls 操作 ACL

    查看指定文件的 ACL

    icacls C:\test.txt

    其中(OI)代表对象继承 (CI)代表容器继承 (F)代表完全访问:

    备份指定文件 (包括当前目录及其子目录中的文件) 的 ACL

    icacls C:\test.txt /save AclFile /t

    还原指定文件(包括当前目录及其子目录中的文件)的ACL(注意这里还原的路径需要为先前备份的路径的上一级)

    icacls C:\ /restore AclFile /t

    添加用户对指定文件的完全访问权限

    icacls C:\test.txt /grant test:(OI)(CI)(F) /t

    移除用户对指定文件(包括当前目录及其子目录中的文件)的完全访问权限

    icacls C:\test.txt /remove test1 /t

    powershell 操作 ACL

    查看指定路径的ACL

    Get-Acl -Path 'C:\test'| Format-Table -wrap

    添加用户 test1 对指定文件的完全访问权限

    1. function Add-ACL{
    2. [CmdletBinding()]
    3. Param (
    4. [Parameter(Mandatory = $True)]
    5. [String]
    6. [ValidateNotNullOrEmpty()]
    7. $Path
    8. )
    9. $acl = Get-Acl -Path $Path
    10. $person = [System.Security.Principal.NTAccount]"test1"
    11. $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    12. $inheritance = [System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"
    13. $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    14. $type = [System.Security.AccessControl.AccessControlType]"Allow"
    15. $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    16. $person,$access,$inheritance,$propagation,$type)
    17. $acl.AddAccessRule($rule)
    18. Set-Acl $Path $acl
    19. }
    20. Add-ACL -Path 'C:\test'

    移除用户 test1 对指定文件的完全访问权限

    1. function Remove-ACL{
    2. [CmdletBinding()]
    3. Param (
    4. [Parameter(Mandatory = $True)]
    5. [String]
    6. [ValidateNotNullOrEmpty()]
    7. $Path
    8. )
    9. $acl = Get-Acl -Path $Path
    10. $person = [System.Security.Principal.NTAccount]"test1"
    11. $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    12. $inheritance = [System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"
    13. $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    14. $type = [System.Security.AccessControl.AccessControlType]"Allow"
    15. $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    16. $person,$access,$inheritance,$propagation,$type)
    17. $acl.RemoveAccessRule($rule)
    18. Set-Acl $Path $acl
    19. }
    20. Remove-ACL -Path 'C:\test'

    添加用户test1对指定文件(包括当前目录及其子目录中的文件)的完全访问权限

    1. function Add-ACL{
    2. [CmdletBinding()]
    3. Param (
    4. [Parameter(Mandatory = $True)]
    5. [String]
    6. [ValidateNotNullOrEmpty()]
    7. $Path
    8. )
    9. $acl = Get-Acl -Path $Path
    10. $person = [System.Security.Principal.NTAccount]"test1"
    11. $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    12. $inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
    13. $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    14. $type = [System.Security.AccessControl.AccessControlType]"Allow"
    15. $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    16. $person,$access,$inheritance,$propagation,$type)
    17. $acl.AddAccessRule($rule)
    18. Set-Acl $Path $acl
    19. }
    20. Add-ACL -Path 'C:\test'
    21. $fileList = Get-ChildItem 'C:\test' -recurse
    22. Foreach($file in $fileList)
    23. {
    24. $file.fullname
    25. Add-ACL -Path $file.fullname
    26. }

    移除用户test1对指定文件(包括当前目录及其子目录中的文件)的完全访问权限

    1. function Remove-ACL{
    2. [CmdletBinding()]
    3. Param (
    4. [Parameter(Mandatory = $True)]
    5. [String]
    6. [ValidateNotNullOrEmpty()]
    7. $Path
    8. )
    9. $acl = Get-Acl -Path $Path
    10. $person = [System.Security.Principal.NTAccount]"test1"
    11. $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    12. $inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
    13. $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    14. $type = [System.Security.AccessControl.AccessControlType]"Allow"
    15. $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    16. $person,$access,$inheritance,$propagation,$type)
    17. $acl.RemoveAccessRule($rule)
    18. Set-Acl $Path $acl
    19. }
    20. Remove-ACL -Path 'C:\test'
    21. $fileList = Get-ChildItem 'C:\test' -recurse
    22. Foreach($file in $fileList)
    23. {
    24. Remove-ACL -Path $file.fullname
    25. }

    注册表操作 ACL

    查看指定路径的ACL:

    Get-Acl -Path 'HKLM:\SAM'| Format-Table -wrap

    获得Access项的具体内容:

    1. $acl = Get-Acl -Path 'HKLM:\SAM'
    2. $acl.Access

    添加用户test1对指定路径(包括当前注册表项及其子健)的完全访问权限

    1. $acl = Get-Acl HKLM:\SAM
    2. $person = [System.Security.Principal.NTAccount]"test1"
    3. $access = [System.Security.AccessControl.RegistryRights]"FullControl"
    4. $inheritance = [System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"
    5. $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    6. $type = [System.Security.AccessControl.AccessControlType]"Allow"
    7. $rule = New-Object System.Security.AccessControl.RegistryAccessRule( `
    8. $person,$access,$inheritance,$propagation,$type)
    9. $acl.AddAccessRule($rule)
    10. Set-Acl HKLM:\SAM $acl

    移除用户test1对指定路径(包括当前注册表项及其子健)的完全访问权限

    1. $acl = Get-Acl HKLM:\SAM
    2. $person = [System.Security.Principal.NTAccount]"test1"
    3. $access = [System.Security.AccessControl.RegistryRights]"FullControl"
    4. $inheritance = [System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"
    5. $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    6. $type = [System.Security.AccessControl.AccessControlType]"Allow"
    7. $rule = New-Object System.Security.AccessControl.RegistryAccessRule( `
    8. $person,$access,$inheritance,$propagation,$type)
    9. $acl.RemoveAccessRule($rule)
    10. Set-Acl HKLM:\SAM $acl

    Source & Reference

    点击关注,共同学习!安全狗的自我修养

    github haidragon

    https://github.com/haidragon

  • 相关阅读:
    zookeeper安装教程(Windows)
    使用 KubeSkoop exporter 监测和定位容器网络抖动问题
    【前端 Echarts】小白初步学习小结Echarts基本使用
    在k8s中部署Elasticsearch高可用集群详细教程
    Scala 高阶(八):集合内容汇总(下篇)
    解决线上服务器CPU占用过高问题
    计算机体系结构复习笔记
    聚名十周年线上庆典正式开启,发送祝福即有好礼相赠~
    磷脂修饰Fe3O4磁性纳米颗粒|罗丹明标记表面氨基功能化葡聚糖修饰的Fe3O4磁性纳米颗粒
    QT修改windowTitle的名字以及图片
  • 原文地址:https://blog.csdn.net/sinat_35360663/article/details/127704090