AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 833749
Accepted
the-wabbit
the-wabbit
Asked: 2017-02-21 08:42:55 +0800 CST2017-02-21 08:42:55 +0800 CST 2017-02-21 08:42:55 +0800 CST

"Permissão negada" criando uma nova raiz Dfs baseada em domínio como não administrador

  • 772

Fui incumbido de delegar uma série de tarefas quotidianas do nosso domínio a um grupo de técnicos que não tem Domain Adminsfiliação. Uma dessas tarefas é a criação de novas raízes Dfs baseadas em domínio (Server 2008 R2 Enterprise DCs). E é aqui que estou preso.

O c0de

Isso é basicamente apenas tentar criar uma raiz Dfs baseada em domínio, usando um controlador de domínio arbitrário (primeiro na lista) como o primeiro servidor de namespace:

$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

O código acima está lançando uma exceção mencionando a falta de acesso a um recurso CIM. O caminho ROOT\Microsoft\Windows\DFSN\MSFT_DFSNamespacefornecido em CategoryInfo se parece com um caminho WMI:

New-DfsnRoot : Access to a CIM resource was not available to the client.
At line:1 char:1
+ New-DfsnRoot -Path "\\domain.contoso.com\$DfsnRootName" -TargetPath "\\$($DCList ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (MSFT_DFSNamespace:ROOT\Microsoft\...FT_DFSNamespace) [New-DfsnRoot], CimException
    + FullyQualifiedErrorId : MI RESULT 2,New-DfsnRoot


PS Z:\> $Error[0].CategoryInfo


Category   : PermissionDenied
Activity   : New-DfsnRoot
Reason     : CimException
TargetName : MSFT_DFSNamespace
TargetType : ROOT\Microsoft\Windows\DFSN\MSFT_DFSNamespace

As tentativas inúteis de resolução:

Eu tenho "permissões de gerenciamento delegado" por meio do console Dfs para todo o domínio: captura de tela de permissões de gerenciamento de delegado

que é efetivamente apenas adicionar uma ACE de "controle total" para o principal adicionado ao CN=Dfs-Configuration,CN=Systemcontêiner do AD.

E como eu estava recebendo um erro indicando permissões ausentes no Service Control Manager usando o assistente "Add Dfs root"dfsmgmt.msc em , usei sc sdset scmanagerpara manipular a string SDDL adicionando o respectivo grupo com permissões "KA" (key access), análogo ao BUILTIN\AdministratorsACE que existe por padrão.

Dessa forma, posso usar o assistente "Adicionar raiz Dfs" para percorrer todas as etapas, mas a criação da raiz em si ainda está falhando - "O servidor de namespace \ADSRV0\Test não pode ser adicionado. Acesso negado"

W00t?

powershell active-directory delegation
  • 3 3 respostas
  • 5396 Views

3 respostas

  • Voted
  1. Best Answer
    Matthew Wetmore
    2017-03-15T11:00:06+08:002017-03-15T11:00:06+08:00

    Os endpoints Just Enough Administration (JEA) são adequados para sua tarefa. Projetar um terminal JEA requer três decisões principais:

    1. Quem pode chamar o terminal JEA?
    2. O que o chamador pode fazer?
    3. Como a chamada será executada?

    O endpoint do PowerShell no PS 5.1 não é tecnicamente um endpoint JEA, mas o mecanismo é essencialmente o mesmo.

    Get-PSSessionConfiguration
    Nome: microsoft.powershell PSVersion: 5.1 StartupScript
    : Permissão: NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

    A partir disso, os grupos de permissão definem quem tem permissão para ligar. Não há limitação no ponto de extremidade do PowerShell do que pode ser feito, então você tem recursos completos de linguagem. E, por último, com RunAsUser em branco - o código é executado representado pelo usuário ou pelas credenciais fornecidas.

    Com essa base, consulte a ajuda para Register-PSSessionConfiguration, e uma visão geral do JEA .

    Para obter pontos de bônus, considere o uso de contas de serviço gerenciado de grupo (GMSA) como parte de sua solução, especialmente como o chamador.

    No seu caso: você pode restringir o terminal para ser chamado por seus usuários com privilégios limitados.

    Em seguida, defina cmdlets específicos que você deseja que eles usem. Eles podem ser incorporados ou expostos a partir de módulos personalizados que você especificar. Mantenha-os específicos para sua tarefa, para evitar ataques de elevação de privilégio com argumentos complicados ou muitos comandos de baixo nível expostos que podem tirar vantagem de serem executados como um usuário elevado.

    Você pode usar um RunAsUseradministrador de domínio ou outra conta com privilégios suficientes.

    • 2
  2. Peter Zhabin
    2017-03-08T13:58:34+08:002017-03-08T13:58:34+08:00

    Para criar um namespace DFS em todo o domínio, uma conta que o faça deve ter um privilégio de administrador local em um servidor de namespace, ADSRV0no seu caso. Sua última mensagem de erro me sugere que não é assim no seu caso.

    • 1
  3. the-wabbit
    2019-01-12T05:57:41+08:002019-01-12T05:57:41+08:00

    Apenas para adicionar alguns detalhes de implementação à ideia inicial de Matthew Wetmore aqui, criamos uma função configurando o namespace Dfs de acordo com nossos requisitos, expondo-o em um módulo Powershell LT-DFSManagemente criando uma configuração de sessão Powershell em execução em uma "conta virtual" (que está obtendo privilégios de administrador local) em um controlador de domínio restrito a chamar essa mesma função e acessível aos membros de um grupo de segurança de técnicos.

    Estamos usando dfsutilo código como foi escrito para rodar em uma máquina Server 2008 R2, onde os Dfsn -cmdlets não estão disponíveis. Esteja ciente de que o código está usando algumas variáveis ​​globais que não serão definidas em seu ambiente por padrão, mas são vitais para a execução correta do código.

    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()
    }
    

    O arquivo PSSessionConfiguration define o grupo de segurança para o qual esta configuração de sessão estará disponível:

    @{
        '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' }
    

    e o AD-JEA-DFSarquivo de capacidade de função restringe o terminal apenas à função 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'
    }
    

    Um registro final da configuração coloca as coisas no lugar:

    Register-PSSessionConfiguration -Name "DFS" -Path "C:\ProgramData\JEAConfiguration\DFS.pssc"
    
    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve