【CentOS7】【vsftpd】FTPサーバ構築

[スポンサーリンク]


CentOS7にFTPでファイル転送


先日PythonでTwitterAPIを使って、画像ツイートをしました
その時に一番苦戦したのは、CentOSサーバに画像を設置すること(笑)
CentOSにFTPサーバを構築して、画像を転送出来る様にした作業を記録します

【Python3】【TwitterAPI】Pythonで画像付きツイート(POSTmedia/upload)
Python3でTwitterAPI使用する準備Python3でTwitterAPI使用する準備として、下記を行いました①APIキーとトークンの取得②ライブラリのインストールメディア...

参考サイト


CentOS7にvsftpdをインストールして、FTPサーバを構築するにあたり参考にさせて戴いたサイトです
非常に分かり易く、必要作業を記載されています

CentOS 7のvsftpdでセキュアなFTPSが利用できるFTPサーバーを構築する
CentOSとApacheでウェブサーバーを構築した前回の記事の環境を利用して、今回はFTPサーバーのインストールと設定手順を紹介したいと思います 参考 CentOSとApacheでウェブサーバーを構

[スポンサーリンク]


FTPとは


FTPとはFile Transfer Protocolで、ファイル転送を行う通信プロトコルです
FTPクライアントとFTPサーバ間で、ファイルのアップロード/ダウンロードを実現します


セキュリティを確保したFTP通信FTPSとSFTP


単純なFTPは、ユーザ/パスワードの認証情報や転送するファイルは暗号化されていません

セキュリティが考慮されたFTPS、SFTPの通信プロトコルがあります
FTPSはSSL/TLS、SFTPはSSHによって、通信のセキュリティを実現しています

今回は実施しませんが、今後SSL証明書を作成しFTPSでの通信が出来るようにしたいと思います


アクティブモードとパッシブモード


FTPは二つのポートを使い、それぞれコネクションを使ってファイルを転送します
一方は制御用のコネクションで、他方はデータ転送用のコネクションです

FTP通信には、アクティブモードとパッシブモードの二つのセッション確立モードがあります
大きな違いは転送コネクションの開始(★)の方向とポートです

アクティブモードは、サーバは21ポートのみデータ転送に使用で済みますが、クライアントは指定されたポートでの通信を受け付ける必要があります

パッシブモードは、1024以降のポート(※)をデータ転送用に開放しなければいけませんが、クライアントからは指定範囲のポートへ通信を要求するだけになります
※ ウェルノウンポート(0~1023)で予約済の為に使用出来ない

パッシブモードでは、クライアント側からしか通信を開始しないのが重要です
FireWallは外部からの接続(侵入行為)を禁止し、自分自身(内部)からの通信は許可する設定することが多いです
クライアント側は、外部からの接続を受け付ける必要がなく、セキュリティが確保しやすい方法になります
(外部流出等を防ぐ場合には、クライアントも内部からの通信も遮断が必要ですが)

・アクティブモード
FTPサーバから、ファイル転送のセッションの確立をする方法です
FTPサーバが能動的(アクティブ)に、FTPクライアントとセッションを確立します
クライアントは、サーバから指定されたポートでの通信を受け付ける必要があります

フロー概要は以下です

コネクションサーバ
通信ポート
通信方向クライアント
通信ポート
通信内容
制御21任意FTPサーバの21番ポートへ
制御用コネクションを接続
制御21任意FTPクライアントへ
ユーザ認証を要求
制御21任意FTPサーバへ
ユーザ認証情報を送信
制御21任意FTPクライアントへ
データ転送に使用するポートを連携
制御21任意FTPサーバへ
ファイル転送を要求
転送★20指定FTPクライアントへ
データ転送用コネクションを接続
転送20指定データ転送
(アップロード/ダウンロード)
転送20指定FTPクライアントへ
データ転送用コネクションを切断
制御21任意FTPサーバの21番ポートへ
制御用コネクションを切断

・パッシブモード
FTPクライアントから、ファイル転送のセッションの確立をする方法です
FTPサーバは受動的(パッシブ)に、FTPクライアントからセッションを確立を受け付けます
クライアントは、サーバから指定されたポートでの通信を要求することとなります

