Configuration Directives

The following configuration parameters control ProFTPD features and configuration:


AccessGrantMsg

Syntax: AccessGrantMsg message
Default: Dependent on login type
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0pl5 and later

Normally, a 230 response message is sent to an FTP client immediately after authentication, with a standard message indicating that the user has either logged in or that anonymous access has been granted. This message can be customized with the AccessGrantMsg directive. In the message argument, the magic cookie '%u' is replaced with the username specified by the client during login. Example:

AccessGrantMsg "Guest access granted for %u."


Allow

Syntax: Allow ["from"] "all"|"none"|host|network[,host|network[,...]]
Default: Allow from all
Context: <Limit>
Compatibility: 0.99.0pl6 and later

The Allow directive is used inside a <Limit> context to explicitly specify which hosts and/or networks have access to the commands or operations being limited. Allow is typically used in conjuction with Order and Deny in order to create sophisticated (or perhaps not-so-sophisticated) access control rules. Allow takes an optional first argument; the keyword from. Using from is purely cosmetic. The remaining arguments are expected to be a list of hosts and networks which will be explicitly granted access. The magic keyword all can be used to indicate that all hosts will explicitly be granted access (analogous to the AllowAll directive, except with a lower priority). Additionally, the magic keyword none can be used to indicate that no hosts or networks will be explicitly granted access (although this does not prevent them from implicitly being granted access). If all or none is used, no other hosts or networks can be supplied.

Host and network addresses can be specified by name or numeric address. For security reasons, it is recommended that all address information be supplied numerically. Relying solely on named addresses causes security to depend a great deal upon DNS servers which may themselves be vulnerable to attack or spoofing. Numeric addresses which specify an entire network should end in a trailing period (i.e. 10.0.0. for the entire 10.0.0 subnet). Named address which specify an entire network should begin with a trailing period (i.e. .proftpd.net for the entire proftpd.net domain).

Example:

<Limit LOGIN>
Order Allow,Deny
Allow from 128.44.26.,128.44.26.,myhost.mydomain.edu,.trusted-domain.org
Deny from all
</Limit>


AllowAll

Syntax: AllowAll
Default: Default is to implicitly AllowAll, but not explicitly
Context: <Directory>, <Anonymous>, <Limit>, .ftpaccess
Compatibility: 0.99.0 and later

The AllowAll directive explicitly allows access to a <Directory>, <Anonymous> or <Limit> block. Although proftpd's default behavior is to allow access to a particular object, the default is an implicit allow. AllowAll creates an explicit allow, overriding any higher level denial directives.


AllowFilter

Syntax: AllowFilter regular-expression
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre7 and later

AllowFilter allows the configuration of a regular expression that must be matched for all commands sent to ProFTPD. It is extremely useful in controlling what characters may be sent in a command to ProFTPD, preventing some possible types of attacks against ProFTPD. The regular expression is applied against the entire command sent by the client, so care must be taken when creating a proper regex. Commands that fail the regex match result in a "Forbidden command" error being returned to the client.

If the regular-expression argument contains whitespace, it must be enclosed in quotes.

Example:

# Only allow commands containing alphanumeric characters and whitespace
AllowFilter ".*/[a-zA-Z0-9 ]+$"

See Also: DenyFilter


AllowForeignAddress

Syntax: AllowForeignAddress on|off
Default: AllowForeignAddress off
Context: server config, <VirtualHost&, <Anonymous>, <Global>
Compatibility: 1.1.7 and later

Normally, proftpd disallows clients from using the ftp PORT command with anything other than their own address (the source address of the ftp control connection), as well as preventing the use of PORT to specify a low-numbered (< 1024) port. In either case, the client is sent an "Invalid port" error and a message is syslog'd indicating either "address mismatch" or "bounce attack". By enabling this directive, proftpd will allow clients to transmit foreign data connection addresses that do not match the client's address. This allows such tricks as permitting a client to transfer a file between two FTP servers without involving itself in the actual data connection. Generally it's considered a bad idea, security-wise, to permit this sort of thing.

AllowForeignAddress only affects data connection addresses; not tcp ports. There is no way (and no valid reason) to allow a client to use a low-numbered port in it's PORT command.


AllowGroup

Syntax: AllowGroup group-expression
Default: None
Context: <Limit>
Compatibility: 1.1.1 and later

