Безопасное развертывание FTP для приложения Azure с использованием Python (с использованием TLS или FTPS) - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь скопировать некоторые файлы в приложение Azure, используя python как часть более широкого скрипта python.

Я могу сделать это с помощью FTP, но я не могу понять, как это сделать безопасным способом с использованием TLS.

Я использую учетные данные, которые я скачал с портала Azure, нажимаю «Получить профиль публикации», а затем использую их внутри кода Python, например:

import ftplib

ftpServer = ftplib.FTP_TLS(host='waws-<...>.ftp.azurewebsites.windows.net',
                        user='<MY_USER>\$<MY_USER>',
                        passwd='<VERY_LONG_PSW>')

однако при выполнении ftpServer.cwd('<THE_PATH_TO_INSPECT>') тогда я вижу: ConnectionRefusedError: [Errno 111] Connection refused

При использовании ftplib.FTP(...) вместо ftplib.FTP_TLS(...) все работает как положено.

Глядя на документы по Python здесь https://docs.python.org/3.5/library/ftplib.html кажется, я должен убедиться, что соблюдается какое-то неявное / явное условие, но я не могу понять, что делать.

При чтении на различных веб-ресурсах мне кажется, что я должен использовать порт, отличный от стандартного 21, кто-то говорит 990, кто-то говорит 989, но я не могу понять, где указать этот другой порт в коде Python.

  • Что не так с моим кодом? Почему я вижу Connection refused?
  • Как сделать код Python, устанавливающий безопасное соединение TLS через FTP?

РЕДАКТИРОВАТЬ 1:

Кажется, что это неявное соединение для FTP связано с TLS версии 1.2 (согласно документации по python), я не уверен на 100%, так как я не знаком с этими стандартами, однако я все равно попробовал, но безуспешно. Имейте в виду, , что <MY_USER>\$<MY_USER> (и пароль) исходит из содержимого файла, который я загружаю с портала Azure как «Профиль публикации» , см. Ниже:

$ python
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 17:14:51) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> 
>>> 
>>> import ftplib
>>> 
>>> 
>>> ftpServer = ftplib.FTP_TLS(host='waws-<...>.ftp.azurewebsites.windows.net',
...                         user='<MY_USER>\$<MY_USER>',
...                         passwd='<VERY_LONG_PSW>')
>>> 
>>> 
>>> 
>>> ftpServer.dir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/<MY_USER>/Conda/lib/python3.6/ftplib.py", line 575, in dir
    self.retrlines(cmd, func)
  File "/home/<MY_USER>/Conda/lib/python3.6/ftplib.py", line 468, in retrlines
    with self.transfercmd(cmd) as conn, \
  File "/home/<MY_USER>/Conda/lib/python3.6/ftplib.py", line 399, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "/home/<MY_USER>/Conda/lib/python3.6/ftplib.py", line 798, in ntransfercmd
    conn, size = FTP.ntransfercmd(self, cmd, rest)
  File "/home/<MY_USER>/Conda/lib/python3.6/ftplib.py", line 361, in ntransfercmd
    source_address=self.source_address)
  File "/home/<MY_USER>/Conda/lib/python3.6/socket.py", line 724, in create_connection
    raise err
  File "/home/<MY_USER>/Conda/lib/python3.6/socket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
>>> 
>>> 

1 Ответ

0 голосов
/ 14 января 2019

Кажется, просто отлично работает на неявном FTPS (990 / TCP):

$ openssl s_client -connect waws-prod-am2-119.ftp.azurewebsites.windows.net:990

CONNECTED(00000003)
[...]
---
Certificate chain
 0 s:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/
      CN=waws-prod-am2-119.publish.azurewebsites.windows.net
   i:/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
 1 s:/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
---
[...]
SSL handshake has read 3574 bytes and written 390 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
[...]
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-SHA384
    [...]
    Verify return code: 0 (ok)
    Extended master secret: yes
---
220 Microsoft FTP Service

Клиентская библиотека Python может быть устаревшей или не иметь недавнего пакета CA, содержащего CA DigiCert. Вы не должны подключаться к FTP, попробуйте загрузить их в хранилище BLOB-объектов, а веб-приложение должно обслуживать файлы из этой учетной записи хранилища (с подписью SAS , если файлы не должны быть общедоступными).

Если вы пытаетесь развернуть веб-приложение, использовать git-репо или веб-развертывание, это намного надежнее.

Использование ftplib в наличии Python 3.6:

>>> ftpServer = FTP_TLS(host='waws-prod-am2-119.ftp.azurewebsites.windows.net',
...                         user='myuser\$myuser',
...                         passwd='rM....dsFsfp')

>>> ftpServer.dir()
03-21-17  09:27AM       <DIR>          .ssh
02-22-18  08:19AM       <DIR>          ciphers
02-22-18  10:28AM       <DIR>          data
01-12-18  12:58AM       <DIR>          LogFiles
02-22-18  08:16AM       <DIR>          site

>>> ftpServer.cwd('data')
'250 CWD command successful.'
...