フロー概要は以下です

コネクションサーバ
通信ポート
通信方向クライアント
通信ポート
通信内容
制御21任意FTPサーバの21番ポートへ
制御用コネクションを接続
制御21任意FTPクライアントへ
ユーザ認証を要求
制御21任意FTPサーバへ
ユーザ認証情報を送信
制御21任意FTPクライアントへ
データ転送に使用するポート範囲を連携
転送★任意
(指定範囲)
任意FTPサーバへ指定ポート範囲のポートへ
ファイル転送を要求
転送任意
(指定範囲)
任意FTPサーバのへ
データ転送用コネクションを接続
転送任意
(指定範囲)
任意データ転送
(アップロード/ダウンロード)
転送任意
(指定範囲)
任意FTPサーバへ
データ転送用コネクションを切断
制御21任意FTPサーバの21番ポートへ
制御用コネクションを切断

[スポンサーリンク]


FTPサーバの構築



vsftpdとは


vsftpdは、very secure FTP daemonのことです
セキュリティを確保した、FTPのdaemon(常駐プログラム)です
CentOS、RedHat、Ubuntu、Fedora等のディストリビューションに標準で入っています

vsftpd - Secure, fast FTP server for UNIX-like systems
Secure, fast FTP server for UNIX systems

vsftpdインストール方法


今回の環境はCentOS7の為、vsftpdは標準になります
yum infoで情報を確認します

yum installでvsftpdをインストールします


vsftpd設定


vsftpdの設定として、今回は以下の2点を変更します
家庭内での通信なので、最低限の設定です
※後続に記載しますが、設定変更内容に不足があります

・アノニマス接続の拒否
 既定では、アノニマス(匿名)つまり誰でも接続が可能となっています
 anonymous_enableをYESからNOに変更して、ユーザ認証が必要とします

・chrootの有効化
 既定では、FTP接続したユーザは、FTPサーバ内の全てのディレクトリが参照可能です
 chrootを有効化して、接続ユーザは自分のユーザディレクトリ配下のみ参照を可能とします

 この環境では、chroot_listが存在しないので、ファイルも作成します
 今後、ユーザディレクトリ以外も参照可能なユーザが必要になった場合は、chroot_listに追加します

/etc/vsftpd/vsftpd.confを修正して、上記を設定します
configファイルをバックアップ後、更新します

# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bk$(date +%Y%d%m%H%M)

vsftpd起動


systemctl startコマンドでvsftpdを起動します
成功した場合は、何も表示されません
systemctl statusコマンドで起動していることを確認します


FTP接続(試行錯誤)


同一ネットワークにあるWindows10からftp接続してみます
まぁ、繋がりませんよね・・・


SELinuxを一時的に無効化


まず、SELinuxを強制から、許可に変更してみました

SELinuxは、Security Enhanced Linuxで、Linuxの細かいセキュリティ設定を可能にする機能です
CentOS7では、既定で有効となっています

但し既定の設定では、今回の様に、必要としている通信などの動作をもアクセス不可とする場合があります

ステータスSELinuxアクセス制御
enforcing有効アクセス不可(制御が有効)
permissive有効アクセス可(警告が出力)
disabled無効アクセス可

SELinuxの現在の動作状態は、getenforceで確認出来ます

setenforce 0コマンドで、動作状態をPermissiveに変更出来ます
状態変更が成功した場合は、何も表示されないので、変更後はgetenforceで動作状態を確認します

setenforceコマンドの変更は、一時的な変更になり、再起動を行った場合は元の状態に戻ります
恒久的にSELinux動作状態を変更する場合は、/etc/selinux/configファイルを変更し、起動時にファイル内容の状態でSELinuxを起動するようにする必要があります

同一ネットワークにあるWindows10からftp接続してみます
SELinuxを無効化しても、繋がりませんでした・・・
SELinuxさん、疑ってすみません(汗)


ファイアウォールを無効化


次は、ファイアウォールを無効化してみます
Windowsでも同名で、通信制御をしているので、聞きなれた言葉です