AllowGroup specifies a group-expression that is specifically permitted within the context of the <Limit> block it is applied to. group-expression has the same format as that used in DefaultRoot, in that it should contain a comma seperated list of groups or "not" groups (by prefixing a group name with the `!' character) that are to be allowed access to the block. The expression is parsed as a boolean "and" list, meaning that ALL elements of the expression must evaluate to logically true in order for the explicit allow to apply.

See Also: DenyGroup, DenyUser, AllowUser


AllowUser

Syntax: AllowUser user-expression
Default: None
Context: <Limit>
Compatibility: 1.1.7 and later

AllowUser specifies a user-expression that is specifically permitted access within the context of the <Limit> block it is applied to. user-expression has a similar syntax as that used in AllowGroup, in that it should contain a comma delimited list of users or "not" users (by prefixing a user name with the `!' character) that are to be allowed access to the block. The expression is parsed as a boolean "and" list, meaning that ALL elements of the expression must evaluate to logically true in order to the explicit allow to apply.

See Also: DenyUser, DenyGroup, AllowGroup


AllowOverwrite

Syntax: AllowOverwrite on|off
Default: AllowOverwrite off
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>, .ftpaccess
Compatibility: 0.99.0 and later

The AllowOverwrite directive permits newly transfered files to overwrite existing files. By default, ftp clients cannot overwrite existing files.


AnonRequirePassword

Syntax: AnonRequirePassword on|off
Default: AnonRequirePassword off
Context: <Anonymous>
Compatibility: 0.99.0 and later

Normally, anonymous FTP logins do not require the client to authenticate themselves via the normal method of a transmitted cleartext password which is hashed and matched against an existing system user's password. Instead, anonymous logins are expected to enter their e-mail address when prompted for a password. Enabling the AnonRequirePassword directive requires anonymous logins to enter a valid password which must match the password of the user that the anonymous daemon runs as. However using AuthUsingAlias authentication can be matched against the password of the login username. This can be used to create "guest" accounts, which function exactly as normal anonymous logins do (and thus present a "chrooted" protected file system to the client), but require a valid password on the server's host system.

Example of a "guest" account configuration:

<Anonymous ~roger>
User roger
Group other
UserAlias proftpd roger
AnonRequirePassword on
# Deny write operations to all directories, underneath root-dir
# Default is to allow, so we don't need a <Limit> for read operations.
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
# Deny all read/write operations in incoming. Because these are command-group
# limits, we can explicitly permit certain operations which will take precedance
# over our group limit.
<Directory incoming>
<Limit READ WRITE>
DenyAll
</Limit>
# The only command allowed in incoming is STOR (transfer file from client to server)
<Limit STOR>
AllowAll
</Limit>
</Directory>
</Anonymous>


AllowRetrieveRestart

Syntax: AllowRetrieveRestart on|off
Default: AllowRetrieveRestart on
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>, .ftpaccess
Compatibility: 0.99.0 and later

The AllowRetrieveRestart directive permits or denies clients from performing "restart" retrieve file transfers via the FTP REST command. By default this is enabled, so that clients may resume interrupted file transfers at a later time without losing previously collected data.


AllowStoreRestart

Syntax: AllowStoreRestart on|off
Default: AllowStoreRestart off
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>, .ftpaccess
Compatibility: 0.99.0 and later

The AllowStoreRestart directive permits or denies clients from "restarting" interrupted store file transfers (those sent from client to server). By default restarting (via the REST command) is not permitted when sending files to the server. Care should be taken to disallow anonymous ftp "incoming" transfers to be restarted, as this will allow clients to corrupt or increase the size of previously stored files (even if not their own).


<Anonymous>

Syntax: <Anonymous root-directory>
Default: None
Context: server config,<VirtualHost>, <Global>
Compatibility: 0.99.0 and later

The Anonymous configuration block is used to create an anonymous FTP login, and is terminated by a matching </Anonymous> directive. The root-directory parameters specifies which directory the daemon will first chdir to, and then chroot, immediately after login. Once the chroot operation successfully completes, higher level directories are no longer accessible to the running child daemon (and thus the logged in user). By default, proftpd assumes an anonymous login if the remote client attempts to login as the currently running user; unless the current user is root, in which case anonymous logins are not allowed regardless of the presence of an <Anonymous> block. To force anonymous logins to be bound to a user other than the current user, see the User and Group directives. In addition, if a User or Group directive is present in an <Anonymous> block, the daemon permanently switches to the specified uid/gid before chroot()ing.

Normally, anonymous logins are not required to authenticate with a password, but are expected to enter a valid e-mail address in place of a normal password (which is logged). If this behavior is undesirable for a given <Anonymous> configuration block, it can be overridden via the AnonRequirePassword directive.

Note: Chroot()ed anonymous directories do not need to have supplemental system files in them, nor do they need to have any sort of specific directory structure. This is because proftpd is designed to acquire as much system information as possible before the chroot, and to leave open those files which are needed for normal operation and reside outside the new root directory.

Example of a typical anonymous FTP configuration:

<Anonymous /home/ftp>
User ftp # After anonymous login, daemon runs as user ftp.
Group ftp # After anonymous login, daemon runs as group ftp.
UserAlias anonymous ftp # Client login as 'anonymous' is aliased to 'ftp'.
# Deny write operations to all directories, underneath root-dir
# Default is to allow, so we don't need a <Limit> for read operations.
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
<Directory incoming>
<Limit READ WRITE>
DenyAll
</Limit>
<Limit STOR>
AllowAll
</Limit>
</Directory>
</Anonymous>


AnonymousGroup

Syntax: AnonymousGroup group-expression
Default: None
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.1.3 and later

The AnonymousGroup directive specifies a group-expression to which all matching users will be considered anonymous logins. The group-expression argument is a boolean logically ANDed list of groups to which the user must be a member of (or non-member if the group name is prefixed with a `!' character). For more information on group-expressions see the DefaultRoot directive.

If the authenticating user is matched by an AnonymousGroup directive, no valid password is required, and a special dynamic anonymous configuration is created, with the user's home directory as the default root directory. If a DefaultRoot directive also applies to the user, this directory is used instead of the user's home dir.

Great care should be taken when using AnonymousGroup, as improper configuration can open up user home directories to full read/write access to the entire world.


AuthAliasOnly

Syntax: AuthAliasOnly on|off
Default: AuthAliasOnly off
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.3 and later

AuthAliasOnly restricts authenication to "aliased" logins only; i.e. those usernames provided by clients which are "mapped" to a real userid by the UserAlias directive. Turning AuthAliasOnly `on' in a particular context will cause proftpd to completely ignore all non-aliased logins for the entire context. If no contexts are available without AuthAliasOnly set to `on', proftpd rejects the client login and sends an appropriate message to syslog.


AuthGroupFile

Syntax: AuthGroupFile path
Default: None
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.0.3/1.1.1 and later

AuthGroupFile specifies an alternate groups file, having the same format as the system /etc/group file, and if specified is used during authentication and group lookups for directory/access control operations. The path argument should be the full path to the specified file. AuthGroupFile can be configured on a per-VirtualHost basis, so that virtual FTP servers can each have their own authentication database (most often used in conjuction with AuthUserFile).

Note that this file need not reside inside a chroot()ed directory structure for Anonymous or DefaultRoot logins, as it is held open for the duration of client connections.


AuthPAMAuthoritative

Syntax: AuthPAMAuthoritative on|off
Default: off
Context: server config,<VirtualHost>, <Global>
Compatibility: 1.2.0pre3 and later

This directive allows you to control whether or not PAM is the ultimate authority on authentication. Setting this directive to on will cause authentication to fail if PAM authentication fails. The default setting, off, allows other modules and directives such as AuthUserFile and friends to authenticate users, should PAM authentication fail.

If you are having problems with PAM and using other directives like AuthUserFile, set this directive to off.


AuthUserFile

Syntax: AuthUserFile path
Default: None
Context: server config,<VirtualHost>, <Global>
Compatibility: 1.0.3/1.1.1 and later

AuthUserFile specifies an alternate passwd file, having the same format as the system /etc/passwd file, and if specified is used during authentication and user lookups for directory/access control operations. The path argument should be the full path to the specified file. AuthUserFile can be configured on a per-VirtualHost basis, so that virtual FTP servers can each have their own authentication database (most often used in conjuction with AuthGroupFile).

Note that this file need not reside inside a chroot()ed directory structure for Anonymous or DefaultRoot logins, as it is help open for the duration of client connections.


AuthUsingAlias

Syntax: AuthUsingAlias on|off
Default: AuthUsingAlias off
Context: <Anonymous>
Compatibility: 1.2.0pre9 and later

Normally, when the AnonRequirePassword directive is used, the authentication is done using the password entry of the daemon process. However under certain circumstances it may be required for the authentication to be done using the login username & password instead.

An example of an Anonymous configuration using AuthUsingAlias

# Basic Read-Only Anonymous Configuration.

<Anonymous /home/ftp>
UserAlias anonymous nobody
UserAlias ftp nobody
AuthAliasOnly on
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>

# Give Full Read-Write Anonymous Access to certain users

<Anonymous /home/ftp>
AnonRequirePassword on
AuthAliasOnly on
AuthUsingAlias on
# The list of authorized users.
# user/pass lookup is for each user, not password entry
# of server uid ('nobody' in this example).
UserAlias fred nobody
UserAlias joe nobody
<Limit ALL>
AllowAll
</Limit>
</Anonymous>


Bind

Syntax: Bind address
Default: None
Context: server config, <VirtualHost>
Compatibility: 1.1.6 and later

The Bind directive allows additional IP addresses to be bound to a main or VirtualHost configuration. Multiple Bind directives can be used to bind multiple addresses. The address argument should be either a fully qualified domain name or a numeric dotted-quad IP address. Incoming connections destined to an additional address added by Bind are serviced by the context containing the directive. Additionally, if SocketBindTight is set to on, a specific listen connection is created for each additional address.


CDPath

Syntax: CDPath directory
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre2 and later

Adds an entry to a search path that is used when changing directories. For example:

  CDPath    /home/public
  CDPath    /var/devel
This allows a user to cd into any directory directly under /home/public or /var/devel, provided they have the appropriate rights. So, if /home/public/proftpd exists, cd proftpd will bring the user to that directory, regardless of where they currently are in the directory tree.


CommandBufferSize

Syntax: CommandBufferSize size
Default: None
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre7 and later

The CommandBufferSize directive controls the maximum command length permitted to be sent to the server. This allows you to effectively control what the longest command the server may accept it, and can help protect the server from various Denial of Service or resource-consumption attacks.


DefaultChdir

Syntax: DefaultChdir directory [group-expression]
Default: ~
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre2 and later

Determines the directory a user is placed in after logging in. By default, the user is put in their home directory. The specified directory can be relative to the user's home directory.

NOTE: if the specifed directory is not available the user will not be able to log in.


DefaultRoot

Syntax: DefaultRoot directory [group-expression]
Default: DefaultRoot /
Context: server config, <VirtualHost>, <Global>
Compatibility: 0.99.0pl7 and later

The DefaultRoot directive controls the default root directory assigned to a user upon login. If DefaultRoot is set to a directory other than "/", a chroot operation is performed immediately after a client authenticates. This can be used to effectively isolate the client from a portion of the host system filespace. The specified root directory must begin with a / or can be the magic character '~'; meaning that the client is chroot jailed into their home directory. If the DefaultRoot directive specifies a directory which disallows access to the logged-in user's home directory, the user's current working directory after login is set to the DefaultRoot instead of their normal home directory. DefaultRoot cannot be used in <Anonymous> configuration blocks, as the <Anonymous> directive explicitly contains a root directory used for Anonymous logins.

The special character '~' is replaced with the authenticating user's home directory immediately after login. Note that the default root may be a subdirectory of the home directory, such as "~/anon-ftp".

The optional group-expression argument can be used to restrict the DefaultRoot directive to a unix group, groups or subset of groups. The expression takes the format: [!]group-name1[,[!]group-name2[,...]]. The expression is parsed in a logical boolean AND fashion, such that each member of the expression must evaluate to logically TRUE in order for the DefaultRoot directive to apply. The special character '!' is used to negate group membership.

Care should be taken when using DefaultRoot. Chroot "jails" should not be used as methods for implementing general system security as there are potentially ways that a user can "escape" the jail.

Example of a DefaultRoot configuration:

ServerName "A test ProFTPD Server"
ServerType inetd
User ftp
Group ftp
#
# This causes proftpd to perform a chroot into the authenticating user's directory immediately after login.
# Once this happens, the user is unable to "see" higher level directories.
# Because a group-expression is included, only users who are a member of
# the group 'users' and NOT a member of 'staff' will have their default
# root directory set to '~'.
DefaultRoot ~ users,!staff
...


DefaultServer

Syntax: DefaultServer on|off
Default: DefaultServer off
Context: server config,<VirtualHost>
Compatibility: 0.99.0pl6 and later

The DefaultServer directive controls which server configuration is used as the default when an incoming connection is destined for an IP address which is neither the host's primary IP address or one of the addresses specified in a <VirtualHost> configuration block. Normally such "unknown" connections are issued a "no server available to service your request" message and disconnected. When DefaultServer is turned on for either the primary server configuration or a virtual server, all unknown destination connections are serviced by the default server. Only a single server configuration can be set to default.


DefaultTransferMode

Syntax: DefaultTransferMode ascii|binary
Default: DefaultTransferMode ascii
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre9 and later

DefaultTransferMode sets the default transfer mode of the server. By default, carriage-return/linefeed translation will be performed (ASCII mode).


DeferWelcome

Syntax: DeferWelcome on|off
Default: DeferWelcome off
Context: server config, <VirtualHost>, <Global>
Compatibility: 0.99.0 and later

The DeferWelcome directive configures a master or virtual server to delay transmitting the ServerName and address to new connections, until a client has successfully authenticated. If enabled, the initial welcome message will be exceedingly generic and will not give away any type of information about the host that the daemon is actively running on. This can be used by security-conscious administrators to limit the amount of "probing" possible from non-trusted networks/hosts.


Deny

Syntax: Deny ["from"] "all"|"none"|host|network[,host|network[,...]]
Default: None
Context: <Limit>
Compatibility: 0.99.0pl6 and later

The Deny directive is used to create a list of hosts and/or networks which will explicitly be denied access to a given <Limit> context block. The magic keywords all and none can be used to indicate that all hosts are denied access, or that no hosts are explicitly denied (respectively). For more information on the syntax and usage of Deny see: Allow and Order.


DenyAll

Syntax: DenyAll
Default: None
Context: <Directory>, <Anonymous>, <Limit>, .ftpaccess
Compatibility: 0.99.0 and later

The DenyAll directive is analogous to a combination of "order deny,allow <cr> deny from all", with the exception that it has a higher precendance when parsed. It is provided as a convenient method of completely denying access to a directory, anonymous ftp or limit block. Because of it's precedance, it should not be intermixed with normal Order/Deny directives. The DenyAll directive can be overridden at a lower level directory by using AllowAll. DenyAll and AllowAll are mutually exclusive.


DenyFilter

Syntax: DenyFilter regular-expression
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre7 and later

Similar to AllowFilter, DenyFilter specifies a regular expression which must not match any command. If the regex does match, a "Forbidden command" error is returned to the client. This can be especially useful for forbidding certain command combinations from ever reaching ProFTPD.

Example:

# We don't want to allow any commands with % being sent to the server
DenyFilter "%"

See Also: AllowFilter


DenyGroup

Syntax: DenyGroup group-expression
Default: None
Context: <Limit>
Compatibility: 1.1.1 and later

DenyGroup specifies a group-expression that is specifically denied within the context of the <Limit> block it is applied to. group-expression has the same format as that used in DefaultRoot, in that it should contain a comma seperated list of groups or "not" groups (by prefixing a group name with the `!' character) that are to be denied access to the block. The expression is parsed as a boolean "and" list, meaning that ALL elements of the expression must evaluate to logically true in order for the explicit deny to apply.

See Also: AllowGroup, AllowUser, DenyUser


DenyUser

Syntax: DenyUser user-expression
Default: None
Context: <Limit>
Compatibility: 1.1.7 and later

DenyUser specifies a user-expression that is specifically denied within the context of the <Limit> block it is applied to. user-expression is a comma delimited list of users or "not" users (by prefixing a user name with the `!' character). The expression is parsed as a boolean "and" list, meaning that all elements of the expression must evaluate to logically true in order for the explicit deny to apply.

See Also: AllowUser, DenyGroup, AllowGroup


<Directory>

Syntax: <Directory pathname>
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0 and later

This directive creates a block of configuration directives which applies only to the specified directory and it's sub-directories. The block is ended with </Directory>. Per-directory configuration is enabled during run-time with a "closest" match algorithm, meaning that the <Directory> directive with the closest matching path to the actual pathname of the file or directory in question is used. Per-directory configuration is inherited by all sub-directories until a closer matching <Directory> is encountered, at which time the original per-directory configuration is replaced with the closer match. Note that this does not apply to <Limit> </Limit> blocks, which are inherited by all sub-directories until a <Limit> block is reached in a closer match.

Example:
<Directory /users/robroy/private>
HideNoAccess
</Directory>

A trailing slash and wildcard ("/*") can be appended to the directory, specifying that the configuration block applies only to the contents (and sub-contents), not to the actual directory itself. Such wildcard matches always take precedence over non-wildcard <Directory> configuration blocks. <Directory> blocks cannot be nested (they are automatically nested at run-time based on their pathnames). Pathnames must always be absolute (except inside <Anonymous>), and should not reference symbolic links. Pathnames inside an <Anonymous> block can be relative, indicating that they are based on the anonymous root directory.

[Notes for ProFTPD 1.1.3 and later only]
Pathnames that begin with the special character '~' and do not specify a username immediately after ~ are put into a special defered mode. When in defered mode, the directory context is not hashed and sorted into the configuration tree at boot time, but rather this hashing is defered until a user authenticates, at which time the '~' character is replaced with the user's home directory. This allows a global <Directory> block which applies to all user's home directories, or sub-directories thereof.

Example:
<Directory ~/anon-ftp>
<Limit WRITE>
DenyAll
</Limit READ>
</Directory>


DirFakeGroup

Syntax: DirFakeGroup On|Off [groupname]
Default: DirFakeGroup Off
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.5

DirFakeGroup and it's companion directive, DirFakeUser, can be used to hide the true group and user owners of files in a directory listing. If simply turned On, DirFakeGroup will display all files as being owned by group 'ftp'. Optionally, the groupname argument can be used to specify a specific group other than 'ftp'. Both DirFakeGroup and DirFakeUser are completely cosmetic; the groupname or username specified need not exists on the system, and neither directive affects permissions, real ownership or access control in any way.


DirFakeMode

Syntax: DirFakeMode octal-mode
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.1.6

The DirFakeMode directive configures a mode (or permissions) which will be displayed for ALL files and directories in directory listings. For each subset of permissions (user, group, other), the "execute" permission for directories is added in listings if the "read" permission is specified by this directive. For example:

DirFakeMode 0640

Will result in:

-rw-r----- ... arbitrary.file
drwxr-x--- ... arbitrary.directory

As with DirFakeUser, and DirFakeGroup, the "fake" permissions shown in directory listings are cosmetic only, they do not affect real permissions or access control in any way.


DirFakeUser

Syntax: DirFakeUser On|Off [username]
Default: DirFakeUser Off
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.5

See DirFakeGroup


DisplayConnect

Syntax: DisplayConnect filename
Default: None
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre2 and later

The DisplayConnect directive configures an ASCII text filename which will be displayed to the user when they initially connect but before they login. The filename can be either relative or absolute. In the case of a relative filename, the file is searched for starting in the home directory of the user the server is running as. As this can lead confusion, absolute pathnames are suggested. If the file cannot be found or accessed, no error occurs and nothing is logged or displayed to the client.

DisplayConnect supports a subset of the "magic cookies" used by DisplayLogin and DisplayFirstChdir: %T, %F, %R, %L and %u (see DisplayFirstChdir for details).


DisplayFirstChdir

Syntax: DisplayFirstChdir filename
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 0.99.0 and later, magic cookies only in 0.99.0pl10 and later

The DisplayFirstChdir directive configures an ASCII text filename which will be displayed to the user the first time they change into a directory (via CWD) per a given session. The file will also be displayed if proftpd detects that it's last modification time has changed since the previoius CWD into a given directory. If the filename is relative, it is looked for in the new directory that the user has changed into. Note that for anonymous ftp logins (see <Anonymous>), the file must reside inside the chroot()ed file system space. If the file cannot be found or accessed, no error occurs and nothing is logged or displayed to the client.

DisplayFirstChdir, DisplayConnect, DisplayLogin, DisplayQuit, support the following "magic cookies" (only in 0.99.0pl10 and later), which are replaced with their respective strings before being displayed to the user.

%T   Current Time
%F   Available space on file system
%C   Current working directory
%R   Remote host name
%L   Local host name
%u   Username reported by ident protocol
%U   Username originally used in login
%M   Max number of connections
%N   Current number of connections
%E   Server admin's e-mail address

NOTE: not all of these may have a rational value, depending on the context in which they're used (e.g., %u if ident lookups are off).


DisplayGoAway

Syntax: DisplayGoAway filename
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre8 and later

The DisplayGoAway directive specifies an ASCII text filename which will be displayed to the user if the class they're a member of has too many users logged in and their login request has been denied.

DisplayGoAway supports the same "magic cookies" as DisplayFirstChdir.

See Also: DisplayFirstChdir


DisplayLogin

Syntax: DisplayLogin filename
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0 and later

The DisplayLogin directive configures an ASCII text filename which will be displayed to the user when they initially login. The filename can be either relative or absolute. In the case of a relative filename, the file is searched for in the initial directory a user is placed in immediately after login (home directory for unix user logins, anonymous-root directory for anonymous logins). Note that for anonymous logins, the file must reside inside the chroot()ed file system space. If the file cannot be found or accessed, no error occurs and nothing is logged or displayed to the client.

DisplayLogin supports the same "magic cookies" as DisplayFirstChdir.


DisplayQuit

Syntax: DisplayQuit filename
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre8 and later

DisplayQuit configures an ASCII text filename which will be displayed to the user when they quit. The filename can be either relative or absolute. In the case of a relative filename, the file is searched for in current directory a user is in when they logout -- for this reason, a absolute filename is usually preferable.

NOTE: for anonymous logins, the file must reside inside the chroot()ed file system space. If the file cannot be found or accessed, no error occurs and nothing is logged or displayed to the client.

DisplayQuit supports the "magic cookies" listed under DisplayFirstChdir.


DisplayReadme

Syntax: DisplayReadme filename
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre8 and later
Module: mod_readme

The DisplayReadme directive notifies the user of the last change date of the specified file. Only a single DisplayReadme directive is allowed per configuration scope.

DisplayReadme README

Will result in:

Please read the file README it was last modified on Sun Oct 17 10:36:14 1999 - 0 days ago

Being displayed to the user on a cwd.


ExtendedLog

Syntax: filename [[command-classes] format-nickname]
Default: None
Context: server config, <VirtualHost>, <Anonymous> <Global>
Compatibility: 1.1.6pl1 and later

The ExtendedLog directive allows customizable logfiles to be generated, either globally or per VirtualHost. The filename argument must contain an absolute pathname to a logfile which will be appended to when proftpd starts. Multiple logfiles (potentially with different command classes and formats) can be created.

Optionally, the command-classes argument can be used to control which types of commands are logged. If not command classes are specified, proftpd logs all commands by default (passwords are hidden). command-classes is a comma delimited (no whitespace!) list of which commands to log. The following are valid classes:

If a format-nickname argument is supplied, ExtendedLog will use the predefined logformat (created by LogFormat). Otherwise, the default format of "%h %l %u %t \"%r\" %s %b" is used.

For example, to log all read and write operations to /var/log/ftp.log (using the default format), you could:

ExtendedLog /var/log/ftp.log read,write

See Also: LogFormat, TransferLog


<Global>

Syntax: <Global>
Default: None
Context: server config, <VirtualHost>
Compatibility: 1.1.6 and later

The Global configuration block is used to create a set of configuration directives which is applied universally to both the main server configuration and all VirtualHost configurations. Most, but not all other directives can be used inside a Global block.

In addition, multiple <Global> blocks can be created. At runtime, all Global blocks are merged together and finally into each server's configuration. Global blocks are terminated by a matching </Global> directive.


Group

Syntax: Group groupid
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0 and later

The Group directive configures which group the server daemon will normally run at. See User for more details.


GroupOwner

Syntax: GroupOwner groupid
Default: None
Context: <Anonymous>, <Directory>, .ftpaccess
Compatibility: 0.99.0 and later

The GroupOwner directive configures which group all newly created directories and files will be owned by, within the context that GroupOwner is applied to. Note that GroupOwner cannot be used to override the host OS/file system user/group paradigm. If the current user is not a member of the specified group, new files and directories will not be able to be chown()ed to the GroupOwner group. If this happens, file STOR (send file from client to server) and MKD (mkdir) operations will succeed normally, however the new directory entries will be owned by the current user's default group (a warning message is also logged) instead of by the desired group.


GroupPassword

Syntax: GroupPassword groupid hashed-password
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0pl5 and later

The GroupPassword directive creates a special "group" password which allows all users in the specified group to authenticate using a single password. The group/password supplied is only effective inside the context to which GroupPassword is applied. The hashed-password argument is a standard cleartext password which has been passed through the standard unix crypt() library function. Extreme care should be taken when using GroupPassword, as serious security problems may arise if group membership is not carefully controlled.

See Also: UserPassword


HiddenStor

Syntax: HiddenStor on|off
Default: HiddenStor off
Context: <Directory>, <Anonymous>, <VirtualHost>, <Global>
Compatibility: 1.2.0pre5 and later

The HiddenStor directive enables two-step file uploads: files are uploaded as ".in.filename." and once the upload is complete, renamed to just "filename". This provides a degree of atomicity and helps prevent 1) incomplete uploads and 2) files being used while they're still in the progress of being uploaded. Note: if the temporary file name is already in use (e.g., a server crash during upload), it will prevent the file from being uploaded.


HideGroup

Syntax: HideGroup groupid
Default: None
Context: <Directory>, <Anonymous>
Compatibility: 0.99.0 and later

The HideGroup directive configures a <Directory> or <Anonymous> block to hide all directory entries owned by the specified group, unless the group is the primary group of the currently logged-in, authenticated user . Normally, hidden directories and files cannot be seen via LIST or NLST commands but can be operated on via other FTP commands (CWD, DELE, RETR, etc). This behavior can be modified via the IgnoreHidden directive.

See Also: HideUser, HideNoAccess, IgnoreHidden


HideNoAccess

Syntax: HideNoAccess
Default: None
Context: <Directory>,<Anonymous>
Compatibility: 0.99.0 and later

The HideNoAccess directive configures a <Directory> or <Anonymous> block to hide all directory entries in a directory listing (via the LIST or NLST FTP commands) to which the current logged-in, authenticated user has no access to. Normal Unix-style permissions always apply, so that although a user may not be able to see a directory entry that has HideNoAccess applied, they will receive a normal "Permission denied" error message when attempting to blindly manipulate the file system object. The directory or file can be made completely invisible to all FTP commands by applying IgnoreHidden in conjunction with HideNoAccess.

See Also: HideUser, HideGroup, IgnoreHidden


HideUser

Syntax: HideUser userid
Default: None
Context: <Directory>, <Anonymous>
Compatibility: 0.99.0 and later

The HideUser directive configures a <Directory> or <Anonymous> block to hide all directory entries owned by the specified user, unless the owning user is the currently logged-in, authenticated user. Normally, hidden directories and files cannot be seen via LIST or NLST commands but can be operated on via other FTP commands (CWD, DELE, RETR, etc). This behavior can be modified via the IgnoreHidden directive.

See Also: HideGroup, HideNoAccess, IgnoreHidden


IdentLookups

Syntax: IdentLookups on|off
Default: IdentLookups on
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.1.5 and later

Normally, when a client initially connects to proftpd, the ident protocol (RFC1413) is used to attempt to identify the remote username. This can be controlled via the IdentLookups directive.


IgnoreHidden

Syntax: IgnoreHidden on|off
Default: IgnoreHidden off
Context: <Limit>
Compatibility: 0.99.0 and later

Normally, files hidden via HideNoAccess, HideUser or HideGroup can be operated on by all FTP commands (assuming Unix file permissions allow access), even though they do not appear in directory listings. Additionally, even when normal file system permissions disallow access, proftpd returns a "Permission denied" error to the client, indicating that the requested object does exist, even if it cannot be acted upon. IgnoreHidden configures a <Limit> block to completely ignore any hidden directory entries for the set of limited FTP commands. This has the effect of returning an error similar to "No such file or directory" when the client attempts to use the limited command upon a hidden directory or file.


<Limit>

Syntax: <Limit command|command-group [command2 ..]>
Default: None
Context: server config, <VirtualHost>, <Directory>, <Anonymous>, <Global>, .ftpaccess
Compatibility: 0.99.0 and later

The Limit configuration block is used to place access restrictions on one or more FTP commands, within a given context. Limits flow downward, so that a Limit configuration in the server config context applies to all <Directory> and <Anonymous> blocks that also reside in the configuration; until it is overridden by a "lower" <Limit> block. Any number of command parameters can be specified, against which the contents of the <Limit> block will be applied. command can be any valid FTP command, but is generally one of the following:

In addtion, the following command-groups are accepted. They have a lower precedence than real commands, meaning that a real command limit will always be applied instead of the command-group.

Finally, a special command is allowed which can be used to control login access:

<Limit> command restrictions should not be confused with file/directory access permission. While limits can be used to restrict a command on a certain directory, they cannot be used to override the file permissions inherent to the base operating/file system.

See Also: IgnoreHidden


Syntax: LDAPDefaultAuthScheme crypt|clear
Default: LDAPDefaultAuthScheme "crypt"
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

Specifies the authentication scheme used for passwords with no {prefix} in the LDAP database. For example, if you are using something like userPassword: mypass in your LDAP database, you would want to set LDAPDefaultAuthScheme to clear.


Syntax: LDAPDefaultGID default-gid
Default: None
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

This directive is useful primarily in virtual-user environments common in large-scale ISPs and hosting organizations. If a user does not have a LDAP gidNumber attribute, the LDAPDefaultGID is used. This allows one to have a large number of users in an LDAP database without gidNumber attributes; setting this configuration directive will automatically assign those users a single GID.


Syntax: LDAPDefaultUID default-uid
Default: None
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

This directive is useful primarily in virtual-user environments common in large-scale ISPs and hosting organizations. If a user does not have a LDAP uidNumber attribute, the LDAPDefaultUID is used. This allows one to have a large number of users in an LDAP database without uidNumber attributes; setting this configuration directive will automatically assign those users a single UID.


Syntax: LDAPDNInfo "ldap-dn" "dn-password"
Default: LDAPDNInfo "" "" (anonymous bind)
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

This directive specifies the LDAP DN and password to use when binding to the LDAP server. If this configuration directive is not specified, anonymous binds are used.


Syntax: LDAPDoAuth on|off "auth-base-prefix"
Default: LDAPDoAuth off
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

This configuration directive activates LDAP authentication. The second argument to this directive is the LDAP prefix to use for authentication.


Syntax: LDAPDoUIDLookups on|off "uid-base-prefix"
Default: LDAPDoUIDLookups off
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

This configuration directive activates LDAP UID-to-name lookups in directory listings. The second argument to this directive is the LDAP prefix to use for UID-to-name lookups.


Syntax: LDAPDoGIDLookups on|off "uid-base-prefix"
Default: LDAPDoGIDLookups off
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

This configuration directive activates LDAP GID-to-name lookups in directory listings. The second argument to this directive is the LDAP prefix to use for GID-to-name lookups.


Syntax: LDAPHomedirOnDemand on|off
Default: LDAPHomedirOnDemand off
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

LDAPHomedirOnDemand activates on-demand home directory creation. If a user logs in and does not yet have a home directory, a home directory is created automatically. The home directory will be owned by the same user and group that ProFTPD is running as (see the User and Group configuration directives).


Syntax: LDAPNegativeCache on|off
Default: LDAPNegativeCache off
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre9 and later

LDAPNegativeCache specifies whether or not to cache negative responses from the LDAP server when using LDAP for UID/GID lookups. This option is useful if you also use/are in transition from another authentication system; if there are many users in your old authentication system that aren't in the LDAP database, there can be a significant delay when a directory listing is performed as the UIDs not in the LDAP database are repeatedly looked up in an attempt to present usernames instead of UIDs in directory listings. With LDAPNegativeCache set to on, negative ("not found") responses from the LDAP server will be cached and speed will improve on directory listings that contain many users not present in the LDAP database.


Syntax: LDAPQueryTimeout timeout-seconds
Default: LDAPQueryTimeout default-api-timeout
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre10 and later

Sets the timeout used for LDAP directory queries. The default is the default timeout used by the LDAP API.


Syntax: LDAPServer "hostname"
Default: LDAPServer "localhost"
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre9 and later

LDAPServer allows you to to specify the hostname of the LDAP server to use for LDAP authentication. If no LDAPServer configuration directive is present, the local host will be used for the LDAP server.


LogFormat

Syntax: LogFormat nickname "format-string"
Default: LogFormat default "%h %l %u %t \"%r\" %s %b"
Context: server config
Compatibility: 1.1.6pl1 and later

The LogFormat directive can be used to create a custom logging format for use with the ExtendedLog directive. Once created, the format can be referenced by the specified nickname.

The format-string argument can consist of any combination of letters, numbers and symbols. The special character % is used to start a meta-sequence (see below). To insert a literal % character, use %%. The following meta sequences are available and are replaced as indicated when logging.

%b   Bytes sent for request
%f   Filename stored or retrieved
%{FOOBAR}e   Contents of environment variable FOOBAR
%h   Remote host name
%a   Remote IP address
%l   Remote username (from ident)
%p   Local server port number
%v   Local server name
%P   Local server process id (pid)
%r   Full command line received from client
%t   Current local time
%{format}t   Current local time formatted (strftime(3) format)
%T   Time taken to transmit/receive file, in seconds
%s   Numeric FTP response code (status)
%u   Local authenticated userid

See Also: ExtendedLog, TransferLog


LoginPasswordPrompt

Syntax: LoginPasswordPrompt on|off
Default: LoginPasswordPrompt on
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.2.0pre1 and later

If set to off, ProFTPd will skip the password request if the login will be denied regardless of password, e.g., if a <Limit LOGIN> directive forbids the connection.


LsDefaultOptions

Syntax: LsDefaultOptions "options string"
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.6 and later

Normally, FTP commands involving directory listings (NLST, LIST and STAT) use the arguments (options) passed by the client to determine what files are displayed and the format they are displayed in. Using the LsDefaultOptions directive can alter the default behavior of such listings, but implying that a certain option (or options) is always present. For example, to force all directory listings to always display ".dotfiles", one might:

LsDefaultOptions "-a"


MaxClients

Syntax: MaxClients number|none message
Default: MaxClients none
Context: server config, <Anonymous>, <VirtualHost>, <Global>
Compatibility: 0.99.0 and later

The MaxClients directive configures the maximum number of authenticated clients which may be logged into a server or anonymous account. Once this limit is reached, additional clients attempting to authenticate will be disconnected.

The special value none may be supplied which removes all maximum connection limits from the applicable configuration context. Additionally, an optional message argument may be used which will be displayed to a client attempting to exceed the maximum value; immediately before disconnection. The message argument is parsed for the magic string "%m", which is replaced with the configured maximum value. If message is not supplied, a system-wide default message is used.

Example:

MaxClients 5 "Sorry, the maximum number of allowed users are already connected (%m)"

Results in:

530 Sorry, the maximum number of allowed users are already connected (5)


MaxClientsPerHost

Syntax: MaxClientsPerHost number|none message
Default: MaxClientsPerHost none
Context: server config, <Anonymous>, <VirtualHost>, <Global>
Compatibility: 1.1.7 and later

The MaxClientsPerHost directive configures the maximum number of clients allowed to connect per host. The optional argument message may be used which will be displayed to a client attempting to exceed the maximum value. If message is not supplied, a system-wide default message is used.

Example:

MaxClientsPerHost 1 "Sorry, you may not connect more than one time."

Results in:

530 Sorry, you may not connect more than one time.


MaxInstances

Syntax: MaxInstances number
Default: MaxInstances none
Context: server config
Compatibility: 1.1.6pl1

The MaxInstances directive configures the maximum number of child processes that may be spawned by a parent proftpd process in standalone mode. The directive has no effect when used on a server running in inetd mode.

Because each child proftpd process represents a single client connection, this directive also controls the maximum number of simultaneous connections allowed. Additional connections beyond the configured limit are syslog'd and silently disconnected. The MaxInstances directive can be used to prevent undesireable denial-of-service attacks (repeatedly connecting to the ftp port, causing proftpd to fork-bomb). By default, no limit is placed on the number of child processes that may run at one time.


MaxLoginAttempts

Syntax: MaxLoginAttempts number
Default: MaxLoginAttempts 3
Context: server config, <VirtualHost>, <Global>
Compatibility: 0.99.0 and later

The MaxLoginAttempts directive configures the maximum number of times a client may attempt to authenticate to the server during a given connection. After the number of attempts exceeds this value, the user is disconnected and an appropriate message is logged via the syslog mechanism.


MultilineRFC2228

Syntax: MultilineRFC2228 on|off
Default: MultilineRFC2228 off
Context: server config
Compatibility: 1.2.0pre3 and later

By default, proftpd sends multiline responses as per RFC 959, i.e.:

  200-First line
   More lines...
  200 Last line
RFC 2228 specifies that "6xy" response codes will be sent as follows:
  600-First line
  600-More lines...
  600 Last line
Note that 2228 ONLY specifies this for response codes starting with '6'. Enabling this directive causes ALL responses to be sent in this format, which may be more compatible with certain web browsers and clients. Also note that this is NOT the same as wu-ftpd's multiline responses, which do not comply with any RFC. Using this method of multilines is more likely to be compatible with all clients, although it isn't strictly RFC, and is thus not enabled by default.


Order

Syntax: Order allow,deny|deny,allow
Default: Order allow,deny
Context: <Limit>
Compatibility: 0.99.0pl6 and later

The Order directive configures the order in which Allow and Deny directives are checked inside of a <Limit> block. Because Allow directives are permissive, and Deny directives restrictive, the order in which they are examined can significantly alter the way security functions.

If the default setting of allow,deny is used, "allowed" access permissions are checked first. If an Allow directive explicitly allows access to the <Limit> context, access is granted and any Deny directives are never checked. If Allow did not explicitly permit access, Deny directives are checked. If any Deny directive applies, access is explicitly denied. Otherwise, access is granted.

When deny,allow is used, "deny" access restrictions are checked first. If any restriction applies, access is denied immediately. If nothing is denied, Allow permissions are checked. If an Allow explicitly permits access, access to the entire context is permited; otherwise access is implicitly denied.

For clarification, the following illustrates the steps used when checking Allow/Deny access:

Order allow,deny

  1. Check Allow directives. If one or more apply, exit with result: ALLOW
  2. Check Deny directives. If one or more apply, exit with result: DENY
  3. Exit with default implicit ALLOW

Order deny,allow

  1. Check Deny directives. If one or more apply, exit with result: DENY
  2. Check Allow directives. If one or more apply, exit with result: ALLOW
  3. Exit with default implicit: DENY

PAMConfig

Syntax: PAMConfig service
Default: ftp
Context: server config,<VirtualHost>, <Global>
Compatibility: 1.2.0pre3 and later

This directive allows you to specify the PAM service name used in authentication. PAM allows you to specify a service name to use when authenticating. This allows you to configure different PAM service names to be used for different virtual hosts.

Example:

# Virtual host foobar authenticates differently than the rest. PAMConfig foobar

This assumes you have a PAM service named foobar configured in your /etc/pam.conf file or /etc/pam.d directory.


PathAllowFilter

Syntax: PathAllowFilter regular-expression
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.7 and later

PathAllowFilter allows the configuration of a regular expression that must be matched for all newly uploaded (stored) files. The regular expression is applied against the entire pathname specified by the client, so care must be taken when creating a proper regex. Paths that fail the regex match result in a "Forbidden filename" error being returned to the client.

If the regular-expression argument contains whitespace, it must be enclosed in quotes.

Example:

# Only allow filenames containing alphanumeric characters
PathAllowFilter ".*/[a-zA-Z0-9]+$"


PathDenyFilter

Syntax: PathDenyFilter regular-expression
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.7 and later

Similar to PathAllowFilter, PathDenyFilter specifies a regular expression which must not match any uploaded pathnames. If the regex does match, a "Forbidden filename" error is returned to the client. This can be especially useful for forbidding .ftpaccess or .htaccess files.

Example:

# We don't want .ftpaccess or .htaccess files to be uploaded
PathDenyFilter "(\.ftpaccess)|(\.htaccess)$"


PersistentPasswd

Syntax: PersistentPasswd on|off
Default: Platform dependent
Context: server config
Compatibility: 1.1.5 and later

The PersistentPasswd directive controls how proftpd handles authentication, user/group lookups, and user/group to name mapping. If set to On, proftpd will attempt to open the system-wide /etc/passwd, /etc/group (and /etc/shadow, potentially) files itself, holding them open even during a chroot()ed login (note that /etc/shadow is never held open, for security reasons). On some platforms, you must turn this option on, as the libc functions are incapable of accessing these databases from inside of a chroot(). At configure-time, the configuration script will attempt to detect whether or not you need this support, and make it the default. However, such "guessing" may fail, and you will have to manually enable or disable the feature. If you cannot see user or group names when performing a directory listing inside an anonymous chrooted login, this indicates you must enable the directive. Use of the AuthUserFile or AuthGroupFile directives will force partial support for persistent user or group database files; regardless of PersistentPasswd's setting.

Note: NIS or NIS+ users will most likely want to disable this feature, regardless of proftpd's detected configuration defaults. Failure to disable this will make your NIS/NIS+ maps not work!


Port

Syntax: Port port-number
Default: Port 21
Context: server config, <VirtualHost>
Compatibility: 0.99.0 and later

The Port directive configures the tcp port which proftpd will listen on while running in standalone mode. It has no effect when used upon a server running in inetd mode (see ServerType). The directive can be used in conjuction with <VirtualHost> in order to run a virtual server on the same IP address as the master server, but listening on a different port.


RateReadBPS

Syntax: RateReadBPS byte_per_sec-number
Default: 0
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.2.0 and later

RateReadBPS sets the allowed byte per second download bandwidth in the given config context. Zero means no bandwidth limit. (See RateReadFreeBytes about limiting bandwidth only after some amount of downloaded bytes.) The usual place for this directive is in <VirtualHost> or <Directory> sections.


RateReadFreeBytes

Syntax: RateReadFreeBytes number of bytes
Default: 0
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.2.0 and later

RateReadFreeBytes is the amount of bytes to be transferred without any bandwidth limits, so with that option you can give full bandwidth for small files while limiting big ones. (See RateReadHardBPS on further info about what happens after the free amount was transferred.)

RateReadHardBPS

Syntax: RateReadHardBPS on/off
Default: off
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.2.0 and later

RateReadHardBPS forces the bandwidth to the given RateReadBPS value after the RateReadFreeBytes amount of file was transfered. This means that if the user have huge bandwidth and downloaded the "free" amount fast, HardBPS will stop the transfer until the average goes down to the given limit. If the amount of FreeBytes is high and the ReadBPS is low then the user may wait for extended periods of time until the transfer continues. :-)


