HOWTO · PowerShell

PowerShell을 사용하여 ACL 권한 관리하는 방법

이 기사에서는 서로 다른 권한 유형이 무엇인지 배우고 PowerShell을 사용하여 파일 및 폴더에서 ACL을 쿼리하고 수정하며 제거하는 방법을 배웁니다.

이 페이지의 내용

시스템 관리자는 최소 권한 모델을 구현하기 위해 NTFS 파일 서버에서 액세스 제어 항목 ACE를 추가하여 NTFS 액세스 제어 목록 ACL을 구성합니다.

이 기사에서는 다양한 권한 유형과 PowerShell을 사용하여 파일 및 폴더의 ACL을 쿼리, 수정 및 제거하는 방법을 배웁니다.

PowerShell의 NTFS 권한 유형

NTFS 권한에는 고급 권한과 기본 권한이 모두 있습니다. 예를 들어, 각 권한을 거부 또는 허용으로 설정할 수 있습니다.

  • 전체 제어: 이 권한이 있는 사용자는 파일 및 디렉토리를 수정, 추가, 이동 및 삭제할 수 있으며, 그와 관련된 속성도 변경할 수 있습니다. 또한, 이 권한이 있는 사용자는 모든 하위 디렉토리 및 파일에 대한 권한 설정을 변경할 수 있습니다.
  • 수정: 이 권한이 있는 사용자는 파일 및 파일 속성을 보고 수정할 수 있으며, 디렉토리에 파일을 추가하거나 파일 속성을 삭제할 수 있습니다.
  • 읽기 및 실행: 이 권한이 있는 사용자는 실행 파일, 스크립트를 포함하여 실행 가능한 파일을 실행할 수 있습니다.
  • 읽기: 이 권한을 가진 사용자는 파일, 파일 속성 및 디렉토리를 볼 수 있습니다.
  • 쓰기: 이 권한이 있는 사용자는 파일에 쓸 수 있으며 디렉토리에 파일을 추가할 수 있습니다.

다음은 고급 권한 목록입니다:

  • 폴더 탐색 또는 파일 실행: 이 고급 권한이 있는 사용자는 폴더를 탐색하여 다른 폴더나 파일에 도달할 수 있으며, 이러한 파일이나 폴더에 대한 권한이 없어도 가능합니다. 이 고급 권한이 있는 사용자는 또한 실행 가능한 파일을 실행할 수 있습니다. 폴더 탐색 권한은 사용자가 그룹 정책 스냅인에서 탐색 우회 확인 우선 권한이 없을 때 적용됩니다.
  • 폴더 목록 또는 데이터 읽기: 이 고급 권한이 있는 사용자는 폴더 내의 파일 및 하위 폴더 목록과 파일 내용을 볼 수 있습니다.
  • 속성 읽기: 이 고급 권한이 있는 사용자는 파일이나 폴더의 속성, 예를 들어 숨겨져 있는지 또는 읽기 전용인지 여부를 볼 수 있습니다.
  • 속성 쓰기: 이 고급 권한이 있는 사용자는 파일이나 폴더의 속성을 변경할 수 있습니다.
  • 확장 속성 읽기: 이 고급 권한이 있는 사용자는 파일이나 폴더의 확장 속성, 예를 들어 권한 및 생성 및 수정 시간을 볼 수 있습니다.
  • 확장 속성 쓰기: 이 고급 권한이 있는 사용자는 파일이나 폴더의 확장 속성을 변경할 수 있습니다.
  • 파일 생성 또는 데이터 쓰기: 파일 생성 권한은 사용자가 이 고급 권한을 가진 폴더 내에서 파일을 생성할 수 있게 합니다. 이 권한은 폴더에만 적용됩니다. 데이터 쓰기 권한은 이 고급 권한이 있는 사용자가 파일을 변경하고 기존 내용을 덮어 쓸 수 있게 합니다. 이 권한은 파일에만 적용됩니다.
  • 폴더 생성 또는 데이터 추가: 폴더 생성 권한은 사용자가 이 고급 권한을 가진 폴더 내에서 폴더를 생성할 수 있게 합니다. 이 권한은 폴더에만 적용됩니다. 데이터 추가 권한은 이 고급 권한이 있는 사용자가 파일 끝에 변경할 수 있게 하지만 기존 데이터를 변경, 덮어쓰거나 삭제할 수는 없습니다. 이 권한은 파일에만 적용됩니다.
  • 삭제: 이 고급 권한이 있는 사용자는 폴더나 파일을 삭제할 수 있습니다. 사용자가 폴더나 파일에서 삭제 권한이 없는 경우, 부모 폴더에서 하위 폴더 및 파일 삭제 권한이 있는 경우에도 객체를 삭제할 수 있습니다.
  • 권한 읽기: 이 고급 권한이 있는 사용자는 폴더나 파일의 권한, 예를 들어 전체 제어, 읽기, 쓰기를 읽을 수 있습니다.
  • 권한 변경: 이 고급 권한이 있는 사용자는 파일이나 폴더의 권한을 변경할 수 있습니다.
  • 소유권 가져오기: 이 고급 권한이 있는 사용자는 파일이나 폴더의 소유권을 가져올 수 있습니다. 파일이나 폴더의 소유자는 항상 권한을 변경할 수 있으며, 파일이나 폴더를 보호하는 기존 권한과 관계없이 가능합니다.
  • 동기화: 이 고급 권한이 있는 사용자는 객체를 동기화하는 데 사용할 수 있습니다. 이 권한은 스레드가 객체가 신호 상태에 들어갈 때까지 기다리게 합니다. 이 권한은 ACL 편집기에서 제공되지 않습니다.

