質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

1回答

2632閲覧

vsftpdによるftps ( ftp over tls/ssl ) において、データ用ポート(ftp-data)だけ暗号化されない

tatsa398

総合スコア6

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2018/08/17 17:09

編集2022/01/12 10:55

前提・実現したいこと

経路暗号化されたNAS環境を簡単に構築するために、
Ubuntuにおいて、ftpsの設定をしたvsftpdに対し、
iosアプリのftpmanagerからftps接続で完全なtls通信を
させたい。

発生している問題・エラーメッセージ

vsftpdのftpsには、tlsとしてimplicit,explicitの2つがあり、
vsftpd.confにおいて

・ implicit_ssl=YES # implicitなtls接続しかサーバは受け付けない
・ #implicit_ssl=YES explicitでも可

の各設定の場合に合うように、ftpmanagerのプロトコル設定も

・ require explicit ftp over tls
・ require implicit ftp over tls

と設定して試したが、ubuntu側でwiresharkによりパケットを見ると、
どちらの場合も、

ftpsの
制御用portの21 or 990はtls
データ用portの20はftp-data

と表示されて、データが暗号化されていません。

tls化しているにもかかわらず、ファイル転送が暗号化されないなら、意味ないです。

あと、匿名ユーザーとunixユーザーでのログインで比較しても結果は同じです。
ソフトの問題というより、ftpのデータ用ポートは非暗号化される仕様なのでしょうか。

vsftpd 3.0.3の/etc/vsftpd.confに対して加えた設定変更の差分は以下です。
(編集履歴を参照。
cipher_suites,pasv拒否、ftp-data port20のblockのみです。
)

diff -u vsftpd.conf.orig vsftpd.conf @@ -11,7 +11,8 @@ # # Run standalone? vsftpd can run either from an inetd or as a standalone # daemon started from an initscript. -listen=NO +#listen=NO +listen=YES # # This directive enables listening on IPv6 sockets. By default, listening # on the IPv6 "any" address (::) will accept connections from both IPv6 @@ -19,33 +20,36 @@ # sockets. If you want that (perhaps because you want to listen on specific # addresses) then you must run two copies of vsftpd with two configuration # files. -listen_ipv6=YES +#listen_ipv6=YES # # Allow anonymous FTP? (Disabled by default). -anonymous_enable=NO +anonymous_enable=YES # # Uncomment this to allow local users to log in. local_enable=YES # # Uncomment this to enable any form of FTP write command. -#write_enable=YES +write_enable=YES # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) -#local_umask=022 +local_umask=022 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. -#anon_upload_enable=YES +anon_upload_enable=YES # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. -#anon_mkdir_write_enable=YES +anon_mkdir_write_enable=YES + +no_anon_password=YES + # # Activate directory messages - messages given to remote users when they # go into a certain directory. -dirmessage_enable=YES +dirmessage_enable=NO # # If enabled, vsftpd will display directory listings with the time # in your local time zone. The default is to display GMT. The @@ -57,7 +61,8 @@ xferlog_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). -connect_from_port_20=YES +#connect_from_port_20=YES +connect_from_port_20=NO # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not @@ -67,11 +72,11 @@ # # You may override where the log file goes if you like. The default is shown # below. -#xferlog_file=/var/log/vsftpd.log +xferlog_file=/var/log/vsftpd.log # # If you want, you can have your log file in standard ftpd xferlog format. # Note that the default log file location is /var/log/xferlog in this case. -#xferlog_std_format=YES +xferlog_std_format=NO # # You may change the default value for timing out an idle session. #idle_session_timeout=600 @@ -96,8 +101,8 @@ # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. -#ascii_upload_enable=YES -#ascii_download_enable=YES +ascii_upload_enable=YES +ascii_download_enable=YES # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. @@ -128,7 +133,7 @@ # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. -#ls_recurse_enable=YES +ls_recurse_enable=YES # # Customization # @@ -146,10 +151,36 @@ # # This option specifies the location of the RSA certificate to use for SSL # encrypted connections. -rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem -rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key -ssl_enable=NO +#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem +#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key +rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem +rsa_private_key_file=/etc/pki/tls/certs/vsftpd.pem +#ssl_enable=NO +ssl_enable=YES +ssl_sslv2=NO +ssl_sslv3=NO +ssl_tlsv1=NO +force_local_data_ssl=YES +force_local_logins_ssl=YES +force_dot_files=YES +allow_anon_ssl=YES +require_ssl_reuse=YES +ssl_ciphers=ECDHE:ECDSA:!aNULL:!eNULL:!EXPORT:!DES:!CAMELLIA:!RC4:!MD5:!SHA:!PSK:!aECDH:!EDH:!DH:!DSS:!CBC3:!CBC + +implicit_ssl=YES +listen_port=990 + +pasv_promiscuous=NO +#pasv_min_port=30000 +#pasv_max_port=30100 + +#syslog_enable=YES +log_ftp_protocol=YES + + # # Uncomment this to indicate that vsftpd use a utf8 filesystem. -#utf8_filesystem=YES +utf8_filesystem=YES

