Consenti solo RemoteApp, non Desktop remoto


11

Ho trovato la seguente domanda, con una premessa simile, tuttavia la risposta alla domanda, è stata riformulata come una dichiarazione!

RemoteApp Impedisci all'utente di eseguire Desktop remoto

Come posso consentire RemoteApp ma non posso consentire Remote Desktop? Al fine di consentire l'app remota, apparentemente devo aggiungere gli utenti al gruppo "Utenti desktop remoto". Ciò consente Desktop remoto.

Ho provato a utilizzare il gruppo "TS Web Access Computers", tuttavia ciò non dà loro l'autorizzazione per eseguire RemoteApp.

Dove si trova la configurazione per disabilitare Desktop remoto, lasciando intatte le funzionalità di RemoteApp?


RemoteApp è ancora TS / RDS; devi comunque proteggere il server allo stesso modo.
Chris S,

D'accordo, sebbene la premessa del nostro servizio, è che sono autorizzati a utilizzare solo l'applicazione. Non viene concesso un accesso completo al desktop per ridurre le spese generali sul sistema. Se ci aggirano come menziona Evan, allora possiamo occuparci di questo caso per caso. Questo è un problema di risorse, non un problema di sicurezza difficile.
Brett Allen,

Risposte:


12

Non esiste un modo "ufficialmente sanzionato" per farlo perché, fondamentalmente, la funzionalità TS RemoteApp sta semplicemente sfruttando il codice Desktop remoto esistente. Potresti fare qualcosa di stupido come usare Criteri di gruppo per impostare la shell dell'utente su "logoff.exe" in modo tale che se tentassero di accedere al desktop della macchina verrebbero immediatamente disconnessi. Qualsiasi applicazione che utilizza una finestra di dialogo "File / Apri" comune, tuttavia, può essere utilizzata per ottenere un prompt dei comandi o altri programmi aperti sul desktop del server.

Stai meglio assicurandoti di seguire il principio del privilegio minimo e di dare ai tuoi utenti TS RemoteApp i diritti di cui hanno bisogno per eseguire il software previsto. Se finiscono sul desktop del computer server, i loro diritti limitati dovrebbero impedire loro di fare qualsiasi danno al computer server.


Buono a sapersi, il software è nostro e stiamo fornendo ai clienti un modo per eseguirlo senza avere il proprio server. Tuttavia, stiamo tentando di limitarli al semplice utilizzo dell'applicazione. Tenterà quell'idea e vedrà come va.
Brett Allen,

Dove si trova la politica per questo? Posso farlo nella politica di sicurezza locale per il server che ospita queste applicazioni? Se devo farlo a livello di dominio, devo coinvolgere il proprietario dell'azienda e guidarlo attraverso di esso.
Brett Allen,

2
@Aequitarum Custos, credo che stesse parlandoUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache il

1
Non dimenticare di impostare criteri di restrizione software che consentano loro di eseguire solo ciò che ti aspetti che vengano eseguiti. (+1 per impostare la shell su logoff.exe: ho fatto lo stesso e lo consiglio)
Skyhawk

@Aequitarum No, non è necessario farlo a livello di dominio. Se vuoi modificare i Criteri di gruppo localmente per un solo computer, esegui semplicemente gpedit.msc.
Skyhawk,

2

È meglio utilizzare "Criterio controllo applicazioni" nelle impostazioni di sicurezza solo per consentire solo le applicazioni o gli script necessari se si utilizza Windows 7 o Windows 2008 R2


1

Questo è ciò che ho fatto per bloccare il desktop in modo che sia accessibile solo agli amministratori del server e ad un gruppo AD nominato. Gli utenti che non sono membri di un determinato gruppo AD riceveranno un messaggio che dice loro di usare RDWeb e non il desktop / mstsc standard.

  1. Crea un vbscript e mettilo in una cartella sul server che tutti gli utenti possono leggere + eseguire
  2. Aggiungi la seguente riga a %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

Il codice vbscript (aggiungi le tue informazioni personali nelle <> voci seguenti)

'Script created by Tord Bergset, Jan 2014
'This script is called from the file called C:\Windows\System32\USRLOGON.CMD
'The script check if a user logging on to the server desktop is a allowed to do this.
'The string called StrGroupName controls the access group to check for. 
'AD group used for this script = "G WTS Grant Desktop Access"
'---------------------------------------------------------------------------------------

Const strComputer = "."
Const EWX_LOGOFF = 0 

Dim objShell, objWMIService, colProcessList, objNetwork, StrGroupName, strUsername, strUserIsMember, strUserFullName

Set objShell = WScript.CreateObject ("WScript.Shell")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'userinit.exe'")
Set objNetwork = CreateObject("Wscript.Network")
strUsername = EnvString("username")

' Mention any AD Group Name Here. Also works for Domain Admins, Enterprise Admins etc.
' -------------------------------------------------------------------------------------
StrGroupName = "G WTS Grant Desktop Access"
' -------------------------------------------------------------------------------------

If IsAdmin = 0 Then wscript.Quit

CheckADGroupMembership()

If strUserIsMember = "YES" Then
    ' Do something here if user is a member of the group
    'MsgBox "Is member"
    Wscript.Quit
Else
    ' Do something here if user is NOT a member of the group
    'MsgBox "Is not member" 
    For Each objProcess in colProcessList
        MsgBox "You (" & strUsername & " ) are not allowed to log in to the server desktop." & VBLF & "Please connect through the Remote Desktop Web Page (RDWeb):" & VBLF & VBLF & "<rdweb server address>", vbExclamation + vbSystemModal, strUsername & " - Access Denied !"
        objShell.run "logoff"
        WScript.Quit
    Next    