RateWriteBPS

Syntax: RateWriteBPS byte_per_sec-number
Default: 0
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.2.0 and later

RateWriteBPS sets the allowed byte per second upload bandwidth in the given config context. Zero means no bandwidth limit. (See RateWriteFreeBytes about limiting bandwidth only after some amount of uploaded bytes.) The usual place for this directive is in <VirtualHost> or <Directory> sections.


RateWriteFreeBytes

Syntax: RateWriteFreeBytes number of bytes
Default: 0
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.2.0 and later

RateWriteFreeBytes is the amount of bytes to be transferred without any bandwidth limits, so with that option you can give full bandwidth for small files while limiting big ones. (See RateWriteHardBPS on further info about what happens after the free amount was transferred.)


RateWriteHardBPS

Syntax: RateWriteHardBPS on/off
Default: off
Context: server config, <VirtualHost>, <Anonymous>, <Directory>, <Global>
Compatibility: 1.2.0 and later

RateWriteHardBPS forces the bandwidth to the given RateWriteBPS value after the RateWriteFreeBytes amount of file was transfered. This means that if the user have huge bandwidth and uploaded the "free" amount fast, HardBPS will stop the transfer until the average goes down to the given limit. If the amount of FreeBytes is high and the WriteBPS is low then the user may wait for extended periods of time until the transfer continues. :-)


RequireValidShell

Syntax: RequireValidShell on|off
Default: RequireValidShell on
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0 and later

The RequireValidShell directive configures the server, virtual host or anonymous login to allow or deny logins which do not have a shell binary listed in /etc/shells. By defualt, proftpd disallows logins if the user's default shell is not listed in /etc/shells. If /etc/shells cannot be found, all default shells are assumed to be valid.


RootLogin

Syntax: RootLoginl on|off
Default: RootLogin off
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.5 and later

Normally, proftpd disallows root logins under any circumstance. If a client attempts to login as root, using the correct password, a special security message is sent to syslog. When the RootLogin directive is turned On, the root user may authenticate just as any other user could (assuming no other access control measures deny access); however the root login security message is still sysloged. Obviously, extreme care should be taken when using this directive.


ScoreboardPath

Syntax: ScoreboardPath path
Default: ScoreboardPath /var/run
Context: server config
Compatibility: 1.1.6 and later

The ScoreboardPath directive sets the directory where proftpd run-time scoreboard files (proftpd-*) are kept. These file(s) are necessary for MaxClients to work properly, as well as other utilities (such as ftpwho and ftpcount).


ServerAdmin

Syntax: ServerAdmin "admin-email-address"
Default: ServerAdmin root@[ServerName]
Context: server config, <VirtualHost>
Compatibility: 0.99.0pl10 and later