経路暗号化を実現するNAS用プロトコルの代替案について

NASに利用できるプロトコルは様々にありますが、

・sambaだと、ldapの設定無しに、tls/sslを利用できない。
・webdavはデータの破損が怖い (webdav vs ftpより)
・tls likeな通信がいいので、sftpは除外

という問題があり、ftpを試しました。非暗号接続でいいなら、sambaで十分なのですが。

補足情報(FW/ツールのバージョンなど)

ubuntu 18.04
vsftpd 3.0.3
iphone ios 11.4
ftpmanager 5.1.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2018/08/17 21:17

暗号化されていない判断した根拠はWireshark上で実際に生のデータ(ファイルの中身)が見えたということでよろしいでしょうか?
tatsa398

2018/08/18 08:30 編集

見当たりませんでした
guest

回答1

0

手元でvsftpdサーバーを立ててWiresharkでパケットキャプチャで確認しました。(CentoOS7とFFFTPを用いたので全く同じ環境ではありません)

検証はサーバーからクライアントへのダウンロードを行う物で、ダウンロードするファイルの中身は

This is a test file. Can you read me?

という内容のテキストファイルです。

暗号化していない場合は、下記のようなパケットになっていました。中身がパケットにそのまま現れる事が確認できます。(172.25.255.20がサーバー、172.25.255.17がクライアント)

11 0.073771 172.25.255.20 172.25.255.17 FTP-DATA 92 FTP Data: 38 bytes (PASV) (RETR test.txt) 0000 76 15 e0 3e 40 0f 00 15 5d 84 b2 0c 08 00 45 08 v.à>@...].²...E. 0010 00 4e 12 88 40 00 40 06 d1 c0 ac 19 ff 14 ac 19 .N..@.@.ÑÀ¬.ÿ.¬. 0020 ff 11 b6 a9 cb fc dc 46 d1 3a 06 05 9f 21 50 18 ÿ.¶©ËüÜFÑ:...!P. 0030 00 e5 67 b5 00 00 54 68 69 73 20 69 73 20 61 20 .ågµ..This is a 0040 74 65 73 74 20 66 69 6c 65 2e 0a 43 61 6e 20 79 test file..Can y 0050 6f 75 20 72 65 61 64 20 6d 65 3f 0a ou read me?.

次にimplicitモードにして試しました。コマンド自体は暗号化されていますが、FTPデータ通信用ポートを使った最初のパケットが次のようになっていました。

11 0.101559 172.25.255.17 172.25.255.20 TLSv1.2 361 Client Hello

これはTLSハンドシェイクの開始を意味しています。TLSハンドシェイクが完了した直後のパケットが下記です。

15 0.102205 172.25.255.20 172.25.255.17 TLSv1.2 121 Application Data 0000 76 15 e0 3e 40 0f 00 15 5d 84 b2 0c 08 00 45 08 v.à>@...].²...E. 0010 00 6b 5a d7 40 00 40 06 89 54 ac 19 ff 14 ac 19 .kZ×@.@..T¬.ÿ.¬. 0020 ff 11 ae 04 cb 0d 0e a0 77 51 10 5b 85 96 50 18 ÿ.®.Ë.. wQ.[..P. 0030 00 ed e8 34 00 00 17 03 03 00 3e 4b 98 8d 71 0e .íè4......>K..q. 0040 cb c3 c0 60 06 e7 3f 02 86 55 3b e5 0f 78 61 4c ËÃÀ`.ç?..U;å.xaL 0050 60 cc 50 49 68 c0 68 e0 f4 13 83 57 73 7e fe 1d `ÌPIhÀhàô..Ws~þ. 0060 8a f6 29 c8 13 90 3e 6e 2b 3a 8f 22 f4 0a b6 6b .ö)È..>n+:."ô.¶k 0070 50 a5 29 67 e3 44 1d 81 22 P¥)gãD.."

これ以外にサーバーからクライアントへのデータ通信が現れる事がなく通信は閉じられます。このことからFTPデータ通信のデータ本体と思われますが、暗号化されているため、内容を知ることは出来ません。

以上の事からFTPSはデータ通信でも正常に暗号化しています。

vsftpdの設定ではforce_local_logins_ssl=YESを設定していれば、匿名ではないFTP接続ではない場合、データ通信が暗号化されることを強制します。この設定がなされている限り、データ通信は暗号化されているはずです。それでも暗号化されていなかった場合、vsftpdのバグと考えられます。パケットの中身、TLSハンドシェイクが開始されていないか、生データがパケットに現れていないかを確認してみてください。


なお、Samba、つまりSMB/CIFSに用いられる認証プロトコルは既に暗号化されています(ただし、古いWindowsと互換性のために用意されているNTLMは脆弱であるため使うべきではありません。少なくともNTLMv2にすべきです)。しかし、SMBでデータ通信の暗号化がサポートされたのはSMB3からになります。最新のSambaはSMB3にによる暗号化に対応していますが、クライアントでのSMB3はWindows 8からですので、Windows 7では使用できません。
参考: smb encrypt - smb.conf
ただし、これらはSSL/TLSではありません。

他にもっと手軽にSSL/TLSでファイルサーバーのようなアクセスをする方法として、Nextcloudやowncloudがあります。dropboxのような使い方(デスクトップアプリもあります)になりますが、通信はHTTPS上のみ行われるため、暗号化されることは確実です。

投稿2018/08/18 02:46

編集2018/08/18 02:48
raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsa398

2018/08/18 05:44 編集

connect_from_port_20=NOとしたところ、 tlsパケットしか現れなくなりました。 代わりに、tcpが増えたような気がするので、tcpペイロードに生データがないか確認しています。 connect_from_port_20をNOにしてもいいのかわからないので、 connect_from_port_20について調べてみます
tatsa398

2018/08/18 06:24 編集

tcpペイロードに生データが含まれていないかの確認として、 以下を匿名ユーザーとunixユーザに対して適用すると、 ip.addr == (iphoneのip) && udp => なし ip.addr == (iphoneのip) && tcp.payload => tlsかtcp rstか接続エラー時の 平文の「500 oops」 となり、制御用通信とデータ用通信が両方暗号化されていました。 (確認方法として正しい!?) あと、経路暗号化に関する余談ですが、 vsftpd.confに「dsa_cert_file」というのがあるのですが、 ecdhe-ecdsaは使用できないでしょうか?
raccy

2018/08/18 08:24

connect_from_port_20の有無で変わるのは謎ですが、forec_anon_data_ssl=YESがないと匿名側は暗号化されるとは限らないことに注意してください。 vsftpdの暗号処理はOpenSSLに依存していますので、どんな暗号が使えるかはOSに入っているOpenSSL次第になります。
tatsa398

2018/08/18 08:29

