Feeds:
Записи
Комментарии

Archive for Октябрь 2016

По умолчанию PowerShell обладает довольно слабой поддержкой  командлетов для гибкого управления правами NTFS. Зачастую Get-Acl/Set-Acl не справляются ,даже, с базовыми задачами. При использовании .Net  / WMI (Win32_Trustee, Win32_ACE, Win32_SecurityDescriptor) API позволяет расширить функционал при этом не добавляя гибкости и простоты, с значительным увеличением кодовой базы. Поставляемые по умолчанию  утилиты cacls/icacls/takeown –  справляются со своими задачами, но имеют ограничения и сложность в добавлении расширенного функционала. 

Сторонние утилиты обладающие более широким функционалом, наиболее известные:

SubInACL — https://www.microsoft.com/en-us/download/details.aspx?id=23510

SetACL(для скриптования есть поддержка COM-интерфейса) — https://helgeklein.com

На мой взгляд более удобная  — это SetACL, обладает отличным функционалом, хорошей документаций с большим обилием примеров, поддержка длинных путей 256+ и распространяется бесплатно.

Raimund Andrée написал прекрасный модуль NTFSSecurity для работы с NTFS, обладающий отличным функционал и легкостью управления,поддержка длинных путей 256+. Кто хочет более детально изучить работу модуля может ознакомится с исходными кодами проекта на C# — https://github.com/raandree/NTFSSecurity.

В качестве документации, настоятельно рекомендую прочитать:

NTFSSecurity Tutorial 1 — Getting, adding and removing permissions

NTFSSecurity Tutorial 2 — Managing NTFS Inheritance and Using Privileges

В нашем примере версия PowerShell 5.0 (или выше 5.1 в состоянии preview, 6.0 alpha) , который имеет поддержку Windows 7+.  Модуль NTFSSecurity  не поддерживает использование Linux/MacOS.

Установка модуля.

В PowerShell V3 была добавлена новая переменная среды — $env:PSModulePath.

Переменная среды PSModulePath содержит пути откуда можно импортировать модули, когда не указан полный путь к модулю. 

Дополнительные сведения:

Modifying the PSModulePath Installation Path — https://msdn.microsoft.com/en-us/library/dd878326(v=vs.85).aspx

Installing a PowerShell Module — https://msdn.microsoft.com/en-us/library/dd878350(v=vs.85).aspx

При изменении переменной PSModulePath , чтобы настройки вступили в силу, требуется отправить сообщение WM_SETTINGCHANGE с параметром Environment. Пример скрипта для отправки сообщения — Invoke-WMSettingsChange by Oisin Grehan

В PowerShell V4 PSModulePath  переменная содержит путь:

%ProgramFiles%\WindowsPowerShell\Modules

В моем случае:

PS > $env:PSModulePath.split(";")
C:\Users\Administrator\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules

В PowerShell v5 добавили замечательную возможность PowerShellGet(V3,V4 – данный модуль тоже доступен) для работы с онлайн репозитариями. Подробнее можно ознакомиться в документации — https://msdn.microsoft.com/en-us/powershell/gallery/readme

И выполняем команду:

Install-Module -Name NTFSSecurity -Scope AllUsers -Verbose -Force            

Где область AllUsers:

The AllUsers scope lets modules be installed in a location that is accessible to all users of the computer, that is

, %systemdrive%:\ProgramFiles\WindowsPowerShell\Modules.

Модуль содержит на момент написания 36 командлетов. Список можно посмотреть:

Get-Command -Module NTFSSecurity

Убедимся, что модуль находится в нужном месте:

PS > Get-Module NTFSSecurity | Format-List            
            
Name              : NTFSSecurity            
Path              : C:\Program Files\WindowsPowerShell\Modules\NTFSSecurity\4.2.3\NTFSSecurity.psm1            
Description       : Windows PowerShell Module for managing file and folder security on NTFS volumes


Использование привилегий

Зачастую разрешения даны только определенным группам пользователей. В редких случаях, некорректного назначения прав deny, удаления групп/пользователей являющихся владельцем объекта. Тем самым,лишая возможности, обладая даже полными правами Администратора системы, чтения ACL-объекта, получая -  access is denied. Администратор по умолчанию обладает привилегией Take ownership of files or other objects (SeTakeOwnershipPrivilege) , которая позволяет стать владельцем любых объектов. Но в этом случае, затираются существующие ACL объекта, что может привести к нежелательному результату и дополнительной работе для администратора.

В нашем примере, отметим только те привилегии, которые имеют отношения к файлам и папкам.

  • Back up files and directories:

Это право пользователя определяет, какие пользователи могут игнорировать разрешения  файлов и каталогов, реестра и другие  в целях резервного копирования системы.

Это право пользователя эквивалентно предоставлению следующих разрешений пользователя или группы, выбранных для всех файлов и папок в системе:

  • Traverse Folder/Execute File

  • List Folder/Read Data

  • Read Attributes

  • Read Extended Attributes

  • Read Permissions

По умолчанию: Administrators и Backup Operators

  • Restore files and directories:

Этот параметр безопасности определяет, какие пользователи могут игнорировать разрешения файлов, каталогов, реестра и другие  при их восстановления из резервной копии и определяет, какие пользователи могут устанавливать владельца для объекта.

