Повышение безопасности папки обмена на файловом сервере

Повышение безопасности папки обмена на файловом сервере

Рассмотрен простой, не требующий дополнительных затрат способ повысить безопасность папки обмена на файловом сервере

Олег Ржевский, Microsoft MVP – Windows and Devices for IT

Рассмотрен простой, не требующий дополнительных затрат способ повысить безопасность папки обмена на файловом сервере. В предложенном решении реализуется принцип работы публичного файлообменника: хотя доступ к папкам и файлам внутри папки обмена не ограничивается разрешениями на файловую систему, но для успешного доступа требуется точное знание полного пути к созданной папке.

Папки обмена широко используются в работе во многих организациях, поскольку позволяют быстро передать объемные данные, содержащие структуры из папок и файлов, даже если сотрудники не имеют доступа к какой-либо общей папке подразделения или проекта. Вместе с тем, общий доступ на запись в папки обмена для всех без исключения сотрудников представляет серьезную угрозу безопасности, поскольку конфиденциальная информация, даже временно находящаяся в папке обмена, может стать доступной тем, для кого она не предназначена.

Так, в папках обмена мне реально и неоднократно приходилось находить отсканированные копии паспортов, относящиеся к категории персональных данных, доступ к которым должен быть строго ограничен, а также другие конфиденциальные документы.

Предлагаемое решение основано на идее, что мы не ограничиваем доступ к папкам и файлам внутри папки обмена, но получить такой доступ пользователь сможет, только если будет точно знать полный путь к той или иной папке. Просто открыть папку обмена и просматривать информацию внутри нее невозможно, т.к. папка выглядит пустой. Предполагается, что пользователь, передающий информацию через папку обмена, сообщает получателю или получателям полный путь к созданной им папке внутри папки обмена. Получатели, открывающие папку по полному пути, имеют разрешения на запись в этой папке, как и отправитель. Например, они могут удалить информацию из папки обмена после того, как скопируют ее на свой компьютер или используют иным образом. Назначенное задание, запускаемое регулярно на файловом сервере, выполняет удаление всех папок внутри папки обмена.

Таким образом, принцип работы очень похож на публичные файлообменники, когда для передачи файла пользователь загружает его на веб-сайт и затем сообщает ссылку для скачивания файла тем, кто заинтересован в его получении. При этом URL ссылки генерируется сайтом-файлообменником, и получить файл, не зная ссылки на него, нельзя. Рассмотрим подробнее, как выглядит работа пользователей с безопасной папкой обмена.

1) На все клиентские компьютеры следует распространить сценарий exfld.vbs, текст которого приведен ниже, а Рабочем столе или в Панели задач следует создать ярлык, запускающий данный сценарий. Разместить сценарий также можно в сетевой папке, в том числе и в самой папке обмена.

2) Пользователь, желающий передать информацию другим пользователям внутри папки обмена, запускает сценарий exfld.vbs. В результате создается и открывается на Рабочем столе пустая папка внутри сетевой папки обмена.

Имя папки генерируется автоматически и представляет собой набор из трех случайных трехзначных чисел. В эту папку отправитель копирует необходимые для передачи папки и файлы. Полный путь к папке легко скопировать в буфер обмена из адресной строки окна и, например, отправить получателям по электронной почте. Также возможно продиктовать 9 цифр в имени папки по телефону.

3) Для открытия папки получателю достаточно перейти по полученной ссылке. Если имя папки сообщается по телефону, то получатель запускает на своем компьютере сценарий exfld.vbs, игнорирует в данном случае созданную папку, однако в адресной строке папки изменяет конечное имя папки на то, которое отправитель сообщил по телефону.

Как уже упоминалось, если любой пользователь, не обладающий правами локального администратора, пожелает просмотреть папку обмена (TMP), то он увидит, что папка пустая.

Открыть вложенную папку TMP, указав в адресной строке прямой путь, тоже не получится, возникнет ошибка.

Тем не менее, информация в папке есть. Если открыть папку обмена в контексте администратора, то она будет иметь примерно такой вид

т.е. ее содержимое будет представлять собой набор папок, созданных разными пользователями, и с именами, составленными из 9-значных случайных чисел.

Сценарий exfld.vbs, создающий папку внутри папки обмена и автоматически генерирующий имя папки, имеет очень простой вид. В нем легко разобраться, даже если вы не разрабатываете (и не собираетесь писать) сценарии на vbScript.

Option Explicit

Const strRootFolder = "\\cloudlab.com\org\tmp\tmp"

Function Rnd3()

Rnd3 = Mid(CStr(1000+Int(Rnd()*1000)),2,3)

End Function

Dim oShell, oFSO, oFolder

Dim strFoldername, strPath

