Поделиться через


FTP через SSL <>

Общие сведения

Элемент <ssl> задает параметры FTP по протоколу SSL для службы FTP; FTP через SSL впервые появился для IIS 7 в FTP 7.0.

В отличие от использования ПРОТОКОЛА HTTP через SSL, для которого требуется отдельный порт и подключение для безопасного обмена данными (HTTPS), безопасный обмен данными по ПРОТОКОЛу FTP осуществляется через тот же порт, что и небезопасный обмен данными. FTP 7 поддерживает две различные формы FTP через SSL:

  • Явный FTPS. По умолчанию ftp-сайты и клиенты используют порт 21 для канала управления, а сервер и клиент согласовывают вторичные порты для подключений к каналу данных. В типичном FTP-запросе FTP-клиент подключается к FTP-сайту через канал управления, а затем клиент может согласовывать SSL/TLS с сервером для канала управления или канала данных. При использовании FTP 7 вы используете явный ПРОТОКОЛ SSL, если включаете FTPS и назначаете ftp-сайту любой порт, отличный от порта 990.
  • Неявное FTPS. Неявное FTPS — это более старая форма FTP по SSL, которая по-прежнему поддерживается FTP 7. При использовании неявного FTPS подтверждение SSL должно быть согласовано перед отправкой каких-либо ftp-команд клиентом. Кроме того, несмотря на то, что явный FTPS позволяет клиенту произвольно решать, следует ли использовать SSL, неявный FTPS требует, чтобы весь сеанс FTP был зашифрован. При использовании FTP 7 используется неявный ПРОТОКОЛ SSL, если вы включили FTPS и назначите ftp-сайт порту 990.

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

controlChannelPolicy dataChannelPolicy Примечания
SslAllow SslAllow Такая конфигурация позволяет клиенту решить, следует ли шифровать какую-либо часть сеанса FTP.
SslRequireCredentialsOnly SslAllow Эта конфигурация защищает учетные данные FTP-клиента от электронного перехвата и позволяет клиенту решить, следует ли шифровать передачу данных.
SslRequireCredentialsOnly SslRequire Эта конфигурация требует, чтобы учетные данные клиента были защищены, а затем позволяет клиенту решить, следует ли шифровать команды FTP. Однако все передачи данных должны быть зашифрованы.
SslRequire SslRequire Эта конфигурация является наиболее безопасной: клиент должен согласовывать SSL с помощью команд, связанных с FTPS, прежде чем будут разрешены другие команды FTP, и все передачи данных должны быть зашифрованы.

Совместимость

Версия Примечания
IIS 10.0 Элемент <ssl> не был изменен в IIS 10.0.
IIS 8,5 Элемент <ssl> не был изменен в IIS 8.5.
IIS 8,0 Элемент <ssl> не был изменен в IIS 8.0.
IIS 7,5 Элемент <ssl> элемента поставляется <security> как компонент IIS 7.5.
IIS 7.0 Элемент <ssl> элемента появился <security> в FTP 7.0, который был отдельной загрузкой для IIS 7.0.
IIS 6,0 Служба FTP в IIS 6.0 не поддерживала FTP через SSL.

Примечание

Службы FTP 7.0 и FTP 7.5 поставляются внеполосно для IIS 7.0, что требует скачивания и установки модулей по следующему URL-адресу:

https://www.iis.net/expand/FTP

В Windows 7 и Windows Server 2008 R2 служба FTP 7.5 поставляется в качестве функции для IIS 7.5, поэтому скачивание службы FTP больше не требуется.

Настройка

Чтобы обеспечить поддержку публикации FTP для веб-сервера, необходимо установить службу FTP. Для этого выполните следующие действия.

