> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/it/sicurezza/security.md).

# Informazioni

Configuri l'autenticazione e l'autorizzazione basata sui ruoli in PowerShell Universal, con la mappatura delle attestazioni, gli script dei criteri e i token applicativi.

## Autenticazione

Per impostazione predefinita, PowerShell Universal fornisce l'[autenticazione utente locale](/powershell-universal/it/sicurezza/local-accounts.md). I nomi utente e le password crittografate sono archiviati nel database di PowerShell Universal. Per gli ambienti aziendali, può valutare l'utilizzo dei metodi di autenticazione supportati dalla sua organizzazione.

* [Windows SSO](/powershell-universal/it/sicurezza/enterprise-security/windows-sso.md)
* [OpenID Connect](/powershell-universal/it/sicurezza/enterprise-security/openid-connect.md)
* [SAML2](/powershell-universal/it/sicurezza/enterprise-security/saml2.md)
* [WS-Federation](/powershell-universal/it/sicurezza/enterprise-security/ws-federation.md)

## Autorizzazione

L'autorizzazione degli utenti avviene tramite i ruoli. I ruoli possono essere assegnati tramite la mappatura delle attestazioni, uno script di criteri oppure assegnando il ruolo direttamente all'identità.

{% hint style="info" %}
Per impostazione predefinita, gli utenti non ricevono alcun ruolo. In PowerShell Universal sono valide più assegnazioni di ruolo.
{% endhint %}

### Mappatura dei ruoli alle attestazioni

Può mappare i ruoli a un'attestazione (come l'appartenenza a un gruppo) utilizzando i parametri `-ClaimType` e `-ClaimValue` di `New-PSURole`. Le impostazioni sono disponibili anche nella finestra di dialogo delle proprietà del ruolo in Secure > Roles.

Ad esempio, con l'autenticazione Windows, se volesse mappare un gruppo a un ruolo, potrebbe configurarla in modo che il SID del gruppo venga mappato al ruolo di amministratore.

{% code collapsedlinecount="10" %}

```powershell
New-PSURole -Name Administrator -ClaimType 'http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid' -ClaimValue 'S-123-123-123'
```

{% endcode %}

Mappare i ruoli alle attestazioni in questo modo è più veloce rispetto agli script dei criteri, perché non richiede l'esecuzione di PowerShell quando l'utente effettua l'accesso.

### Visualizzare le informazioni sulle attestazioni

Per agevolare lo sviluppo degli script dei criteri o l'assegnazione dei ruoli alle attestazioni, può visualizzare le informazioni sulle attestazioni facendo clic su View Claim Information in Secure > Roles.

### Esempio: Azure Active Directory

Può mappare un gruppo di Azure Active Directory a un ruolo cercando l'Object ID del gruppo in Azure. Ad esempio, all'interno del dominio Ironman Software, abbiamo un gruppo chiamato Dashboard Administrators. Questo gruppo ha un object ID pari a `61849bf2-e44b-4057-b589-6cd1812d7545`.

All'interno di PowerShell Universal, posso assegnare gli utenti di questo gruppo al gruppo Administrator configurando la mappatura delle attestazioni. Il Claim Type sarà `groups` e il Claim Value sarà `61849bf2-e44b-4057-b589-6cd1812d7545`. Una volta mappata l'attestazione, gli utenti del gruppo Dashboard Administrators faranno parte del gruppo Administrators di PowerShell Universal. Il file `roles.ps1` risultante avrà questo aspetto.

Tutti gli altri ruoli sono disabilitati.

{% code collapsedlinecount="10" %}

```powershell
New-PSURole -Name Administrator -ClaimType 'groups' -ClaimValue '61849bf2-e44b-4057-b589-6cd1812d7545'
New-PSURole -Name "Operator" -Description "Operators have access to manage and execute scripts, create other entities within PowerShell Universal but cannot manage PowerShell Universal itself." -Policy {} -Disabled
New-PSURole -Name "Reader" -Description "Readers have read-only access to PowerShell Universal. They cannot make changes to any entity within the system." -Policy { } -Disabled 
New-PSURole -Name "Execute" -Description "Execute scripts within PowerShell Universal." -Policy { } -Disabled
New-PSURole -Name "User" -Description "Does not have access to the admin console but can be assigned resources like APIs, scripts, dashboards and pages." -Policy { } -Disabled
```

{% endcode %}

### Assegnazione tramite criteri

