Windows에서 파일이나 폴더에 대한 접근을 제어하려면 해당 NTFS 파일 시스템 객체(파일 또는 폴더)에 ACL(Access Control List)이라는 특수한 목록이 할당됩니다. 객체의 ACL은 특정 사용자나 그룹이 해당 파일 시스템 객체에 대해 수행할 수 있는 작업(권한)을 정의합니다.
대부분의 경우 Windows 관리자는 파일 탐색기의 그래픽 인터페이스(파일/폴더 속성 → 보안 탭)나 icacls 콘솔 도구를 사용해 NTFS 권한을 관리합니다. 하지만 이 글에서는 PowerShell cmdlet을 활용해 NTFS 객체의 권한을 관리하는 방법을 살펴보겠습니다. 이러한 명령어들은 스크립트 작성은 물론, Windows 파일 서버와 워크스테이션의 NTFS 접근 권한 관리를 자동화할 때 매우 유용하게 활용할 수 있습니다.
Get-Acl & Set-Acl: NTFS ACL 관리를 위한 기본 제공 PowerShell cmdlet
PowerShell v5(Windows 10/Windows Server 2016)에는 ACL을 관리하기 위한 두 개의 기본 제공 cmdlet(Microsoft.PowerShell.Security 모듈에 포함)이 있습니다.
- Get-Acl — NTFS 파일 시스템에서 특정 객체의 현재 ACL을 조회합니다.
- Set-Acl — 객체의 현재 ACL을 추가하거나 변경합니다.
다만 이 cmdlet들은 실제 업무 환경에서 NTFS 권한을 관리하기에는 기능이 다소 부족한 편입니다. 따라서 여기서는 자세히 다루지 않고, 몇 가지 대표적인 활용 사례만 살펴보겠습니다.
폴더(파일)의 현재 소유자와 할당된 NTFS 권한 목록을 확인하려면 다음 명령을 실행합니다.
get-acl C:\docs\ | fl출력 결과를 보면 현재 권한이 SDDL 문자열 형식으로도 표시되는 것을 확인할 수 있습니다. SDDL은 Windows 서비스 권한 설정 등에서 사용되는 접근 권한 기술 형식입니다.
NTFS 권한 목록만 더 보기 편한 형태로 표시하려면 다음과 같이 실행합니다.
(get-acl C:\docs\).access또한 한 NTFS 폴더(객체)의 현재 권한을 복사해 다른 폴더에 적용할 수도 있습니다.
Get-Acl e:\old_docs | Set-Acl C:\docs단, 이 작업을 수행하려면 해당 계정이 객체의 소유자여야 하며 Take Ownership 권한을 보유하고 있어야 합니다.
Set-Acl 사용 시 주의점
Set-Acl의 가장 큰 문제는 단순히 NTFS 권한만 변경하려는 경우에도 cmdlet이 항상 리소스 소유자를 변경하려 한다는 점입니다. 따라서 객체에 권한을 추가하려면 아래와 같은 복잡한 스크립트를 사용해야 합니다.
$path = "c:\docs"
$user = "corp\DSullivan"
$Permiss = "Read, ReadAndExecute, ListDirectory"
$InheritSettings = "Containerinherit, ObjectInherit"
$PropogationSettings = "None"
$RuleType = "Allow"
$acl = Get-Acl $path
$perm = $user, $Permiss, $InheritSettings, $PropogationSettings, $RuleType
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $perm
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path $path특정 사용자나 그룹의 폴더 접근 NTFS 권한을 제거하려면 다음과 같이 합니다.
$path = "c:\docs"
$acl = Get-Acl $path
$rules = $acl.Access | where IsInherited -eq $false
$targetrule = $rules | where IdentityReference -eq "corp\DSullivan"
$acl.RemoveAccessRule($targetrule)
$acl | Set-Acl -Path $pathPowerShell에서 폴더의 상속을 비활성화하는 방법은 다음과 같습니다.
$path = 'C:\docs'
$acl = Get-ACL -Path $path
# 첫 번째 $True는 보호 여부, 두 번째 $True는 기존 NTFS 권한을 복사할지 여부를 지정합니다.
$acl.SetAccessRuleProtection($True, $True)
Set-Acl -Path $path -AclObject $acl이 외에도 Get-Acl과 Set-Acl을 활용하면 객체의 NTFS 감사(audit) 설정 관리나 AD의 OU 위임 권한 확인 등도 가능합니다.
NTFSSecurity PowerShell 모듈로 파일 권한 관리하기
앞서 언급했듯이, 파일 시스템 객체를 관리하는 기본 제공 cmdlet은 사용하기가 다소 불편합니다. Windows에서 파일과 폴더의 NTFS 권한을 관리할 때는 PowerShell 갤러리에서 제공하는 별도 모듈인 NTFSSecurity를 사용하는 것이 좋습니다.
최신 버전의 NTFSSecurity 모듈(현재 4.2.6)은 다음 명령으로 설치하거나 직접 내려받을 수 있습니다.
Install-Module -Name NTFSSecurity직접 설치할 경우 모듈 압축 파일을 C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurity 경로에 해제하면 됩니다. 이때 다운로드한 파일의 차단을 해제(unblock)하는 것을 잊지 마세요.
PowerShell 세션에 NTFSSecurity 모듈을 가져옵니다.
Import-Module NTFSSecurity모듈에서 사용 가능한 명령 목록(36개 cmdlet)을 확인하려면 다음을 실행합니다.
Get-Command -Module NTFSSecurity현재 NTFS 권한 조회 및 권한 추가
폴더의 현재 NTFS 권한을 나열합니다.
Get-Item 'c:\docs' | Get-NTFSAccess기본 cmdlet에 비해 훨씬 직관적이고 보기 편한 형태로 권한이 출력되는 것을 확인할 수 있습니다.
특정 폴더에 대해 사용자나 그룹에게 전체 제어(Full Control) 권한을 부여하려면 다음 명령을 실행합니다.
Add-NTFSAccess -Path C:\docs -Account 'CORP\RShelby','BUILTIN\Administrators' -AccessRights 'Fullcontrol' -PassThru팁: NTFSSecurity cmdlet은 기본적으로 실행 결과를 반환하지 않습니다. 실행 후 새로 적용된 ACL을 화면에 표시하려면 -PassThru 매개변수를 사용하세요.
최상위 폴더에만 권한을 부여하고 하위 중첩 객체들의 권한은 변경하지 않으려면 다음과 같이 -AppliesTo ThisFolderOnly 옵션을 사용합니다.
Add-NTFSAccess c:\docs\public -Account corp\LMurkowski -AccessRights Modify -AppliesTo ThisFolderOnlyNTFS 권한 제거
할당된 NTFS 권한을 제거합니다.
Remove-NTFSAccess -Path C:\DOCS -Account 'corp\LMurkowski' -AccessRights FullControl -PassThru다음 명령은 지정한 계정에 대해 폴더 내 모든 하위 객체의 권한을 제거합니다(상속된 권한은 제외).
Get-ChildItem -Path C:\docs -Recurse | Get-NTFSAccess -Account 'corp\LMurkowski' -ExcludeInherited | Remove-NTFSAccess -PassThru아래 명령으로 폴더 내 모든 중첩 객체의 소유자를 Administrator 계정으로 변경할 수 있습니다.
Get-ChildItem -Path C:\docs -Recurse -Force | Set-NTFSOwner -Account 'Administrator'폴더 객체에 수동으로 할당된 모든 권한을 초기화하려면 다음을 사용합니다(상속된 권한은 제거되지 않습니다).
Get-ChildItem -Path C:\docs -Recurse -Force | Clear-NTFSAccess폴더 내 모든 객체에 대해 NTFS 상속을 활성화합니다.
Get-ChildItem -Path C:\docs -Recurse -Force | Enable-NTFSAccessInheritance상속된 권한을 제외하고 수동으로 할당된 권한만 표시합니다.
dir C:\docs | Get-NTFSAccess –ExcludeInherited특정 계정에 할당된 권한을 확인할 수도 있습니다(유효 권한과는 다르다는 점에 유의하세요. 유효 권한은 뒤에서 다룹니다).
dir C:\docs | Get-NTFSAccess -Account woshub\RShelbyPowerShell로 NTFS 유효 권한(Effective Permissions) 확인하기
Get-EffectiveAccess cmdlet을 사용하면 특정 파일이나 폴더에 대한 유효 NTFS 권한(effective permissions)을 확인할 수 있습니다.
예를 들어, 어떤 폴더에 여러 AD 보안 그룹에 접근 권한을 부여했다고 가정해 보겠습니다. 이때 특정 사용자 계정(또는 SID)이 해당 폴더의 파일에 접근할 수 있는지 알고 싶다면 어떻게 해야 할까요? 사용자가 속한 모든 AD 그룹의 구성원을 일일이 나열하지 않고도 확인하는 방법이 바로 유효 NTFS 권한 조회입니다.
예를 들어, 도메인 계정 confroom에 대해 폴더 내 모든 하위 디렉터리의 유효 권한을 확인하려면 다음 명령을 사용합니다.
Get-ChildItem -Path c:\docs -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'corp\confroom' | select Account, AccessControlType, AccessRights, FullName특정 파일에 대한 유효 권한도 확인할 수 있습니다.
Get-Item -Path 'C:\docs\annual_report2019.xlsx' | Get-NTFSEffectiveAccess -Account 'corp\confroom' | Format-List파일 시스템 객체에 대한 현재 사용자의 유효 권한은 출력 결과의 AccessRights 필드에서 확인할 수 있습니다.