12.4. 設定ファイル(/etc/proftpd.conf)の基本

ProFTPD の設定ファイルは、/etc/proftpd.conf です。# で始まる行はコメントと見なされます。Turbolinux 11 Server の /etc/proftpd.conf は以下の通りです。ファイル中のコメントは、一部消去しています。

ServerName			"ProFTPD Default Installation"
ServerIdent                     on "FTP Server ready."
ServerAdmin                     root@localhost
ServerType			standalone
DefaultServer			on
AccessGrantMsg                  "User %u logged in."
DeferWelcome                    off
DefaultRoot                     ~ !adm
AuthPAMConfig                   proftpd
AuthOrder                       mod_auth_pam.c* mod_auth_unix.c
IdentLookups                    off
UseReverseDNS                   off
Port                            21
Umask                           022
ListOptions                     "-a"
AllowRetrieveRestart            on
AllowStoreRestart               on
MaxInstances                    20
User                            nobody
Group                           nobody
UseSendfile                     no
ScoreboardFile                  /var/run/proftpd.score
<Global>
  AllowOverwrite                yes
  <Limit ALL SITE_CHMOD>
    AllowAll
  </Limit>
</Global>

LogFormat                       default "%h %l %u %t \"%r\" %s %b"
LogFormat                       auth    "%v [%P] %h %t \"%r\" %s"

設定ファイルの書式は、Web サーバーの Apache と似ており、1 行につき 1 つのディレクティブ(設定項目)を指定します。ディレクティブの値は、指定したディレクティブ名のあとにスペース、またはタブで区切り記述します。また、ディレクティブの中には、ディレクティブ名とその値が < と > で囲まれたものもあります。これらのディレクティブは終了タグの </ディレクティブ名> までを適用範囲として扱い、この中に記述されたディレクティブは、その範囲内でのみ有効となります。このようなディレクティブには、Directory、Anonymous、Limit、Global、VirtualHost があります。

ディレクティブは、/etc/proftpd.conf のどの箇所にでも記述できるわけではありません。ディレクティブを記述したコンテキストによっては意味をなさない場合があります。コンテキストとは、ディレクティブが /etc/proftpd.conf のどこで使用されたときに有効となるかを示すものです。したがって、ディレクティブを指定するときは、そのディレクティブがどのコンテキストで使用可能かを、ProFTPD のオンラインマニュアル等を参照し、確認する必要があります。なお、多くのディレクティブは、1 つのコンテキストだけで使用できるのではなく、他のコンテキストでも使用可能です。例えば、ServerType というディレクティブは server config コンテキストでしか使用することはできませんが、Limit ディレクティブは、server config、VirtualHost、Directory、Anonymous、Global、.ftpaccess 全てのコンテキストで使用することができます。

コンテキストの種類と概要は以下の通りです。

表 12-3. コンテキストの種類

コンテキストの種類概要
server config コンテキストserver config コンテキストで指定するディレクティブの多くは、ProFTPD サーバーの全般的な設定を行うためのディレクティブです。Directory、Limit、Anonymous など、<ディレクティブ名 値> と </ディレクティブ名> で囲まれた中で使用することはできません。
<Anonymous> コンテキストAnonymous ディレクティブの中で使用可能であることを意味します。
<Directory> コンテキストDirectory ディレクティブの中で使用可能であることを意味します。
<Global> コンテキストGlobal ディレクティブの中で使用可能であることを意味します。
<Limit> コンテキストLimit ディレクティブの中で使用可能であることを意味します。
<VirtualHost> コンテキストVirtualHost ディレクティブの中で使用可能であることを意味します。
.ftpaccess コンテキスト.ftpaccess ファイル内で使用可能であることを意味します。

12.4.1. /etc/proftpd.conf の基本設定

以下では、/etc/proftpd.conf の server config コンテキストで指定されている基本的なディレクティブを解説します。デフォルトの /etc/proftpd.conf は、ProFTPD で使用可能なほんの一部のディレクティブしか使用していません。ProFTPD は、他にも様々なディレクティブを使用することが可能です。ProFTPD の特徴の 1 つは、それらの豊富なディレクティブを使用して、サーバー管理者の要求する FTP サイトを構築できることろにあります。ProFTPD で使用できるディレクティブの詳細は、ProFTPD Web サイトのオンラインマニュアルなどから得ることができます。

ServerName name

ユーザーが FTP サーバーに接続した際に表示する名前を指定します。

ServerIdent off | on [identification string]

ユーザーが FTP サーバーに接続した際に文字列を表示するかどうかの指定です。on(表示する)の場合は、続けて文字列を指定します。

ServerAdmin admin-email-address

サーバー管理者の E-MAIL アドレスを指定します。

ServerType standalone|inetd

スタンドアロンモード(standalone)で起動するか、スーパーサーバーモード(inetd)で起動するかを指定します。Turbolinux 11 Server の初期設定ではスタンドアロンモードで起動します(項12.3.1 を参照)。

DefaultServer on|off