Per impostazione predefinita, i ruoli vengono assegnati dai criteri. I criteri vengono eseguiti quando l'utente effettua l'accesso. Può modificare gli script dei criteri visitando la pagina Secure > Roles. Faccia clic sul pulsante Edit Code per configurare lo script del criterio.

Gli script dei criteri ricevono un oggetto `ClaimsPrincipal` come parametro e devono restituire true o false. I criteri che generano errori vengono considerati false. L'oggetto `ClaimsPrincipal` contiene l'identità dell'utente e le attestazioni che l'utente ha ricevuto. Queste possono includere le assegnazioni ai gruppi o altre caratteristiche dell'account di un utente.

Può aspettarsi un oggetto con questa struttura.

{% code collapsedlinecount="10" %}

```csharp
public class ClaimsPrincipal
{
    public List<Claim> Claims { get; set; } = new List<Claim>();
    public Identity Identity { get; set; } = new Identity();
}

public class Identity 
{
    public string Name { get ;set; }
}

public class Claim 
{
    public string Type { get; set; }  
    public string Value { get; set; }
    public string ValueType { get; set; } 
    public string Issuer { get; set; }
    public Dictionary<string, string> Properties { get; set; } = new Dictionary<string, string>();
}
```

{% endcode %}

### Assegnazione dei ruoli

Per assegnare un ruolo a un utente, può creare la sua identità all'interno di Universal e poi selezionare il ruolo dal menu a discesa nella pagina Identities.

Per impostazione predefinita, le identità ricevono un ruolo tramite la mappatura delle attestazioni o tramite un criterio.

### Ruoli predefiniti

#### Administrator

Accesso completo all'intera piattaforma PowerShell Universal e alle impostazioni.

#### Operator

Gli operatori possono aggiungere e rimuovere risorse come API, script e dashboard. Gli operatori non possono modificare impostazioni come gli ambienti, i ruoli o le impostazioni generali.

#### Execute

Il ruolo Execute concede la possibilità di eseguire script e l'accesso in lettura a tutto il resto.

#### Reader

Il ruolo Reader fornisce l'accesso in sola lettura a PowerShell Universal.

### Percorso predefinito per ruolo

Può modificare la pagina che l'utente vede al momento dell'accesso impostando la proprietà `Default Route` per il ruolo. Ad esempio, potrebbe voler indirizzare gli utenti delle Risorse umane alla dashboard Human Resources e gli utenti IT alla dashboard IT.

### Utenti con molti gruppi

Se i suoi utenti sono membri di più di circa 40 gruppi, potrebbe riscontrare problemi di accesso. Ciò è dovuto ai limiti di dimensione delle intestazioni HTTP in IIS e Kestrel. Più gruppi ha un utente, più attestazioni di autorizzazione possiede e più grande è l'intestazione.

Può aumentare il limite delle intestazioni per Kestrel utilizzando la configurazione dei limiti nel file `appsettings.json`. Dovrà aumentare la dimensione dell'intestazione. Si tratta di un valore in byte il cui valore predefinito è 32 kb.

{% code collapsedlinecount="10" %}

```
{
  "Kestrel": {
    "Endpoints": {
      "HTTP": {
        "Url": "http://*:5000"
      }
    },
    "Limits": {
      "MaxRequestHeadersTotalSize": 132768
    },
    "RedirectToHttps": "false"
  },
```

{% endcode %}

### Autorizzazione in IIS

L'autorizzazione in IIS funziona come con qualsiasi altro metodo, ma deve tenere presente il limite di dimensione dell'intestazione della richiesta. Potrebbe ricevere errori quando abilita attestazioni che includono molti gruppi. Possono superare il limite di dimensione dell'intestazione e IIS restituirà degli errori. Abbiamo riscontrato che circa 40 gruppi di Azure Active Directory causano questo problema in un'installazione IIS predefinita.

L'errore che riceverà sarà un errore 400 con l'indicazione che la richiesta è troppo lunga.

*Bad Request - Request Too Long* *HTTP Error 400. The size of the request headers is too long.*

Se ha HTTPS abilitato, riceverà un errore relativo a un errore del protocollo HTTP2.

Può aumentare la dimensione della richiesta di IIS impostando le seguenti chiavi di registro. Dovrà riavviare la macchina affinché abbiano effetto.

{% code collapsedlinecount="10" %}

```
HKLM:\System\CurrentControlSet\Services\Http\Parameters
    MaxFieldLength: DWORD

HKLM:\System\CurrentControlSet\Services\Http\Parameters
    MaxRequestBytes: DWORD
```

