[an error occurred while processing this directive]
- Professional FTP Daemon -


設定 - よくある質問
ProFTPD を起動したのですが、動いていないようです。`ps'でも見えていません。何が悪いのでしょう?
多くの場合が考えられますが、もしかして root で proftpd を走らせていないのでは?(起動時には root で実行する必要がありますが、非特権ユーザにスイッチします)。とにかく、proftpd は標準の syslog で全てのエラーをログします。何が問題なのか、システムのログを確認する必要があります。
   
syslog に"inet_create_connection() failed: Operation not permitted"というエラーが出てしまいます。
shadow password を使っています。ユーザが ProFTPD にログインできません。
root で proftpd を走らせていないか、あるいは root 以外のユーザで proftpd を走らせるように inetd を設定しています。proftpd デーモンは 1024 よりも低い tcp ポートにバインドするためか、ユーザ認証時に shadow password ファイルを開くために root として実行されなければなりません。デーモンは通常、User/Group directive によって指定されたユーザに uid/gid をスイッチします。その時`ps'は、指定されたユーザによって走っていることを示すでしょう。
   
コマンドラインから proftpd を起動しようとすると、"Fatal: Socket operation on non-socket"というメッセージが出て、proftpd が起動しません。
スタンドアローンの代わりに inetd モードで proftpd を走らせるように設定しています。このモードで proftpd は、ターミナルの代わりに stdin/stdout がソケットになる inetd super-server から起動するようになっています。結果として、ソケットのオペレーションは失敗して、上記のエラーが表示されます。スタンドアローンモードでシェルから proftpd を走らせたいなら、proftpd.conf 設定ファイルを編集して、ServerType directive を読み込むように、追加、編集する必要があります:

ServerType standalone
   
ファイアウォール内部にある FTP クライアントに問題があって、ディレクトリ表示やファイル転送ができないみたいです。proftpd が接続のソースポートとして 20 番を使っていないようです; これは変えられますか?
クライアントが完全に認証された後でも、デーモンに root 特権で動くことを要求する unix FTP デーモンには、セキュリティ上問題があります。proftpd versions 1.0.x では、セキュリティへの関心があって、RFC959 で要求している 20 番のポートを無視することにしました。不幸にも時間が経って、これは過ちであることが明らかになりました。RFC が"fix"されるまで、この問題は unix FTP サーバを苦しめ続けるでしょう。
proftpd versions 1.1.x とそれ以降では、"標準的"な、root のままでポートの 20 番にバインドし、RFC959 に準拠したデーモンになっています。セキュリティの問題は残りますが、コードは出来る限り最新のセキュアなものをハンドルするように構築されています。

この問題に関しては、打開策が二つあります:

1. proftpd 1.1.x へのアップグレード(開発版).

2. FTP クライアントを passive mode にする。passive mode のデータ接続はクライアント側から発生し、このような "20" 番のポートの問題は生じません。
   
Anonymous FTP が動きません。サンプルの設定ファイルを全て試しましたが、どうしても 'ftp' または 'anonymous' で proftpd にログインしようとすると、"550 Login incorrect." と言われてしまいます。
まず、以下の事項を確認してください:

1. <Anonymous> の記述があって、user/group が指定されていることを確認してください。これは、実際にデーモンを走らせている、信頼できるユーザとグループでなければなりません。

2. もし RequireValidShell が意図的に off にされていなければ、"ftp user"(<Anonymous> の記述で User directive によって指定されているもの)は /etc/shells に示される有効な shell を持ちます。もしユーザに有効な shell を与えたくなければ、これを無効にする "RequireValidShell off" を使ってください。

3. もし、UseFtpUsers が意図的に off にされていなければ、/etc/ftpusers に "ftp user" が明示されていないことを確認してください。

これでうまくいかないようなら、syslog を確認してください。なんらかの理由で認証が失敗すると、proftpd は失敗した訳をログします; AUTH (or AUTHPRIV) 機能を使います。もし助けが必要なら、関係する syslog と設定ファイルを含むメールを proftpd メーリングリストに送ってください: proftpd-l@evcom.net
   
inetd super-server から proftpd を走らせるためには、/etc/inetd.conf の何を編集するのですか?
/etc/inetd.conf にある、このような行を見つけてください:
ftp stream tcp nowait root in.ftpd in.ftpd

このように置き換えます:
ftp stream tcp nowait root in.proftpd in.proftpd

それから、プロセスの中から inetd のプロセスを探し出して SIGHUP シグナルを送信して、リハッシュ、再設定します。例 (ほとんどの場合、inetd の pid は 189 とは違うので、バカ正直に以下を入力することはしないでください):
kill -1 189
   
