このページの対象Linuxディストリビューションは次のものです。


2011/03/26 作成
2012/03/04 更新

ftpサーバ(vsftpd)の設定


方針

  1. IPv6、IPv4どちらでもアクセス出来る。
  2. ASCII転送が出来る。
  3. ホームディレクトリのpublic_html以下しかアクセス出来ない。
  4. 許可されたローカルユーザーしかアクセス出来ない。
  5. アップロードしたファイルにユーザー以外の書込み権を付与しない。
  6. ftpsでアクセス出来る。(2012/03/04 追記)

作業

インストール

$ sudo apt-get update
$ sudo apt-get install vsftpd

まだ設定が完了していないvsftpdが起動しているので停止させる。

$ sudo /etc/init.d/vsftpd stop

設定

設定ファイルを編集する。

$ sudo nano /etc/vsftpd.conf

設定ファイルはオプション=値の形式で設定する。
=の前後にスペースを入れるとエラーになる。

listen
listen=YES
スタンドアローン(デーモン)として起動するかの設定。
コメントアウトする。
#listen=YES
listen_ipv6
#listen_ipv6=YES
スタンドアローン(デーモン)として起動するかの設定。
IPv6で待ち受ける。
listenとlisten_ipv6は片方しか有効に出来ない。
(listen_ipv6=YESとした場合、IPv6、IPv4どちらでもアクセス出来るようになる。)
コメントを外し有効にする。
listen_ipv6=YES
anonymous_enable
anonymous_enable=YES
anonymousログインを認めるかの設定。
禁止するのでNOにする。
(ubuntu 11.04ではNOになっている。)
anonymous_enable=NO
local_enable
#local_enable=YES
ローカルユーザーのログインを認めるかの設定。
コメントを外し有効にする。
(ubuntu 11.04では有効になっている。)
local_enable=YES
write_enable
#write_enable=YES
書込み(アップロード、削除等)を認めるかの設定。
認めるのでコメントを外し有効にする。
write_enable=YES
local_umask
#local_umask=022
umaskの設定。
ユーザー以外には書込み権を与えないかつ読込み権は与えるのでコメントを外し有効にする。
local_umask=022
anon_upload_enable
#anon_upload_enable=YES
anonymousログインで書込みを認めるかの設定。
認めないのでコメントのまま。
anon_mkdir_write_enable
#anon_mkdir_write_enable=YES
anonymousログインでディレクトリの生成を認めるかの設定。
認めないのでコメントのまま。
dirmessage_enable
dirmessage_enable=YES
新たなディレクトリに初めて入ったときにメッセージを表示するかの設定。
そのままにする。
use_localtime
use_localtime=YES
ローカルタイムを使用するかの設定。
デフォルトはNOでGMTになる。
そのままにする。
xferlog_enable
xferlog_enable=YES
ログファイルにアップロードとダウンロードの詳細を記録するかの設定。
そのままにする。
connect_from_port_20
connect_from_port_20=YES
データ接続でサーバがポート20を送信元ポートにするかの設定。
ポート20を使用するのでそのまま。
chown_uploads
#chown_uploads=YES
anonymousログインでアップロードされたファイルの所有者を変更するかの設定。
YESにした場合はchown_usernameで指定したユーザーにする。
コメントのまま。
chown_username
#chown_username=whoever
anonymousログインでアップロードされたファイルの所有者を変更す場合のユーザーを指定する。
コメントのまま。
xferlog_file
#xferlog_file=/var/log/vsftpd.log
ログファイルのファイル名の設定。
デフォルト(/var/log/vsftpd.log)でよいのでコメントのまま。
xferlog_std_format
#xferlog_std_format=YES
ログをxferlogのフォーマットにするかの設定。
デフォルト(NO)でよいのでコメントのまま。
idle_session_timeout
#idle_session_timeout=600
なにもしなかった場合のタイムアウト時間の設定。
デフォルト(300)でよいのでコメントのまま。
data_connection_timeout
#data_connection_timeout=120
データ転送時に進捗が無い場合のタイムアウト時間の設定。
デフォルト(300)でよいのでコメントのまま。
nopriv_user
#nopriv_user=ftpsecure
特権がいらない場合の権限の指定。
デフォルト(nobody)でよいのでコメントのまま。
async_abor_enable
#async_abor_enable=YES
非同期ABORを認めるかの設定。
認めないのでコメントのまま。
ascii_upload_enable
#ascii_upload_enable=YES
アップロードでASCII転送を認めるかの設定。
認めるのでコメントを外し有効にする。
ascii_upload_enable=YES
ascii_download_enable
#ascii_download_enable=YES
ダウンロードでASCII転送を認めるかの設定。
認めるのでコメントを外し有効にする。
ascii_download_enable=YES
ftpd_banner
#ftpd_banner=Welcome to blah FTP service.
接続した時に表示するメッセージを指定する。
そのままにする。
deny_email_enable
#deny_email_enable=YES
anonymousログインを拒否するリストを有効にするかの設定。
そのままにする。
banned_email_file
#banned_email_file=/etc/vsftpd.banned_emails
deny_email_enableがYESの場合に拒否するリストのファイル名を指定する。
拒否するリストはメールアドレスで指定する。
そのままにする。
chroot_local_user
#chroot_local_user=YES
ローカルユーザーがログイン後にホームディレクトリにchrootするかの設定。
ホームディレクトリ以下のみアクセスを認めるのでコメントを外し有効にする。
chroot_local_user=YES
chroot_list_enable
#chroot_list_enable=YES
chroot_local_userの設定で意味がかわる。
chroot_local_userがNOの場合、chrootするユーザーを指定する設定になる。
chroot_local_userがYESの場合、chrootしないユーザーを指定する設定になる。
コメントを外し有効にする。
chroot_list_enable=YES
chroot_list_file
#chroot_list_file=/etc/vsftpd.chroot_list
chroot_list_enableがYESの場合のユーザーを記述するファイルを指定する。
デフォルトのまま使用するのでコメントのままでも良いがコメントを外し有効にする。
chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable
#ls_recurse_enable=YES
ls -Rを使用できるかの設定。
そのままにする。
secure_chroot_dir
secure_chroot_dir=/var/run/vsftpd/empty
そのままにする。
pam_service_name
pam_service_name=vsftpd
PAMサービス名の指定。
そのままにする。
rsa_cert_file
rsa_cert_file=/etc/ssl/private/vsftpd.pem
SSL接続で使用するSSL証明書ファイルを指定する。
ssl_enableがYESになっていないと無視される。
ssl_enable=YESの場合、SSL証明書がないと起動に失敗する。
証明書と秘密鍵が一体になったファイルが必要。
そのままにする。

