セキュアFTPサーバの構築(vsftpd+SSL/TLS:CentOS4.x系編)


ProFTPDのバックアップとして vsftpd の動作確認しています。その vsftpd も バージョン2.0.1 からSSL/TLS対応に、2.04 では動的IP対応になったので、CentOS4.xでも動かしてみました。SSL/TLSでサポートしているのは ProFTPD同様に Explisitモードで、クライアントとしてはこちらで紹介している、「GetIt FTP」や「SmartFTP」や「Filezilla」が使用できます。
また、デーモンの起動方法はstandaloneとinetモードがあり、RedHat系のデフォルトはstandaloneモードですが、ここでは PASV 対応やバーチャルホスト運用には都合が良いinetモード(xinetd)で動作させることを前提に設定していきます。
バージョン2.0.4から、ProFTPDと同様にPASVモードでクライアントに通知するサーバのアドレスとして、pasv_addressでホスト名を指定しておくとデーモン起動時にそのホスト名からIPアドレスに変換したアドレスを通知できるようになりました。従って、inetモード(xinetd)で動作させれば、おやじが考えたような変な対策をしなくてもPASV未対応のルータを使用して動的IP環境下でPASV運用が可能になります。

■vsftpd のインストール

今回は、FedoraCore の spec ファイルを参考にして、管理を簡単にするためrpmを作ってからインストールすることにしました。rpmの作成方法を記述するのは大変なので、これに関してはダウンロードにrpmの他にsrpmを置いておきますので、興味のある方はそちらを見てください。
なお、このrpmはSSL対応になっていますが、設定しなければ通常のFTPサーバとして使用できます。
おやじの所から rpm をダウンロードして、インストールしてください。インストールは、任意の場所(ここでは、/usr/local/src)にRPMを置いて、インストールします。

# cd /usr/local/src
# rpm -Uvh vsftpd-2.0.4-1.i386.rpm


■vsftpd の設定

vsftpd の設定は、/etc/vsftpd/vsftpd.conf で行います。 ここでのFTPの用途は、WWW サーバへのユーザ毎のコンテンツのアップロード(パーミッションの設定が楽)と anonymousFTP でのソフト公開を行うというポリシーで設定してあります。なお、バーチャルホストについては、ProFTPD と同様の方法(xinetd起動として、バーチャルホスト毎にIPアドレスとconfファイルとxinetd用起動ファイルを用意)が採れますので、こちらを参考にしてください。デフォルト設定は anonymous 専用になっており、vsftpd.conf にはほとんど設定が入っていませんので、man を参考におやじなりに設定したものを以下にあげて置きます。 
vsftpd の設定は、大きく以下の3つの設定オプションのカテゴリがありますので、目的に応じて設定する必要があります。
  1. ブール・オプション

    機能に対して YES/NO でその機能をどう扱うかを設定するもので、機能毎にデフォルト値が決まっており、変更する場合のみ記述すればよい。慣れないだけかもしれないが、いろいろなことを考えて設定しようとすると、ProFTPD のほうが設定しやすく感じるのはおやじだけでしょうか?

  2. 数値・オプション

    タイマ等の数値で設定するオプションであり、これもデフォルト値が決まっている。

  3. ストリング・オプション

    ファイルのパス等、ストリング形式で設定するオプションであり、これもデフォルト値があるものとないものがあるので、適宜設定する。

注:いずれの場合も オプション=設定値 の形態をとるが、 「=」を挟んでどちら側にも絶対にスペースを入れないこと。設定値の後ろにもスぺースがあると駄目なので注意すること、。

◆基本的な設定

