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
コメントフォーム