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

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

ServerName			"ProFTPD Default Installation"
ServerType			standalone
DefaultServer			on
TimesGMT                        off
Port				21
Umask				022
MaxInstances			30
TimeoutStalled                  300
User				nobody
Group				nobody
PersistentPasswd off
ExtendedLog /var/log/proftpd.log

<Directory /*>
  AllowOverwrite		on
</Directory>

<Anonymous ~ftp>
  User				ftp
  Group				ftp
  UserAlias			anonymous ftp
  #RequireValidShell           off
  MaxClients			10 "Sorry, max %m users -- try again later"
  DisplayLogin			welcome.msg
  DisplayFirstChdir		.message
  <Limit WRITE>
    DenyAll
  </Limit>
</Anonymous>

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

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

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

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

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

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

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

ServerName name

ユーザーが FTP セッションを開始した際に表示する文字列を指定します。

ServerType standalone|inetd

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

DefaultServer on|off

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

TimesGMT on|off

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

Port port-number

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

Umask octal-mask

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

MaxInstances number

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

TimeoutStalled seconds

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

User userid / Group groupid

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

PersistentPasswd on|off

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

ExtendedLog filename

proftpd のログを出力するファイル名をフルパスで指定しています。Turbolinux 10 Server の初期設定は、/var/log/proftpd.log です。

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

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

<Directory /*>
  AllowOverwrite		on
</Directory>

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

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

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

<Limit WRITE>
  DenyAll
</Limit>

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

表 11-4. 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>