ここでは、ローカルユーザが FTP で WWW サーバへのユーザ毎のコンテンツのアップロードするという使い方を中心にした設定方法を示します。

  1. ローカルユーザの利用設定

    local_enable=YES (デフォルト:NO)

    vsftpd はデフォルトで anonymous しかサポートしておらず、ローカルユーザはログインできない。本設定を YES とすることで、ローカルユーザ(例えば、oyaji)のログインが可能となる。

  2. ローカルユーザのumask設定

    local_umask=022 (デフォルト:077)

    デフォルトは077であり、このままだとフォルダ作成時のパーミションが700となり、apacheユーザがコンテンツの読みだしができなくなる。従って、FTP では一般的な022とし、パーミションが755となるよう変更する。

  3. 書き込み系コマンドの使用可否

    write_enable=YES (デフォルト:NO)

    デフォルトでは、書き込み系のコマンド(STOR, DLE, RNFR, RNTO, MKD, APPE, SITE)が使用できず、ホームページのデータのアップさえできないが、本設定を YES とすることで書き込みが可能となる。 anonymous で upload を許可する場合にも本設定は YES にしなければならないが、更に anonymous 用の別のオプションが必要である。

  4. ディレクトリメッセージの設定

    dirmessage_enable=YES (デフォルト:NO)

    このオプションのデフォルトはNOであるが、 conf ファイル上は YES になっている。YES の場合、ディレクトリ毎にメッセージファイル(デフォルトのファイル名: .message) を置いておくと、そのディレクトリ一覧を表示するときに当該メッセージをコマンドのレスポンスとして表示できる。メッセージファイル名は、message_file=xxxxx (デフォルト: .message ) オプションで変更できる。

  5. バナーメッセージの設定

    ftpd_banner="任意のメッセージ" (デフォルト: vsftpdのバージョン)

    ログイン時にサーバ名などを表示する時、このオプションで "  " でくくって適当なバナーメッセージを指定する。特に指定していなければ、vsftpd のバージョンが表示される。

  6. データ転送モードの設定

    ascii_download_enable=YES (デフォルト:NO)
    ascii_upload_enable=YES (デフォルト:NO)

    ASCUモードでのダウンロード・アップロードが何故かデフォルトで不可になっている。 YES にしないと、CGI が動かないという痛い目にあう。

  7. Activeモード時のデータコネクションポートの設定

    connect_from_port_20=YES (デフォルト:NO)

    Activeモード時のデータコネクションポートを20番に固定するかどうかの設定で、デフォルトのNOでは任意のポートが使用される。おやじのポリシーは20番に固定なので、ここは YES に設定。20番にしないと、クライアント側環境によってはデータ転送ができない可能性がある。

  8. NATルータ越えでPASVモードでインターネット公開する場合の設定

    pasv_enable=YES (デフォルト:YES)
    pasv_address=ルータのWAN側のIPアドレス (デフォルト:なし サーバのNICアドレス)
    pasv_addr_resolve=YES (デフォルト:NO)
    pasv_min_port=最小ポート番号 (デフォルト:0 任意のポートを使用)
    pasv_max_port=最大ポート番号 (デフォルト:0 任意のポートを使用)

    ・pasv_enable
     デフォルトで PASV モードが有効になっているので、敢えて設定は不要だが PASV は使用したくないなら、NO に設定。

    ・pasv_address / pasv_addr_resolve(pasv_addr_resolveは2.0.4以降)
     固定IPの場合はルータの WAN 側アドレスを書けば良いが、動的IPの場合は変化してしまうので IP アドレスを書いても意味がない。
     バージョン2.0.4以降なら、追加されたpasv_addr_resolveオプションをYES とし、ここにルータのWAN側アドレスが牽けるDDNSのホスト名を記述すれば、デーモン起動時に名前解決して得たIPアドレスをクライアントに通知できるようになった。従って、本設定を行いinetモードで起動すれば、動的IPアドレスでも問題なくPASVが使用できるようになる。

    ・pasv_min_port/pasv_max_port
     PASVモードで使用するポート番号(1024以上)の最小と最大で範囲指定する。おやじは、家庭用なのでそれほど多くは必要ないのと使いまわしされるので、とりあえず30ポートとし、他のデーモンで使ってない4000-4029を使用することとし、
     pasv_min_port=4000
      pasv_max_port=4029
    とした。それぞれ、別行で書かないとうまくいかないので要注意。(過去1行で書いて動作しない方がいた。)
     なお、このポートはインターネット側から接続が開始されるので、ルータのスタティックNATでサーバにNATすると同時に、フルタリングも開ける必要がある。

  9. PAM認証の設定

    pam_service_name=vsftpd (デフォルト:ftp)

     PAMサービスで使用するサービスの名前を指定する。 RPM から入れたなら vsftpd になっており、/etc/pam.d 配下に vsftpd ファイルがインストールされているはずなので、特に変更は不要である。

  10. ユーザ制限の設定

    userlist_enable=NO (デフォルト:NO)
    userlist_deny=NO (デフォルト:YES)
    userlist_file=/etc/vsftpd/user_list (デフォルト)

    上記の上2つのパラメータで、ローカルユーザの制限を行う。 なお、/etc/ftpusers で指定されているシステムユーザは本設定とは無関係にログインできない。

    userlist_enable userlist_deny 動 作 概 要
    NO - userlist_file を使用した制御は行われず、ローカルユーザはログイン可能。
    YES NO userlist_file を使用した制御が有効になり、userlist_file ファイル(ユーザを1行づつ記述したリスト)に登録されたユーザのみログインできる。
    YES userlist_file を使用した制御が有効になり、userlist_file ファイル(ユーザを1行づつ記述したリスト)に登録されたユーザはログインできず規制される。

  11. アクセスディレクトリの制限 ( chroot )

    chroot_local_user=YES (デフォルト:NO)
    chroot_list_enable=YES (デフォルト:NO)
    chroot_list_file=/etc/vsftpd/chroot_list (デフォルト)

    ローカルユーザの chroot は上記の上2つのパラメータで行うが、組み合わせで少し動作が異なるので以下に整理した。

    chroot_local_user chroot_list_enable 動 作 概 要
    NO NO デフォルトの設定であるが、ログイン時は当該ユーザのホームディレクトリ(/home/oyaji)にアクセスするが、その後は、全てのディレクトリにアクセスできてしまう。書き換えは無理でもほとんどのファイルにアクセスは可能になってしまうので、ローカルユーザ使用をした時点でここの設定変更は必須である。
    YES NO この設定ではログイン時は「/」にアクセスし、システムのディレクトリ全てが見えてしまうので、この設定は有り得ない。(bin ディレクトリ以外はアクセスはできないが)
    NO YES この設定では、ユーザを1行づつ記述したリスト(デフォルトは/etc/vsftpd/chroot_list。 chroot_list_file=/xxx/xx オプションでファイルは変更可。)に記載されているユーザのみ chroot され、当該ユーザのホームディレクトリ(/home/oyaji)配下しかアクセスできないが、未記載のユーザは、ログイン時は当該ユーザのホームディレクトリ(/home/oyaji)にアクセスするが、その後は、全てのディレクトリにアクセスできてしまう。
    YES YES この設定が、一番安全で間違いのない設定である。上記と異なるのは、基本的にローカルユーザはchrootされホームディレクトリ(/home/oyaji)配下しかアクセスできないが、/etc/vsftpd/chroot_list に記載されたユーザのみが全てのディレクトリにアクセスできるようになるので、意識して設定しない限り自由なアクセスができないので安全である。但し、特権ユーザがいなくても、空でもいいので /etc/vsftpd/chroot_list を用意しておかないと一切ログインできないので注意が必要である。

     なお、chroot すると /home/user 以下が root ディレクトリとなるので、Maildir 等のシステム関係のディレクトリやファイルまでが見えてしまい、誤操作でおかしくしてしまう可能性もある。ProFTPd と同様に以下のように設定を追加し、一般ユーザは public_html 以下しかアクセスできないようにするほうが良い。

    local_root=public_html

  12. ドットファイル表示の設定

    force_dot_files=NO (デフォルト:NO)

    vsftpd ではデフォルトで .htaccess のようなドットファイルは表示されない。必要なら本オプションをYES とすればよい。

  13. ログ関係の設定

    xferlog_enable=YES (デフォルト:NO)
    xferlog_std_format=YES (デフォルト:NO)
    log_ftp_protocol=NO (デフォルト:NO)
    vsftpd_log_file=/var/log/vsftpd.log (デフォルト:/var/log/vsftpd.log)
    xferlog_file=/var/log/xferlog (デフォルト:/var/log/xferlog)
    dual_log_enable=YES (デフォルト:NO)

    vsftpd_log_file
     
    vsftpd では、デフォルトでvsftpd オリジナルのログ(/var/log/vsftpd.log)が作成される。名称や場所を変更したければここで変更する。

    xferlog_enable
     
    本設定をYESとすると、アップロードやダウンロードの詳細ログが採られ、ログはvsftpd オリジナルのログ(/var/log/vsftpd.log)に作成される。

    xferlog_std_format
     
    本設定をYESとすると、ログフォーマットがwu-ftpd 相当のフォーマットになり、mrtg 等でログ解析が可能となる。このとき、ログファイルは:/var/log/xferlogとして作成される。

    xferlog_file
     
    xferlog の場所や名称を変更する場合に設定する。

    dual_log_enable
     
    本設定をYESとすると、vsftpd オリジナルのログとwu-ftpd 相当のフォーマットのログの両方を採取可能となる。

    log_ftp_protocol
     
    本設定をYESとすると、全てのやりとりをログに残すようになる。xferlog_std_formatとは背反なので、本設定をYES とした場合は、xferlog_std_format はNO とすること。デバック用だが、アタック監視に使えなくもないか?

  14. 時刻表示の変更

    use_localtime=YES (デフォルト:NO)

    時刻表示はデフォルトでGMTになっており、日本を対象にするなら上記設定を追加することにより、local timeに変更される。

  15. Standaloneモードの設定

    listen=NO (デフォルト:NO)

    Standaloneモードで動作させる場合の設定でありvsftpdのデフォルトはNOであるが、RedHat系はStandaloneモードがデフォルトなのでconfファイルの設定はYESとなっている。ここではinetdモードで起動するので、NOに変更する。

  16. anonymousFTPの停止

    anonymous_enable=NO (デフォルト:YES)

    anonymousFTPは、デフォルトで有効になっているので、運用しない場合は明示的に設定する必要がある。