{% endcode %}

Maggiori informazioni sono disponibili nella [documentazione di Microsoft](https://docs.microsoft.com/en-us/troubleshoot/iis/http-bad-request-response-kerberos#workaround-2-set-maxfieldlength-and-maxrequestbytes-registry-entries).

In alternativa all'aumento della dimensione della richiesta, può anche ridurre il numero di gruppi inviati. In Azure Active Directory, può impostare solo i gruppi assegnati all'applicazione per evitare che vengano inviati tutti i gruppi.

In Azure vada su **App registrations** > (selezioni l'app) > **Token Configuration** e specifichi i gruppi assegnati all'applicazione.

Ora vada su **Enterprise Application** > (selezioni l'app) > **Users and groups**. Assegni il gruppo o i gruppi che desidera includere nelle attestazioni. (Nota: questo può essere utilizzato anche come limite di sicurezza se imposta “User Assignment Required” su Yes nella sezione 'Properties' dell'app)

## Token applicativi

I token applicativi possono essere assegnati a servizi che non possono effettuare l'accesso in modo interattivo. Gli amministratori possono creare token per le identità da Secure > Application Tokens. Per creare un token per il suo account, apra User Settings dal menu utente e selezioni Tokens.

Il token avrà una scadenza di un anno e disporrà dei ruoli validi per il suo account. Per copiare il token applicativo nel suo account, faccia clic sull'azione Copy. Per revocare un token applicativo, faccia clic sull'azione Revoke.

Può utilizzare i token applicativi con i cmdlet di Universal oppure tramite richieste web dirette utilizzando l'autorizzazione Bearer.

## Ambiente

Per impostazione predefinita, gli script di autenticazione tramite form e di assegnazione dei criteri vengono eseguiti all'interno del processo di PowerShell Universal. Facoltativamente, può configurare un [Environment ](/powershell-universal/it/config/environments.md)esterno per eseguire i suoi script di autenticazione e autorizzazione. Quando configura un ambiente di sicurezza, viene avviato un processo PowerShell esterno configurato per utilizzare le impostazioni del suo ambiente.

Per modificare l'ambiente utilizzato dal processo di sicurezza, imposti `-SecurityEnvironment` in `settings.ps1`.

{% code collapsedlinecount="10" %}

```powershell
Set-PSUSetting -SecurityEnvironment '5.1'
```

{% endcode %}

## Esempio: autenticazione tramite form con Active Directory

L'esempio seguente mostra come eseguire un semplice "LDAP BIND" per convalidare le credenziali Active Directory di un utente. Se un utente che tenta di accedere a PowerShell Universal non è il Default Admin User, dovrà autenticare correttamente le proprie credenziali con Active Directory tramite un semplice bind LDAP. Questo può essere combinato con un controllo di appartenenza a un gruppo AD nei criteri dei ruoli Admin, Operator e Reader per utilizzare efficacemente l'autenticazione Active Directory E l'appartenenza ai gruppi di Active Directory al fine di fornire un accesso basato sui ruoli a PowerShell Universal.

{% code collapsedlinecount="10" %}

```powershell
param(
    [PSCredential]$Credential
)

#
#   You can call whatever cmdlets you like to conduct authentication here.
#   Just make sure to return the $Result with the Success property set to $true
#

$Result = [Security.AuthenticationResult]::new()
if ($Credential.UserName -eq 'Admin') 
{
    #Maintain the out of box admin user
    $Result.UserName = 'Default Admin'
    $Result.Success = $true 
}
else
{
    # Get current domain using logged-on user's credentials - this validates their credential
    $CurrentDomain = "LDAP://DC=mydemodomain,DC=com"  # Insert Your Domain Here
    $domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,($Credential.UserName),$Credential.GetNetworkCredential().password)

    if ($domain.name -eq $null)
    {
        "Authentication failed for $($Credential.UserName)!" | Out-File "C:\test\adlogin.txt"
        write-host "Authentication failed - please verify your username and password."
        $Result.UserName = ($Credential.UserName)
        $Result.Success = $false 
    }
    else
    {
        write-host "Successfully authenticated with domain $($domain.name)"
        "Authentication success for $($Credential.UserName)!" | Out-File "C:\test\adlogin.txt"
        $Result.UserName = ($Credential.UserName)
        $Result.Success = $true 
    }
}

$Result
```

{% endcode %}

## Esempio: criterio basato sull'appartenenza a un gruppo di Active Directory (autenticazione Windows)

{% hint style="info" %}
Questo esempio richiede un metodo di autenticazione che fornisca le informazioni sui gruppi durante il processo di autenticazione. Metodi come l'autenticazione Windows e WS-Federation possono fornire queste informazioni. L'autenticazione tramite form non funziona con questo tipo di criterio.
{% endhint %}

Questo esempio sfrutta le attestazioni fornite durante l'autenticazione. Può verificare se l'utente dispone di un groupsid (appartenenza a un gruppo) utilizzando le mappature delle attestazioni. Mappi il tipo di attestazione groupid al valore a cui desidera assegnare il ruolo.

{% code collapsedlinecount="10" %}

```powershell
$Parameters = @{
    Name = "Administrators"
    ClaimType = 'http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid'
    ClaimValue = 'S-1-5-21-22222222-111111-3333333-153'
}

New-PSURole @Parameters
```

{% endcode %}

## Esempio: criterio basato sull'appartenenza a un gruppo di Active Directory

In questo esempio configureremo il nostro script del criterio Administrator per utilizzare LDAP al fine di recuperare l'appartenenza a un gruppo di Active Directory. Qui abbiamo creato un gruppo chiamato "PowerShell Universal Admins" i cui membri devono ottenere l'accesso Administrator in PowerShell Universal. Qui eseguiamo un semplice controllo del samaccountname dell'utente per verificare che sia membro del gruppo. Per ambienti più robusti sarebbe più appropriato un controllo su SID/DN/ObjectGUID.

{% code collapsedlinecount="10" %}

```powershell
param(
$User
)

$UserName = ($User.Identity.Name)
$UserName = $UserName.Substring($UserName.IndexOf('\')+1,($UserName.Length -($UserName.IndexOf('\')+1)))

$IsMember = $false;

# Perform LDAP Group Member Lookup
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = 'LDAP://CN=Users,DC=berg,DC=com' # INSERT ROOT LDAP HERE
$Searcher.Filter = "(&(objectCategory=person)(memberOf=CN=PowerShell Universal Admins,OU=Information Technology,DC=berg,DC=com))" #GROUP INSERT DN TO CHECK HERE
$Users = $Searcher.FindAll()
$Users | ForEach-Object{
    If($_.Properties.samaccountname -eq $UserName)
    {
        $IsMember = $true;
        "$UserName is a member of admin group!" | Out-File "C:\test\adgroup.txt"
    }
    else {
        "$UserName is NOT member of admin group!" | Out-File "C:\test\adgroup.txt"
    }
}

return $IsMember
```

{% endcode %}

## Esempio: appartenenza a un gruppo basata su Azure Active Directory

Questo esempio sfrutta [OpenID Connect e Azure Active Directory](/powershell-universal/it/sicurezza/enterprise-security/openid-connect.md#configuring-azure-entra-id-azure-active-directory).

Una volta configurati PowerShell Universal e Azure Active Directory, può configurare gli script dei ruoli per verificare se gli utenti sono membri dei gruppi presenti in Azure AD. Può sfruttare le mappature delle attestazioni per mappare l'ID del gruppo di Azure AD a un ruolo di PowerShell Universal.

Innanzitutto, si assicuri di avere abilitato le attestazioni di appartenenza ai gruppi nel manifest della registrazione dell'applicazione. Ciò includerà tutte le appartenenze ai gruppi, in modo che siano accessibili in PowerShell Universal.

{% code collapsedlinecount="10" %}

```
"groupMembershipClaims": "All",
```

{% endcode %}

Una volta effettuata la configurazione, può aggiornare lo script dei ruoli per verificare l'appartenenza a un gruppo. Prenda prima nota dell'object ID del gruppo che desidera verificare all'interno di Azure AD.

Successivamente, all'interno dello script `roles.ps1`, può verificare che un utente disponga di un determinato ruolo utilizzando la mappatura delle attestazioni.

{% code collapsedlinecount="10" %}

```powershell
New-PSURole -Name 'Administrators' -ClaimType 'groups' -ClaimValue '4acabc67-56cc-4590-9de6-164f3c4faf10'
```

{% endcode %}

Man mano che gli utenti effettuano l'accesso, la loro appartenenza ai gruppi verrà convalidata rispetto alle loro attestazioni e verrà assegnato un ruolo.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/it/sicurezza/security.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