Windows Server 2012 или Windows Server 2012 R2

  1. На панели задач щелкните Диспетчер сервера.

  2. В диспетчер сервера откройте меню Управление и выберите пункт Добавить роли и компоненты.

  3. В мастере добавления ролей и компонентов нажмите кнопку Далее. Выберите тип установки и нажмите кнопку Далее. Выберите целевой сервер и нажмите кнопку Далее.

  4. На странице Роли сервера разверните узел Веб-сервер (IIS) и выберите FTP-сервер.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Помимо службы FTP необходимо выбрать расширяемость FTP.
    Снимок экрана: область сервера IS и F T P, развернутая с выделенной расширяемостью F T P. .

  5. Нажмите кнопку Далее, а затем на странице Выбор компонентов нажмите кнопку Далее еще раз.

  6. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.

  7. На странице Результаты нажмите кнопку Закрыть.

Windows 8 или Windows 8.1

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

  2. В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.

  3. Разверните узел Службы IIS, а затем выберите FTP-сервер.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Также необходимо выбрать расширяемость FTP.
    Снимок экрана: службы IIS и область сервера F T P, развернутая с выделенной расширяемостью F T P.

  4. Нажмите кнопку ОК.

  5. Щелкните Закрыть.

Windows Server 2008 R2

  1. На панели задач нажмите кнопку Пуск, выберите Администрирование, а затем диспетчер сервера.

  2. В области иерархии диспетчер сервера разверните узел Роли и выберите Веб-сервер (IIS).

  3. На панели Веб-сервер (IIS) прокрутите страницу до раздела Службы ролей и щелкните Добавить службы ролей.

  4. На странице Выбор служб ролеймастера добавления служб ролей разверните узел FTP-сервер.

  5. Выберите Служба FTP.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Также необходимо выбрать расширяемость FTP.
    Снимок экрана: развернутый сервер F T P с выбранной службой F T P.

  6. Щелкните Далее.

  7. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.

  8. На странице Результаты нажмите кнопку Закрыть.

Windows 7

  1. На панели задач нажмите кнопку Пуск, а затем панель управления.

  2. В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.

  3. Разверните узел Службы IIS, а затем FTP-сервер.

  4. Выберите Служба FTP.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Также необходимо выбрать расширяемость FTP.
    Снимок экрана: панель

  5. Нажмите кнопку ОК.

Windows Server 2008 или Windows Vista

  1. Скачайте пакет установки по следующему URL-адресу:

  2. Следуйте инструкциям в следующем пошаговом руководстве, чтобы установить службу FTP:

Инструкции

Настройка параметров SSL для FTP-сайта

  1. Откройте диспетчер служб IIS:

    • Если вы используете Windows Server 2012 или Windows Server 2012 R2:

      • На панели задач щелкните диспетчер сервера, выберите Сервис, а затем диспетчер служб IIS.
    • Если вы используете Windows 8 или Windows 8.1:

      • Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
      • Щелкните Администрирование, а затем дважды щелкните Диспетчер служб IIS.
    • Если вы используете Windows Server 2008 или Windows Server 2008 R2:

      • На панели задач нажмите кнопку Пуск, наведите указатель на пункт Администрирование, а затем выберите Пункт Диспетчер служб IIS.
    • Если вы используете Windows Vista или Windows 7:

      • На панели задач нажмите кнопку Пуск, а затем панель управления.
      • Дважды щелкните Администрирование, а затем дважды щелкните Диспетчер служб IIS.
  2. В области Подключения разверните имя сервера, узел Сайты и щелкните имя сайта.

  3. На домашней панели сайта дважды щелкните функцию ПАРАМЕТРЫ FTP SSL .
    Снимок экрана: панель

  4. В списке SSL-сертификат выберите сертификат, который будет использоваться для подключений к FTP-серверу.
    Снимок экрана: страница параметров SS L F T PS, на котором отображается поле для параметра SSL Certificate and S S L Policy .

  5. В разделе Политика SSL выберите один из следующих параметров:

    • Разрешить SSL-подключения. Позволяет FTP-серверу поддерживать не ssl- и SSL-подключения с клиентом.

    • Требовать SSL-подключения. Требуется шифрование SSL для обмена данными между FTP-сервером и клиентом.

    • Пользовательский. Позволяет настроить другую политику шифрования SSL для канала управления и канала данных. Если выбран этот параметр, нажмите кнопку Дополнительно... . Когда откроется диалоговое окно Расширенная политика SSL , выберите следующие параметры:

      • В разделе Канал управления выберите один из следующих вариантов шифрования SSL через канал управления:

        • Разрешить: указывает, что ssl разрешен для канала управления; FTP-клиент может использовать SSL для канала управления, но это не обязательно.
        • Требовать. Указывает, что для канала управления требуется SSL; FTP-клиент не может переключиться в небезопасный режим связи для канала управления.
        • Требовать только для учетных данных: указывает, что только учетные данные пользователя должны быть отправлены через сеанс SSL; FTP-клиент должен использовать SSL для имени пользователя и пароля, но клиент не обязан использовать SSL для канала управления после входа в систему.
      • В разделе Канал данных выберите один из следующих вариантов шифрования SSL по каналу данных:

        • Разрешить: ssl разрешен для канала данных; FTP-клиент может использовать SSL для канала данных, но это не обязательно.
        • Требовать: для канала данных требуется SSL; FTP-клиент не может переключиться в небезопасный режим связи для канала данных.
        • Запретить: ssl запрещен для канала данных; FTP-клиент не может использовать SSL для канала данных.
      • Нажмите кнопку ОК , чтобы закрыть диалоговое окно Расширенная политика SSL .

  6. В области Действия нажмите кнопку Применить.