◆anonymous関係の設定

ここでは、anonymousFTP を動作させる場合の代表的な設定をあげておきます。

  1. anonymousFTPの有効化

    anonymous_enable=YES (デフォルト:YES)

    vsftpd ではデフォルトでanonymousFTPが有効になっているので、敢えて設定は不要ではあるが、自分の意志でデフォルトで使用しているという意味で、この手の場合もおやじは極力設定を書くようにしている。何かあっても書いてあれば忘れないですし。

  2. anonymous でのアップロードの許可

    anon_upload_enable=YES (デフォルト:NO)

    おやじは恐ろしくてやる気はないが、どうしてもanonymous でアップロードさせたいときは、本オプションを YES にする。同時に write_enable もYES になっていないと機能しないので注意が必要である。
    なお、anonymous ログイン時の root ディレクトリは ftp ユーザのホームディレクトリ ( /srv/ftp ) であるが、ここにはパーミッションの関係で upload はできないのでこの配下に upload 専用ディレクトリ ( /srv/ftp/upload 等) を作成し、オーナをftp 、パーミッションを755 として書き込みできるようにする必要がある。

  3. anonymous の umask設定

    anon_umask=022 (デフォルト:077)

    デフォルトは077であり、このままだとファイル作成時のパーミションが600となり、upload したファイルは download できない。これを 022 とすれば、パーミションが644となり、ダンロード可となる。upload の使い方に合わせて設定する。

  4. anonymous での新規ディレクトリ作成

    anon_mkdir_write_enable=YES (デフォルト:NO)

    本オプションを YES とすると、anonymous ユーザでも新規にディレクトリを作成できる。但し、当然、write_enable になっていなければ駄目だし、親ディレクトリのパーミッションの整合もとれている必要がある。実質、upload ディレクトリ配下のみが対象か?

    anon_other_write_enable オプションでは削除やリネームもできるようになるが、事故のもとなので設定は不要(NO)と思う。

  5. anonymous の速度制限

    anon_max_rate=50000 (デフォルト:0 無制限)

    本オプションでanonymous クライアントの最大転送速度を指定できる。単位はByte/秒である。デフォルトは無制限なのでCPUパワーに余裕があれば、FTTHでも回線帯域を使い切ってしまうことがあるので、他サービスの影響を考えると制限したほうが良い。

◆SSL/TLS関係の設定

SSL/TLS関係の設定項目は、多くはありません。以下に設定が必要な項目を示します。
  1. SSL機能の有効化

    ssl_enable=YES (デフォルト:NO)

    vsftpd はデフォルトでは SSL 機能が動かないので、本設定で動作するようにする。

  2. SSLプロトコルの設定

    ssl_tlsv1=YES (デフォルト:ssl_tlsv1)

    vsftpd はSSLのプロトコルとして、SSL v2(ssl_sslv2)、SSL v3(ssl_sslv3)、TLS v1(ssl_tlsv1)の3種類をサポートしているが、デフォルトはTLS v1であり、多くの場合、この設定で問題ないのでデフォルトのままとする。

  3. anonymous接続時のSSLの使用有無

    allow_anon_ssl=NO (デフォルト:NO)

    anonymous接続でSSLを使用する場合は、YESとする。不特定の相手を対象とするanonymous接続でSSL接続は考えられないので、NOのまま(デフォルト:NOなので未記述でよい)とする。

  4. ローカルユーザ接続時のSSLの使用有無

    force_local_logins_ssl=NO (デフォルト:YES)
    force_local_data_ssl=NO (デフォルト:YES)

    ローカルユーザ接続時に、ログインとデータコネクションでSSL接続を強制的に行うオプション。デフォルトで両方ともYESになっているので、SSL以外での接続ができない。必要時にユーザが指定すればSSLが利用できるようにするには、両方ともNOに設定する。

  5. サーバ証明書の指定

    rsa_cert_file=/usr/local/certs/vsftpd.pem (デフォルト: /usr/share/ssl/certs/vsftpd.pem)

    RSAサーバ証明書のファイルの位置を指定する。サーバ証明書はこちらを参考にして作成するが、作成するのは参照先にある証明書と鍵を一体化したメール用証明書(mail.pem)である。
    上記はの指定は、/usr/local/certs配下にCourier-imap用に作成したmail.pemをそのまま利用し、名前だけロジカルリンクしたものである。名前などどうでも良いのでmail.pemのままでも良い。

    # cd /usr/local/certs
    # ln -s mail.pem vsftpd.pem



■起動設定

CentOS4.xの場合は、デフォルトではstandaloneモードで起動するようになっているので、まずはこれを止めます。その後、下記によりxinetd 用起動設定ファイル(/etc/xinetd.d/vsftpd)を開いて disable を no に変更し、システム起動時にxinetd 経由で起動される設定変更し、chkconfig でその内容を確認した後、xinetd をrestart して起動します。

# /etc/rc.d/init.d/vsftpd stop
# chkconfig vsftpd off
#
vi /etc/xinetd.d/vsftpd

# default: off
# description: The vsftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service ftp
{
      socket_type    = stream
      wait           = no
      user           = root
      server         = /usr/sbin/vsftpd
      server_args    = /etc/vsftpd/vsftpd.conf
      nice           = 10
      disable        = no
      flags          = IPv4
}

[Esc][:][w][q]で保存。

# chkconfig --list vsftpd
xinetd based services:
       vsftpd:         on
# /etc/init.d/xinetd.d restart



Top Pageへ