はてなブックマークに追加する Twitterに投稿する Facebookで共有する Googleブックマークに追加する Evernoteクリップに追加する Share Yahoo!ブックマークに追加する livedoorクリップに追加する

Cyberam Documents Project

ProFTPDとは
ProFTPDは現在最もシェアのあるwu-ftpdよりもセキュリティが高く安全です。(設定が正しければ) また、自由度の高い設定が可能であり設定ファイルが単一でApacheの設定ファイルに似た構造(ディレクティブ) なので容易に設定できます。ここではinetdやxinetdからではなく単独のデーモンとして起動させます。
ProFTPDのインストール
まず最初にwu-ftpdがインストールされていないか確認します。
#rpm -qa | grep wu-ftpd
wu-ftpd-2.6.2-12.i386.rpm
インストールされている場合はwu-ftpdを削除します。
#rpm -e anonftp wu-ftpd
ProFTPDをダウンロードし、解凍します。
proftpd-1.3.0a.tar.gz
#tar xvfz proftpd-1.3.0a.tar.gz
#cd proftpd-1.3.0a
コンパイルし、インストールします。
#./configure
#make
#make install
以上でインストール完了です。
主なディレクティブの説明
ProFTPDの設定ファイルは/usr/local/etc/proftpd.confです。主なディレクティブを以下に説明します。

主なディレクティブ
ディレクティブ 説明
ServerName サーバ名 ProFTPDに接続したユーザに表示される文字列を指定します。
ServerType inetd | standalone ProFTPDをinetdから起動させるかスタンドアロンなデーモンとして起動させるか指定します。
(デフォルト:standalone)
Port ポート番号 スタンドアロンで動作している場合のProFTPDの待ち受けTCPポート番号を指定する。(デフォルト:21)
Umask マスク値 新規作成されるファイルパーミッションのマスク値を指定する。(例えばマスク値に022を指定すれば 新規作成されるテキストファイルの基本パーミッションは666であるため単純に減算してパーミッションが644に設定されるということ。)
MaxInstances 子プロセスの最大値 スタンドアロンで動作している場合の親プロセスが生成する子プロセス数を指定する。最大値を超えた接続は切断されます。(子プロセスはクライアントが 接続されるたびに生成される。よって同時に接続を許すクライアント数を指定する。)
(デフォルト:none(制限なし))
User ユーザ名 ProFTPDを動作させるユーザ名を指定する。
Group グループ名 ProFTPDを動作させるグループ名を指定する。
DefaultRoot ディレクトリ [[!]グループ名,[[!]グループ名,…]] ユーザがログインした時のルートディレクトリを指定します。ユーザはこのディレクトリより上の階層には移れません。(見えません。) その後のグループ名はDefaultRootで制限するグループを指定します。!を先頭に付けることでそのグループをこの制限から排除できます。
AllowStoreRestart on | off ファイルアップロードのResume機能(転送を中断点から再開する機能)を有効にするか指定する。
(デフォルト:off)
AllowRetrieveRestart on | off ファイルダウンロードのResume機能(転送を中断点から再開する機能)を有効にするか指定する。
(デフォルト:on)
RequireValidShell on | off /etc/shellsにシェルバイナリが記述されていないユーザのログインを許可するか指定します。
(デフォルト:on(拒否する))
TimesGMT on | off 時間表示をGMTで表示するかローカルタイムで表示するかを指定する。(デフォルト:on(GMT表示))
MaxStoreFileSize ファイルサイズ | * [user ユーザ名 | group グループ名] アップロードするファイルサイズの最大値を指定する。*は制限しないことを表します。
またユーザやグループ単位で制限することもできます。
MaxClientsPerHost 最大値 | none ["メッセージ"] 同一ホストからの同時接続の最大値である。noneは制限しないことを表します。メッセージは最大値を超えた接続が行われた 場合にクライアントに表示されます。
IdentLookups on | off 接続したリモートユーザ名を確認するかを指定する。off(確認しない)にするとログイン時間を短縮できる。
(デフォルト:on(確認する))
UseReverseDNS on | off DNSの逆引きを行うかを指定する。(デフォルト:on(行う))
AuthPAMAuthoritative on | off PAMで認証させるかを指定する。(デフォルト:off(させない))
AuthPAMConfig サービス名 PAMサービス名(/etc/pam.dディレクトリ以下に設置された設定ファイル名)を指定します。(デフォルト:ftp)


