«В разрешении отказано» создание нового корневого домена Dfs в качестве неадминистратора

Мне было поручено делегировать ряд повседневных задач в нашем домене группе технических специалистов, не входящих в Администраторы домена . Одна из этих задач - создание новых доменных корней Dfs (контроллеры домена Server 2008 R2 Enterprise). И здесь я застрял.

Teh c0de

По сути, это просто попытка создать доменный корень Dfs, используя произвольный (первый в списке) контроллер домена в качестве первого сервера пространства имен:

$DfsnRootName="test"
$DCList = Get-ADDomainController -Filter * | ForEach-Object { ,$_.HostName } 
New-DfsnRoot -Path "\\domain.contoso.com\$DfsnRootName" -TargetPath "\\$($DCList[0])\$dfsnRootName" `
             -Description "Dfs-Root für $DfsnRootName" -EnableAccessBasedEnumeration $true -Type DomainV2
$DCList | ForEach-Object {
    New-DfsnRootTarget -Path "\\domain.contoso.com\$DfsnRootName" `
                       -TargetPath "\\$_\$dfsnRootName" -State Online
}

Teh err0r

Приведенный выше код генерирует исключение, в котором упоминается отсутствие доступа к ресурсу CIM.

W00t?

2
задан 21 February 2017 в 10:56
3 ответа

Достаточно простого администрирования (JEA) конечных точек хорошо подходит для вашей задачи. Проектирование конечной точки JEA требует трех основных решений:

  1. Кто может вызывать конечную точку JEA?
  2. Что может делать вызывающий абонент?
  3. Кто будет вызывать абонента?

Оконечная точка PowerShell в PS 5.1 технически не является конечной точкой JEA, но механизм, по сути, тот же самый.

Get-PSSessionConfiguration
Имя: microsoft.powerhell PSVersion : 5.1
. StartupScript:
RunAsUser :
Разрешение : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

С этого момента группы разрешений определяют, кому разрешено звонить. Нет никаких ограничений на конечную точку PowerShell, поэтому у вас есть все языковые возможности. И, наконец, с пустым RunAsUser - код запускается, выдавая себя за пользователя или предоставленные учетные данные.

На этой основе обратитесь за помощью к Register-PSSessionConfiguration, и к обзору JEA.

Для получения бонусных баллов рассмотрите возможность использования Групповых счетов управляемых служб (GMSA) как части вашего решения, в частности, в качестве вызывающего абонента.

В вашем случае:. Можно ограничить конечную точку вызова пользователями с ограниченными привилегиями.

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

Вы можете использовать RunAsUser администратора домена, или другую учетную запись с достаточными привилегиями.

.
2
ответ дан 3 December 2019 в 10:35

Для создания пространства имен DFS в пределах всего домена учетная запись, делающая это, должна иметь привилегию локального администратора на сервере пространства имен, то есть ADSRV0 в вашем случае. Ваше последнее сообщение об ошибке подсказывает мне, что в вашем случае это не так...

.
1
ответ дан 3 December 2019 в 10:35

Чтобы добавить некоторые детали реализации к искрящейся идее Мэтью Ветмора, мы создали функцию, настраивающую пространство имен Dfs в соответствии с нашими требованиями, представив ее в модуле Powershell LT- DFSManagement и создал конфигурацию сеанса Powershell, работающую в «виртуальной учетной записи» (которая получает права локального администратора) на контроллере домена, ограниченном вызовом этой самой функции и доступным для членов группы безопасности технических специалистов.

Мы используем dfsutil в коде, так как он был написан для работы на машине Server 2008 R2, где командлеты Dfsn недоступны. Имейте в виду, что в коде используются некоторые глобальные переменные, которые не будут определены в вашей среде по умолчанию, но жизненно важны для правильного выполнения кода.

