Skip to content

Instantly share code, notes, and snippets.

@t-okkn
Last active March 17, 2021 13:00
Show Gist options
  • Save t-okkn/0d6a6ed09b44dda01339911193ebfc10 to your computer and use it in GitHub Desktop.
Save t-okkn/0d6a6ed09b44dda01339911193ebfc10 to your computer and use it in GitHub Desktop.
FTPサーバ(vsftpd)の設定手順

FTPサーバ(vsftpd)の設定手順

■前提

Arch Linuxにて検証した手順になります。
※「{{ }}」にて囲まれている部分は変数を表します(Jinja2などのテンプレートエンジンでもレンダリング可能なようにしてあります)。

■FTPサーバ要件概略

  • Anonymous 禁止
  • chroot化する
  • Passive接続
  • Unixユーザと分離(ただし、ディレクトリ・ファイル作成時のマッピング用Unixユーザは1アカウント以上必要)
  • DBはサーバ内蔵機能を利用

■手順

  1. vsftpd をインストール

    $ sudo pacman -S vsftpd
    $ yay -S libpam_pwdfile
    
    (Ubuntu → $ sudo apt install vsftpd libpam-pwdfile)
    
  2. VirtualUser Config 用のディレクトリを作成

    $ sudo mkdir -p /etc/vsftpd/conf.d
    
  3. VirtualUser の User と Password を設定

    $ sudo touch /etc/vsftpd/.passwd && echo -e "{{ VirtualUserName }}:$(openssl passwd -1)" | sudo tee /etc/vsftpd/.passwd
    
  4. user_list(VirtualUser) と chroot_list の作成

    $ sudo touch /etc/vsftpd/user_list && echo -e "{{ VirtualUserName }}\n" | sudo tee /etc/vsftpd/user_list
    $ sudo touch /etc/vsftpd/chroot_list && echo "" | sudo tee /etc/vsftpd/chroot_list
    
  5. パーミッションの調整

    $ sudo chmod -R 755 /etc/vsftpd
    $ sudo chmod 600 /etc/vsftpd/user_list
    $ sudo chmod 600 /etc/vsftpd/chroot_list
    $ sudo chmod 600 /etc/vsftpd/.passwd
    
  6. PAM 設定ファイルを作成

    $ curl -sS https://gist.githubusercontent.com/t-okkn/0d6a6ed09b44dda01339911193ebfc10/raw/543a207e811111b4e44235d53a366830e35a744d/vsftpd.virtual | sudo tee /etc/pam.d/vsftpd.virtual
    
  7. config ファイルの作成

    $ sudo mv /etc/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
    $ curl -sS https://gist.githubusercontent.com/t-okkn/0d6a6ed09b44dda01339911193ebfc10/raw/543a207e811111b4e44235d53a366830e35a744d/vsftpd.conf | sudo tee /etc/vsftpd.conf
    
  8. パラメータの調整
    {{ FtpPort }}, {{ MinPort }}, {{ MaxPort }}, {{ MyHostName }}, {{ UnixUserName }} の各パラメータを入力してください。
    ※{{ UnixUserName }} は VirtualUser の Username ではなく Unix の Username です。

  9. vsftpd の起動

    $ sudo systemctl enable --now vsftpd
    

■補足

VirtualUser ごとにルートディレクトリを変更するのであれば、以下のように設定します。

$ echo "local_root=/path/to/example" | sudo tee /etc/vsftpd/conf.d/{{ VirtualUserName }}

【備忘】ufw でのFW設定

$ sudo ufw allow from 0.0.0.0/0 to any port {{ FtpPort }} proto tcp
$ sudo ufw allow from 0.0.0.0/0 to any port {{ MinPort }}:{{ MaxPort }} proto tcp


SSL(TLS) を使用しようとして設定したのですが、うまく動作しなかったので諦めました。
なので、vsftpd はFTPサーバ専用と考えています。

