ProFTPDの各種設定(Linuxで動作するFTPサーバ)

スポンサーリンク

ProFTPDの設定

ここで記載する設定は全て任意の設定項目です。

ProFTPDは単に動作させるだけなら設定は全てデフォルトのままでも動作してくれますので、必要と思われる項目だけ設定すればOKです。

設定ファイル

ProFTPDの設定ファイル

ProFTPD自体の設定ファイルはこれ1個と非常にシンプルで、アクセス制限の記述方法などWebサーバのapacheとよく似た記述方法で分かりやすく出来ています。

/etc/proftpd.conf

FTP接続を禁止するユーザーのリスト

1行に1ユーザーを記述するテキストファイルで、rootのほかログインシェルを持たないユーザーが予め記述されています。

/etc/ftpusers

ProFTPDの起動・終了・常時起動

開始

systemctl start proftpd

終了

systemctl stop proftpd

常時起動

systemctl enable proftpd

タイムゾーン

日本標準時の場合

TimesGMT off
SetEnv TZ JST-9

サーバー名

ServerName "sakue.com ProFTPD server"

接続時のメッセージ

ServerIdent on "FTP Server ready."

管理者メールアドレス

ServerAdmin admin@sakue.com

ログイン時のDNS逆引きをしない(ログイン高速化)

UseReverseDNS off

ident無効(ログイン高速化)

IdentLookups off

シェルなしユーザーでログイン可能にする

RequireValidShell off

ポート番号の変更(制御用)

制御用ポートはデフォルト「21」ですが、攻撃を減らすために別のポート番号にしています。

Port 20021

ポート番号の変更(パッシブポート)

パッシブポートは「PassivePorts 最小ポート番号 最大ポート番号」のように範囲で指定します。

以下の場合はポート57000~58000を使うという意味です。

PassivePorts 57000 58000

デフォルトルート

FTPでログインした時に見せるディレクトリを指定します。

複数記述することができ、以下の書式で追加していきます。

DefaultRoot [ディレクトリ] [ユーザー名]

「~」だとユーザーのHomeディレクトリです。

以下の場合はユーザーが「sakue」の場合はsakueのホームディレクトリへ、ユーザーが「sakueftp」の場合はログインすると「/media/TeraStation」が表示されます。

DefaultRoot ~ sakue
DefaultRoot /media/TeraStation sakueftp

子プロセスの上限

DoSアタックから守るために少なめにしておきます。

MaxInstances 15

ログイン失敗回数

何回失敗したら切断されるかですが、1でOKです。

MaxLoginAttempts 1

ログ出力

システムログ

SystemLog /var/log/proftpd/proftp.log

アクセス&認証ログ

ExtendedLog /var/log/proftpd/access.log WRITE,READ default
ExtendedLog /var/log/proftpd/auth.log AUTH auth
ExtendedLog /var/log/proftpd/proftp.log ALL allinfo
ExtendedLog /var/log/proftpd/proftp.log WRITE write
ExtendedLog /var/log/proftpd/proftp.log READ read
ExtendedLog /var/log/proftpd/proftp.log AUTH auth

「ExtendedLog」は個々に別のログへ出力できますが、以下のように重複している場合は両方へ出力されます(例は認証のログ)

ExtendedLog /var/log/proftpd/auth.log AUTH auth
ExtendedLog /var/log/proftpd/test.log AUTH auth

ログフォーマット

個々に異なるフォーマット指定ができます。

注意点として、fail2banなどログを監視するようなシステムが別途動作している場合、あまり自由に変更するとフィルタに一致せず検知できなくなるため、よく分からない場合はデフォルトのままをおすすめします。

fail2banの場合は「/etc/fail2ban/filter.d/proftpd.conf」がデフォルトで用意されているProFTPD用のフィルタなので、書式が分かる方ならフィルタに記述のパターンに合致する範囲でログフォーマットを修正するか、修正したログフォーマットに一致するようフィルタを修正してもOKです。

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

使える変数は以下のとおりです。

%h   リモートホスト名
%a   リモートIPアドレス
%l   リモートユーザ名
%p   ローカルサーバのポート番号
%v   ローカルサーバ名
%P   ローカルサーバのプロセスID
%r   クライアントから受け取ったフルのコマンドライン
%t   現在のローカルタイム
%T   ファイルの送受信にかかった時間(秒単位) 
%s   NumericFTPレスポンスコード
%u   ローカルで認証されたユーザーID

Anonymousを拒否(匿名ログイン)

匿名ログインは無効にしておきます。

「proftpd.conf」に以下のようなブロックがあるので、<IfDefine ANONYMOUS_FTP> から </IfDefine> までを全てコメントアウトするか、行ごと削除します。

<IfDefine ANONYMOUS_FTP>
   ~~省略~~
</IfDefine>

SSLの設定(ftps)

 

<IfModule mod_tls.c>

   TLSEngine on

   TLSLog /var/log/proftpd/ftps.log

   TLSProtocol TLSv1 TLSv1.1 TLSv1.2

   TLSCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

   TLSOptions NoSessionReuseRequired

   TLSRequired on

   TLSVerifyClient off

   TLSRSACertificateFile /etc/letsencrypt/live/sakue.com/cert.pem
   TLSRSACertificateKeyFile /etc/letsencrypt/live/sakue.com/privkey.pem
   TLSCACertificateFile /etc/letsencrypt/live/sakue.com/chain.pem

   <IfModule mod_tls_shmcache.c>
      TLSSessionCache shm:/file=/var/run/proftpd/sesscache
   </IfModule>
