ftpのユーザをmysqlで管理する

こーめいです。

ftpのユーザをmysqlで管理する際のメモです。個人的にはユーザをmysqlで管理するのは好きです。今回はvsftpd + pam_myslqで環境構築します。

概要

pam_mysqlインストール

pam_mysqlをインストールします。その他、vsftpd, mysqlなど必要なパッケージも合わせてインストールします。

sudo yum install vsftpd
sudo yum --enablerepo=epel install pam_mysql
sudo yum install mysql mysql-server mysqlclient10

mysqlを起動してchkconfigも忘れずにonにしておきましょう

sudo /etc/rc.d/init.d/mysqld start
chkconfig mysqld on

mysql設定

mysqlで今回使用するdatabaseとtableを作成します。テーブルにはユーザを格納するuserとアクセスログを格納するlogテーブルを作成します。後々設定をしますが、ローカルでもリモートでもどちらでも可能です。

mysql -u root -p
create database ftpuser_db;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER on ftpuser_db.* to <username> identified by '<password>';
use ftpuser_db;

create table user(
id int AUTO_INCREMENT NOT NULL,
name char(128) binary NOT NULL,
passwd char(128) binary NOT NULL,
primary key(id)
);

create table log (
msg varchar(255),
user char(128),
pid int,
host char(128),
rhost char(128),
logtime timestamp
);

pam_mysql設定

ここではローカルのmysqlを使用する前提で設定します。リモートに構築した場合はpam設定のhost=<remote_host>で設定してください。

touch /etc/pam.d/vsftpd_mysql
chmod 644 /etc/pam.d/vsftpd_mysql

vim /etc/pam.d/vsftpd_mysql
auth       required     /lib64/security/pam_mysql.so user=<username> passwd=<password> host=localhost db=ftpuser_db table=users usercolumn=name passwdcolumn=passwd crypt=2 use_323_passwd=false sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime
account    required     /lib64/security/pam_mysql.so user=<username> passwd=<password> host=localhost db=ftpuser_db table=users usercolumn=name passwdcolumn=passwd crypt=2 use_323_passwd=false sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime

vsftpd設定

以下はvsftpd.confの設定です。自身の環境に合わせて適宜修正してください。

/etc/vsftpd/vsftpd.conf

anonymous_enable=NO
ascii_upload_enable=YES
ascii_download_enable=YES
use_localtime=YES
log_ftp_protocol=YES
pasv_enable=YES

pam_service_name=vsftpd_mysqlがポイントです。

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd_mysql
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/userconf
force_dot_files=YES

guest_usernameには実際のLinux上のユーザを指定してください。ここではftpを使用します。

guest_enable=YES
guest_username=ftp

userconfフォルダにユーザ名のファイルを作成してftpユーザ用のディレクトリを指定します。ホームディレクトリより上層にアクセスする必要はないため、chroot_listは空ファイルで問題ないです。

mkdir /etc/vsftpd/userconf

vi /etc/vsftpd/userconf/testuser
local_root=/var/testuser
touch /etc/vsftpd/chroot_list

それでは実際にtestuserを先ほどのテーブルに作成します。

mysql -u <username> -p
use ftpuser_db;
insert into user (name,passwd) values('testuser',password('<password>'));

testuser用のディレクトリも合わせて作成します。先ほどguest_usernameを設定したユーザでアクセスできるよう権限を設定しておきます。

mkdir -p /var/testuser
chown ftp:ftp /var/testuser

最後にvsftpdをリスタートします。

sudo /etc/rc.d/init.d/vsftpd restart

ここまでの設定で問題なければftpでアクセスできるようになっているはずです。ログはmysqlのlogテーブルに格納されますので注意してください。

あまり流行ってはないようですが、実際にやってみると簡単かつ管理しやすく個人的なスタンダードとして使用したいと思います。


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

MySQL徹底入門 第3版 ?5.5新機能対応?

MySQL徹底入門 第3版 ?5.5新機能対応?

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版