AlmaLinux 9 に FTP サーバーを構築する機会があり、vsftpd で設定したがうまくいかず、結局 ProFTPD にしたという話。
環境
- OS:AlmaLinux release 9.4 (Seafoam Ocelot)
- FTPd:vsftpd(version 3.0.5)⇒ ProFTPD(Version 1.3.8b)
- 暗号化モード:TLS 1.2、Implicit
- クライアント:NextFTP4(Ver4.95.00 / 64bit)
vsftpd の設定
CentOS 7 からの移行だったので、以前の環境から使用していた vsftpd をインストールしました。
Let's Encrypt で取得した SSL 証明書を使って FTPS(Implicit モード)を設定します。
vsftpd の設定(SSL 周りを抜粋)は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # DEBUG debug_ssl=yes log_ftp_protocol=yes # SSL ssl_enable=YES ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1=NO ssl_tlsv1_1=NO ssl_tlsv1_2=YES ssl_ciphers=HIGH allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES rsa_cert_file=/etc/letsencrypt/live/ドメイン名/fullchain.pem rsa_private_key_file=/etc/letsencrypt/live/ドメイン名/privkey.pem require_ssl_reuse=NO #strict_ssl_read_eof=NO #strict_ssl_write_shutdown=NO # Implicit implicit_ssl=YES listen_port=990 # PASV pasv_enable=YES pasv_address=xxx.xxx.xxx.xxx pasv_min_port=60000 pasv_max_port=60100 |
NextFTP クライアントから接続すると、問題なく接続できます。ところがファイルをアップロードしていると止まってしまう場合があり、サーバー上に 0 バイトのファイルが作られた状態でエラーになります。
1 2 3 4 5 6 | DEBUG: Client "xxx.xxx.xxx.xxx", "SSL version: TLSv1.3, SSL cipher: TLS_AES_256_GCM_SHA384, not reused, no cert" DEBUG: Client "xxx.xxx.xxx.xxx", "SSL shutdown state is: NONE" DEBUG: Client "xxx.xxx.xxx.xxx", "SSL shutdown state is: SSL_SENT_SHUTDOWN" DEBUG: Client "xxx.xxx.xxx.xxx", "SSL ret: 18446744073709551615, SSL error: error:00000000:lib(0)::reason(0), errno: 32" FTP response: Client "xxx.xxx.xxx.xxx", "426 Failure reading network stream." FAIL UPLOAD: Client "xxx.xxx.xxx.xxx", "/xxxxxxxxxxx/test.cgi", 0.00Kbyte/sec |
エラーログを見ると、SSL 関連のエラーが出ています。
strict_ssl_read_eof の値を変えたり、ssl_ciphers の設定を色々弄ってみたのですが、どれもうまくいかず結局 ProFTPD に乗り換えることにしました。
ProFTPD の設定
ProFTPD の設定は不慣れなため Include /etc/proftpd/conf.d/*.conf でオーバーライドせずに、proftpd.conf にすべてベタ書きしました。
ログインするユーザーは 1 人だけで、Web サイト(/var/www/html)の更新ができれば良いという事なので、MySQL でのアカウント管理なども連携していません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | # Load DSO modules as required Include /etc/proftpd/modules.conf # サーバー名 ServerName "サーバー名" ServerIdent off MasqueradeAddress ドメイン名 ServerAdmin メールアドレス # IPv6 設定 UseIPv6 off # 認証ポート Port 990 # パッシブポート MasqueradeAddress xxx.xxx.xxx.xxx PassivePorts 60000 60100 # 逆引き DNS を抑止 UseReverseDNS off # プロセス数 MaxInstances 10 MaxClientsPerHost 10 # リジューム AllowStoreRestart on AllowRetrieveRestart on # アップロード失敗時自動削除 DeleteAbortedStores on # ユーザーの設定 RootLogin off # タイムアウト TimeoutIdle 600 TimeoutNoTransfer 600 TimeoutStalled 3600 # Umask設定 Umask 022 CreateHome on dirmode 755 # ユーザーとグループ設定 User ユーザー名 Group グループ名 # ログインユーザーの制限 <Limit LOGIN> AllowGroup ユーザー名 DenyAll </Limit> # ディレクトリ設定 DefaultRoot /var/www DefaultChdir /var/www/html グループ名 # ファイルの上書きを許可 <Directory /> AllowOverwrite on </Directory> # ドットで始まるファイルを表示 ListOptions "-a" # ローカルタイム設定 TimesGMT off # ログ SystemLog /var/log/proftpd/proftpd.log LogFormat default "%h %l %u %t \"%r\" %s %b" ExtendedLog /var/log/proftpd/access.log WRITE,READ default LogFormat auth "%v [%P] %h %t \"%r\" %s" ExtendedLog /var/log/proftpd/auth.log AUTH auth TransferLog /var/log/proftpd/xfer.log # SSL の設定 <IfModule mod_tls.c> TLSEngine on TLSRequired on TLSVerifyClient off TLSRSACertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem TLSRSACertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem TLSCACertificateFile /etc/letsencrypt/live/ドメイン名/chain.pem TLSProtocol TLSv1.2 TLSCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP TLSOptions NoSessionReuseRequired UseImplicitSSL </IfModule> |
Implicit にするために TLSOptions に UseImplicitSSL を追加し、Port を 990 にしています。
この他にも /etc/ftpusers を編集してログインしないユーザーを追記しておきました。
クライアント(NextFTP)でアクセスして、当該ファイルを含めて問題なくアップロードできる事を確認しました。
まとめ
FTP が不調の間 SFTP を使用してもらいましたが、WinSCP の転送設定が適切でなかったため Perl の CGI ファイルがバイナリモードで転送されてしまい、Internal Server Error になってしまいました。
とはいえ、サーバー側(sshd_config)で chroot の設定と、クライアント側(WinSCP)でテキストモード転送の設定をちゃんとすれば、FTP を使わず SFTP で代用可能なケースも多いかもしれません。
コメント