このままではローカルユーザーは誰でもアクセス出来る。
アクセスできるユーザーを制限するリストを作成する。
リストに載っているユーザーのみアクセス出来るようにする。
またアクセス出来る場所をホームディレクトリのpublic_html以下にのみにする。
設定ファイルに以下の設定を追加する。

userlist_enable
ユーザーリストを使用しアクセスできるユーザーを制限するかの設定。
YESにする。
userlist_enable=YES
userlist_deny
YESの場合、ユーザーリストはアクセスを拒絶するユーザーのリストになる。
NOの場合、ユーザーリストはアクセスを許可するユーザーのリストになる。
NOにする。
userlist_deny=NO
userlist_file
ユーザーリスト用のファイルを指定する。
/etc/vsftpd.user_listにする。
userlist_file=/etc/vsftpd.user_list
local_root
ログイン後に移動するディレクトリを指定する。
chrootが有効になっている場合、chroot後のルートを指定する。
public_htmlにする。
local_root=public_html
指定するディレクトリはシンボリックリンクでも構わない。
"公開"ディレクトリにリンクを張るには次のようにする。
$ ln -s ~/公開 ~/public_html

chroot_list_enableをYESにしたのでchroot_list_fileが存在しないとログインを拒絶される。
空の/etc/vsftpd.chroot_listを作成する。