The ServerAdmin directive sets the email address of the administrator for the server or virtualhost. This address is displayed in magic cookie replacements (see DisplayLogin and DisplayFirstChdir).


ServerIdent

Syntax: ServerIdent On|Off [identification string]
Default: ServerIdent ProFTPD [version] Server (server name) [hostname]
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre2 and later

The ServerIdent directive sets the default message displayed when a new client connects. Setting this to off displays "[hostname] FTP server ready." If set to on, the directive can take an optional string argument, which will be displayed instead of the default text. Sites desiring to give out minimal information will probably want a setting like ServerIdent "FTP Server ready.", which won't even reveal the hostname.


ServerName

Syntax: ServerName "name"
Default: ServerName "ProFTPD Server [version]"
Context: server config, <VirtualHost>
Compatibility: 0.99.0 and later

The ServerName directive configures the string that will be displayed to a user connecting to the server (or virtual server if the directive is located in a <VirtualHost> block).

See Also: <VirtualHost>


ServerType

Syntax: ServerType type-identifier
Default: ServerType standalone
Context: server config
Compatibility: 0.99.0 and later

The ServerType directive configures the server daemon's operating mode. The type-identifier can be one of two values:


ShowDotFiles

Syntax: ShowDotFiles on|off
Default:ShowDotFiles Off
Context:
server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility:
0.99.0pl6 and later -- Deprecated