Конфигурация

Элемент <ssl> настраивается на уровне сайта.

Атрибуты

Атрибут Описание
controlChannelPolicy Необязательный атрибут перечисления.

Указывает политику SSL для канала управления FTP.

Примечание: Нет значения перечисления, запрещающего SSL для канала команд; Чтобы запретить SSL, не привязывайте SSL-сертификат к FTP-сайту, указывая хэш сертификата в атрибуте serverCertHash .
Значение Описание
SslAllow Указывает, что ssl разрешен для канала управления.

Числовое значение равно 0.
SslRequire Указывает, что для канала управления требуется ПРОТОКОЛ SSL.

Числовое значение равно 1.
SslRequireCredentialsOnly Указывает, что только команды USER и PASS должны отправляться через сеанс SSL. После входа ftp-клиента клиент может переключиться в небезопасный режим.

Числовое значение равно 2.
Значение по умолчанию — SslRequire.
dataChannelPolicy Необязательный атрибут перечисления.

Указывает политику SSL для канала данных FTP.
Значение Описание
SslAllow Указывает, что ssl разрешен для канала данных.

Числовое значение равно 0.
SslRequire Указывает, что для канала данных требуется ПРОТОКОЛ SSL.

Числовое значение равно 1.
SslDeny Указывает, что ssl запрещен для канала данных.

Числовое значение равно 2.
Значение по умолчанию — SslRequire.
serverCertHash Необязательный строковый атрибут.

Указывает хэш отпечатка для сертификата на стороне сервера, который будет использоваться для SSL-подключений.

Значение по умолчанию отсутствует.
serverCertStoreName Необязательный строковый атрибут.

Указывает хранилище сертификатов для SSL-сертификатов сервера.

Значение по умолчанию — MY.
ssl128 Необязательный атрибут boolean .

Указывает, требуется ли 128-разрядное шифрование SSL.

Значение по умолчанию — false.

Дочерние элементы

Отсутствует.

Образец конфигурации

В следующем примере показаны несколько параметров конфигурации в элементе <ftpServer> для FTP-сайта. В частности, <site> параметры в этом примере демонстрируют следующее:

  • Создайте FTP-сайт и добавьте привязку для протокола FTP через порт 21.
  • Настройте параметры SSL FTP, чтобы разрешить безопасный доступ как к элементу управления, так и к каналу данных с помощью сертификата.
  • Отключите анонимную проверку подлинности и включите обычную проверку подлинности для FTP.
  • Запретить доступ для команды FTP SYST .
  • Укажите формат списка каталогов UNIX.
  • Настройте параметры ведения журнала.
  • Укажите настраиваемое приветственное сообщение и включите локальные подробные сообщения об ошибках.
  • Укажите, что пользователи будут запускаться в домашнем каталоге, основанном на имени входа, но только в том случае, если этот каталог существует.