Function Add-DfsNamespace() {
<#
.SYNOPSIS
Creates a new Dfs namespace
#>
    Param(
        # Name of the namespace to create
        [string]$Name,
        # name of the security group to delegate management permissions to
        [string]$DelegationTo = "ACL-$Name-Dfs-management",
        # list of the servers to set up as namespace servers
        $NamespaceServerList = $global:DomainControllersList
    )

    $ErrorActionPreference = "Stop"

    Try { 
        $DelegationIdentity = (Get-ADGroup $DelegationTo -Server $global:THKDomainControllerToUse).SID
    } Catch {
        Throw "Unable to set up delegation permissions for $DelegationTo: $_"
    }
    $NamespaceServerList | ForEach-Object {
        Try {
            $NamespaceServer = $_
            Write-Debug "Create a directory for the namespace: \\$NamespaceServer\c$\DfsRoots\$Name"
            New-Item -Type Directory "\\$NamespaceServer\c$\DfsRoots\$Name" | Out-Null
        } Catch {
            Write-Warning "Creation of \\$NamespaceServer\c$\DfsRoots\$Name failed: $_"
        }

        # Create a new share through WMI
        $share = [wmiclass]"\\$_\root\CimV2:Win32_Share" 
        Write-Debug 'WMI call to create the share `"$Name`" on $_' 
        $result=$share.Create( "c:\DfsRoots\$Name", $Name, 0) 
        Switch ($result.returnValue) {
           0 { Write-Debug "\\$_\$Name share created successfully" }
           22 { Write-Warning "Share \\$_\$Name already present" }
           default { Throw "Share creation failed, return value of Win32_Share.Create: $result.returnValue" }
        }
    }
    Write-Verbose "Creating Domain Dfs namespace $Name on namespace servers $($NamespaceServerList -join "; ")"
    dfsutil root addDom "\\$($NamespaceServerList[0])\$Name"
    $NamespaceServerList | ForEach-Object {
        If($_ -ne $NamespaceServerList[0]) {
            dfsutil target add "\\$_\$Name"
        }
    }
    Write-Debug "Enabling Access-Based Enumeration"
    dfsutil property abde enable "\\$global:sADDomainFQDN\$Name"
    Write-Debug "Granting delegation rights for Namespace $Name to $DelegatedTo"
    $adsiDfsNamespace = $null
    $adsiDfsNamespace = [adsi]"LDAP://$global:THKDomainControllerToUse/CN=$Name,CN=Dfs-Configuration,CN=System,$sADDomainDN" 
    # Query ADSI for the ACL of the namespace AD object until we get a response
    $retries = 0
    Do {
        $namespaceACL = $adsiDfsNamespace.PSBase.ObjectSecurity
        If ($namespaceACL) {
            # here we've got the ACL, loop will end hereafter
        } Else {
            Write-Debug "Waiting another round ($retries/$ADSImaxRetries) as ADSI has not yet provided a security descriptor for $($adsiDfsNamespace)"
            Start-Sleep 1
        }
        $retries+=1
    } Until (($retries -gt $ADSImaxRetries) -or ($null -ne $namespaceACL))

    Write-Debug "Creating a new ACE for $DelegationTo ($DelegationIdentity)"
    # Construct a new Full Control ACE for $DelegationIdentity 
    $newAce =
        New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
            $DelegationIdentity,
            [System.DirectoryServices.ActiveDirectoryRights]::GenericAll,
            [System.Security.AccessControl.AccessControlType]::Allow,
            [System.DirectoryServices.ActiveDirectorySecurityInheritance]::All
        )

    Write-Verbose "Updating the ACL of the Namespace $Name"
    $namespaceAcl.AddAccessRule($newAce)
    $adsiDfsNamespace.PSBase.CommitChanges()
}

Файл PSSessionConfiguration определяет группу безопасности, для которой эта конфигурация сеанса будет доступна:

@{
    'Author' = 'the-wabbit';
    'RunAsVirtualAccount' =  $true;
'GUID' = 'cfe0ea5f-9d19-406d-90aa-d26df4bc840f';
    'TranscriptDirectory' = 'C:\ProgramData\JEAConfiguration\Transcripts';
    'SchemaVersion' = '2.0.0.0';
    'RoleDefinitions' = @{
                            'DOMAIN\ACL-DFS-Technicians-AD-JEA-Remoting' = @{
                                                                                'RoleCapabilities' = 'AD-JEA-DFS' }
                        };
    'SessionType' = 'RestrictedRemoteServer' }

и файл возможностей роли AD-JEA-DFS ограничивает конечную точку только функцией Add-DfsNamespace:

@{
GUID = 'b17b282d-a656-41c8-a7d4-cc6a1fbc17e4'
Author = 'the-wabbit'
CompanyName = 'Looney Tunes'
Copyright = '(c) 2017 the-wabbit. All rights reserved.'
ModulesToImport = 'LT-DFSManagement'
VisibleFunctions='Add-DfsNamespace'
}

Окончательная регистрация конфигурации приводит все в порядок:

Register-PSSessionConfiguration -Name "DFS" -Path "C:\ProgramData\JEAConfiguration\DFS.pssc"
0
ответ дан 3 December 2019 в 10:35

Теги

Похожие вопросы