If set to on, files starting with a '.' will be displayed in directory listings. This directive has been deprecated in favor of LsDefaultOptions -- e.g., LsDefaultOptions "-a" -- and may be removed in future versions.

See Also: LsDefaultOptions


ShowSymlinks

Syntax: ShowSymlinks on|off
Default: (versions previous to 1.1.5) Off for anonymous logins, On for normal logins
Default: (versions 1.1.5 and beyond) ShowSymlinks On
Context:
server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility:
0.99.0pl6 and later

Symbolic links (if supported on the host OS and filesystem) can be either shown in directory listings (including the target of the link) or can be "hidden" (proftpd dereferences symlinks and reports the target's permissions and ownership). The default behavior is to show all symbolic links when normal users are logged in, and hide them for anonymous sessions. If a symbolic link cannot be dereferenced for any reason (permissions, target does not exist, etc) and ShowSymlinks is off, proftpd displays the link as a directory entry of type 'l' (link) with the ownership and permissions of the actual link.

Under ProFTPD versions 1.1.5 and higher, the default behavior in regard to ShowSymlinks has been changed so that symbolic links are always displayed as such (in all cases), unless ShowSymlinks off is explicitly set.


SocketBindTight

Syntax: SocketBindTight on|off
Default: SocketBindTight off
Context: server config
Compatibility: 0.99.0pl6 and later

The SocketBindTight directive controls how proftpd creates and binds it's initial tcp listen sockets in standalone mode (see ServerType). The directive has no effect upon servers running in inetd mode, because listen sockets are not needed or created. When SocketBindTight is set to off (the default), a single listening socket is created for each port that the server must listen on, regardless of the number of IP addresses being used by <VirtualHost> configurations. This has the benefit of typically requiring a relatively small number of file descriptors for the master daemon process, even if a large number of virtual servers are configured. If SocketBindTight is set to on, a listen socket is created and bound to a specific IP address for the master server and all configured virtual servers. This allows for situations where an administrator may wish to have a particular port be used by both proftpd (on one IP address) and another daemon (on a different IP address). The drawback is that considerably more file descriptors will be required if a large number of virtual servers must be supported.

Example: Two servers have been configured (one master and one virtual), with the IP addresses 10.0.0.1 and 10.0.0.2, respectively. The 10.0.0.1 server runs on port 21, while 10.0.0.2 runs on port 2001.

SocketBindTight off #default
# proftpd creates two sockets, both bound to ALL available addresses.
# one socket listens on port 21, the other on 2001. Because each socket is
# bound to all available addresses, no other daemon or user process will be
# allowed to bind to ports 21 or 2001.
...
SocketBindTight on
# proftpd creates two sockets again, however one is bound to 10.0.0.1, port 21
# and the other to 10.0.0.2, port 2001. Because these sockets are "tightly"
# bound to IP addresses, port 21 can be reused on any address OTHER than
# 10.0.0.1, and visa-versa with 10.0.0.2, port 2001.

One side-effect of setting SocketBindTight to on is that connections to non-bound addresses will result in a "connection refused" message rather than the typical "500 Sorry, no server available to handle request on xxx.xxx.xxx.xxx.", due to the fact that no listen socket has been bound to the particular address/port pair. This may or may not be aesthetically desireable, depending on your circumstances.


SyslogFacility

Syntax: SyslogFacility facility-level
Default: None
Context: server config
Compatibility: 1.1.6 and later

Proftpd logs it's activity via the Unix syslog mechanism, which allows for several different general classifications of logging messages, known as "facilities." Normally, all authentication related messages are logged with the AUTHPRIV (or AUTH) facility [intended to be secure, and never seen by unwanted eyes], while normal operational messages are logged with the DAEMON facility. The SyslogFacility directive allows ALL logging messages to be directed to a different facility than the default. When this directive is used, ALL logging is done with the specificed facility, both authentication (secure) and otherwise.

The facility-level argument must be one of the following: AUTH (or AUTHPRIV), CRON, DAEMON, KERN, LPR, MAIL, NEWS, USER, UUCP, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6 or LOCAL7.

See Also: SystemLog


SystemLog

Syntax: SystemLog filename|NONE
Default: None
Context: server config
Compatibility: 1.1.6pl1 and later

The SystemLog directive disables proftpd's use of the syslog mechanism and instead redirects all logging output to the specified filename. The filename argument should contain an absolute path. Use of this directive overrides any facility set by the SyslogFacility directive.

Additionally, the special keyword NONE can be used which disables all syslog style logging for the entire configuration.


tcpBackLog

Syntax: tcpBackLog backlog-size
Default: tcpBackLog 5
Context: server config
Compatibility: 0.99.0 and later

The tcpBackLog directive controls the tcp "backlog queue" when listening for connections in standalone mode (see ServerType). It has no affect upon servers in inetd mode. When a tcp connection is established by the tcp/ip stack inside the kernel, there is a short period of time between the actual establishment of the connection and the acceptance of the connection by a user-space program. The duration of this latency period is widely variable, and can depend upon several factors (hardware, system load, etc). During this period tcp connections cannot be accepted, as the port that was previouisly "listening" has become filled with the new connection. Under heavy connection load this can result in occasional (or even frequent!) "connection refused" messages returned to the incoming client, even when there is a service available to handle requests. To eliminate this problem, most modern tcp/ip stacks implement a "backlog queue" which is simply a pre-allocation of resources necessary to handle backlog-size connections during the latency period. The larger the backlog queue, the more connections can be established in a very short time period. The trade-off, of course, is kernel memory and/or other kernel resources.

Generally it is not necessary to use a tcpBackLog directive, unless you intend to service a large number of virtual hosts (see <VirtualHost>), or have a consistantly heavy system load. If you begin to notice or hear of "connection refused" messages from remote clients, try setting a slightly higher value to this directive.


tcpNoDelay

Syntax: tcpNoDelay on|off
Default: tcpNoDelay on
Context: server config, <VirtualHost>, <Global>
Compatibility: 1.2.0pre3a and later

The tcpNoDelay directive controls the use of the TCP_NODELAY socket option (which disables the Nagle algorithm). ProFTPd uses TCP_NODELAY by default, which usually is a benefit but this can ocassionally lead to problems with some clients, so tcpNoDelay is provided as a way to disable this option. You will not normally need to use this directive but if you have clients reporting unusually slow connections, try setting this to off.


tcpReceiveWindow

Syntax: tcpReceiveWindow window-size
Default: tcpReceiveWindow 8192
Context: server config, <VirtualHost>
Compatibility: 0.99.0 and later

The tcpReceiveWindow directive configures the size (in octets) of all data connections' tcp receive windows. It is only used when receiving a file from a client over the data connection. Typically, a given tcp/ip implementation will use a relatively small receive window size (the number of octets that can be received at the tcp layer before a "turnaround" acknowledgement is required). When transfering a large amount of data over fast digital transmission lines which have a relatively high latency, a small receive window can dramatically affect perceived throughput because of the necessity to completely stop the transfer occasionally in order to wait for the remote endpoint to receive the acknowledgement and continue transmission. For example, on a T1 line (assuming full 1.544Mbps endpoint-to-endpoint throughput) with 100 ms latency, a 4k receive buffer will very dramatically reduce the perceived throughput. The default value of 8192 octets (8k) should be reasonable in common network configurations.

Additionally, proftpd allocates its internal buffers to match the receive/send window sizes; in order to maximize the reception/transmission performance (reducing the number of times data must be transfered from proftpd to the kernel tcp/ip stack). The tradeoff, of course, is memory; both kernel- and user-space. If running proftpd on a memory tight host (and on a low-bandwidth connection), it might be advisable to decrease both the tcpReceiveWindow and tcpSendWindow sizes.


tcpSendWindow

Syntax: tcpSendWindow window-size
Default: tcpSendWindow 8192
Context: server config, <VirtualHost>
Compatibility: 0.99.0 and later

The tcpSendWindow directive configures the size (in octets) of all data connections' tcp send windows. It is only used when sending a file from the server to a client on the data connection. For a detailed description of receive/send window sizes see tcpReceiveWindow.


TimeoutIdle

Syntax: TimeoutIdle seconds
Default: TimeoutIdle 600
Context: server config
Compatibility: 0.99.0 and later

The TimeoutIdle directive configures the maximum number of seconds that proftpd will allow clients to stay connected without receiving any data on either the control or data connection. If data is received on either connection, the idle timer is reset. Setting TimeoutIdle to 0 disables the idle timer completely (clients can stay connected for ever, without sending data). This is generally a bad idea as a "hung" tcp connection which is never properly disconnected (the remote network may have become disconnected from the Internet, etc) will cause a child server to never exit (at least not for a considerable period of time) until manually killed

See Also: TimeoutLogin, TimeoutNoTransfer


TimeoutLogin

Syntax: TimeoutLogin seconds
Default: TimeoutLogin 300
Context: server config
Compatibility: 0.99.0 and later

The TimeoutLogin directive configures the maximum number of seconds a client is allowed to spend authenticating. The login timer is not reset when a client transmits data, and is only removed once a client has transmitted an acceptable USER/PASS command combination.

See Also: TimeoutIdle, TimeoutNoTransfer


TimeoutNoTransfer

Syntax: TimeoutNoTransfer seconds
Default: TimeoutNoTransfer 600
Context: server config
Compatibility: 0.99.0 and later

The TimeoutNoTransfer directive configures the maximum number of seconds a client is allowed to spend connected, after authentication, without issuing a command which results in creating an active or passive data connection (i.e. sending/receiving a file, or receiving a directory listing).

See Also: TimeoutIdle, TimeoutLogin


TimeoutStalled

Syntax: TimeoutStalled seconds
Default: TimeoutStalled 0
Context: server config
Compatibility: 1.1.6 and later

The TimeoutStalled directive sets the maximum number of seconds a data connection between the proftpd server and an FTP client can exist but have no actual data transferred (i.e. "stalled"). If the seconds argument is set to 0, data transfers are allowed to stall indefinitely (the default).


TransferLog

Syntax: TransferLog filename|NONE
Default: TransferLog /var/log/xferlog
Context: server config, <Anonymous>, <VirtualHost>, <Global>
Compatiblity: 1.1.4 and later

The TransferLog directive configures the full path to the "wu-ftpd style" file transfer log. Seperate log files can be created for each Anonymous and/or VirtualHost.

Additionally, the special keyword NONE can be used, which disables wu-ftpd style transfer logging for the context in which the directive is used (only applicable to version 1.1.7 and later).

See Also: ExtendedLog, LogFormat


Umask

Syntax: Umask file octal-mask [directory octal-mask]
Default: None
Context: server config, <Anonymous>, <VirtualHost>, <Directory>, <Global>, .ftpaccess
Compatibility: 0.99.0 and later

Umask sets the mask applied to newly created file and directory permissions within a given context. By default, the Umask in the server configuration, <VirtualHost> or <Anonymous> block is used, unless overridden by a "per-directory" Umask setting. Any arguments supplied must be an octal number, in the format 0xxx. An optional second argument can specify a Umask to be used when creating directories. If a second argument isn't specified, directories are created using the default Umask in the first argument. For more information on umasks, consult your operating system documentation/man pages.


UseFtpUsers

Syntax: UseFtpUsers on|off
Default: UseFtpUsers on
Context: server config, <Anonymous>, <VirtualHost>, <Global>
Compatibility: 0.99.0 and later

Legacy FTP servers generally check a special authorization file (typically /etc/ftpusers) when a client attempts to authenticate. If the user's name is found in this file, FTP access is denied. For compatibility sake, proftpd defaults to checking this file during authentication. This behavior can be supressed using the UseFtpUsers configuration directive.


UseReverseDNS

Syntax: UseReverseDNS on|off
Default: UseReverseDNS on
Context: server config
Compatibility: 1.1.7 and later

Normally, incoming active mode data connections and outgoing passive mode data connections have a reverse DNS lookup performed on the remote host's IP address. In a chroot environment (such as <Anonymous> or DefaultRoot), the /etc/hosts file cannot be checked and the only possible resolution is via DNS. If for some reason, DNS is not available or improperly configured this can result in proftpd blocking ("stalling") until the libc resolver code times out. Disabling this directive prevents proftpd from attempting to reverse-lookup data connection IP addresses.


User

Syntax: User userid
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0 and later

The User directive configures which user the proftpd daemon will normally run as. By default, proftpd runs as root which is considered undesireable in all but the most trustful network configurations. The User directive used in conjuction with the Group directive instructs the daemon to switch to the specified user and group as quickly as possible after startup. On some unix variants, the daemon will occasionally switch back to root in order to accomplish a task which requires super-user access. Once the task is completed, root privileges are relinquished and the server continues to run as the specified user and group. When applied to a <VirtualServer> block, proftpd will run as the specified user/group on connections destined for the virtual server's address or port. If either User or Group is applied to an <Anonymous> block, proftpd will establish an anonymous login when a user attempts to login with the specified userid, as well as permanently switching to the corresponding uid/gid (matching the User/Group parameters found in the anonymous block) after login.

Note: When an authorized unix user is authenticated and logs in, all former privileges are released, the daemon switches permanently to the logged in user's uid/gid, and is never again capable of switching back to root or any other user/group.


UserDirRoot

Syntax: UserDirRoot on|off
Default: off
Context: <Anonymous>
Compatibility: 1.2.0pre2 and later

When set to true, the chroot base directory becomes a subdirectory of the anonymous ftp directory, based on the username of the current user. For example, assuming user "foo" is aliased to "ftp", logging in as "foo" causes proftpd to run as real user ftp, but to chroot into ~ftp/foo instead of just ~ftp.


UserAlias

Syntax: UserAlias login-user userid
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0 and later

The UserAlias directive creates a mapping from a login name transmitted by a client (login-user) to a real system userid (userid). If the user logs in as the alias, authentication is performed as though they were actually logging in as the real user. This directive is often used inside an <Anonymous> block in order to allow multiple login names to activate an anonymous login. Note: If the login-user parameter is the same as a real system userid, the real userid will no longer be recognized by proftpd.


UserPassword

Syntax: UserPassword userid hashed-password
Default: None
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 0.99.0pl5 and later

The UserPassword directive creates a password for a particular user which overrides the user's normal password in /etc/passwd (or /etc/shadow). The override is only effective inside the context to which UserPassword is applied. The hashed-password argument is a cleartext string which has been passed through the standard unix crypt() function. Do NOT use a cleartext password. This can be useful when combined with UserAlias to provide multiple logins to an Anonymous FTP site.

See Also: GroupPassword


<VirtualHost>

Syntax: <VirtualHost address>
Default: None
Context: server config
Compatibility: 0.99.0 and later

The VirtualHost configuration block is used to create an independent set of configuration directives that apply to a particular hostname or IP address. It is often used in conjuction with system level IP aliasing or dummy network interfaces in order to establish one or more "virtual" servers which all run on the same physical machine. The block is terminated with a </VirtualHost> directive. By utilizing the Port directive inside a VirtualHost block, it is possible to create a virtual server which uses the same address as the master server, but listens on a seperate tcp port (incompatible with ServerType inetd).

When proftpd starts, virtual server connections are handled in one of two ways, depending on the ServerType setting:

Because of the method that the daemon uses to listen for connections when in standalone mode, it is possible to support an exceedingly large number of virtual servers, potentially exceeding the number of per-process file descriptors. This is due to the fact that a single file descriptor is used to listen to each configured port, regardless of the number of addresses being monitored. Note that it may be necessary to increase the tcpBackLog value on heavily loaded servers in order to avoid kernel rejected client connections ("Connection refused").


WtmpLog

Syntax: WtmpLog on|off|NONE
Default: WtmpLog on
Context: server config, <VirtualHost>, <Anonymous>, <Global>
Compatibility: 1.1.7 and later

The WtmpLog directive controls proftpd's logging of ftp connections to the host system's wtmp file (used by such commands as `last'). By default, all connections are logged via wtmp.



Banner.Novgorod.Ru