Randomize

strFolderName = Rnd3() & "-" & Rnd3() & "-" & Rnd3()

strPath = strRootFolder & "\" & strFolderName

Set oFSO = CreateObject("Scripting.FileSystemObject")

Set oFolder = oFSO.CreateFolder(strPath)

Set oShell = CreateObject("WScript.Shell")

oShell.Run "file://" & strPath,1,false

В качестве значения константы strRootFolder следует подставить ваш сетевой путь к папке обмена, включая вложенную папку.

Корневая папка обмена должна быть предоставлена в совместное использование. Опционально, она может быть добавлена в пространство имен DFS. В свойствах разделяемой папки рекомендуется включить Access Based Enumeration, как показано на скриншоте.

На папке обмена (Tmp) и папке tmp внутри папки обмена должны быть настроены следующие разрешения NTFS. На корневую папку обмена следует предоставить разрешения Read&Execute для Authenticated Users и только для текущей папки.

На папку tmp внутри корневой папки обмена должны быть установлены следующие разрешения для группы Authenticated Users:

1) для текущей папки детальные разрешения:

  • Traverse folder/execute file
  • Create folders/append data
  • Write attributes
  • Write extended attribute

2) для подпапок и файлов — Modify

Указанные разрешения NTFS обеспечивают доступ на запись к создаваемым папкам для группы Authenticated Users, но при условии, что пользователь знает точный путь к папке.

Осталось только создать назначенное задание для очистки папки обмена. Оно может выполняться по расписанию в нерабочее время и запускаться на сервере от имени Local System. В простейшем случае это может быть сценарий командной строки, удаляющий все файлы и папки во вложенной папке tmp:

@echo off

for /D %%i in ("c:\tmp\tmp\*.*") do rmdir "%%i" /s /q

В более сложном варианте папки и файлы, скопированные в папку обмена, гарантированно хранятся в ней заданное время. Такой сценарий на PowerShell описан в моем блоге.

Работу с папкой обмена можно сделать еще более удобной, если разработать веб-интерфейс. Не исключено, что создавать папки обмена пользователям будет проще, переходя по ссылке на какой-нибудь веб-странице в корпоративной сети, а не запуская сценарий.

Далее представлены два варианта веб-страниц и сопровождающих их сценариев, предназначенные для размещения на веб-сервере. Их следует рассматривать исключительно как proof of concept с целью показать работоспособность решения. В них добавлен в них лишь необходимый минимум разметки и элементов интерфейса, а также не ставилось целью написать оптимальный код. Кроме того, отсутствуют средства проверки корректности ввода, иные украшения и т.п.

Элементы управления и функционал обеих веб-страниц внешне выглядят одинаково. Аналогично сценарию на vbScript, активное содержимое веб-страниц включает функции по генерации случайных чисел и созданию папки. В первом варианте (ASP.Net) все необходимые действия выполняются на стороне веб-сервера, что однако накладывает ограничения на веб-сервер, зато веб-страница работает с разными браузерами (протестирована с Internet Explorer и Edge) и не предъявляет требований к их настройкам. Во втором варианте (JavaScript + ActiveX) код работает на стороне клиента. Как результат, веб-страница может размещаться на любом веб-сервере, однако в качестве браузера может использоваться только Internet Explorer. Перейдем к более подробному рассмотрению обоих решений.

ASP.Net

В этом варианте создание временной папки для обмена происходит по инициативе веб-сервера. Веб-страница может работать только на Microsoft IIS, причем в конфигурации роли должна быть добавлена поддержка ASP.Net. Создайте на сервере виртуальный каталог и разместите в нем три файла

web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>

default.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="default.aspx.vb" Inherits="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title></title>

<style type="text/css">

body

{

font-family: Arial;

font-size: 10pt;

}

</style>

</head>

<script>

function OpenFolder() {

var strName = "";

strName = document.getElementById("FldName").value;

window.open("file://<% Response.Write(Replace(RootFolder,"\","\\")) %>"+strName, "_self");

}

</script>

<body>

<b>Управление папкой обмена (ASP.Net, выполняется на сервере)</b><br>

<hr>

<form id="form1" runat="server">

<asp:Button ID="btnNewFolder" Text="Создать" runat="server" OnClick="NewFolder" />

<p> </p>

<asp:HyperLink id="hypFld" runat="server" />

<p> </p>

<INPUT id="FldName" VALUE="000-000-000">

<INPUT TYPE="button" id="bt" VALUE="Открыть" onClick="OpenFolder();">

</form>

</body>

</html>

default.aspx.vb

Imports System.IO
 
