Permitir solo RemoteApp, no Remote Desktop

11

Encontré la siguiente pregunta, con una premisa similar, sin embargo, la respuesta a la pregunta fue ¡la pregunta reformulada como una declaración!

RemoteApp impide que el usuario ejecute Escritorio remoto

¿Cómo permito RemoteApp pero no permitir Remote Desktop? Para permitir la aplicación remota, aparentemente tengo que agregar los usuarios al grupo "Usuarios de escritorio remoto". Esto permite el escritorio remoto.

Intenté usar el grupo "Computadoras de acceso web TS", sin embargo, esto no les da la autoridad para ejecutar RemoteApp.

¿Dónde está la configuración para deshabilitar el Escritorio remoto, dejando intactas las capacidades de RemoteApp?

Brett Allen
fuente
RemoteApp sigue siendo TS / RDS; todavía tiene que asegurar el servidor de la misma manera.
Chris S
De acuerdo, aunque la premisa de nuestro servicio, es que solo se les permite usar la Aplicación. No se les proporciona un inicio de sesión completo en el escritorio para reducir la sobrecarga en el sistema. Si lo solucionan como lo menciona Evan, entonces podemos tratar ese caso por caso. Este es un problema de recursos, no un problema de seguridad difícil.
Brett Allen

Respuestas:

12

No existe una forma "oficialmente autorizada" de hacerlo porque, fundamentalmente, la funcionalidad TS RemoteApp solo está aprovechando el código de Escritorio remoto existente. Podría hacer algo tonto como usar la Política de grupo para configurar el shell del usuario para que sea "logoff.exe", de modo que si intentaran acceder al escritorio de la máquina, se cerrará inmediatamente la sesión. Sin embargo, cualquier aplicación que use un cuadro de diálogo común "Archivo / Abrir" se puede usar para abrir un símbolo del sistema u otros programas en el escritorio del servidor.

Es mejor asegurarse de seguir el principio de privilegio mínimo y otorgar a sus usuarios de TS RemoteApp los pocos derechos que necesiten para ejecutar el software deseado. Si terminan en el escritorio de la computadora servidor, sus derechos restringidos deberían evitar que hagan algo dañino para la computadora servidor.

Evan Anderson
fuente
Es bueno saber que el software es nuestro y brindamos a los clientes una forma de ejecutarlo sin tener su propio servidor. Sin embargo, estamos intentando restringirlos a simplemente usar la aplicación. Intentaré esa idea y veré cómo va.
Brett Allen
¿Dónde se encuentra la política para esto? ¿Puedo hacer esto en la Política de seguridad local para el servidor que aloja estas aplicaciones? Si necesito hacer esto a nivel de dominio, necesito traer al dueño de la compañía y guiarlo a través de él.
Brett Allen
2
@Aequitarum Custos, creo que estaba hablandoUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache
1
No olvide establecer políticas de restricción de software que les permitan ejecutar solo lo que espera que se ejecuten. (+1 para configurar el shell en logoff.exe: he hecho lo mismo y lo recomiendo)
Skyhawk
@Aequitarum No, no necesita hacerlo a nivel de dominio. Si desea editar las Políticas de grupo localmente para una sola máquina, simplemente ejecute gpedit.msc.
Skyhawk
2

Es mejor usar la "Política de control de aplicaciones" en la configuración de seguridad solo para permitir solo las aplicaciones o scripts necesarios si usa Windows 7 o Windows 2008 R2

Dmitry Bespalov
fuente
1

Esto es lo que he hecho para bloquear el escritorio para que solo sea accesible para los administradores del servidor y un grupo AD con nombre. Los usuarios que no son miembros del grupo de AD dado recibirán un mensaje que les indica que usen RDWeb y no el escritorio / mstsc estándar.

  1. Cree un vbscript y póngalo en una carpeta en el servidor que todos los usuarios puedan leer + ejecutar
  2. Agregue la siguiente línea a %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

El código vbscript (agregue su información personal en las siguientes <> entradas)

'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
Tord Bergset
fuente
0

Puede aprovechar el hecho de que las sesiones de usuario completas inician el userinit.exeproceso mientras que las sesiones de RemoteApp inician el rdpshell.exeproceso. AppLocker se puede usar para prohibir userinit.exeque los usuarios estándar lo ejecuten.

Michael Steele
fuente