Linuxでも、wirewallは存在し、通信制御をしています
firewallは、systemctl statusコマンドで実行状態(Active:)を確認出来ます
systemctl stopコマンドで停止をすることが出来ます
stopコマンドが成功した場合は、何も表示されないので、systemctl statusコマンドで実行状態を確認します

FTP接続が出来ました
firewallが、接続を制限していました
しかし、エラーが表示され、ディレクトリを参照出来ません


500 OOPS: vsftpd: refusing to run with writable root inside chroot()


エラー内容を調べると、対処内容がありました
/etc/vsftpd/vsftpd.confにallow_writeable_chroot=YESを追加することで、解消出来ます

vsftpd2.3.5から、chrootのディレクトリに書き込み権限がある場合は、接続出来なくなっています
allow_writeable_chrootを有効にして、書き込み権限を許可することで、接続出来る様になります
(書き込み権限を削除しても接続出来ますが、それではファイルがアップロード出来ないので・・・)

vsftpdの設定で謎のエラーにハマった - TomoProgの技術書
皆さん こんにちは、こんばんは TomoProgです。今日はTwitterボット用にサーバを設定していたら、vsftpdの設定でハマったのでここに書いておきます。 ちなみにサーバは「Ubuntu14.04 amd-64 LTS」です。それでは頑張っていきましょう。 vsftpdをインストールする まずはvsftpdをイ...

無事接続することが出来ました!

[スポンサーリンク]


firewall設定


ファイアウォールを無効化することで、FTP接続が出来ることが確認出来ました
ファイアウォールをずっと無効化する訳にはいかないので、FTP通信は許可するように設定します

先ずは、systemctl start firewalldコマンドで無効化したファイアウォールを有効化します
そして、firewall-cmd –add-service=ftpで一時的に一時的にFTPサービスの通信を許可します

この状態で、FTP接続が問題なく出来ることと、拒否する通信は制御出来ていることを確認します
動作が問題なければ、–permanentオプションを付けて、FTPサービスの通信を恒久的に許可するように設定します
設定変更後は、–reloadオプションを実行し、設定を反映します


SELinux設定


SELinuxも無効化し続けるのは、ベターではないので、有効化します
(無効化したままでいいという方も多いですが、勉強の為戻します)
setenforce 1コマンドで、起動状態をEnforcingにします

FTP接続がエラーになります・・・
やはり、SElinuxも有罪です(笑)

SELinuxもftpサービスの通信を許可するように設定します

SElinsxのFTP関連の設定をgetseboolで確認します
ftp関連のブール値はoffとなっていて、アクセスで出来ないようになっているのが分かります
今回はftpd_full_accessをonとして、FTPサービスの通信を許可します
ブール値については、下記サイトに詳しく記載がありました

16.2. ブール値 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.
# /usr/sbin/getsebool -a | grep ftp ftpd_anon_write –> off ftpd_connect_all_unreserved –> off ftpd_connect_db –> off ftpd_full_access –> off ftpd_use_cifs –> off ftpd_use_fusefs –> off ftpd_use_nfs –> off ftpd_use_passive_mode –> off httpd_can_connect_ftp –> off httpd_enable_ftp_server –> off tftp_anon_write –> off tftp_home_dir –> off # setsebool -P ftpd_full_access on

無事、firewallもSELinuxも有効な状態で、FTP接続が出来ました


vsftpdデーモン(FTPサービス)の常時起動


FTP接続が出来る環境が出来たので、vsftpdデーモンが常に起動するように設定します
systemctl enableコマンドで、vsftpdを起動時に起動するサービスとして設定します

FTPサーバを悪戦苦闘しながら、構築することが出来ました
今後、SSL証明書を作成しFTPSでの通信が出来るようにしたいと思います

因みに、Window10からFFFTPで接続も出来ることも確認出来ました

[スポンサーリンク]

[スポンサーリンク]
▼オンラインで、初心者のプログラミングへの挑戦も、SE職のスキルアップも▼

コメント

タイトルとURLをコピーしました