CentOS 7 で安全にファイルをアップロード、SSLを利用したFTPサーバーを導入する

2018/05/21 CentOS, Linux, サーバー構築

ftp-top
前回の記事「CentOS 7 への Apacheインストール。最短でウェブサーバーを構築してテストページを表示する。」でウェブサーバー環境が完成しました。続いてウェブサーバーへコンテンツをアップロードするためにFTPサーバーのセットアップ手順を紹介します。SSHが利用できる環境ならSFTP(FTPと付いてますが、SSH通信上でファイル転送を行うための機能になります。)を利用することも可能ですが、現状ではコンテンツのアップロードにFTPを利用することが多いかと思います。
FTPはファイルの転送に利用する通信です。そのままだとスニッファ(盗聴)などでファイルの内容が見えてしまう可能性もありますので、本記事ではセキュアなFTPS(SSLで暗号化されたFTP通信)を利用するように設定を行います。

スポンサーリンク

目次

1.FTPサーバーを導入する環境

FTPサーバーを導入する環境は、以前の記事「CentOS 7 への Apacheインストール。最短でウェブサーバーを構築してテストページを表示する。」で作成したウェブサーバーになります。
以前の記事に詳細な環境は記載していますが、基本的な環境は以下の通りです。

  • OSのバージョンはCentOSで最新のバージョン7.4を利用しています。
  • CentOS 7系であれば、どのバージョンでも同じ手順で構築が可能です。
  • サーバーはインターネットへ接続されており、グローバルIPアドレスが一つ、割り当てられています。
  • ウェブサーバーとしてhttpdがインストールされています。
  • ファイアウォールとしてfirewalld、若しくはiptablesを設定しています。

この環境を前提に先へ進めて行きます。

2.ftpパッケージの確認

CentOSの標準レポジトリに含まれるftpパッケージを確認します。CentOSでは標準でvsftpdというftpサーバが用意されています。インストール前にパッケージの情報を表示して、想定しているものと合致していることを確認します。

2-1.パッケージ確認

CentOSに含まれるvsftpdと名前の付くパッケージのリストを確認します。パッケージリストの確認は、yumコマンドにオプションのsearchを付けて実行します。

この中でftpサービスに該当するパッケージはvsftpdになりますので、これをインストールします。
インストール前に間違いないか、念のためにvsftpdのパッケージ詳細を確認します。

vsftpdサービスのパッケージであることが確認できましたので、このパッケージをインストールします。

3.vsftpdパッケージのインストール

項目2.で確認したvsftpdパッケージをyumコマンドでインストールする手順を記載していきます。

3-1.yumコマンドによるvsftpのインストール

vsftpdパッケージはyumコマンドに”install”オプションを付けることでインストールすることができます。

上記ではyumコマンドに-yオプションを付けることでインストール時の確認応答を省いています。コマンドを実行すると、以下のようにインストールが開始されます。

エラーの出力がなく、「完了しました!」と表示されれば、vsftpdのインストールは正常に完了しています。

3-2.vsftpdインストール後の確認

vsftpdがインストールされたことを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、vsftpdパッケージがインストールされていることを確認します。

出力結果として、以vsftpdパッケージが表示されることを確認します。

続いてvsftpdがインストールされた場所を確認します。インストールされた場所(パス)を確認するためにはwhichコマンドを利用します。以下のように実行することでインストールパスを確認できます。

実行結果は以下のようになります。

この結果から、vsftpdが/usr/sbin以下にインストールされたことが確認できます。
これでvsftpdのインストールが正常に終了したことが確認できました。

3-3.vsftpdの起動と確認

ここまででvsftpdのインストールと確認が完了しましたので、続いてインストールしたvsftpdが起動することを確認します。CentOSでは7系からsystemctlコマンドでサービスの起動・停止を行います。vsftpdは以下のように実行することで起動できます。

エラーが出力されなければ、vsftpdは正常に起動しています。
systemctlコマンドにstatusオプションを付けて実行することで、起動したサービスの状態について、詳細な情報を取得することができます。以下が実行例です。

上記では分かり難いかもしれませんが、黒丸(●)の部分が正常な起動状態の場合、緑色で表示されます。
また、Activeの項目にrunningと表示されていることから、vsftpdが起動していることが確認できます。
稼働しているプロセスを表示するpsコマンドでもvsftpdが起動していることを確認できます。
以下のように実行します。

以上の結果から、vsftpdが正常に起動することが確認できました。

3-4.vsftpdのスタートアップ設定(自動起動設定)

サーバーの再起動や停止の復旧時に、vsftpdが自動的に起動するように設定します。サービスの自動起動を設定するにもsystemctlコマンドを利用します。自動起動は以下のようにsystemctlコマンドを実行します。

エラーが出力されなければ、自動起動は設定が完了しています。

続いて自動起動が設定されたことを確認します。こちらもsystemctlコマンドから確認できます。

実行結果として “enabled”と表示されればvsftpdの自動起動設定は完了です。

4.vsftpdの設定ファイル変更

項目3.の手順までで、vsftpdパッケージの導入までが完了しました。vsftpdの場合は設定の変更を行わないとFTP接続できない場合(firewallによって拒否されたり、パッシブ接続が有効になっていないなど)があります。本記事ではvsftpdを運用するにあたって最低限、必要になる設定を行います。設定の前提は以下の通りです。

  • FTPユーザーは、自身のホームディレクトリ以上に移動できない (chroot設定)
  • アノニマス(不特定なユーザー)FTPは利用しない
  • FTPはSSL通信で行う(FTPS設定)
  • .(ドット)の付いた隠しファイルを表示する
  • インターネット経由での接続を考え、パッシブFTPの設定を行う(接続ポートは60001から60010に固定)
  • その他、基本的に行ったほうが良い設定の変更

この条件に合わせて設定を行っていきます。

4-1.vsftpd.confの変更

vsftpdの設定は/etc/vsftpd以下にあるvsftpd.confで行います。
vsftpd.confの編集前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

バックアップ(コピー)の完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

4-1-1.アノニマスFTPの無効化

vsftpdではデフォルトで匿名FTPサーバ(ユーザー情報を持っていない第三者がログインできるFTPサーバ)が可能な状態に設定されています。この機能はセキュリティホールになりますので、無効化しておきます。設定は以下のパラメーターを変更します。

に変更します。

4-1-2.asciiアップロード、ダウンロードの有効化

デフォルトの設定ではasciiのアップロードとダウンロードが無効化されています。特定のプログラム言語(例えばPerlなど)を記載したCGI用ファイルなどはasciiでないとアップロードした際に動作しなくなる可能性がありますので、asciiでのアップロードとダウンロードを有効化します。以下のパラメーターを変更します。

パラメーターのコメント部分”#”を外します。

4-1-3.chroot設定

ユーザーを自身のホームディレクトリ以上に移動できないようにchroot設定を行います。ファイルの修正と、空ファイルの作成の二つの変更をおこないます。まず設定ファイルの修正です。

パラメーターのコメント部分”#”を外します。

に変更します。
併せてchrootを許可するリストを記載したファイル指定します。このファイルは後ほど(項目.4-2)作成しますので、変更時点では無くとも大丈夫です。

パラメーターのコメント部分”#”を外します。

に変更します。

4-1-4.ls有効化設定

ls -R を有効にする設定を行います。本設定はディレクトリごと一括での転送機能を有効化します。

からコメントを外して

に変更します。

4-1-5.SSL通信有効化の設定

SSLでFTP接続ができるように設定を行います。この項目は設定ファイルにはありませんので項目を追記してください。以下を追加します。

SSL機能を有効化するための項目と、SSL通信で利用するサーバー証明書ファイルのパスを設定します。

スポンサーリンク

4-1-6.パッシブポートの設定

