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 ファイル内で使用可能であることを意味します。 |
以下では、/etc/proftpd/proftpd.conf の server config コンテキストで指定されている基本的なディレクティブを解説します。デフォルトの /etc/proftpd/proftpd.conf は、ProFTPD で使用可能なほんの一部のディレクティブしか使用していません。ProFTPD は、他にも様々なディレクティブを使用することが可能です。ProFTPD の特徴の 1 つは、それらの豊富なディレクティブを使用して、サーバー管理者の要求する FTP サイトを構築できることろにあります。ProFTPD で使用できるディレクティブの詳細は、ProFTPD Web サイトのオンラインマニュアルなどから得ることができます。
ユーザーが FTP セッションを開始した際に表示する文字列を指定します。
スタンドアロンモード(standalone)で起動するか、スーパーサーバーモード(inetd)で起動するかを指定します。Turbolinux 10 Server の初期設定ではスタンドアロンモードで起動します(項11.3.1 を参照)。
バーチャルホストの設定をしたときなど、proftpd が複数の IP アドレスで接続を待ち受ける場合に、いずれの IP アドレスにも該当しない接続を受け入れるデフォルトサーバーとして動作させるかどうかを指定します。
FTP サーバー側のファイルリストの時間を GMT で表示するかどうかの指定です。ローカルタイムで表示するには、off を指定する必要があります。
proftpd をスタンドアローンモードで起動している場合に使用する TCP ポート番号を指定します。通常は、FTP の標準ポート番号である 21 番を指定します。
ファイルやディレクトリの作成時にパーミッションに割り当てる標準のマスクを指定します。
スタンドアローンモードで起動した場合のみ有効な指定です。親プロセスである proftpd により起動される子プロセスの最大数を指定します。
proftpd と ftp クライアントの間にデータ転送がないまま、何秒間コネクションを維持していられるかを指定します。Turbolinux 10 Server の初期設定は、300 秒です。0 を指定すると制限はなくなります。
proftpd サーバープロセスを実行するユーザーとグループを指定します。Turbolinux 10 Server の初期設定は、nobody です。ただし、ユーザーが FTP サーバーにログインすると、そのユーザーの UID、GID で実行されます。
proftpd の認証やユーザー名、グループ名の参照等の処理を制御します。他のオペレーティングシステムの中には、この値を on にしなければ、ファイルの所有者やグループを表示できない場合がありますが、Turbolinux 10 Server の場合は off のままで問題ありません。
proftpd のログを出力するファイル名をフルパスで指定しています。Turbolinux 10 Server の初期設定は、/var/log/proftpd.log です。
Directory ディレクティブは、指定したディレクトリと、そのサブディレクトリだけに適用される設定を行うためのディレクティブです。終了タグの </Directory> までが適用範囲となります。Turbolinux 10 Server の /etc/proftpd/proftpd.conf では、以下の設定で Directory ディレクティブが使用されています。
<Directory /*> AllowOverwrite on </Directory> |
/* は、Directory ディレクティブで設定を行うディレクトリの指定です。/* は、/ ディレクトリ以下の全てのディレクトリをあらわしています。このように *(アスタリスク)を使用したディレクトリの指定も可能です。また、Directory ディレクティブの中で使用されている AllowOverwrite ディレクティブは、ファイルの上書きを許可するかどうかを指定するためのディレクティブです。したがって、上記の設定は、/ ディレクトリ以下の全てのファイルに対して上書きを許可する設定となります。逆に AllowOverwrite の値を off にすれば、ファイルの上書きはできなくなります。もちろん、on に設定していても Linux システム上で対象のファイルに対する書き込み権限がなければ、そのユーザーはファイルを上書きすることはできません。
使用可能な 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 ディレクティブの開始タグと終了タグの間には、指定したコマンドの使用を許可するのか、それとも拒否するのかといった設定を記述します。このようなアクセス制御を行う代表的なディレクティブには、以下のものがあります。
全てのアクセスを許可します。
全てのアクセスを拒否します。
特別にアクセスを許可するユーザーを指定します。複数のユーザーを指定する場合は ,(カンマ)で区切ります。
特別にアクセスを拒否するユーザーを指定します。複数のユーザーを指定する場合は ,(カンマ)で区切ります。
特別にアクセスを許可するグループを指定します。複数のグループを指定する場合は ,(カンマ)で区切ります。
特別にアクセスを拒否するグループを指定します。複数のグループを指定する場合は ,(カンマ)で区切ります。
Allow は最初の引数として from をとります。続く引数でアクセスを許可するホストやネットワークを指定します。all は、全てのホストからのアクセスを許可するために使用します。none はアクセスを許可するホストやネットワークが存在しないことを示すために使用します。もし all か none が使用されていれば、host や network を指定することはできません。host や network では、proftpd にアクセスするホストをホスト名やネットワークアドレス、または IP アドレスで指定できます。複数指定する場合は ,(カンマ)で区切ります。
Deny は最初の引数として from をとります。続く引数でアクセスを拒否するホストやネットワークを指定します。all は、全てのホストからのアクセスを拒否するために使用します。none はアクセスを拒否するホストやネットワークが存在しないことを示すために使用します。もし all か none が使用されていれば、host や network を指定することはできません。host や network では、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> |