ProFTPD の導入 MariaDBとの連携

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を導入しておいてください。

あわせて読みたい
MariaDB(MySQL) の導入 MariaDBは、MySQLをベースに開発されたオープンソースのデータベース管理システムです。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
あわせて読みたい
Let’s Encryptの導入 (SAN証明書, ワイルドカード証明書) Let's Encrypt とは、無料でSSL証明書を発行するための認証局 (CA: Certificate Authority) で、ウェブサイトのセキュリティを簡単かつ手頃な価格で向上させること...

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の設定が完了しました。環境と要件に合わせて、適切なポート番号と範囲を設定してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次