อนุญาตเฉพาะ RemoteApp ไม่ใช่ Remote Desktop


11

ฉันพบคำถามต่อไปนี้ด้วยหลักฐานที่คล้ายกันอย่างไรก็ตามคำตอบของคำถามคือคำถามที่ใช้ถ้อยแถลงใหม่เป็นคำแถลง!

RemoteApp ป้องกันผู้ใช้จากการเรียกใช้ Remote Desktop

ฉันจะอนุญาตให้ใช้ RemoteApp แต่ไม่อนุญาตให้ใช้ Remote Desktop ได้อย่างไร เพื่อให้สามารถใช้แอพระยะไกลได้ฉันต้องเพิ่มผู้ใช้ในกลุ่ม "ผู้ใช้เดสก์ท็อประยะไกล" สิ่งนี้อนุญาตให้ Remote Desktop

ฉันพยายามใช้กลุ่ม "คอมพิวเตอร์การเข้าถึงอินเทอร์เน็ต TS" แต่นี่ไม่ได้ให้สิทธิ์แก่พวกเขาในการเรียกใช้ RemoteApp

การกำหนดค่าเพื่อปิดใช้งานเดสก์ท็อประยะไกลอยู่ที่ไหนในขณะที่ยังคงความสามารถของ RemoteApp ไว้เหมือนเดิม


RemoteApp ยังคงเป็น TS / RDS คุณยังต้องรักษาความปลอดภัยเซิร์ฟเวอร์เหมือนกัน
Chris S

ตกลงแม้ว่าหลักฐานของบริการของเราจะได้รับอนุญาตให้ใช้งานแอปพลิเคชันเท่านั้น พวกเขาจะไม่ได้รับการล็อกอินแบบเต็มไปยังเดสก์ท็อปเพื่อลดค่าใช้จ่ายในระบบ หากพวกเขาทำงานเหมือน Evan เราก็สามารถจัดการกับกรณีนั้นได้ นี่เป็นปัญหาด้านทรัพยากรไม่ใช่ปัญหาด้านความปลอดภัยที่ยากลำบาก
เบร็ทอัลเลน

คำตอบ:


12

ไม่มีวิธี "การลงโทษอย่างเป็นทางการ" ในการทำเช่นนี้เพราะโดยพื้นฐานแล้วฟังก์ชั่น TS RemoteApp เป็นเพียงการใช้ประโยชน์จากโค้ดเดสก์ท็อประยะไกลที่มีอยู่ คุณสามารถทำอะไรที่โง่ ๆ ได้เช่นใช้ Group Policy เพื่อตั้งค่าเชลล์ของผู้ใช้ให้เป็น "logoff.exe" เช่นถ้าพวกเขาพยายามเข้าถึงเดสก์ท็อปของเครื่องพวกเขาจะถูกล็อกออฟทันที แอปพลิเคชันใด ๆ ที่ใช้กล่องโต้ตอบ "ไฟล์ / เปิด" ทั่วไปสามารถใช้เพื่อรับพรอมต์คำสั่งหรือโปรแกรมอื่น ๆ ที่เปิดอยู่บนเดสก์ท็อปของเซิร์ฟเวอร์

คุณดีกว่าเพื่อให้แน่ใจว่าคุณปฏิบัติตามหลักการของสิทธิ์น้อยที่สุดและให้สิทธิ์ผู้ใช้ TS RemoteApp ของคุณน้อยที่สุดเนื่องจากพวกเขาจำเป็นต้องเรียกใช้ซอฟต์แวร์ที่ต้องการ หากพวกเขาลงเอยบนเดสก์ท็อปของคอมพิวเตอร์เซิร์ฟเวอร์สิทธิ์ที่ จำกัด ของพวกเขาควรป้องกันไม่ให้พวกเขาทำสิ่งที่สร้างความเสียหายให้กับคอมพิวเตอร์เซิร์ฟเวอร์


เป็นการดีที่จะรู้ว่าซอฟต์แวร์นี้เป็นของเราเองและเรากำลังให้วิธีการใช้งานแก่ลูกค้าโดยไม่ต้องมีเซิร์ฟเวอร์ของตัวเอง อย่างไรก็ตามเราพยายาม จำกัด ให้เพียงแค่ใช้แอปพลิเคชัน จะลองใช้ความคิดนั้นและดูว่ามันจะไปอย่างไร
เบร็ทอัลเลน

นโยบายของที่ตั้งนี้อยู่ที่ไหน ฉันสามารถทำได้ในนโยบายความปลอดภัยท้องถิ่นสำหรับเซิร์ฟเวอร์ที่โฮสต์แอปพลิเคชันเหล่านี้หรือไม่ ถ้าฉันต้องทำสิ่งนี้ในระดับโดเมนต้องนำเจ้าของ บริษัท และพาเขาผ่านมัน
เบร็ทอัลเลน

2
@Aequitarum Custos ฉันเชื่อว่าเขากำลังพูดถึงUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache

1
อย่าลืมตั้งค่านโยบาย จำกัด ซอฟต์แวร์ที่อนุญาตให้เรียกใช้เฉพาะสิ่งที่คุณคาดหวังให้เรียกใช้ (+1 สำหรับการตั้งค่าเปลือกเพื่อ logoff.exe: ผมเคยทำแบบเดียวกันและแนะนำ)
Skyhawk

@Aequitarum ไม่คุณไม่จำเป็นต้องทำในระดับโดเมน หากคุณต้องการแก้ไขนโยบายกลุ่มภายในเครื่องสำหรับหนึ่งเครื่องเพียงแค่เรียกใช้ gpedit.msc
Skyhawk

2

เป็นการดีกว่าที่จะใช้ "นโยบายการควบคุมแอปพลิเคชัน" ในการตั้งค่าความปลอดภัยเพียงเพื่ออนุญาตเฉพาะแอปพลิเคชันหรือสคริปต์ที่จำเป็นหากคุณใช้ Windows 7 หรือ Windows 2008 R2


1

นี่คือสิ่งที่ฉันได้ทำเพื่อล็อคเดสก์ท็อปให้สามารถเข้าถึงได้เฉพาะผู้ดูแลเซิร์ฟเวอร์และกลุ่มโฆษณาที่มีชื่อ ผู้ใช้ที่ไม่ได้เป็นสมาชิกของกลุ่มโฆษณาที่ระบุจะได้รับข้อความแจ้งให้พวกเขาใช้ RDWeb และไม่ใช่เดสก์ท็อป / mstsc มาตรฐาน

  1. สร้าง vbscript และวางไว้ในโฟลเดอร์บนเซิร์ฟเวอร์ที่ผู้ใช้ทุกคนสามารถอ่าน + ดำเนินการ
  2. เพิ่มบรรทัดต่อไปนี้ลงใน %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

รหัส vbscript (โปรดเพิ่มข้อมูลส่วนบุคคลของคุณในรายการ <> ด้านล่าง)

'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

คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าเซสชันผู้ใช้ทั้งหมดเปิดuserinit.exeกระบวนการขณะที่เซสชัน RemoteApp เปิดใช้rdpshell.exeกระบวนการ AppLocker สามารถใช้เพื่อห้ามมิให้userinit.exeผู้ใช้มาตรฐานดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.