ProFTPD(Pro FTP Daemon)は、Linux系オペレーティングシステム上で動作する高度に設定可能なFTPサーバーソフトウェアです。GNU General Public License(GPL)に従って配布されており、オープンソースプロジェクトとして開発が行われています。
ProFTPDの主な特徴は以下の通りです。
- 柔軟性: ProFTPDは多くの設定オプションを提供し、個々の状況に応じて簡単にカスタマイズできます。設定ファイルの構文はApache HTTPサーバーに似ており、直感的で理解しやすいです。
- 拡張性: モジュールアーキテクチャを採用しており、追加の機能が必要な場合は新しいモジュールを追加して拡張することができます。
- セキュリティ: ProFTPDはセキュリティを重視して設計されており、TLS/SSL暗号化のサポート、TCPラッパー、ACL(Access Control List)によるアクセス制限など、さまざまなセキュリティ機能を提供しています。
- オペレーティングシステムの互換性: Linux、BSD、macOSなど、さまざまなUNIX系オペレーティングシステムで動作するため、多くの環境で利用可能です。
ProFTPDを使用したセキュアなFTPサーバーの導入方法を解説します。
ProFTPDとMariaDBを連携させて認証させます。
FTP、SFTP、FTPSの違い
FTP (File Transfer Protocol)
FTPは、インターネット上でファイルを転送するための標準的なプロトコルです。データと制御の通信がそれぞれ異なるポートを使用して行われます。しかし、FTPはセキュリティ面で問題があり、ユーザー名やパスワード、データが平文で転送されるため、盗聴や改ざんが可能です。
SFTP (SSH File Transfer Protocol)
SFTPは、SSH(Secure Shell)を使用して安全なファイル転送を行うプロトコルです。SSHは、暗号化された通信チャンネルを提供し、データの秘匿性、完全性、および認証を保証します。そのため、平文でのデータ漏洩のリスクが低くなります。また、SFTPは単一のアクセスポート(デフォルトでは22番ポート)を使用し、ファイル転送、リモートファイル操作(リスト、削除、変更など)、ローカルファイル操作も可能です。
※ sshはLinuxアカウントに依存するため MariaDBとの連携はできません。
FTPS (FTP Secure)
FTPSは、FTPにSSL/TLS暗号化を追加したバージョンで、通信の秘匿性と完全性が向上しています。FTPSは、暗号化のないFTPと互換性を持ちますが、SSL/TLSによるセキュリティの強化が行われています。FTPSでは、通常2つのモードが利用できます。
- 明示的なTLS: クライアントがコントロール用接続の開始後、明示的にTLSを要求し、サーバがそれに応じてセキュアな接続を確立します。
- 暗黙的なTLS: コントロール用接続の開始直後に、クライアントとサーバが自動的にTLSハンドシェイクを行い、暗号化された接続を確立します。
これらの違いをまとめると、以下のようになります。
- FTP: 基本的なファイル転送プロトコルで、セキュリティ上の問題がある
- SFTP: SSHを使用した安全なファイル転送プロトコル
- FTPS: FTPにSSL/TLS暗号化を加えた安全なバージョン
データのセキュリティを確保するために、SFTPまたはFTPSが推奨されます。
前提条件
MariaDB(MySQL)はすでに導入済みの前提です。
予め、MariaDBを導入しておいてください。
必要なパッケージのインストール
まず、EPELリポジトリと必要なパッケージをインストールしましょう。
sudo dnf -y install epel-release
sudo dnf --enablerepo=epel,crb -y install proftpd proftpd-mysql proftpd-utils
ProFTPDの設定
/etc/proftpd.conf
ファイルがデフォルトの設定ファイルです。既存のものをバックアップして、新しい設定ファイルを作成しましょう。
sudo cp /etc/proftpd.conf /etc/proftpd.conf.bak
sudo truncate -s 0 /etc/proftpd.conf
sudo vi /etc/proftpd.conf
ProFTPDとMariaDBを連携させて認証する場合、AuthUserFile
の代わりにmod_sql
モジュールを使用してデータベースから認証情報を取得します。proftpd.conf
の設定は以下のようになります。
設定ファイルに、パッシブモード用のポート範囲を指定するPassivePorts
ディレクティブを追加します。以下の例では、50000から51000のポート範囲が利用されます。
次に、以下の設定を設定ファイルに追加します。
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
ServerIdent off
ServerType standalone
DefaultServer on
# ポート番号 (デフォルトは21)
Port 21
# Umask設定 (ディレクトリ=775, ファイル=664)
Umask 022
CreateHome on dirmode 755
# ユーザーとグループ設定
User nobody
Group nobody
SQLMinUserUID 999
SQLMinUserGID 99
SQLDefaultUID 1000
SQLDefaultGID 100
# SQLバックエンドの設定 (MariaDB)
SQLBackend mysql
# 認証情報をデータベースから取得
SQLEngine on
SQLAuthenticate users
SQLLogFile /var/log/proftpd/mysql.log
# データベース接続情報
SQLAuthTypes Plaintext
SQLConnectInfo proftpd@localhost:3306 proftpd ここにパスワード
SQLUserInfo ftp_users username password uid gid homedir shell
# セキュリティの強化
<IfModule mod_tls.c>
# デフォルトでTLS接続を要求する
RequireValidShell off
TLSEngine on
# TLS接続を任意にする場合は、TLSRequired off にする
TLSRequired off
TLSRSACertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
TLSRSACertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
TLSProtocol TLSv1.2 TLSv1.3
</IfModule>
# 各ユーザーの設定
<Directory /*>
AllowOverwrite on
</Directory>
# パッシブモード用のポート範囲の設定
PassivePorts 50000 51000
TLS接続用の証明書は、このあと作成します。TLSを使用しない場合は、セキュリティー強化の項目をコメントアウトしてください。
証明書の作成
セキュアな接続を提供するために、TLSを有効にすることをお勧めします。以下の手順でTLS設定を行います。
TLS証明書を作成します。以下のコマンドを実行して、プライベートキーと証明書を生成します。
ここでは、自認証の証明書を設定していますが、Let’s Encrypt(無料) や グローバルサイン等の公認認証局(CA)から証明書を取得することをお勧めします。
sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/private/proftpd.key -out /etc/pki/tls/certs/proftpd.crt
MariaDBの設定
MariaDBのデータベースとユーザーの作成
MariaDBにProFTPD用のデータベースとユーザーを作成します。
sudo mysql -u root -p
次に、以下のコマンドを実行してデータベースとユーザーを作成し、権限を付与します。
CREATE DATABASE proftpd;
CREATE USER 'proftpd'@'localhost' IDENTIFIED BY 'ここにパスワード';
GRANT ALL PRIVILEGES ON proftpd.* TO 'proftpd'@'localhost';
FLUSH PRIVILEGES;
EXIT;
ProFTPD用のテーブルを作成
ProFTPD用のテーブルを作成します。
sudo mysql -u proftpd -p proftpd
次に、以下のSQLコマンドを実行してテーブルを作成します。
CREATE TABLE `ftp_users` (
`id` int(11) NOT NULL,
`username` varchar(32) NOT NULL,
`password` varchar(255) NOT NULL,
`uid` int(11) NOT NULL DEFAULT 1000,
`gid` int(11) NOT NULL DEFAULT 100,
`homedir` varchar(255) NOT NULL,
`shell` varchar(16) NOT NULL DEFAULT '/sbin/nologin'
);
無効シェルを許可
/etc/shells
ファイルに/sbin/nologin
を追加して、無効シェルを許可します。
sudo vi /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/sbin/nologin
FTPユーザーの追加
新しいFTPユーザーを追加し、ホームディレクトリを設定します。
sudo groupadd -g 5000 ftpgroup
sudo useradd -u 5000 -g ftpgroup -s /sbin/nologin ftpuser
次に、パスワードを設定します。
SELinux設定 (任意)
SELinuxが有効な場合、以下のコマンドでポリシーを調整してください。
sudo setsebool -P ftpd_full_access on
ProFTPDサービスの設定と起動
ProFTPDサービスを有効化し、起動します。
sudo systemctl enable proftpd
sudo systemctl start proftpd
これで、ProFTPDを使用したセキュアなFTPサーバーが構築されました。
firewalldのインストールと起動
まだfirewalldがインストールされていない場合、以下のコマンドを実行してインストールします。
sudo yum -y install firewalld
インストール後、firewalldを有効化し、起動します。
sudo systemctl enable firewalld
sudo systemctl start firewalld
FTP用のfirewalldルールの追加
プロトコル21/TCP(FTP用)および20/TCP(データチャネル)を開くために、firewalldにルールを追加します。また、パッシブモード接続の場合に必要なポート範囲も追加します。
以下の例では、50000-51000のポート範囲を許可しています。必要に応じて、この範囲を変更してください。
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=20/tcp
sudo firewall-cmd --permanent --add-port=50000-51000/tcp
TLS接続用のfirewalldルールの追加
TLS接続を使用する場合も、23/TCP(Explicit FTP over TLS)、989/TCPおよび990/TCP(Implicit FTP over TLS)を許可する必要があります。
sudo firewall-cmd --permanent --add-port=23/tcp
sudo firewall-cmd --permanent --add-port=989-990/tcp
設定の適用
追加したfirewalldルールを反映させるために、以下のコマンドを実行します。
sudo firewall-cmd --reload
これで、ProFTPDを使用したセキュアなFTPサーバーに対してfirewalldの設定が完了しました。環境と要件に合わせて、適切なポート番号と範囲を設定してください。