</IfModule>

以下の箇所は「Let’s Encrypt」などで取得したcert.pemなどのパスに修正してください。

TLSRSACertificateFile /etc/letsencrypt/live/sakue.com/cert.pem
TLSRSACertificateKeyFile /etc/letsencrypt/live/sakue.com/privkey.pem
TLSCACertificateFile /etc/letsencrypt/live/sakue.com/chain.pem

rootログインを許可する

rootのログインを許可したい場合、「proftpd.conf」で以下の行を追加したうえで、「/etc/ftpusers」からrootの行を削除します。

どちらかが抜けているとrootログインは許可されません。

RootLogin on

IPv4のみにする(IPv6を使わない)

UseIPv6 off

アクセス制限

モジュールの有効化

以下の行がコメントアウトされていたら解除して有効にします。

LoadModule mod_ifsession.c

シンプルなアクセス制限

以下の例ではユーザー名が「sakue」のユーザーのみ許可し、それ以外のユーザーのログインは拒否します。

<Limit LOGIN>
  AllowUser sakue
  DenyAll
</Limit>

複数のユーザーを記述する場合はカンマで区切ります。

AllowUser user1, user2, user3

FileZillaクライアントで許可なしユーザーでログインした場合のログ例です。

14:08:06 コマンド: USER test
14:08:06 レスポンス: 331 test のパスワードを入力しください
14:08:06 コマンド: PASS **********************
14:08:07 エラー: サーバーによって接続が閉じられました
14:08:07 エラー: サーバーに接続できません

特定ユーザーの接続元を制限

以下の例ではユーザー名「user1」は「192.168.2.0/24」もしくは「.nt.ngn.ppp.infoweb.ne.jp」からのネットワークからの接続のみ許可します。

<IfUser user1>
   <Limit LOGIN>
      Order allow,deny
      allow from 192.168.2.0/24, .nt.ngn.ppp.infoweb.ne.jp
      deny from all
   </Limit LOGIN>
</IfUser>

AND・OR・NOT・正規表現

IfUserなどのディレクティブでは「AND」「OR」や否定の「!」などが使えます。

「regex」では正規表現も使えます。

<IfUser regex ^user>

「user1」または「user2」の場合は以下のように書きます。

<IfUser OR user1, user2>

「AND」はNOTの条件の時に使います。

ユーザー名の先頭に「!」を置くとNOT(否定)です。

以下の例では「user1」でなく「user2」でも無い場合に一致します。

<IfUser AND !user1, !user2>

同時に複数のユーザーに該当することはないため、以下のように書くことはありません。

<IfUser AND user1, user2>

IfUserなどのディレクティブでは「OR」などを使って記述しますが、「allow from」などはカンマ区切りで列挙するだけで先頭に「OR」などはつけません。

以下の場合は「192.168.2.0/24」または「.nt.ngn.ppp.infoweb.ne.jp」のネットワークの接続からは許可という意味です。

allow from 192.168.2.0/24, .nt.ngn.ppp.infoweb.ne.jp

トラブル

設定が反映されない

設定項目と値の区切りはタブ区切りでOKな箇所と、半角スペースでないと駄目な箇所があります。

混乱の元になるため、proftpd.confでは全て半角スペースで統一した方が良さそうです。

接続できない(到達できてるか確認)

Windowsならコマンドプロンプト、Linuxならシェルでtelnet接続してみます。

telnet [IPアドレス] [ポート番号]

FTPサーバのIPアドレスが「192.168.2.200」で、制御用ポート番号を「20021」にしている場合は以下のように実行します。

telnet 192.168.2.200 20021

FTPサーバまで到達できていれば、「proftpd.conf」の「ServerIdent」で指定した以下のようなメッセージが返ってくるはずです。

220 FTP Server ready.

返ってこずタイムアウトするような場合、ルータのNAT設定やiptablesなどのファイアウォールを確認してみます。

ログインできない

「proftpd.conf」の「ExtendedLog」で指定したログを確認してみます。

パスワードミスの場合は以下のような感じのログが出ます。

USER test (Login failed): Incorrect password

ログイン失敗を許可する回数を「MaxLoginAttempts」で指定しますが、それを超過して切断された場合は以下のログが残ります。

カッコ内はMaxLoginAttemptsで指定した回数が表示されます。

Maximum login attempts (1) exceeded, connection refused

アクセス制限でログインできなかった場合のログは以下のような感じです。

ログのメッセージが分かりやすいのはありがたいですね。

USER test (Login failed): Limit access denies login

それ以外の事例では、シェルなしユーザーはデフォルトでログインできないので、対象ユーザーがシェルなしの場合は以下のように許可します。

RequireValidShell  off

また、/sbin/nologin というのは古いシステムでは /etc/shells にデフォルトで記載されていましたが、新しいシステムでは書いてないものが多いため、確認して無ければ最下部に追記しておきます。

cat /etc/shells

/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/sbin/nologin

コメントフォーム

タイトルとURLをコピーしました