バーチャルホストの設定をしたときなど、proftpd が複数の IP アドレスで接続を待ち受ける場合に、いずれの IP アドレスにも該当しない接続を受け入れるデフォルトサーバーとして動作させるかどうかを指定します。

TimesGMT on|off

FTP サーバー側のファイルリストの時間を GMT で表示するかどうかの指定です。ローカルタイムで表示するには、off を指定する必要があります。

AccessGrantMsg messages

認証成功時に表示するメッセージの指定です。

DeferWelcome on|off

認証が完了するまでは ServerName などを表示しない設定です。

DefaultRoot directory [[!]groupname]

ユーザーがログイン後に始めに chroot するディレクトリの指定です。" ~ " はホームディレクトリを表し " !adm" は adm グループのユーザーを除く指定です。詳細は 項12.6 を参照してください。

AuthPAMConfig service

認証に使用するサービス名の指定です。

AuthOrder module-name...

認証に使用するモジュールの順番を指定します。

IdentLookups on|off

通常、クライアントの接続時にはリモートユーザー名を確認するために ident プロトコルを使用しますが、ここでは有効/無効の指定が可能です。

UseReverseDNS on|off

逆引きの名前解決をするかどうかの指定です。

Port port-number

proftpd をスタンドアローンモードで起動している場合に使用する TCP ポート番号を指定します。通常は、FTP の標準ポート番号である 21 番を指定します。

Umask octal-mask

ファイルやディレクトリの作成時にパーミッションに割り当てる標準のマスクを指定します。

ListOptions option

ls 、nlsit などのリストコマンドのオプションを指定します。

AllowRetrieveRestart on|off

クライアントに FTP REST コマンド(ファイル転送読み出しの再開)に使用を許可するかどうかの指定です。

AllowStoreRestart on|off

クライアントに保存ファイルの転送の再開を許可するかどうかの指定です。

MaxInstances number

スタンドアローンモードで起動した場合のみ有効な指定です。親プロセスである proftpd により起動される子プロセスの最大数を指定します。

TimeoutStalled seconds

proftpd と ftp クライアントの間にデータ転送がないまま、何秒間コネクションを維持していられるかを指定します。Turbolinux 11 Server の初期設定は、300 秒です。0 を指定すると制限はなくなります。

User userid / Group groupid

proftpd サーバープロセスを実行するユーザーとグループを指定します。Turbolinux 11 Server の初期設定は、nobody です。ただし、ユーザーが FTP サーバーにログインすると、そのユーザーの UID、GID で実行されます。

UseSendfile on|off

sendfile() を使用するかどうかの指定です。

ScoreboardFile path

Scoreboardfile のパス名指定です。MaxClients ディレクティブで使用されます。

PersistentPasswd on|off

proftpd の認証やユーザー名、グループ名の参照等の処理を制御します。他のオペレーティングシステムの中には、この値を on にしなければ、ファイルの所有者やグループを表示できない場合がありますが、Turbolinux 11 Server の場合は off のままで問題ありません。

LogFormat nickname format

出力するログのフォーマットに名前をつけます。format には以下を指定します。

表 12-4.

%bリクエストに対し送信されたバイト数
%f保存、読み出されたファイル名
%{FOOBAR}e環境変数 FOOBAR
%hリモートホスト名
%aリモート IP アドレス
%lリモートユーザー名
%pサーバーのポート番号
%vサーバー名
%Pサーバーの PID
%rリモートクライアントからのコマンド
%tローカルタイム
%T送受信秒数
%sNumeric FTP レスポンスコード
%u認証されたローカル UID
ExtendedLog path [[command-classes] nickname]

proftpd のログを出力するファイル名をフルパスで指定しています。Turbolinux 11 Server の初期設定では、コメントで /var/log/proftpd/ 以下に access.log 、auth.log の指定があります。

12.4.2. Directory ディレクティブによるディレクトリ毎の設定

Directory ディレクティブは、指定したディレクトリと、そのサブディレクトリだけに適用される設定を行うためのディレクティブです。終了タグの </Directory> までが適用範囲となります。Turbolinux 11 Server の /etc/proftpd.conf では、以下の設定で Directory ディレクティブが使用されています。