Partial Class VB
 
    Inherits System.Web.UI.Page
 
    Function Rnd3()
        Rnd3 = Mid(CStr(1000+Int(Rnd()*1000)),2,3)
    End Function
 
    Function RootFolder()
        RootFolder = "\\cloudlab.com\org\tmp\tmp\"
    End Function   
 
    Protected Sub NewFolder(sender As Object, e As EventArgs)
    Randomize()
 
    Dim strFolderName As String = Rnd3() + "-" + Rnd3() + "-" + Rnd3()
    Dim strPath As String = RootFolder() + strFolderName
 
        Directory.CreateDirectory(strPath)
 
    hypFld.Text = strPath
    hypFld.NavigateURL = "file://" + strPath
    End Sub
 
End Class

Здесь в переменной rootFolder в файле default.aspx.vb должен быть указан путь к папке обмена, по аналогии со сценарием exfld.vbs. Желательно убедиться, что страница default.aspx настроена в качестве страницы по умолчанию для вашей виртуальной директории. Преимуществом данного варианта является отсутствие требований к настройкам безопасности браузера Internet Explorer.

JavaScript + ActiveX

В другом подходе создание папки обмена происходит со стороны клиентского компьютера. Веб-страница может быть размещена на любом веб-сервере, но настройки безопасности Internet Explorer должны быть снижены (чтобы разрешить создание папки из IE). Кроме того, возможно появление дополнительных предупреждений при создании папки.

cli.htm

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=win-1251">
    <style type="text/css">
        body
        {
            font-family: Arial;
            font-size: 10pt;
        }
    </style>
 
<script>
 
function rootFolder() {
    return "\\\\cloudlab.com\\org\\tmp\\tmp\\"; 
}
 
function OpenFolder() {
    var strName = document.form1.FldName.value;
    window.open("file://" + rootFolder() + strName);
}
 
function Rnd3() {
   return (1000+Math.random()*1000).toString().slice(1,4);
}
 
function CreateFolder() {
    var fso;
    var strFolderName = Rnd3() + "-" + Rnd3() + "-" + Rnd3();
//    window.alert(strFolderName);
    fso = new ActiveXObject("Scripting.FileSystemObject");
    var newfolder = fso.CreateFolder(rootFolder() + strFolderName + "\\");
 
    document.getElementById("FldRef").innerHTML = rootFolder() + strFolderName;
    document.getElementById("FldRef").href = "file://" + rootFolder() + strFolderName;
    document.getElementById("FldRef").style.display = 'block';
}
 
</script>
 
</head>
<body>
<b>Управление папкой обмена (JavaScript + ActiveX, выполняется на клиенте)</b><br>
<hr>
    <form name="form1">
        <INPUT TYPE="button" NAME="btCreate" VALUE="Создать" onClick="CreateFolder();">
        <p> </p>
    <a id="FldRef" href="http://webserver.cloudlab.com/exfld" style="display: none;">ExFld</a>
<p></p>
        <INPUT NAME="FldName" value="000-000-000">
        <INPUT TYPE="button" NAME="bt" VALUE="Открыть" onClick="OpenFolder();">
    </form>
 
</body>
</html>

Здесь функция rootFolder возвращает UNC-путь к папке обмена, и еще в форме form1 потребуется указать URL виртуального каталога, назначенного на папку обмена.

Загрузить перечисленные файлы в виде архива можно отсюда. Общий вид обеих веб-страниц после создания временной папки обмена показан на скриншоте. На страницах отображаются ссылки, а при переходе по ссылке открывается окно Проводника с только что созданной папкой обмена.

Имеющийся опыт работы с описанным решением показывает, что лучше использовать ссылки на веб-страницы с короткими именами (без доменных суффиксов), поскольку IE относит их к зоне Местная интрасеть с пониженными требованиями к безопасности, и никакие скрипты не блокируются.

Если в вашей организации еще находятся в эксплуатации компьютеры с Windows XP и Windows Vista, то, не говоря, что это очень плохо, в Проводнике могут не открываться ссылки на создаваемые временные папки в папке обмена. В этом случае может помочь отключение Access Based Enumeration на разделяемой папке, содержащей папку обмена. Побочным эффектом будет то, что в сетевой папке становится видна вложенная папка TMP, но открыть ее все равно не представляется возможным. На более современных ОС, начиная с Windows 7, проблемы с включенным ABE нет.

Да, чтобы не забыть… Сценарий exfld.vbs, и сценарии, выполняющиеся на веб-страницах, ввиду своей простоты, не содержат проверки ситуации, что создаваемая новая папка уже существует. Такую проверку, в принципе, можно добавить, но вероятность этого события крайне мала: даже крупные выигрыши в лотерею случаются чаще.

Красная или синяя таблетка?

В Матрице безопасности выбор очевиден

Выберите реальность — подпишитесь