Linux 系(RedHat 7 系)で FTPS サーバの構築と設定をしてクライアント PC からファイルを転送する手順を解説します。
ファイル転送なら FTP(File Transfer Protocol)が有名ですが、インターネット経由でデータを転送するとデータの中身が丸見えになってしまうため、FTPS(File Transfer Protocol over SSL/TLS)でデータを暗号化してデータを転送します。
FTP の説明です。
【初心者向け】FTPとは?
FTPS(File Transfer Protocol over SSL/TLS)とは?
FTPS は「File Transfer Protocol over SSL/TLS」の略です。
プロトコル名に「SSL/TLS」の文字が入っていることからも SSL/TLS プロトコルを利用してデータを暗号化します。
【レンタルサーバー】 ファイルをアップロードする時は FTP より SCP や SFTP を使う
FTP と SFTP と FTPS の違い
- FTP(File Transfer Protocol) ← FTPでデータを送受信します。
- SFTP(SSH File Transfer Protocol) ← SSH の機能を利用してデータを送受信します。
- FTPS(File Transfer Protocol over SSL/TLS) ← FTPで送受信するデータをSSL/TLSで暗号化します。
FTP と SFTP と FTPS それぞれが使用するポート番号
- FTP(File Transfer Protocol) ← 20/TCP(データ転送)、21/TCP(データ制御)
- SFTP(SSH File Transfer Protocol) ← 22/TCP
- FTPS(File Transfer Protocol over SSL/TLS) ← Explicit(20/TCP,21/CTP)、Implicit(20/TCP,21/TCP,990/TCP)
FTPS サーバの設計
- プラットフォームは AWS(アマゾン ウェブ サービス)を利用する
- OS は RedHat 7 を使用する
- SSL 証明書は自己署名証明書(オレオレ証明書)
- 秘密鍵のパスフレーズは「なし(無し)」にする
- ドメインはお名前.com で取得し DNS レコードは Route53 に登録する
FTPS サーバの構築手順
大まかに言えば、以下のような構築手順になります。
- Amazon EC2 インスタンスの作成
- 自己署名証明書(オレオレ証明書)の作成
- Elastic IP の取得
- Route53 への登録
- FTPツールのインストールおよび設定
- 動作検証
- トラブルシューティング
Amazon EC2 インスタンスの作成
Amazon EC2 インスタンスは既存のインスタンスを使用します。
[ec2-user@redhat7 ~]$ cat /etc/redhat-release |
自己署名証明書(オレオレ証明書)の作成
次に自己署名証明書を作成します。
以下、自己署名証明書の作成手順の参考です。
【Linux】【CentOS6】Apache で「自己証明書(オレオレ証明書)」を作成して HTTPS でアクセスできるようにする手順
自己署名証明書の作成作業
今回は以下の openssl コマンドで /etc/vsftpd ディレクトリに一気に自己署名証明書(オレオレ証明書)を作成します。
[root@redhat7 ~]# openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem |
■オプションの解説
- req ← CSR ファイルを作成します。
- -x509 ← x509 という規格で証明書を発行します。x509 とは公開鍵基盤(PKI)の規格です。
- -nodes ← nodes は「NO DES」で秘密鍵を暗号化しないオプションになります。通常、セキュリティを考慮すれば DES や DES3 や AES などで秘密鍵を暗号化します。(Apache 等の場合は、Apache を再起動するたびにパスフレーズを聞かれるので -nodes でパスフレーズをなしにします)
- -newkey rsa:1024 ← 秘密鍵の作成を行います。暗号方式は RSA で鍵長は 1024 bit です。
- -keyout /etc/vsftpd/vsftpd.pem ← 秘密鍵の出力先とファイル名を指定します。
- -out /etc/vsftpd/vsftpd.pem ← 自己署名証明書(オレオレ証明書)の出力先とファイル名を指定します。
以下のようにファイルが作成されます。
[root@redhat7 vsftpd]# ls -l |
■vsftpd.pem ファイルの中身
vsftpd.pem ファイルの中身は以下のように「秘密鍵」と「サーバ証明書」が入っています。
[root@redhat7 vsftpd]# cat vsftpd.pem MxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxM |
OpenSSLのバージョン確認
エラーが出力された場合は、以下の OpelSSL のバージョン確認のコマンド(openssl version)を実行してみます。
もしエラーになった場合は、OpenSSL がインストールされていないため、「yum install openssl」コマンドでインストールします。
[root@redhat7 ~]# openssl version |
Elastic IP の取得
通常、EC2 インスタンスとドメイン設定する場合、ELB(Elastic Load Balancer)にドメインを結びつけますが、今回は FTP サーバー 1 台構成で構築するために、ELB ではなく EC2 インスタンスに直接ドメインを結びつけます。
そのため事前に「Elastic IP」を取得し、「Elastic IP」を EC2 インスタンスに割り当てます。
「Elastic IP」を取得しないと、EC2 インスタンスの停止・起動のタイミングでグローバル IP が変わる可能性があります。
AWS 管理コンソールより「サービス」-「ネットワーキング&コンテンツ配信」-「VPC」を選択します。
VPC ダッシュボードに移動したら、左側ペインより「Elastic IP」をクリックします。
「新しいアドレスの割り当て」ボタンをクリックします。
下図のような確認画面が表示されたら「割り当て」ボタンをクリックします。
「Elastic IP」が割り当てられたことを確認します。
アドレスの関連付け
次に取得した「Elastic IP」を FTPS サーバーとしたい EC2 インスタンスに関連付けます。
※ELB を経由しないため、直接 EC2 インスタンスに関連付けします。
「Elastic IP」の画面より、関連付けをしたい「Elastic IP」を選択して「アクション」-「アドレスの関連付け」をクリックします。
下図のように関連付けをしたい「EC2 インスタンス」と「プライベート IP」を選択して「関連付け」ボタンをクリックします。
「新しいアドレスの関連付けが成功しました」のメッセージが表示されることを確認します。
下図のように EC2 インスタンスに「Elastic IP」が割り当てられていることを確認します。
独自ドメインを Route 53 へ登録
次に「お名前.com」で取得した独自ドメインを Amazon Route 53 に登録します。
【AWS】Route53 に「お名前.com」取得の独自ドメインを登録して Amazon SES(Simple Email Service)で SMTP プロトコルでメールを送信する手順
【AWS】Route53に「お名前.com」取得の独自ドメインを登録してSES(Simple Email Service)で無料でメールを受信する手順
独自ドメインを新規登録する
AWS の管理コンソールにログインし「サービス」-「ネットワーキング&コンテンツ配信」-「Route 53」をクリックします。
ドメインが登録されていない場合は、下図のように「Get started now」ボタンが表示されるのでクリックします。
「Create Hosted Zone」ボタンをクリックします。
もう一度「Create Hosted Zone」ボタンをクリックします。
下図のように設定して「Create」ボタンをクリックします。
- Domain Name ← ドメイン名を入力します。
- Type ← Public Hosted Zone を選択します。
ドメインを作成すると下図のようにネームサーバーが表示されるので、後程この 4 つのネームサーバーを「お名前.com」に登録します。
「Create Record Set」ボタンをクリックします。
下図のように設定して「Create」ボタンをクリックします。
- Name ← ドメイン名でサーバーにアクセスしたいので、Name は空欄のままにします。
- Type ← 「A – IPv4 address」を選択します。
- Value ← Elastic IP のアドレスを入力します。
下図のように「Elastic IP」で A レコードが作成されていること確認します。
お名前.com にネームサーバーを登録する
「お名前.com Navi」にログインします。
「お名前.com Navi」にログインしたら、メニューより「ドメイン一覧」をクリックします。
対象ドメインのネームサーバーの「変更する」ボタンをクリックします。
下図のように確認画面が表示されるので「登録情報は正しいので、手続きを進める」ボタンをクリックします。
「他のネームサーバーを利用」タブをクリックします。
先ほどの Route 53 で表示されたネームサーバー 4 つをすべて入力し「確認画面へ進む」ボタンをクリックします。
下図のように確認画面が表示されるので「設定する」ボタンをクリックします。
下図のように「ネームサーバーの変更 完了」画面が表示されることを確認します。
コマンドプロンプトを起動して「nslookup」コマンドで動作確認をします。
C:\Users\xxxx>nslookup xxxx.com 8.8.8.8 |
以上でドメインの登録及び設定は完了です。
FTPツール(vsftpd)のインストールおよび設定
Linux(RedHat 7)に FTP ツール(vsftpd)をインストールします。
FTPツール(vsftpd)のインストール
最初に root アカウントにスイッチします。
[ec2-user@redhat7 ~]$ sudo su – |
yum コマンドで vsftpd をインストールします。
[root@redhat7 ~]# yum install vsftpd |
FTPツール(vsftpd)のコンフィグファイル(/etc/vsftpd/vsftpd.conf)の編集
次に vsftpd のコンフィグファイル(/etc/vsftpd/vsftpd.conf)を設定します。
最初に設定ファイルをバックアップします。
[root@redhat7 ~]# cp -ip /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org |
vi コマンドで「/etc/vsftpd/vsftpd.conf」を編集します。
[root@redhat7 vsftpd]# vi /etc/vsftpd/vsftpd.conf |
SSLを有効化します。
# SSLを有効化します。 |
SSLv2 と SSLv3 は使用しません。
# SSLv2とSSLv3は使用しません。(明示的にNOにします) |
TLS を使用する設定にしますが、TLS 1.0 は使用せずに、TLS 1.1 と TLS 1.2 のみ使用します。
# TLSを使います。 |
SSL での anonymous 接続を許可しません。
allow_anon_ssl=NO |
ローカルユーザー接続でログインとデータ転送に SSL を使用します。
※ローカルユーザー接続とは、FTP サーバに存在するアカウント(test001とかtest3とか)でアクセスすることを言います。
# ローカルユーザー接続でログインとデータ転送に SSL を使用します。 |
証明書の場所を指定します。
サーバー証明書の情報も、秘密鍵(プライベートキー)の情報も「/etc/vsftpd/vsftpd.pem」ファイルにまとめています。
# 証明書の場所を指定します。 |
anonymous 接続(アノニマス接続)を許可しません。
# Allow anonymous FTP? (Beware – allowed by default if you comment this out). |
IPv4 アドレスに対してのみ Listen します。
IPv6 アドレスからは Listen しません。
# When “listen” directive is enabled, vsftpd runs in standalone mode and |
■今回編集した結果の「/etc/vsftpd/vsftpd.conf」ファイル
[root@redhat7 vsftpd]# cat vsftpd.conf |
vsftpd サービスの起動
コンフィグの編集が完了したら vsftpd サービスを起動します。
[root@redhat7 log]# systemctl start vsftpd.service ← vsftpd サービスを起動します。 |
FTPS での「アクティブモード」と「パッシブモード」の違い
FTP に「アクティブモード」と「パッシブモード」がありますが、FTPS にも「アクティブモード」と「パッシブモード」があります。
【FTPの基本】 「アクティブモード」と「パッシブモード」の違いとは?
- アクティブモード ← サーバー から クライアントへデータコネクションを張る
- パッシブモード ← クライアント から サーバーへデータコネクションを張る
以下の vsftpd.conf ファイルで「パッシブモード」で接続される
今回設定した以下の vsftpd.conf ファイルの場合、パッシブモードで FTPS サーバーに接続されていました。
■今回編集した結果の「/etc/vsftpd/vsftpd.conf」ファイル
[root@redhat7 vsftpd]# cat vsftpd.conf |
■WinSCP のログ
WinSCP のログを確認すると以下の構成になっています。
- Explicit モード
- パッシブモード
. 2019-03-21 15:16:26.862 ————————————————————————– |
■明示的に Implicit モードにする場合
明示的に Implicit モードにする場合、「/etc/vsftpd/vsftpd.conf」ファイルに以下の設定を入れます。
implicit_ssl=YES |
「YES」で Implicit モードになります。
デフォルトではこの設定は入っていないので、自動的に Explicit モードになります。
明示的に Explicit モードにしたい場合は、「implicit_ssl=NO」の設定を入れます。
明示的にパッシブモードにする場合
vsftpd.conf では、特に指定しなければデフォルトでパッシブモードになります。
pasv_enable=YES |
パッシブモードを許可したくない場合(アクティブモードにしたい場合)は、「pasv_enable=NO」を設定します。
明示的にパッシブモードに設定したい場合は上記のように「pasv_enable=YES」を設定します。
パッシブモードの場合で明示的にポート範囲を設定したい場合
パッシブモードの場合、あらかじめサーバーが指定するポート番号を設定(指定)することができます。
パッシブモードの場合は、サーバー側の 1024 番以上のエフェメラルポートに対してパケットが送られてきます。
サーバー側で Firewall を設定していると、データ転送は失敗します。
データ転送用のポート範囲を指定するには、「/etc/vsftpd/vsftpd.conf」ファイルに「pasv_max_port」と「pasv_min_port」を設定します。
以下は例として、パッシブモードで利用するエフェメラルポートを明示的に「60010」~「60020」に設定しています。
pasv_min_port=60010 pasv_max_port=60020 |
特に何も設定していない場合は、デフォルトの値になります。場合は、設定されていないので、以下のように設定されているので、どのポートにアクセスされるか分かりません。
- pasv_min_port=0 ← any ポート(どのポートになるか分かりません)
- pasv_max_port=0 ← any ポート(どのポートになるか分かりません)
パッシブモードでファイアウォールを絞った場合
動作検証のため、パッシブモードでファイアウォール(Amazon EC2 のセキュリティグループ)で以下のように絞った場合です。
- TCP/20
- TCP/21
WinSCP でログインしようとすると、下図の状態で止まります。
WinSCP のログは以下のようになっています。
. 2019-03-21 21:08:09.930 ————————————————————————– |
パッシブモードでエフェメラルポートを指定した場合
以下のように「/etc/vsftpd/vsftpd.conf」ファイルを編集します。
# パッシブモードの設定を明示的に追加
# パッシブモードで使用するポート番号(エフェメラルポート番号)を設定します。 |
vsftpd を再起動します。
[root@redhat7 ~]# systemctl restart vsftpd.service |
セキュリティグループの設定も以下のようにポート番号の範囲を指定して許可します。
WinSCP で FTPS でサーバーにアクセスできることを確認します。
ログを確認します。
. 2019-03-21 23:57:08.328 ————————————————————————– |
WinSCP を使用しての動作検証
WinSCP で動作検証を行います。
WinSCP を起動して「新しいサイト」をクリックします。
以下のように設定します。
- 転送プロトコル ← FTP(FTPS はないので FTP を選択します)
- 暗号化 ← 明示的な TLS/SSL 暗号化
- ホスト名 ← コモンネーム(FQDN)を入力します。
- ポート番号 ← 21
- ユーザ名 ← FTP サーバーで作成したアカウントを入力します。
- パスワード ← パスワードを入力します。
「保存」ボタンをクリックして「ログイン」ボタンをクリックします。
今回の証明書は正式な証明書ではなく、自己署名証明書なので下図のような警告画面が表示されます。
「はい」をクリックします。
下図のようにファイルをアップロード&ダウンロードできることを確認します。
SSL/TLS で通信しているか確認する
実際に SSL/TLS で通信ができているのかパケットキャプチャして確認します。
以前作成した tcpdump の使い方の記事です。
tcpdump のインストールと使い方 パケット解析をする
ホストとプロトコルを絞って tcpdump コマンドを実行します。
[root@redhat7 ~]# tcpdump src host xx.xx.xx.253 and -nn not port 22 and not arp |
WinSCP のログを確認します。
TLSv2 でアクセスしていることが確認できます。
. 2019-03-16 17:09:46.751 ————————————————————————– |
トラブルシューティング
鍵がうまく作成できていないと以下のように「500 OOPS: SSL: cannot load RSA certificate 」のメッセージが出力されます。
[root@redhat7 ~]# systemctl status vsftpd.service -l |
パスフレーズが付いている場合や、証明書がうまく作成できていない場合はエラーになります。
—–BEGIN CERTIFICATE—– |