CentOS 6.7 でのvsftpd設定 とFFFTPクライアントの設定

サーバー管理にSSHを利用する方が多いので、
ファイル転送にはSCP、もしくはHTTPといったところでしょうか。

一昔前はファイル転送にはFTPがメジャーでしたが、
HTTP、SCPに押され使用頻度が落ちているかな?と感じます。

ですが、SCPは暗号化を行うため、暗号化を行わないFTPと比べると
転送速度は半分以下(4分の1程度のことも)になることがほとんどです。

なので、特に暗号化の必要のない多くのデータを一度に転送する際には、まだまだFTPは使えます。

ということで、、下記の要件を仮定して、CentOS6.7で、FTPサーバー(vsftpd)を立ててみます。

■ 外部からのアクセスを許可しない社内サーバーでの運用(LANのみ)
■ アクティブモード接続(20番、21番ポート開放のみでOK)
※パッシブモード(PASVモード)の場合にはTCP 1024以上でけっこう広いレンジのファイアウォールを開放する必要があります

# rpm -q vsftpd <-- vsftpdがインストールされているか調べる
# パッケージvsftpdはインストールされていません

vsftpdが入っていなかったので入れます。

# yum -y install vsftpd  <-- vsftpdのインストール

# netstat -antu  <-- ポート確認
# iptables -vnL でもOK)

20,21番ポートが空いていない場合には次のようにiptablesに追加

# vi /etc/sysconfig/iptables
-A INPUT -m state –state NEW -m tcp -p tcp –dport 20 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT
(viエディタは”i”押せば書きこめるようになって、記録して終わるときは”ESC”で抜けてから “:wq” ですよ!)

vsftpdの設定ファイルに以下のように設定をします。

# vi /etc/vsftpd/vsftpd.conf

vsftpd.conf内の設定変更したとこだけ抜粋
anonymous_enable=NO <--匿名ログイン禁止(デフォルトはYES)

ascii_upload_enable=YES <--コメント削除して有効にする ( アスキーモードでのアップロードを許可 )
ascii_download_enable=YES <--コメント削除して有効にする(アスキーモードでのダウンロードを許可)

ftpd_banner=Welcome to blah FTP service. <--コメント削除して有効にする。別にしなくてもOK(FTPログイン時にソフト名とバージョンが表示されないようになる)

chroot_local_user=YES <--コメント削除して有効にする ( chroot有効 )。デフォルトでホームディレクトリより上層へのアクセスを禁止
chroot_list_enable=YES <--コメント削除して有効にする。ホームディレクトリより上層へのアクセスを許可するユーザリストの有効化
chroot_list_file=/etc/vsftpd/chroot_list <--コメント削除して有効にする ( chroot リストファイル指定 )
※管理者や、自身のホームディレクトリ以外へアクセスできるようにしておく必要があるユーザのみ登録することを推奨。管理者はSCPでいいやというような場合は特に有効にしなくてOK。もしくはchroot_listを作成時に何も書き込まない。ちなみにchrootを有効にした場合にはchroot_listファイルがないとエラーになるので、作成を忘れないように。

ls_recurse_enable=YES <--コメント削除して有効にする ( ディレクトリごと一括での転送有効 )

最終行へ下記の4行を追記
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
local_root=public_html <--ルートディレクトリ指定 (指定しない場合はホームディレクトリがルートディレクトリとなる)
use_localtime=YES <--ローカルタイムを使う
※userlist_enable=YES、userlist_deny=NOで/etc/vsftpd/user_list がFTPログインできるユーザーのリスト(ホワイトリスト)となります。
userlist_deny=YES もしくは削除で、/etc/vsftpd/user_list がFTPログイン禁止ユーザーのリスト(ブラックリスト)となります。

vsftpdの設定ファイルの修正はこれで終わり。

user_listにFTPログインを許可するユーザー名を書き込む
# vi /etc/vsftpd/user_list
hogehoge

FTPログインのルールはftpusersにも指定されていて、
/etc/vsftpd/ftpusers
に記されたユーザーはFTPログインできません。これは上記のホワイトリスト設定を行っても有効です。

# chkconfig vsftpd on  <-- 次回のブート時からは自動起動の設定
# service vsftpd start  <-- vsftpdを起動

ここで、FTPクライアントからアクセスすると、
500 OOPS: cannot change directory:/home/hogehoge
500 OOPS: priv_sock_get_cmd
となり、接続できないと思うので、さらに下記1か2のどちらかを行えばOK.

1. SELinuxの停止
# getenforce <-- SELinuxが動いているかの確認
Enforcing <-- 動いている。動いていない場合はDiabledと出る

# vi /etc/sysconfig/selinux
SELINUX=enforcing
SELINUX=disabled
と変更する。

# reboot <--OS再起動

2. SELinuxの設定を変更する
/usr/sbin/getsebool -a | grep ftp
で確認する。
ftp_home_dir –> off
になっていれば、これをONに変えるために
# /usr/sbin/setsebool -P ftp_home_dir 1 ←(けっこう時間かかる)

終了したら、念のために
# /usr/sbin/getsebool -a | grep ftp
ftp_home_dir –> on になっていればOK

今回ユーザーアカウントのhomeに設定したpublic_htmlディレクトリどうやって作るの?って人に
$ cd /home/hogehoge
$ mkdir public_html
$ cd public_html
$ echo ‘TEST FILE’ > index.html index.html <-- 試しにファイル作ってみただけで、ネット公開しないので別に必要ないです。

ここまでで、CentOS側への設定は完了です。

FFFTPソフトでアクセスする際の設定を一応書いておきます。
①[設定変更]→[文字コード]→[ファイル名の漢字コード]を「UTF-8N」へ変更
②[設定変更]→[拡張]→「PASVモードを使う」のチェックを外す

vsftpdをちゃんと設定したはずなのに、FTPクライアントで接続できないときは、
chroot_list,user_listが存在するか、設定ファイルに書き込んだパスなどにスペルミスがないかチェックしてみましょう。

windowsのmcd(コマンドプロンプト)でftp接続して、問題を発見できたりもします。

C:\Users\ユーザー名>ftp 192.168.**.***  ←サーバーのIPアドレス指定する
192.168.**.*** に接続しました。
500 OOPS: cannot read user list file:/etc/vsftpd/userlist
500 OOPS: priv_sock_get_cmd
接続がリモート ホストによって閉じられました。

これは、userlist⇒user_listのスペルミスということがわかります。
なので、
# vi /etc/vsftpd/vsftpd.conf
で該当箇所のスペルを修正すればOK

C:\Users\ユーザー名>ftp 192.168.**.***
192.168.**.*** に接続しました。
220 Welcome to blah FTP service.
ユーザー (192.168.**.***:(none)):hogehoge
331 Please specify the password.
パスワード:****
Login successful.
↑これでユーザー名:hogehogeでFTP接続ができたことを確認できました。
ログインできなかったら、user_listにユーザーアカウントを記載していない可能性があります。チェックしてみましょう。