다음 PowerShell 스크립트를 실행하여 이러한 사용자 권한에 대한 모든 정보를 찾을 수 있습니다:

[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])

NTFS 권한은 명시적이거나 상속받을 수 있습니다. 명시적 권한은 개별적으로 구성되며, 상속받은 권한은 상위 폴더에서 상속됩니다.

권한의 계층 구조는 다음과 같습니다:

  • 명시적 거부
  • 명시적 허용
  • 상속 거부
  • 상속 허용

PowerShell에서 폴더 및 파일에 대한 ACL을 가져오기 위해 Get-Acl 명령어 사용

파일 및 폴더 권한을 관리하기 위해 사용되는 첫 번째 PowerShell 명령어는 Get-Acl입니다. 이는 모든 객체 권한을 나열합니다.

Get-Acl \\fs1\shared\hr | fl

사용자는 권한을 복사하기 위해 대상 및 원본 폴더를 모두 소유해야 합니다.

Get-Acl \\fs1\shared\hr | Set-Acl \\fs1\shared\hr

PowerShell에서 파일 및 폴더에 대한 ACL을 설정하기 위해 Set-Acl 명령어 사용

PowerShell Set-Acl 명령어는 파일, 폴더 또는 레지스트리 키와 같은 지정된 항목의 보안 설명자를 변경하는 데 사용됩니다. 즉, 파일이나 폴더 권한을 수정하는 데 사용됩니다.

$acl = Get-Acl \\fs1\shared\hr

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\User01", "FullControl", "Allow")

$acl.SetAccessRule($AccessRule)

$acl | Set-Acl \\fs1\shared\hr

PowerShell에서 사용자 권한을 제거하기 위해 -RemoveAccessRule 매개변수 사용

$acl = Get-Acl \\fs1\shared\hr

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\User01", "FullControl", "Allow")

$acl.RemoveAccessRule($AccessRule)

$acl | Set-Acl \\fs1\shared\hr

PowerShell에서 권한 상속 비활성화 또는 활성화

상속을 관리하기 위해 SetAccessRuleProtection 메서드를 사용할 수 있습니다. 이 메서드는 두 개의 매개변수가 있습니다:

  • 첫 번째 매개변수는 상위 폴더에서의 상속을 차단하는 역할을 합니다. 불리언 상태인 $true$false를 반환합니다.
  • 두 번째 매개변수는 현재 상속된 권한이 제거될지 유지될지를 결정합니다. 또한 불리언 상태인 $true$false를 반환합니다.
$acl = Get-Acl \\fs1\shared\hr

$acl.SetAccessRuleProtection($true, $false)

$acl | Set-Acl \\fs1\shared\hr

이번 변경을 되돌리고 폴더에 대한 상속을 다시 활성화해 보겠습니다:

$acl = Get-Acl \\fs1\shared\hr

$acl.SetAccessRuleProtection($false, $true)

$acl | Set-Acl \\fs1\shared\hr

PowerShell에서 파일 및 폴더 소유권 변경을 위해 SetOwner 메서드 사용

폴더의 소유자를 설정하려면 SetOwner 메서드를 실행해야 합니다.

$acl = Get-Acl \\fs1\shared\hr

$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISE\User01")

$acl.SetOwner($object)

$acl | Set-Acl \\fs1\shared\hr