$ sudo touch /etc/vsftpd.chroot_list

アクセスを許可するユーザーリストを作成する。

$ sudo nano /etc/vsftpd.user_list

リストはユーザー名をそのまま記述すればよい。

ユーザー1
ユーザー2
ユーザー3

ユーザー名がdummyuserの場合、以下になる。

dummyuser


ftps用の設定

SSL証明書

内向きの設定なのでSSL証明書(自己署名証明書)を作成する。
公開サーバの場合は正式な証明を購入したほうが良いかもしない。
webサーバ(SSLサイト)と共通の証明書が利用できる。

SSL証明書を作成するためのパッケージがインストールされているか確認する。

$ dpkg -l | grep ssl-cert

インストールされていなければインストールする。

$ sudo apt-get install ssl-cert

SSL証明書を作成する。
make-ssl-certコマンドはopenssl reqコマンドのラッパーになっている。
openssl reqコマンドを直接使用するより簡単にSSL証明書を作成出来る。
vsftpdではSSL証明書と秘密鍵が一体になったファイルが必要みたいだ。
証明書がなかったり、秘密鍵がついてなかったり、あるいは秘密鍵だけだったりするとvsftpdの起動に失敗する。

$ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/vsftpd.pem

SSL証明書のパーミッションを変更する。

$ sudo chown root:ssl-cert /etc/ssl/private/vsftpd.pem
$ sudo chmod 640 /etc/ssl/private/vsftpd.pem

設定ファイル

設定ファイルにftpsの設定を追加する。
ftpsに対応していないクライアントからの接続を許可する場合は Explicitモード にしてforce_local_data_sslとforce_local_logins_sslをNOにする。
ftps対応クライアントからの接続のみを許可する場合は Explicitモード にしてforce_local_logins_sslをYESにするかImplicitモードにする。

ここではftpsに対応したクライアントと対応していないクライアントのどちらのアクセスも許可する設定をする。

$ sudo nano /etc/vsftpd.conf

ssl_enable
SSLを有効にするかの設定。
YESにする。
ssl_enable=YES
force_local_data_ssl
データの送受信にSSL接続だけを使用するかの設定。
YESにするとftpsに対応していないクライアントと通信出来なくなる。
ftps対応のクライアントとしか通信しないならYESにしても良い。
NOにする。
force_local_data_ssl=NO
force_local_logins_ssl
Explicitモード時にコマンドの送受信にSSL接続だけを使用するかの設定。
YESにするとftpsに対応していないクライアントと通信出来なくなる。
ftps対応のクライアントとしか通信しないならYESにしても良い。
NOにする。
force_local_logins_ssl=NO
ssl_tlsv1
TLS v1プロトコル接続を許可するかの設定。
TLSはSSLを元にIETFが標準化したプロトコル。
YESにする。
ssl_tlsv1=YES
ssl_sslv2
SSL v2プロトコル接続を許可するかの設定。
TLS v1プロトコルが有効だとTLS v1が優先される。
YESにする。
ssl_sslv2=YES
ssl_sslv3
SSL v3プロトコル接続を許可するかの設定。
TLS v1プロトコルが有効だとTLS v1が優先される。
YESにする。
ssl_sslv3=YES
implicit_ssl
Implicitモードにするかの設定。
YESにするとImplicitモードになる。
NOにする、あるいはこの項目を設定しないとExplicitモードになる。
ExplicitモードはAUTHコマンド後に暗号化通信を開始する。
Implicitモードは接続した時点から暗号化通信を開始する。
listen_port
どのポートでlistenするかの設定。
通常は21だがImplicitモードの場合990にすることが多い。
pasv_max_port
ファイヤーウオールが有効になっていると通信を暗号化した場合、 パッシブモードだとnf_conntrack_ftpが開けるべきポート番号が判らず通信に失敗する。
(ログインは出来てもファイル一覧の取得やファイルの転送が出来ない。)
ファイヤーウオールで開けるポートを動的に変更するのではなく静的に決定する。
そのためにポート番号の範囲を限定する。
パッシブモードで使用する最大のポート番号を指定する。
最小のポート番号で60000を指定するのでそれより大きい数を指定する。
60009を指定するが公開サーバなら60099とかにした方が良いかもしれない。
pasv_max_port=60009
pasv_min_port
パッシブモードで使用する最小のポート番号を指定する。
60000を指定す。
pasv_min_port=60000
allow_anon_ssl
anonymousログインでSSL接続を使用するかの設定。
anonymousログイン自体を有効にしていないので設定しない。

ファイヤーウオールの設定

DebianやUbuntu 11.04だとファイヤーウオールがデフォルトで無効になっているがUbuntu 11.10だと有効になってる。
そのためファイヤーウオールを設定するか無効にしないとIPv6で通信できない。
(IPv4の設定はvsftpdをインストールした時点で設定されている。)
ファイヤーウオールはiptablesで実現されているがUbuntuではufwコマンドでiptablesの設定が出来る。
しかし何故かufwコマンドの設定がうまく反映できないことがあるようだ。
(多分新しいルールを追加してファイヤーウオールを無効にして有効にするとその後から反映するみたい。)

リモートログインしか出来ない環境だと設定をミスしSSHの通信が出来なくなると手の打ちようがないので ufwを使用せずiptablesの設定を直接行ったほうが良いかもしれない。

ファイヤーウオールを無効にする。

$ sudo ufw disable

ファイヤーウオールを有効にする。

$ sudo ufw enable

ファイヤーウオールにftpを有効にするルールを追加する。
(IPv4とIPv6の両方が追加される。)

$ sudo ufw allow ftp

パッシブモードの場合、nf_conntrack_ftpモジュールが必要になる。
nf_conntrack_ftpモジュールがロードされているか確認する。

$ lsmod | grep ftp

ロードされていない場合はロードする。

$ sudo modprobe nf_conntrack_ftp

ファイヤーウオールに990番ポート(ftps Implicitモード)を有効にするルールを追加する。

$ sudo ufw allow ftps

ftpsでパッシブモードを使用する場合はnf_conntrack_ftpがうまく動かないのでポートを静的に開ける必要がある。
60000から60009までを有効にした場合は以下のようにする。

$ sudo ufw allow 60000
$ sudo ufw allow 60001
$ sudo ufw allow 60002
$ sudo ufw allow 60003
$ sudo ufw allow 60004
$ sudo ufw allow 60005
$ sudo ufw allow 60006
$ sudo ufw allow 60007
$ sudo ufw allow 60008
$ sudo ufw allow 60009


サーバ(デーモン)の起動

$ sudo /etc/init.d/vsftpd start

完了


コマンド一覧

sudo /etc/init.d/vsftpd start
ftpサーバを開始する。
sudo /etc/init.d/vsftpd stop
ftpサーバを停止する。
sudo /etc/init.d/vsftpd restart
ftpサーバを再起動する。
sudo /etc/init.d/vsftpd reload
設定ファイルを再読込みする。
sudo /etc/init.d/vsftpd status
ステータスを表示する。
sudo update-rc.d vsftpd defaults
マシンの起動時に自動的にftpサーバが起動するようにする。
インストール時には自動的に起動するようになっている。
sudo update-rc.d vsftpd remove
マシンの起動時に自動的にftpサーバが起動するのをやめる。
sudo tail /var/log/vsftpd.log
新しいログを10行表示する。
sudo tail -f /var/log/vsftpd.log
新しいログを表示し続ける。
(ログが追加されてたら表示する。)

はてなブックマークに追加 Tweet

サイト全体のアクセスカウンタ


リンク

参考

関連


[Top][Page Top]