<Directory /*>
  AllowOverwrite		on
</Directory>

/* は、Directory ディレクティブで設定を行うディレクトリの指定です。/* は、/ ディレクトリ以下の全てのディレクトリをあらわしています。このように *(アスタリスク)を使用したディレクトリの指定も可能です。また、Directory ディレクティブの中で使用されている AllowOverwrite ディレクティブは、ファイルの上書きを許可するかどうかを指定するためのディレクティブです。したがって、上記の設定は、/ ディレクトリ以下の全てのファイルに対して上書きを許可する設定となります。逆に AllowOverwrite の値を off にすれば、ファイルの上書きはできなくなります。もちろん、on に設定していても Linux システム上で対象のファイルに対する書き込み権限がなければ、そのユーザーはファイルを上書きすることはできません。

12.4.3. Limit ディレクティブによるアクセス制御の設定

使用可能な FTP コマンドや FTP サーバーへのログインを許可するクライアントを制限するには、Limit ディレクティブを使用します。Limit は、すべてのコンテキストで使用可能なディレクティブです。Directoy ディレクティブの中で Limit ディレクティブを使用すれば、ある特定のディレクトリに対するアクセス制御設定を行うことができます。以下は Limit ディレクティブの使用例です。

<Limit WRITE>
  DenyAll
</Limit>

Limit ディレクティブに指定した WRITE は、ファイルの書き込みを行うコマンドに対して制限を行うことを定義しています。また、DenyAll ディレクティブは、アクセスを完全に拒否するためのディレクティブです。したがって、この例では、ファイルの書き込みを行うコマンドの使用をすべて禁止しています。WRITE の箇所には、他にも様々なコマンドを指定することができます。コマンドを複数指定したい場合は、スペースで区切ります。指定可能なコマンドには以下のものがあります。

表 12-5. Limit ディレクティブのコマンド

コマンド解説
CWDディレクトリの移動
MKDディレクトリの作成
RNFR、RNTOファイルのリネーム
DELEファイルの削除
RMDディレクトリの削除
RETRファイルのダウンロード
STORファイルのアップロード
READファイルの読み出しを処理する全てのコマンド
WRITEファイルの書き込みを処理する全てのコマンド
DIRSディレクトリの表示を処理する全てのコマンド
ALL全てのコマンド(READ WRITE DIRS を指定した場合と同じ)
LOGINサーバーへのログイン

Limit ディレクティブの開始タグと終了タグの間には、指定したコマンドの使用を許可するのか、それとも拒否するのかといった設定を記述します。このようなアクセス制御を行う代表的なディレクティブには、以下のものがあります。

AllowAll

全てのアクセスを許可します。

DenyAll

全てのアクセスを拒否します。

AllowUser user-expression

特別にアクセスを許可するユーザーを指定します。複数のユーザーを指定する場合は ,(カンマ)で区切ります。

DenyUser user-expression

特別にアクセスを拒否するユーザーを指定します。複数のユーザーを指定する場合は ,(カンマ)で区切ります。

AllowGroup group-expression

特別にアクセスを許可するグループを指定します。複数のグループを指定する場合は ,(カンマ)で区切ります。

DenyGroup group-expression

特別にアクセスを拒否するグループを指定します。複数のグループを指定する場合は ,(カンマ)で区切ります。

Allow from all|none|host|network

Allow は最初の引数として from をとります。続く引数でアクセスを許可するホストやネットワークを指定します。all は、全てのホストからのアクセスを許可するために使用します。none はアクセスを許可するホストやネットワークが存在しないことを示すために使用します。もし all か none が使用されていれば、hostnetwork を指定することはできません。hostnetwork では、proftpd にアクセスするホストをホスト名やネットワークアドレス、または IP アドレスで指定できます。複数指定する場合は ,(カンマ)で区切ります。

Deny from all|none|host|network

Deny は最初の引数として from をとります。続く引数でアクセスを拒否するホストやネットワークを指定します。all は、全てのホストからのアクセスを拒否するために使用します。none はアクセスを拒否するホストやネットワークが存在しないことを示すために使用します。もし all か none が使用されていれば、hostnetwork を指定することはできません。hostnetwork では、proftpd にアクセスするホストをホスト名やネットワークアドレス、または IP アドレスで指定できます。複数指定する場合は ,(カンマ)で区切ります。

例えば、server config コンテキストに以下の Limit ディレクティブを設定すれば、taro 以外のユーザーは、FTP サーバーにログインできなくなります。

<Limit LOGIN>
  AllowUser taro
  DenyAll
</Limit>

また、上記の Allow from ... と Deny from ... を使用する場合は、以下のように Order ディレクティブにより、これらのディレクティブをチェックする順番を指定します。

Order allow,deny

このように allow,deny を指定した場合は、Allow ディレクティブが最初にチェックされます。もし、Allow ディレクティブの指定でアクセスが許可されると、Deny ディレクティブはチェックされません。Allow ディレクティブで許可されなかった場合は、Deny ディレクティブがチェックされ、Deny ディレクティブの指定とマッチすれば、アクセスは拒否されます。最終的にどちらのディレクティブにもマッチしなかった場合には、アクセスは許可されます。

Order deny,allow

このように deny,allow を指定した場合は、Deny ディレクティブが最初にチェックされます。もし、Deny ディレクティブの指定でアクセスが拒否されると、Allow ディレクティブはチェックされません。Deny ディレクティブで拒否されなかった場合は、Allow ディレクティブがチェックされ、Allow ディレクティブの指定とマッチすれば、アクセスは許可されます。最終的にどちらのディレクティブにもマッチしなかった場合には、アクセスは拒否されます。

以下は、Limit ディレクティブで Order、Allow、Deny ディレクティブを使用した設定例です。この例では、192.168.0.0/24 のネットワーク上に存在するクライアント以外からのログインを全て拒否しています。

<Limit LOGIN>
  Order allow,deny
  Allow from 192.168.0.0/24
  Deny from all
</Limit>