パッシブFTPが利用できるように、データコネクション用のポートを固定します。パッシブモードではデータコネクションはポート番号20ではなく、ランダムなポート番号が割り当てられ、その情報がFTPクライアントにその情報が伝えられます。
firewallが設定されていない場合はパッシブモードは不要ですが、本環境ではfirewallが設定されているため、必要な設定になります。全てのポートをオープンすることはセキュリティ上、好ましくないため、今回は60001 ~ 60010ポートにFTPデータコネクション用ポートを割り当てます。以下のように設定ファイルに追記します。

4-1-7.その他の設定

その他、vsftpdの運用に設定しておいたほうが良い点について、項目を追加します。この設定は、パッシブポートの設定の下に記載する形にしています。以下を設定ファイルの最下行に追記します。

各設定パラメーターの内容は以下の通りです。
usr_localtime設定は、FTPで接続した場合の時間を設定するパラメーターです。本設定を有効にすると、FTP接続時にファイルの更新時間が、日本時間になります。本設定がない場合、FTPで接続した際にファイルの更新時刻がGMTで表示されます。
allow_writeable_chrootを設定しない場合、chrootした先に書き込み権限があるとエラーとなるようです。書き込み権限は必要になりますので、設定を行います。
force_dot_filesは隠しファイルである.ファイル(例えば.bashrcや.htaccessなど)を表示する設定です。任意ですが、ここでは全てのファイルを表示させたいため、設定をしています。

ここまでの7点で設定ファイルの変更は完了です。変更したファイルを保存してください。

4-2.chroot用ファイルの作成

続いてchrootを行うための空ファイルを作成します。実際にはホームディレクトリ以上に移動できるユーザーを記載するファイルですが、全てのユーザーはホームディレクトリ以上に移動できない設定のため、空のファイルを作成するだけで問題ありません。
空のファイルはtouchコマンドで作成します。作成するファイル名は”chroot_list”になります。
以下のようにコマンドを実行します。

作成後、ファイルを確認します。

作成した chroot_listファイルがlsコマンドで表示されれば、作成は完了です。

5.firewallの許可設定

本記事は、FTPサーバーの導入環境として、記事「CentOS7の基本設定 Linuxのインストール後に設定する9つのポイント」の項目6.で記載したfirewall設定を行っていることを前提としています。
このfirewall設定の場合、FTPのパッシブ接続ポートである60001~60010番をオープンしていないため、インターネット側からFTPでアクセスしても接続できません。(ローカル環境の場合はパッシブFTPを利用しないため、接続できます。)
その為、firewall-cmdコマンドを利用してルールを追加し、パッシブFTP接続できるようします。
※iptablesを利用している場合は、項目5-2.を参照して設定を行って下さい。

5-1.firewall-cmdコマンドによるパッシブFTP接続ポートのオープン

記事「CentOS 7 インストール Linuxを始めるにはインストールからがお勧め」で作成した”manage”というzoneにパッシブ接続用ポートの設定を追加します。

5-1-1.現状の設定確認

先ずは現状の確認を行います。

上記のように 111.8.21.167のIPアドレスからのみ、sshとftpを許可するように設定されていることを確認します。

5-1-2.パッシブ接続用ポートの許可

firewall-cmdコマンドでウェブサーバーの待ち受けポートである80番に外部から接続できるように設定を追加します。コマンドは以下のように実行します。

上記はmanageゾーンに対して、60001-60010のtcpポートを接続用ポートとして追加するというコマンドです。
基本的にはfirewall-cmdは実行結果として”success”と応答があれば、設定は正常に完了しています。(以下も同様です。)

5-1-3.設定の反映

設定した内容を反映するためにreloadを実行します。

5-1-4.設定の確認

設定の確認は以下のコマンドで行います

表示された結果の”ports”項目に”60001-60010/tcp”が追加されていれば、設定の確認は完了です。

5-2.iptablesコマンドによるパッシブFTP接続用ポートのオープン

iptablesコマンドでパッシブFTP接続用ポートある60001-60010番に外部から接続できるように設定を追加します。コマンドは以下のように実行します。