proftpd に tcp-wrappers を使うことはできますか?
もちろんです。既に ProFTPD には IP アクセス制御が組み込まれていますが(DenyAllow directive を見てください)、管理者の多くは in.tcpd 経由で IP アクセス制御を束ねています。他の tcp-wrapper 経由のデーモンと同じように、inetd から起動するように proftpd を設定します:
ftp stream tcp nowait root in.tcpd in.proftpd
   
どうやって他の anonymous ログインや、ゲストアカウントを追加しますか?
tar の配布にある sample-configurations/directory を見てください。基本的に、guest/anonymous の ftp ログインのためにもう一つのシステムユーザを作る必要があります。セキュリティ上の理由から、ユーザアカウントが password を持っているか、あるいは、"unmatchable" password を持っていることを確認することが大事です。guest/anonymous アカウントの root ディレクトリはユーザディレクトリを持ってはいけないし、そうする意味はありません。アカウントを作った後、/etc/proftpd.conf ファイルに以下のように挿入してください(新しい user/group 名は、private/private であると仮定します):

<Anonymous ~private>
AnonRequirePassword off
User private
Group private
RequireValidShell off
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
</Anonymous>


これはユーザ名'private'、パスワードにメールアドレスで ftp クライアントにログインすることを許可しています。'private'アカウントに対して正確なパスワードをクライアントに送信させたければ、AnonRequirePassword directive を "on" に変えることができます。このサンプル設定は、クライアントにディレクトリの移動、表示、読み込みを許可しますが、なんらかの書き込みアクセスは拒否しています。
   
セキュアな仕様で、特定のディレクトリにだけアップロードを許可するにはどうすれば良いでしょうか?そのディレクトリでは、ユーザにダウンロードやサブディレクトリの作成をさせたくありません。
サンプルの設定ファイルには、セキュアな仕様で"upload"ディレクトリを保護するスクリプトがあります("warez" のためにサイトを使われたくなければ、とても良いアイデアです):

<Anonymous /home/ftp>

User ftp
Group ftp
UserAlias anonymous ftp

<Directory *>

<Limit WRITE>
DenyAll
</Limit>

</Directory>

<Directory incoming>

<Limit STOR>
AllowAll
</Limit>
<Limit READ>
DenyAll
</Limit>

</Directory>

</Anonymous>

これは anonymous のルートディレクトリとサブディレクトリに対する書き込み操作を拒否しますが、"incoming/" に対してはパーミッションが逆になっていて、クライアントの書き込みはできますが、読み込みはできなくなっています。<Directory incoming> に <Limit STOR> の代わりに <Limit WRITE> を使うと、ftp クライアントはサブディレクトリに対する全て書き込み操作、つまり、削除、名前の変更、ディレクトリの作成を許可されます。

   
anonymous クライアントからディレクトリを隠すにはどうすれば良いでしょうか?正確な名前を知っているクライアントだけが入れるようにしたいのです。
directive で適当な user/group を組み合わせるHideUserHideGroup directive を使ってください。例えば、anonymous ftp ディレクトリツリーに以下のディレクトリを持っているなら:

drwxrwxr-x 3 ftp staff 6144 Apr 21 16:40 private

ディレクトリの表示からプライベートなディレクトリを隠すには、"HideGroup staff"のような directive を使います。例:

<Anonymous ~ftp>
...
<Directory Private>
HideGroup staff
</Directory>
...
</Anonymous>
   
File/Directory を隠すのがうまくいきません。anonymous FTP として動かすと、ファイルやディレクトリが見えてしまいます。
隠しているグループが anonymous ftp ユーザのプライマリグループになっていないこと、HideGroup が適用されていないことを確認してください。
   
ディレクトリは隠れているんですが、ユーザが全くアクセスできないようにしたいのです。どうすれば良いでしょう?
anonymous FTP ユーザのアクセスを避けるディレクトリのパーミッションを変えるか、もし完全に見えなくしたいなら(ディレクトリが存在しないかのように)、隠れたディレクトリを完全に無視する IgnoreHidden directive を<Limit> の所で、一つかそれ以上使います(無視 = ディレクトリのエントリが存在しないかのようにみえること)。
   
バーチャルの FTP サーバを立ち上げるにはどうしますか?
まず、サーバのドキュメントを読みましたか?もし読んでなければ、読んでください。まだ疑問があるようなら、以下を読んでください:

マルチ IP をハンドルできるようにホストを設定する必要があります。これは "aliasing" と呼ばれるもので、IP エイリアスやダミーのインターフェースの設定により行われます。これをどのように行うかについては、OS のドキュメントを読むことが必要です。いったん、ホストがバーチャル FTP サーバを実行したい IP アドレスを受け入れるように設定して、バーチャルサーバを実行する <VirtualHost> directive を使います:

<VirtualHost 10.0.0.1>
ServerName "My virtual FTP server"
</VirtualHost>


anonymous/guest のログインを作るためには <VirtualHost> ブロックに directive を追加して、バーチャルホストでだけ利用できるようにします。
   
通常の usernames/passwords を使った FTP ユーザをバーチャル FTP サーバに入れたくないのです。バーチャルサーバを anonymous FTP 専用にしたいのです。どうすれば良いでしょう?
バーチャルホストのトップレベルのアクセスを拒否する <Limit LOGIN> を使って、それから anonymous ログインのアクセスを許可する <Limit LOGIN> を <Anonymous> に対して使ってください。例:

...
<VirtualHost 10.0.0.1>
ServerName "My virtual FTP server"
<Limit LOGIN>
DenyAll
</Limit>
<Anonymous /usr/local/private>
User private
Group private
<Limit LOGIN>
AllowAll
</Limit>
...
</Anonymous>
</VirtualHost>
   
ProFTPD と分離したコピーを走らせることをしないで、標準の ftp ポート(21)とは異なるポートで FTP サーバを動かすことはできますか?
できます。マシンの FQDN (Fully Qualified Domain Name) か IP アドレスについて、<VirtualHost> を使って、<VirtualHost> 内部で Port directive を使います。例えば、もしホスト名が "myhost.mydomain.com" で、ポート 2001 で FTP サーバを動かしたいなら:

...
<VirtualHost myhost.mydomain.com>
Port 2001
...
</VirtualHost>
   
<Limit LOGIN> とはどんな機能ですか、どこで使うべきですか?
<Limit LOGIN> directive は接続や、特定のログインアクセス(操作を含む directive)を制御するために使われます。proftpd へクライアントが接続すると、デーモンは <Limit LOGIN> directive のために設定ツリーを探して、パラメータを付けます(Allow, Deny, 等)。ログインをクライアントに許可することが考えられない場合があります。つまり、低次の "Allow from" を無効にしないで、"Deny from" と一致するクライアントのソースアドレスのような場合なら、クライアントはユーザとパスワードを送信しないで切断されます。しかし、クライアントのためにログインを許可するのが可能なら、proftpd は普通に動いて、適当な <Limit LOGIN> が有効ならログインだけをクライアントに許可します。通常、<Limit> directive はサーバ設定、<VirtualHost><Anonymous><Directory> の中で許可されます。しかし、<Limit LOGIN> はクライアントがディレクトリに connect/login しないように、<Directory> では使われません(だから、それには意味がありません)。

例として、以下の設定は 10.1.1.x のサブネットから入ってくる接続に対しては、welcome のメッセージを表示しないで直ちに切断するような <Limit LOGIN> deny です。:

...
<Limit LOGIN>
Order deny,allow
Deny from 10.1.1.
Allow from all
</Limit>
...


次に、入ってくるクライアントを直には切断しない <Limit LOGIN> を使った設定の例ですが、anonymous 以外のログインに対しては "Login invalid" を返します。

...
<Limit LOGIN>
DenyAll
</Limit>
<Anonymous ~ftp>
...
<Limit LOGIN>
AllowAll
</Limit>
...
   
どのようにすれば、ユーザが特定のディレクトリにしかログインできない よう制限することができるのですか? (chroot jail)
アクセス可能なディレクトリを指定するために <Anonymous>命令を、 UserPassword/ AnonRequirePassword命令などとの 併用で、使用することが出来ます。 もし全てのグループに対して、アクセス可能なディレクトリを制限(それより上のディレ クトリにはアクセスできなくなる)したいのであれば、 DefaultRoot命令を使用することができま す。(バージョン 0.99.0pl7 以上で使用できます). DefaultRoot は、 アクセス可能なルートディレクトリを制限できて(それより上のディレ クトリにはアクセスできなくなる)(~ でホームディレクトリを指定することも可能)、 またその設定をグループ単位で適用することが可能です。 例えば、

...
<VirtualHost myhost.mynet.foo>
DefaultRoot ~
...
</VirtualHost>


この設定で、myhost.mynet.fooにログインした全てのユーザの、アクセス可能なディレ クトリを、ホームディレクトに指定できます。 (そこより上のディレクトリにはアクセスできません) また、以下の様にすることもできます。

...
<VirtualHost myhost.mynet.foo>
DefaultRoot /u2/public users,!staff
...
</VirtualHost>