Предоставление этого права пользователя учетной записи похож на предоставление учетной записи следующие разрешения для всех файлов и папок в системе:

  • Traverse Folder/Execute File
  • Write

По умолчанию: Administrators и Backup Operators

  • Take ownership of files or other objects:

Разрешает пользователю становиться вла­дельцем системных объектов, в том числе объектов Active Directory, файлов и папок, принтеров, разделов реестра, процессов и потоков.

По умолчанию: Administrators

Для просмотра текущих привилегий, в модуле есть командлет Get-Privileges или можно воспользоваться встроенной утилитой whoami /priv .

pr241016

Создадим простую структуру:
 
md E:\Doc | Out-Null            
Get-Process > E:\Doc\file1.txt            
Get-Service > E:\Doc\file2.txt            
 
Для получения разрешений командлет Get-NTFSAccess ,для получения владельца - Get-NTFSOwner.
 
dacl241016
 

Пример 1:

Уберем все права  и  назначим ‘NT SERVICE\TrustedInstaller’ владельцем.

Set-NTFSOwner E:\DOC -Account 'NT SERVICE\TrustedInstaller'            
Disable-NTFSAccessInheritance E:\DOC -RemoveInheritedAccessRules

Проверяем стандартными средствами:

acg241016

Оба способа возвращают ‘Access is denied’ под учетной записью администратора.

Если нам требуется только посмотреть список файлов, то можно использовать модуль PowerForensics.

Install-Module PowerForensics -Scope AllUsers -Force

Список файлов E:\Doc:

fm241016

Добавим пользователю, скажем Alexander, права на чтение папки без изменения владельца:

adaa241016

Проверим под пользователем:

ua241016

Пример 2:

С "осиротевшими" объектами. Структура папок из первого примера. Добавляем группу и пользователя, назначаем права, а потом удаляем.

ex2241016

Теперь у нас и в ACL, и владелец – только SID. Get-NTFSOrphanedAccess – позволяет получить список прав, только с "осиротевшими" объектами.

or241016

Т.к. структуру файлов мы знаем, позволим Alexander читать только файл file1.txt

fa241016

Get-NTFSOrphanedAccess  — выведет пусто, в отличие от Get-NTFSAccess

alco241016

PS. Для тех у кого часто возникает задача работа с разрешениями NTFS, данный модуль будет отличным дополнением в арсенал утилит и скриптов. Советую, ознакомиться с модулями из заметки, возможно  однажды, они решат вашу задачу немного проще. Да и для общего развития будет неплохой информацией.

  1. NTFSSecurity
  2. UserRights
  3. PowerForensics

Реклама

Read Full Post »

Для моделей ZyXEL, которые не поддерживаю управление через протокол SSH , воспользуемся протоколом telnet( включен по умолчанию). Стандартная утилита telnet ,которая поставляется в комплекте (начиная с Windows Vista — включается через установку компонентов Windows *), сложно поддается автоматизации и многочисленные примеры ,связанны с отправкой команд, например с SendKeyshttp://www.maxtblog.com/2012/06/telnet-automation-with-powershell-made-simple/ .

*dism /online /Enable-Feature /FeatureName:TelnetClient

* — Install-WindowsFeature «Telnet-Client»

 

Для автоматизации воспользуемся библиотекой Telnet C# —  https://telnetcsharp.codeplex.com/ . Удобная и простая в управлении. Для работы с библиотекой, ее требуется скомпилировать или скопировать из папки ..\telnet\bin\Release\Telnet.dll.

Param(            
 $HostName     = "192.168.0.1",            
 $Port      = 23,            
 $TimeoutSeconds   = 10,            
 $VirtualScreenWidth  = 80,            
 $VirtualScreenHeight  = 40,            
 $UserName     = "admin",            
 $PassWord     = "admin",            
 $Command     = "show version"            
)            
            
Add-Type -Path "C:\Scripts\Telnet.dll"             
            
$tn = New-Object Telnet.Terminal (            
 $HostName,            
 $Port,             
 $TimeoutSeconds,             
 $VirtualScreenWidth,             
 $VirtualScreenHeight            
)            
            
if($tn.Connect())            
{            
 # Логин            
 $f = $tn.WaitForString("Login")            
 if (!$f) {            
        throw "No login possible"            
 }            
                
 $tn.SendResponse($UserName, $true) | Out-Null            
             
 # Пароль            
    $f = $tn.WaitForString("Password")            
    if (!$f) {            
        throw "No password prompt found"            
 }            
                
    $tn.SendResponse($PassWord, $true) | Out-Null            
                
 # Shell            
 $Command | Foreach-Object {            
  $f = $tn.WaitForString(">");            
  if (!$f) {            
   throw "No > prompt found"            
  }            
            
  # Команда            
  $tn.SendResponse($_, $true) | Out-Null            
  $tn.WaitForChangedScreen() | Out-Null            
    }            
            
    $tn.VirtualScreen.Hardcopy().TrimEnd()            
             
 # LogOut            
 $tn.SendLogout() | Out-Null            
             
 # Закрыть соединение            
 $tn.Close() | Out-Null            
}        
   
tn           

-Command «show ?»

stn

 

-Command «?»

htn

 

Файл: GetRealse.ps1

Read Full Post »