エラーが表示されなければ設定は完了しています。
iptablesコマンドを実行後に設定が追加されていることを確認します。確認は以下のように実行します。

以下が実行結果の例になります。

Chain INPUTの8行目に設定を行った60001-60010番ポートが追加されていることが確認できます。設定を確認後、保存を行います。保存は

で行います。上記のように[OK]が表示されれば正常に設定は保存されています。これでiptablesによるfirewallの設定は完了です。

6.FTPS(FTP通信を暗号化する)設定

続いてFTPの通信を暗号化するためにSSLの設定を行います。SSLを利用するためには、SSL証明書ファイルの作成が必要になります。この手順について記載していきます。

6-1.サーバー証明書の作成

SSL通信を行うために証明書ファイルを作成します。ここで作成したファイルはvsftpd.confの”rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem”で指定しています。証明書ファイルを作成するディレクトリに移動します。

6-1-1.証明書ファイル作成コマンドの実行

makeコマンドで証明書ファイルを作成します。以下が実行例になります。

6-1-2.証明書ファイル用の情報を入力

証明書ファイルを作成するための情報を入力します。入力例は以下のようになります。
※実際にはご利用の環境に合わせて下さい。

上記の情報を入力すると、証明書ファイル(vsftpd.pem)が作成されます。

6-1-3.証明書ファイルの確認

証明書ファイルが作成されていることを確認します。

vsftpd.pemが作成されていることが確認できます。

6-2.vsftpdの再起動

証明書ファイルの作成が完了しました。これで設定は全て終わりましたので、vsftpdを再起動して、設定を反映します。

エラーが出力されなければ、vsftpdは正常に再起動しています。続いてvsftpdの状態を確認します。

Active項目にrunningが表示されていますので、正常にvsftpdが起動していることが確認できました。
これでSSLを利用したFTP、FTPSの導入が完了しました。

7.FTPの接続確認

項目6.まででFTPの導入と設定、FTPSの設定まで完了しました。ここでは実際にFTPクライアントを利用して、FTP接続をテストしてみます。FTPクライアントはWindowsで良く利用される”FFFTP”を使っています。

7-1.ffftpでの接続

ffftpのでユーザー名とパスワード、ホストのIPアドレスを入力して接続をクリックします。
centos-ftpd-inst-7-1
証明書の確認が表示されます。これは項目6.で作成した証明書を信頼するかの確認になります。[OK]をクリックして、先へ進めます。
centos-ftpd-inst-7-1-2
暗号化の状態を保存するかの確認があります。[はい]をクリックして先へ進めます。
centos-ftpd-inst-7-1-3
FTPSで接続しています。画面の上部に、「暗号化されています」と表示されていることが確認できます。
centos-ftpd-inst-7-1-4
これで接続のテストは完了です。

ここまででFTPサーバーの導入は完了です。SFTPの場合、chrootの設定がやや面倒な部分もあり、まだまだFTPSを利用する環境は多いと思います。是非、暗号化された通信でセキュアなFTPSを設定してみて下さい。

関連する記事


システムでお困りのお客様

もし、貴社で、

  • サポート切れのサーバやネットワーク機器の入れ替えをしたいが、どうしたらよいかわからない
  • サーバやネットワークの管理を行う社員がいないため困っている
  • 業務に利用している機器のセキュリティが大丈夫か心配
  • 機器の障害で、業務への影響が発生している
  • 社内の要望に対して、どのようなシステムを導入したらよいか解らない

など、サーバーやネットワーク、セキュリティでお悩みの方、新規のシステム導入を検討中の方。
多くのシステム構築を行い、成功させてきた実績をもつ弊社が、その問題を解決します。
お気軽にお問い合わせ頂き、貴社の問題解決にお役立てください。

お問い合わせ・ご相談はこちらから

Facebookでのご購読が便利です。

Twitter・Feedlyでもご購読できます。

Twitterでフォローする Feedlyでフォローする

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク