ここでは、FTPデーモンであるProFTPDについて解説していきます。FTPデーモンと言えば、wu-ftpd
が有名ですが、セキュリティホールが数多く報告されていたり、また開発のほうも停滞しているので当サイトでは、設定が簡単で且つ、wu-ftpd
よりもセキュリティが高いと言われているProFTPDを採用しました。ProFTPD
の設定ファイルは、Apache のhttpd.conf をお手本にした簡単設定で記述することができ、.htaccess
ならぬ、.ftpaccess を採用していることで、ディレクトリごとのアクセス制御をかけることができます。その他、主な機能としては、複数のバーチャルFTPサーバーとして機能、スタンドアロンとinetd
経由どちらの起動方法にも対応、ロギングとutmp/wtmpのサポートなどがあります。また、mod_sql
モジュールと組み合わせることで、FTP認証を実現したり、mod_quota モジュールでディスク容量制限(アップロード/ダウンロード)をしたりすることもできます(がここでは説明しません)。
|
|
■ProFTPD のダウンロード
■ProFTPD のインストール
vsftpd がインストールされている場合は、予めアンインストールしておきます。
$ cd /usr/local/src
$ tar xzvf proftpd-1.2.9.tar.gz
$ cd proftpd-1.2.9
$ ./configure
$ make
# make install |
|
■/usr/local/etc/proftpd.conf の編集
FTPサーバーにログインしたときに表示されるデフォルトの名前です。初期値では、あまりかっこいいとは言えない名前なので変更したい方は変更してください(>▽<
ServerName "ProFTPD
Default Installation" |
|
ProFTPDを inetd もしくは、xinetd 経由で起動させます。デフォルトは、スタンドアロンとして起動するようになっているので以下の行を修正します。デーモンとして起動させたいならば、standalone
を指定します。
DefaultRootを設定することで、chroot環境でFTPを動作させることができます。コメントを削除することで、ユーザーのホームディレクトリより上位の階層へはアクセスできなくなるのでセキュリティが向上します。ここでは、ユーザーのWebサイトをFTPサーバー上にアップロードすることを仮定して(/home/kororo/public_html)、public_html
より上位の階層へアクセスできないように設定しています(なお、httpd.conf の設定でUserDirディレクティブをpublic_html
にしたものとします)。
DefaultRoot
~/public_html |
|
グループをnogroup からnobody に変更します。
AnonymousFTP はここでは使わないので、Anomynous行をコメントアウトして無効にします。使用する予定がないのであれば削除してしまっても構いません。
#<Anonymous ~ftp>
#User ftp
#Group ftp
# We want clients to be able to login
with "anonymous" as well as
"ftp"
# UserAlias anonymous ftp
# Limit the maximum number of anonymous
logins
# MaxClients 10
# We want 'welcome.msg' displayed at
login, and '.message' displayed
# in each newly chdired directory.
# DisplayLogin welcome.msg
# DisplayFirstChdir .message
# Limit WRITE everywhere in the anonymous
chroot
# <Limit WRITE>
# DenyAll
# </Limit>
#</Anonymous
|
|
■ProFTPDを自動起動させる
ProFTPDをxinetd 経由で自動起動させるように/etc/xinetd.d/proftp を作成します。
service ftp
{
disable = no
flags = REUSE
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/local/sbin/proftpd
} |
|
■xinetd の再起動
ProFTPDを起動するため、xinetd を再起動します。
# /etc/init.d/xinetd
restart |
|
■ProFTPD の動作確認
21番ポートがLISTEN状態になっていることを確認してください。
# netstat -an | grep
21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
# nmap localhost
21/tcp open ftp |
|
■その他の設定
ポート番号の指定です。通常は変更の必要はありません。
Umask とは、新規に作成されたファイルやフォルダのデフォルトのパーミッション値を表し、umask
値が022 の場合は、644(rw-r--r--)と同様の意味になります。022という数値は、新規のファイル作成時に与えられる最大の権限である666(rw-rw-rw-)から22を引いた数値という意味なので、パーミッション値は644になります。仮にUmask値を002にすれば、初期権限は664(rw-rw-r--)になります。誰でも読み書き可能である666にしたい場合は000になります。また、ディレクトリ作成時の最大の権限は777で、初期に与えられるパーミッション値は755です。ProFTPDのデフォルトのUmask値は022となっているので、新規ファイルを作成したときには、666から22を引いた644で作成され、新規ディレクトリを作成した時には、777から22を引いた755が初期権限になるというわけです。なお、Umask値をあとから変更した場合、既存のファイル、もしくはディレクトリには影響がありませんので注意してください。
DoS攻撃防止のため、最大の子プロセス数を設定します。デフォルトでは30に設定されていますが、FTPサーバーを利用する人数が少ない場合は、もっと数値を下げてもよいかもしれません。なお、MaxInstances
はスタンドアロンで起動している場合のみ機能し、inetd モードでは無効になります。
ファイルの上書きを許可するかしないかを設定します。
<Directory />
AllowOverwrite on
</Directory> |
|
■ProFTPDのバージョンを非表示にする
FTPサーバーにログイン時には通常、「
220 ProFTPD 1.2.9 Server (ProFTPD
Default Installation) [serv.kororo.jp] 」のようにサーバーの名称とバージョンが表示されます。FTPに限ったことではありませんが、バージョン等を表示させておくとセキュリティホールをついた攻撃をされる可能性もあるのでセキュリティ上、好ましくありません。そこで、ログイン時のバージョンを非表示にするには以下の1行を追記しておきます。
■アクセス制限をかける
<Limit LOGIN>
Order allow, deny
Allow from 172.16.50.0/27,172.16.51.0/28,127.0.0.1/8
Deny from all
</Limit LOGIN> |
|
■リジューム機能を使用する
ダウンロード/アップロード中に意図せず回線が切断された場合、最初からまた接続を再開する羽目になってしまうことがあります。そこで、リジューム機能を使うことでダウンロード/アップロードを途中から再開することができます。なお、ダウンロードはデフォルトでオンの状態になっていますので、ここで指定するのはアップロードのリジュームを行いたい場合です。
■クライアントからログインする
それでは、実際にWindows マシンからコマンドプロンプトを使用してFTPサーバーにログインしてみます。ここで確認しておきたいのは、DefaultRoot
で設定したディレクトリより上位の階層へアクセス不可能な状態になっているかどうかです。詳細な解説は下記に記します。
C:\>ftp
ftp.kororo.jp
Connected to ftp.kororo.jp.
220 ProFTPD 1.2.9 Server (ProFTPD Default Installation)
[ftp.kororo.jp]
User (ftp.kororo.jp:(none)): kororo
331 Password required for kororo.
Password:
230 User kororo logged in.
ftp>
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file
list
cinema
index.html
movie
226 Transfer complete.
ftp: 72 bytes received in 0.00Seconds 72000.00Kbytes/sec.
ftp>
ftp> cd ../
250 CWD command successful.
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file
list
cinema
index.html
movie
226 Transfer complete.
ftp: 72 bytes received in 0.00Seconds 72000.00Kbytes/sec.
ftp> pwd
257 "/" is current directory. |
上記のプロセスを説明するとまず、FTPサーバーにログインし、ユーザー名とパスワードを入力します。ログインに成功したら、ls
コマンドでディレクトリを一覧表示させます。次に、CDコマンドを使用して現在いる初期ディレクトリより上位の階層へアクセス可能かどうかを調べます。プロンプト上では、「
250
CWD command successful.」という成功した旨のメッセージが表示されますが、ls
コマンドを使ってカレントディレクトリを調べてみると先ほどと同様のディレクトリにいることがわかります。つまり、DefaultRoot
で設定した ~/public_html がきちんと有効になっていることを確認することができます。最後にpwd
コマンドを使って自分が現在いるディレクトリを調べてみると、"/ "(ルート)にいることがわかり、これ以上、上位の階層にはアクセスできないことがわかります。