End If

Wscript.Quit 


' *****************************************************
'This function checks to see if the logged on user has local admin rights
Function IsAdmin()
    With CreateObject("Wscript.Shell")
        IsAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function

' *****************************************************
'This function checks to see if the passed group name contains the current user as a member. Returns True or False
Function IsMember(groupName)
    If IsEmpty(groupListD) then
        Set groupListD = CreateObject("Scripting.Dictionary")
        groupListD.CompareMode = TextCompare
        ADSPath = EnvString("userdomain") & "/" & EnvString("username")
        Set userPath = GetObject("WinNT://" & ADSPath & ",user")
        For Each listGroup in userPath.Groups
            groupListD.Add listGroup.Name, "-"
        Next
    End if
    IsMember = CBool(groupListD.Exists(groupName))
End Function

' *****************************************************
'This function returns a particular environment variable's value.
' for example, if you use EnvString("username"), it would return the value of %username%.
Function EnvString(variable)
    variable = "%" & variable & "%"
    EnvString = objShell.ExpandEnvironmentStrings(variable)
End Function


' *****************************************************
Sub CheckADGroupMembership()
    ' =============================================================
    ' List All Members of a Group; Including Nested Members
    ' =============================================================
    Dim ObjRootDSE, ObjConn, ObjRS, ObjCustom
    Dim StrDomainName, StrGroupName, StrSQL
    Dim StrGroupDN, StrEmptySpace

    strUserIsMember = ""

    Set ObjRootDSE = GetObject("LDAP://RootDSE")
    StrDomainName = Trim(ObjRootDSE.Get("DefaultNamingContext"))
    Set ObjRootDSE = Nothing

    StrSQL = "Select ADsPath From 'LDAP://" & StrDomainName & "' Where ObjectCategory = 'Group' AND Name = '" & StrGroupName & "'"

    Set ObjConn = CreateObject("ADODB.Connection")
    ObjConn.Provider = "ADsDSOObject":  ObjConn.Open "Active Directory Provider"
    Set ObjRS = CreateObject("ADODB.Recordset")
    ObjRS.Open StrSQL, ObjConn
    If ObjRS.EOF Then
        'WScript.Echo VbCrLf & "This Group: " & StrGroupName & " does not exist in Active Directory"
    End If
    If Not ObjRS.EOF Then   
        WScript.Echo vbNullString
        ObjRS.MoveLast: ObjRS.MoveFirst
        'WScript.Echo "Total No of Groups Found: " & ObjRS.RecordCount
        'WScript.Echo "List of Members In " & StrGroupName & " are: " & VbCrLf
        While Not ObjRS.EOF     
            StrGroupDN = Trim(ObjRS.Fields("ADsPath").Value)
            Set ObjCustom = CreateObject("Scripting.Dictionary")
            StrEmptySpace = " "
            GetAllNestedMembers StrGroupDN, StrEmptySpace, ObjCustom
            Set ObjCustom = Nothing
            ObjRS.MoveNext
        Wend
    End If
    ObjRS.Close:    Set ObjRS = Nothing
    ObjConn.Close:  Set ObjConn = Nothing
End Sub

Private Function GetAllNestedMembers (StrGroupADsPath, StrEmptySpace, ObjCustom)
    Dim ObjGroup, ObjMember
    Set ObjGroup = GetObject(StrGroupADsPath)
    For Each ObjMember In ObjGroup.Members      
        'WScript.Echo Trim(ObjMember.CN) & " --- " & Trim(ObjMember.DisplayName) & " (" & Trim(ObjMember.Class) & ")" & " (" & Trim(ObjMember.sAMAccountName) & ")"
        strThisUser = Trim(ObjMember.sAMAccountName)

        If lCase(strUsername) = lCase(strThisUser) Then 
            strUserIsMember = "YES"
            strUserFullName = Trim(ObjMember.DisplayName)
            Exit Function
        End If

        If Strcomp(Trim(ObjMember.Class), "Group", vbTextCompare) = 0 Then
            If ObjCustom.Exists(ObjMember.ADsPath) Then 
                'WScript.Echo StrEmptySpace & " -- Already Checked Group-Member " & "(Stopping Here To Escape Loop)"
            Else
                ObjCustom.Add ObjMember.ADsPath, 1  
                GetFromHere ObjMember.ADsPath, StrEmptySpace & " ", ObjCustom
            End If
        End If
    Next
End Function

Private Sub GetFromHere(StrGroupADsPath, StrEmptySpace, ObjCustom)
    Dim ObjThisGroup, ObjThisMember
    Set ObjThisGroup = GetObject(StrGroupADsPath)
    'WScript.Echo vbNullString
    'WScript.Echo "  ** Members of this Group are:"
    For Each ObjThisMember In ObjThisGroup.Members      
        'WScript.Echo "    >> " & Trim(ObjThisMember.CN) & " --- " & Trim(ObjThisMember.DisplayName) & " (" & Trim(ObjThisMember.Class) & ")" & " (" & Trim(ObjThisMember.sAMAccountName) & ")"
        strThisUser = Trim(ObjThisMember.sAMAccountName)

        If lCase(strUsername) = lCase(strThisUser) Then 
            strUserIsMember = "YES"
            strUserFullName = Trim(ObjThisMember.DisplayName)
            Exit Sub
        End If

    Next
    'WScript.Echo vbNullString
End Sub


0

È possibile sfruttare il fatto che le sessioni utente complete avviano il userinit.exeprocesso mentre le sessioni RemoteApp avviano il rdpshell.exeprocesso. AppLocker può essere utilizzato per vietare userinit.exel'esecuzione da parte di utenti standard.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.