首页 > 其他分享 >学习笔记-ACL

学习笔记-ACL

时间:2022-11-05 15:15:17浏览次数:78  
标签:AccessControl System 笔记 ACL 学习 Path Security 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 对指定文件的完全访问权限

function Add-ACL{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $True)]
        [String]
        [ValidateNotNullOrEmpty()]
        $Path
    )

    $acl = Get-Acl -Path $Path
    $person = [System.Security.Principal.NTAccount]"test1"
    $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    $inheritance = [System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"
    $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    $type = [System.Security.AccessControl.AccessControlType]"Allow"
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    $person,$access,$inheritance,$propagation,$type)
    $acl.AddAccessRule($rule)
    Set-Acl $Path $acl
}
Add-ACL -Path 'C:\test'

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

function Remove-ACL{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $True)]
        [String]
        [ValidateNotNullOrEmpty()]
        $Path
    )

    $acl = Get-Acl -Path $Path
    $person = [System.Security.Principal.NTAccount]"test1"
    $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    $inheritance = [System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"
    $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    $type = [System.Security.AccessControl.AccessControlType]"Allow"
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    $person,$access,$inheritance,$propagation,$type)
    $acl.RemoveAccessRule($rule)
    Set-Acl $Path $acl
}
Remove-ACL -Path 'C:\test'

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

function Add-ACL{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $True)]
        [String]
        [ValidateNotNullOrEmpty()]
        $Path
    )

    $acl = Get-Acl -Path $Path
    $person = [System.Security.Principal.NTAccount]"test1"
    $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    $inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
    $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    $type = [System.Security.AccessControl.AccessControlType]"Allow"
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    $person,$access,$inheritance,$propagation,$type)
    $acl.AddAccessRule($rule)
    Set-Acl $Path $acl
}
Add-ACL -Path 'C:\test'
$fileList = Get-ChildItem 'C:\test' -recurse
Foreach($file in $fileList)
{
    $file.fullname
    Add-ACL -Path $file.fullname
}

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

function Remove-ACL{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $True)]
        [String]
        [ValidateNotNullOrEmpty()]
        $Path
    )

    $acl = Get-Acl -Path $Path
    $person = [System.Security.Principal.NTAccount]"test1"
    $access = [System.Security.AccessControl.FileSystemRights]"FullControl"
    $inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
    $propagation = [System.Security.AccessControl.PropagationFlags]"None"
    $type = [System.Security.AccessControl.AccessControlType]"Allow"
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
    $person,$access,$inheritance,$propagation,$type)
    $acl.RemoveAccessRule($rule)
    Set-Acl $Path $acl
}
Remove-ACL -Path 'C:\test'
$fileList = Get-ChildItem 'C:\test' -recurse
Foreach($file in $fileList)
{
    Remove-ACL -Path $file.fullname
}

注册表操作 ACL

查看指定路径的ACL:

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

获得Access项的具体内容:

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

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

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

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

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

Source & Reference

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

github haidragon

https://github.com/haidragon

标签:AccessControl,System,笔记,ACL,学习,Path,Security,acl
From: https://www.cnblogs.com/haidragon/p/16860210.html

相关文章

  • 学习笔记-PDB符号文件
    PDB符号文件什么是PDB文件PDB(ProgramDataBase),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件......
  • 学习笔记-IPC$(Internet Process Connection)
    IPC$(InternetProcessConnection)IPC$的概念IPC$(InternetProcessConnection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名......
  • 第十周学习笔记
    第12章  块设备I/O和缓冲区管理一、主要内容1.块设备I/O缓冲区与内存访问相比,磁盘I/O速度较慢,所以不希望在每次执行读写文件操作时都执行磁盘I/O。因此,大多数文件系......
  • 学习笔记-WinRM
    WinRM什么是WinRMWindows远程管理(WinRM)是WS-ManagementProtocol的Microsoft实现。WS-Management协议是一种基于SOAP的防火墙友好协议,旨在用于系统查找和交换......
  • 学习笔记-Secure-Win
    Secure-Winwindows加固+维护+应急响应参考大纲文件可疑文件系统开机启动账号进程注册表日志系统日志日志工具第三方程序日志网络端口......
  • 学习笔记-PowerShell 笔记
    PowerShell笔记什么是PowerShellWindowsPowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.NETFramework的强大功能.WindowsPowerS......
  • 学习笔记-Speed-Win
    Speed-Win大纲基础使用环境变量符号会话文件和目录查看创建删除查询修改链接网络管理IPC$查看网络信息网络排错工具RDP防火墙系统管......
  • 学习笔记- 角色权限
    角色权限用户帐户在Windowsvista或是windows7中,有两个级别的用户:标准用户和管理员.标准用户是计算机Users组的成员;管理员是计算机Administrators组的成员......
  • 学习笔记-内存管理
    内存管理注:笔记中拓扑图drawio源文件在其图片目录下更多内存相关知识点可见内存笔记Windows内存管理可概括为三大机制:虚拟地址空间管理;物理页面管理;......
  • 学习笔记-凭据
    凭据简介CredentialManager,中文翻译为凭据管理器,用来存储凭据(例如网站登录和主机远程连接的用户名密码)如果用户选择存储凭据,那么当用户再次使用对应的操作,系统......