他のところに一度書きましたが、 tcpペイロードについての返信なので、こちらに書かせて頂きます。 tcpペイロードに非暗号化データが含まれるかどうかの再確認として、 wiresharkのフィルタとして ip.addr == (iphoneのip) && tcp.payload && !ssl を適用し、テキストファイルをいくつかアップロードとダウンロードしました。 まず、testfile.txtの内容が「this file is test」である場合は、 tlsでないtcpペイロードはありませんでした。 しかし、「this file is test」という文字列をひたすらペーストして、ファイルサイズを1.5MBにしたところ、tcpと表示されたtcpペイロードが現れました。 しかし、そのtcpパケットのペイロード部分には、「this file is test」という文章は一切見当たりませんでした。 つまり、 vsftpdの仕様として、ファイル容量が大きい場合の負担を減らすために、tlsセッション上で直接ファイル転送をせずに、暗号化した分割データをtcpペイロードに載せてるように見えます。 これが本当にきちんと暗号化されているかは不明です。 自分は、smbの暗号化やftpの暗号化を信用していないため、アプリケーションレイヤの暗号化ではなく、tls/sslによる暗号化に頼りたいと考えています。 その意味では、tcpペイロード部分が一見すると平文を含んでいないですが、 どんな暗号化実装なのか見えてこないため、 目標達成ではないです。 このような仕様のソフトは結構存在するのでしょうか? ・forec_anon_data_ssl=YESについて 「forec_anon_data_ssl=YES」ありでも、 connect_from_port_20=YESだと、何故かftp-dataが現れました。
tatsa398

2018/08/18 08:36

>vsftpdの暗号処理はOpenSSLに依存していますので、どんな暗号が使えるかはOSに入っているOpenSSL次第になります。 osのopensslは「ecdhe-ecdsa」が使用できるのに、vsftpdでは使用できません。設定ファイルに載せたciphers_suiteにして、 nmap --script ssl-enum-ciphers -p 990 localhost で、ftpsの可能なciphers_suiteをチェックしても、 ``` PORT STATE SERVICE 990/tcp open ftps | ssl-enum-ciphers: | TLSv1.2: | ciphers: | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A | compressors: | NULL | cipher preference: client | warnings: | Key exchange (secp256r1) of lower strength than certificate key |_ least strength: A ``` となります。vsftpdの暗号処理はOpenSSLに依存してるなら、vsftpdを再コンパイルするか、どこかにopensslについての設定ファイルがあるか探して調整するしかないのでしょうか。
raccy

2018/08/18 08:38

Wireshark上のTLSやTCP、FTPなどの表記はWiresharkがポート番号やパケットの中身を分析して勝手に出しているだけに過ぎません。TLSで暗号化されたデータも初めのハンドシェイクががなく途中からのキャプチャであり、ポート番号もWellknownでなければ不明なデータとして扱われます。 本当に暗号化されたかどうか見るにはパケットの中身自体で判断してください。ただし、SSL/TLSなどにかなり深い知識が無ければ、判断は難しいです。判断基準はそのパケットから元の平文のデータを復元できるか出来ないかであり、秘密鍵がないと復元できなければ暗号化されている事になります。
tatsa398

2018/08/18 08:58

サーバの提示するスイートの鍵交換がrsaしかないので、 http://d.hatena.ne.jp/ozuma/20140413/1397397632 にしたがい、vsftpdの設定ファイルの /etc/pki/tls/certs/vsftpd.pem を秘密鍵に指定して復号を試みましたが、暗号化されたままです。
raccy

2018/08/18 09:01

秘密鍵と証明書もECDHE-ECDSA用に楕円曲線暗号にしているでしょうか?ただ、私は楕円曲線暗号は使ったことがないので、本当に出来るかどうかは試していません。
tatsa398

2018/08/18 09:15 編集

ftpsで現在可能なスイートは、先程提示した TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A です。server helloでは、 Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 が選択されています。そのため、鍵交換がrsaであるので、普通の方法で可能なはずです。 PS1: https://www.slideshare.net/mnrkbys/pfstls ecdhe-rsaなので、おそらくsslkeylogfilesを用いないと不可能なようです。 PS:2 暗号スイートの読み方を間違えてました。 http://enterprise.arcgis.com/ja/portal/latest/administer/windows/restrict-portal-for-arcgis-ssl-protocols-and-cipher-suites.htm 「暗号スイートの表」 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 だと、鍵交換がecdheなので、sslkeylogfilesが必須ですね。 検証してみます。
raccy

2018/08/18 09:09

復号できなければ、どこかでやり方が間違っていると言うことです。私もSSL/TLSについては通信の概要しかしりませんので、細部に関する分析についてはアドバイスは出来ません。本当に不安であれば、セキュリティの専門家に依頼するか、自分自身がセキュリティの専門家になるしか無いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問