この例では、 'staff' というユーザに所属していない全ての 'users' グループのユーザ ーは、アクセス可能なディレクトリを /u2/public に制限します。もし、ユーザがど ちらのグループにも所属していなかったら、そのユーザは通常のディレクトリにログイ ンします。(通常のディレクトリとは、彼らのホームディレクトリのことで、また、上の ディレクトリへのアクセス禁止はされません)

単一のディレクトリ内に複数のアクセス制限を設けるために、複数の DefaultRoot 命令を使用することができます。もし、複数の DefaultRoot 命令が同じユーザに対して行われるのであれば、proftpdは任意の1つの設定を選択します。(どのようにして、設定ファイルを解釈するかに準じています。
   
  以下の質問については、proftpdのバージョン1.1.3以降 でのみ有効です。バージョン1.0.x では、これらの機能は使えません。
   
どのようにすれば、ユーザに anonymous FTP を提供することが出来るでしょうか?それぞれのユーザに対して個別の <Anonymous>設定を行うことは非常に難しいです。
解決策は2つ(おそらくもっと沢山)あります。まず、anonymous FTPのルートディレ クトリの中に、それぞれのユーザに対して1つづつ所有権とパーミッションを適切に与え たディレクトリを作成していきます。そして、ユーザホームディレクトリからftpのディ レクトリに対してシンボリックリンクを作成するか、ユーザにftpのディレクトリへのア クセス方法をレクチャーするかの、どちらかを行うことになります。

ユーザごとの anonymous FTPを可能にするための別の(より拡張性のある)手段は、 DefaultRoot との組み合わせで、 AnonymousGroup を使用することです。 おそらく、他の方法でユーザがFTP領域の全てにアクセスできないという理由から、これ を<VirtualHost>命令の適用 ディレクトリ内で行いたいかもしれません。さらに、 <Directory>の適用範囲を広げて、 ユーザが自分のディレクトリ以外にアクセスできる領域を慎重に規定したいかもしれ ません。

Step 1: `anonftp'というグループを unix システムに作成します。 そして、anonymous FTP の領域内に自分のディレクトリを持っているユーザをこの グループに属するように設定します。
Step 2: `anon-ftp'と`anon-ftp/incoming'というディレクトリをそれ ぞれのユーザのホームディレクトリに作成します。
Step 3: /etc/proftpd.conf ファイルを以下のように編集します。 (おそらく、状況に応じてカスタマイズすることになるかもしれません。):

<VirtualHost my.per-user.virtual.host.address>

# 次の行では、anonftpユーザだけがバーチャルホストにログインできるように制限をかけています。

<Limit LOGIN>
DenyGroup !anonftp
</Limit>

# ホームディレクトリの~/anon-ftp ディレクトリが読み込み専用になるように制限をかけます。

<Directory ~/anon-ftp>

<Limit WRITE>
DenyAll
</Limit>

</Directory>

# ユーザの anon-ftp/incoming ディレクトリに stor アクセスを許可するが、それ以外は不許可にする。

<Directory ~/anon-ftp/incoming>

<Limit STOR>
AllowAll
</Limit>

<Limit READ WRITE>
DenyAll
</Limit>

</Directory>

# このバーチャルホストにログインした全てのユーザにバーチャルホストを提供する。
DefaultRoot ~/anon-ftp
# 最後に、anonftpグループに全てのログインがanonymous になるように設定します。
AnonymousGroup anonftp

</VirtualHost>

anonymous の設定を特定のユーザの権限で実行されるようにし、なおかつそのユーザは通常どおりのログインが可能になるようにするにはどのようにすればよいでしょうか?さらにその際に、分割されたバーチャルホストを使用したくありません。
AuthAliasOnly命令を使用して、実際のユーザがどのようにしてどこで認証されるかをコントロールすることが出来ます。(UserAlias 命令によってもたらされる aliased names とは、対照的です。) 2つの同一のエイリアスネームで異なるanonymous サイトにログインすることは、いまだに不可能であることに注意してください。そのためには、<VirtualHost>の使用が必要になります。

例:

...
<Anonymous ~jrluser>

User jrluser
Group jrluser
UserAlias ftp jrluser
UserAlias anonymous jrluser
AuthAliasOnly on
...

</Anonymous>

この例の<Anonymous>設定では、~jrluserにエイリアス認証のみを許可しています。つまり、クライアントが 'jrluser'での認証を試みると、anonymous の設定は無視され、クライアントは通常のユーザとして認証されます。(典型的な、通常の `jrluser'ユーザのログインの結果として)。しかし、もしクライアントユーザが`ftp' や `anonymous' などのエイリアスネームを使用した場合、anonymous の設定が適用されます。


検索文字

ProFTPD ホームページ