<site name="ftp.example.com" id="5">
  <application path="/">
    <virtualDirectory path="/" physicalPath="c:\inetpub\www.example.com" />
  </application>
  <bindings>
    <binding protocol="ftp" bindingInformation="*:21:" />
  </bindings>
  <ftpServer>
    <security>
      <ssl controlChannelPolicy="SslAllow"
         dataChannelPolicy="SslAllow"
         serverCertHash="57686f6120447564652c2049495320526f636b73" />
      <authentication>
        <basicAuthentication enabled="true" />
        <anonymousAuthentication enabled="false" />
      </authentication>
      <commandFiltering maxCommandLine="4096" allowUnlisted="true">
        <add command="SYST" allowed="false" />
      </commandFiltering>
    </security>
    <directoryBrowse showFlags="StyleUnix" />
    <logFile logExtFileFlags="Date, Time, ClientIP, UserName, ServerIP, Method, UriStem, FtpStatus, Win32Status, ServerPort, FtpSubStatus, Session, FullPath, Info" />
    <messages expandVariables="true"
       greetingMessage="Welcome %UserName%!"
       allowLocalDetailedErrors="true" />
    <userIsolation mode="StartInUsersDirectory" />
  </ftpServer>
</site>

Пример кода

В следующих примерах ftp-сайт настраивается таким образом, что ему требуется ПРОТОКОЛ SSL как для канала данных, так и для канала управления.

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.ssl.serverCertHash:"57686f6120447564652c2049495320526f636b73" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.ssl.controlChannelPolicy:"SslRequire" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.ssl.dataChannelPolicy:"SslRequire" /commit:apphost

Примечание

При использовании AppCmd.exe для настройки этих параметров для параметра apphostфиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле ApplicationHost.config.

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();

         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"ftp.example.com");
         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElement ftpServerElement = siteElement.GetChildElement("ftpServer");
         ConfigurationElement securityElement = ftpServerElement.GetChildElement("security");

         ConfigurationElement sslElement = securityElement.GetChildElement("ssl");
         sslElement["serverCertHash"] = @"57686f6120447564652c2049495320526f636b73";
         sslElement["controlChannelPolicy"] = @"SslRequire";
         sslElement["dataChannelPolicy"] = @"SslRequire";

         serverManager.CommitChanges();
      }
   }
   
   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection

      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "ftp.example.com")
      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim ftpServerElement As ConfigurationElement = siteElement.GetChildElement("ftpServer")
      Dim securityElement As ConfigurationElement = ftpServerElement.GetChildElement("security")

      Dim sslElement As ConfigurationElement = securityElement.GetChildElement("ssl")
      sslElement("serverCertHash") = "57686f6120447564652c2049495320526f636b73"
      sslElement("controlChannelPolicy") = "SslRequire"
      sslElement("dataChannelPolicy") = "SslRequire"

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";

var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "ftp.example.com"]);

if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var ftpServerElement = siteElement.ChildElements.Item("ftpServer");
var securityElement = ftpServerElement.ChildElements.Item("security");

var sslElement = securityElement.ChildElements.Item("ssl");
sslElement.Properties.Item("serverCertHash").Value = "57686f6120447564652c2049495320526f636b73";
sslElement.Properties.Item("controlChannelPolicy").Value = "SslRequire";
sslElement.Properties.Item("dataChannelPolicy").Value = "SslRequire";

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"

Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "ftp.example.com"))

If siteElementPos = -1 Then
Wscript.Echo "Element not found!"
WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set ftpServerElement = siteElement.ChildElements.Item("ftpServer")
Set securityElement = ftpServerElement.ChildElements.Item("security")

Set sslElement = securityElement.ChildElements.Item("ssl")
sslElement.Properties.Item("serverCertHash").Value = "57686f6120447564652c2049495320526f636b73"
sslElement.Properties.Item("controlChannelPolicy").Value = "SslRequire"
sslElement.Properties.Item("dataChannelPolicy").Value = "SslRequire"

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function