Directory ディレクティブ
構文
<Directory ディレクトリ>
</Directory>
説明
このディレクティブには指定されたディレクトリにだけ割り当てられる設定を記述します。指定されたディレクトリのサブディレクトリもこの設定を継承します。

Limit ディレクティブ
構文
<Limit コマンドグループ | コマンド>
   [Order allow,deny | deny,allow]
   [Allow from all | none | ホスト名 | IPアドレス [,ホスト名 | IPアドレス,…]]
   [AllowAll]
   [AllowGroup [[!]グループ名,[[!]グループ名,…]]
   [AllowUser [[!]ユーザ名,[[!]ユーザ名,…]]
   [Deny from all | none | ホスト名 | IPアドレス [,ホスト名 | IPアドレス,…]]
   [DenyAll]
   [DenyGroup [[!]グループ名,[[!]グループ名,…]]
   [DenyUser [[!]ユーザ名,[[!]ユーザ名,…]]
</Limit>
説明
このディレクティブはFTPコマンドの使用制限をかけるために使用します。

コマンドグループ 説明
DIRS ディレクトリ表示に関する全てのFTPコマンド
READ ファイルの読み取りに関する全てのFTPコマンド
WRITE ファイルの書き込みや削除に関する全てのFTPコマンド
ALL 全てのFTPコマンド

ディレクティブ 説明
Order allowとdenyの適用順序を指定します。allow,denyの場合はallowがチェックされた後、denyがチェックされます。
Allow 指定されたクライアントのアクセスを許可します。allは全てのクライアントを許可し、noneは許可されたクライアントが存在しないことを明示的に表します。 IPアドレスやホスト名の指定で特定のクライアントを許可することもできます。
AllowAll 全てのクライアントを許可します。
AllowGroup 指定されたグループを許可します。グループ名の先頭に!をつけることで許可されないグループを表します。
AllowUser 指定されたユーザを許可します。ユーザ名の先頭に!をつけることで許可されないユーザを表します。
Deny 指定されたクライアントのアクセスを拒否します。allは全てのクライアントを拒否し、noneは拒否されたクライアントが存在しないことを明示的に表します。 IPアドレスやホスト名の指定で特定のクライアントを拒否することもできます。
DenyAll 全てのクライアントを拒否します。
DenyGroup 指定されたグループを拒否します。グループ名の先頭に!をつけることで拒否されないグループを表します。
DenyUser 指定されたユーザを拒否します。ユーザ名の先頭に!をつけることで拒否されないユーザを表します。

/home/ftpディレクトリへの192.168.0.1からの全てのアクセスを許可し、それ以外のクライアントは読み取りを拒否する。
<Director /home/ftp>
  <Limit DIRS WRITE>
    Order allow,deny
    Allow from 192.168.0.1
    DenyAll
  </Limit>
  <Limit READ>
    AllowAll
  </Limit>
</Directory>

Anonymous ディレクティブ
構文
<Anonymous ルートディレクトリ>
   [User ユーザ名]
   [Group グループ名]
   [UserAlias ログインユーザ名 ユーザ名]
   [MaxClients クライアントの最大値 | none ["メッセージ"]]
   [DisplayLogin ファイルパス]
   [DisplayFirstChdir ファイルパス]
</Anonymous>

説明
このディレクティブには許可を必要としない不特定多数のユーザ(匿名ユーザ)がFTPサーバに接続するための設定を記述する。 Anonymousユーザは通常パスワードとしてメールアドレスを使用する。また書き込み権限は与えない。

ディレクティブ 説明
User Anonymousで接続したユーザのユーザ名を指定します。
Group Anonymousで接続したユーザのグループ名を指定します。
UserAlias ログインユーザ名にAnonymousログインさせるユーザ名を指定し、そのログインをユーザ名のログインとします。
MaxClients Anonymousログインの最大クライアント数を指定する。noneの場合は制限しないことを表します。またメッセージには最大値を超えた 場合にクライアントに表示されるメッセージを指定します。この値を超えた接続はメッセージ表示後切断されます。(デフォルト:none)
DisplayLogin ユーザがログインして最初に表示されるメッセージファイル名を指定します。ファイルパスは絶対パスもしくは ルートディレクトリからの相対パスで指定します。(ファイルのパスはルートディレクトリ以下でなければならない。)

ProFTPDのデフォルトのAnonymous設定です。(/home/ftp/がルートディレクトリになります。)
<Anonymous ~ftp>
  User                         ftp
  Group                        ftp
  UserAlias                    anonymous ftp
  MaxClients                   10
  DisplayLogin                 welcome.msg
  DisplayFirstChdir            .message
  <Limit WRITE>  ←Anonymousでの書き込みや削除を全て拒否しています。
    DenyAll
  </Limit>
</Anonymous>
ProFTPDの基本設定
ここでProFTPDの設定ファイル(/usr/local/etc/proftpd.conf)を編集します。
#vi /usr/local/etc/proftpd.conf
ServerName                      "CYBERAM Server"  ←接続したクライアントに表示する文字列
ServerType                      standalone  ←スタンドアロンで起動
DefaultServer                   on
Port                            21  ←ポート番号は21
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                           022
# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances                    5  ←5つまで子プロセスの生成を許可
# PAM
AuthPAMConfig                   ftp
# Set the user and group under which the server will run.
User                            ftp  ←ftpユーザ、ftpグループでProFTPDを動作させる
Group                           ftp
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~/ftp netusers,!wheel  ←netusersグループのProFTPDでのルートディレクトリを/home/ユーザ名/ftp/に設定する。
                                             これより上の階層は見えない。またwheelグループはこの制限ではない。
RequireValidShell               off  ←/etc/shellsに関係なくログインを許可する(例えばシェルが/bin/falseや/bin/nologinでもログインできる。)
IdentLookups                    off  ←リモートユーザ名の確認をしない
UseReverseDNS                   off  ←逆引きしない
TimesGMT                        off  ←ローカルタイムで時刻表示
#Resume
AllowStoreRestart               on  ←リジューム機能を有効にする
AllowRetrieveRestart            on
# Normally, we want files to be overwriteable.
<Directory />
  AllowOverwrite                on  ←ファイルの上書きを許可する(デフォルトではクライアントはファイルを上書きできない)
</Directory>
# A basic anonymous configuration, no upload directories.  If you do not
# want anonymous users, simply delete this entire  section.
#<Anonymous ~ftp>  ←AnonymousFTPを許可しないので全て(<Anonymous ~ftp>から</Anonymous>まで)コメントアウトする。
#  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>
アクセス制御(PAMの設定)
まずアクセス制御するユーザ名が列挙されたファイル(/etc/ftpusers)を作成する。(各々の環境に合わせて制御するユーザを決定する。)
#vi /etc/ftpusers
root
bin
daemon
adm
lp
sync
shutdown
halt
次に/etc/pam.dディレクトリにPAMのftp設定ファイルを作成する。
#vi /etc/pam.d/ftp
#%PAM-1.0
auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth       required     /lib/security/pam_pwdb.so shadow nullok
account    required     /lib/security/pam_pwdb.so
session    required     /lib/security/pam_pwdb.so
これはpam_listfileモジュールにより、指定されたファイルを基にアクセス制御が行われる。この場合は/etc/ftpusersで指定された ユーザのアクセスを拒否するということである。
また"authrequired/lib/security/pam_shells.so"を追記することで/etc/shellsにユーザが利用するシェルバイナリが記述されている場合のみ 認証させることができる。この場合、/etc/proftpd.confのRequireValidShellディレクティブがoffであっても/etc/shellsに記述されていない シェルバイナリのユーザはアクセスが拒否される。
自動起動の設定
最後にProFTPDを自動起動させる起動スクリプトを作成する。
#vi /etc/rc.d/init.d/proftpd
#!/bin/sh
. /etc/rc.d/init.d/functions
if [ ! -f /etc/sysconfig/network ]; then
exit 0
fi
. /etc/sysconfig/network
RETVAL=0
case "$1" in
start)
echo -n 'Starting proftpd: '
daemon /usr/sbin/proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/proftpd
;;
stop)
echo -n 'Stopping proftpd: '
pkill proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/proftpd
;;
status)
status proftpd
;;
restart)
killall -HUP proftpd
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit $RETVAL
パーミッションを変更し、自動起動させたいランレベルのディレクトリにリンクさせます。(デフォルトランレベルが3の場合)
#chmod 755 /etc/rc.d/init.d/proftpd
#cd /etc/rc.d/rc3.d/
#ln -s ../init.d/proftpd S21proftpd
次回起動時から自動でProFTPDが起動されます。
はてなブックマークに追加する
Evernoteクリップに追加する
Share on Tumblr