## 1.Program Behavior
# xinetd経由での起動しない
listen=YES
# ホストアクセスファイル(hosts.allow等)によるアクセス制限を行わない
tcp_wrappers=NO
## 2.Access Control
# 匿名ユーザを拒否
anonymous_enable=NO
# UNIXユーザ(仮想ユーザ)によるログインを許可
local_enable=YES
# PAMの設定ファイルを指定
pam_service_name=vsftpd.virtual
# userlist_denyによるアクセス制御有効
userlist_enable=YES
# 一覧に存在するユーザのみアクセス許可(ホワイトリスト)
userlist_deny=NO
# アクセス許可/拒否一覧ファイルのPath
userlist_file=/etc/vsftpd/user_list
## 3.Local User
# ホームディレクトリの設定
local_root=/srv/ftp
# 仮想ユーザがホームディレクトリ以外に移動不可
chroot_local_user=YES
# chroot制御について、特別除外ユーザを認める
chroot_list_enable=YES
# chroot制御除外ユーザ一覧ファイル
chroot_list_file=/etc/vsftpd/chroot_list
# chroot先で書き込みを許可
allow_writeable_chroot=YES
# ローカルユーザのumask設定
local_umask=022
# Virtualユーザごとの設定ファイル配置ディレクトリ
user_config_dir=/etc/vsftpd/conf.d
## 4.Display
# メッセージファイルの内容を表示しない
dirmessage_enable=NO
# バナー表示内容
ftpd_banner=Welcome to FTP Service
# 時刻を日本標準時で表示
use_localtime=YES
## 5.File Transfar
# ASCIIモードでの転送を有効化
ascii_upload_enable=YES
ascii_download_enable=YES
# 書き込みを許可
write_enable=YES
#サブフォルダを含む一括アップロードやダウンロード可能
ls_recurse_enable=YES
## 6.Log
# ログファイルの出力を行う
xferlog_enable=YES
# vsftpd形式でログ内容を出力する
xferlog_std_format=NO
# ログファイルの出力先
vsftpd_log_file=/var/log/vsftpd.log
# 全てのやりとりをログに残す
log_ftp_protocol=YES
# SSL通信のLogを出力する
#debug_ssl=YES
## 7.Network
# 待ち受けポート番号
listen_port={{ FtpPort }}
# アクティブモード時のデータコネクションポートの指定を拒否
connect_from_port_20=NO
# パッシブモードを許可
pasv_enable=YES
# pasv_address にホスト名を指定可能にする
pasv_addr_resolve=YES
# 自端末のIPアドレス OR ホスト名(DynamicDNS時)
pasv_address={{ MyHostName }}
# パッシブモードで使用するポートの最小値
pasv_min_port={{ MinPort }}
# パッシブモードで使用するポートの最大値
pasv_max_port={{ MaxPort }}
## 8.Virtual User
# 仮想ユーザを活性化(ユーザはすべて仮想ユーザとして処理される)
guest_enable=YES
# 仮想ユーザの為のUNIXアカウント(1000番台のユーザーが望ましい)
guest_username={{ UnixUserName }}
# 仮想ユーザの書き込みを許可
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=NO
# 仮想ユーザの為のUmask設定
anon_umask=022
# 仮想ユーザをローカルユーザと同じ特権にする
# ファイルの属性変更(chmod)が可能になる
virtual_use_local_privs=YES
## 9.SSL
# YESにするとSSLを有効化
ssl_enable=NO
# Implicitモードを有効化
#implicit_ssl=YES
# SSL用の証明書(ルート証明書+中間証明書)Path
#rsa_cert_file=/etc/letsencrypt/live/{{ Hostname }}/fullchain.pem
# SSL用の秘密鍵Path
#rsa_private_key_file=/etc/letsencrypt/live/{{ Hostname }}/privkey.pem
# 使用プロトコル(TLS1.2以外は使用しない)
#ssl_sslv2=NO
#ssl_sslv3=NO
#ssl_tlsv1=NO
#ssl_tlsv1_1=NO
#ssl_tlsv1_2=YES
# 暗号化方式
#ssl_ciphers=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
# 制御チャンネル(ログイン等)でSSL接続を強制
#force_local_logins_ssl=YES
# データチャンネルでSSL接続を強制
#force_local_data_ssl=YES
# SSLセッション再利用をする
#require_ssl_reuse=YES
#%PAM-1.0
auth required pam_pwdfile.so pwdfile /etc/vsftpd/.passwd
account required pam_permit.so
session required pam_loginuid.so
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment