CentOS7でvsftpdのバーチャルユーザを使って、MySQLでFTPユーザ管理をする。
参考URL
http://park1.wakwak.com/~ima/centos4_vsftpd0006.html
FTPユーザのために、いちいちLinuxユーザを増やしたくない!
vsftpdの認証には、linuxユーザを使っている。実装としてはPAM(Pluggable Authentication Modules)を使っていて、これは各サービスが独自に認証をしなくてもよくなるための仕組み。
今回の目的では、vsftpd → PAM → MySQLの架け橋として、pam_mysqlというパッケージが必要。CentOS6まではEPELに登録されていたらしいが、更新されなくなってCentOS7では削除されたらしい。
しょうがないので、ソースを落としてきてローカルビルドして、インストールしよう
1, vsftpdからmysqlのためにpam_mysqlモジュールをインストール
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | # ローカルでビルドするためのソフトをインストール yum install -y make gcc-c++ autoconf automake libtool rpm-build pam-devel mysql-devel openssl-devel cyrus-sasl-devel # pam_mysqlのソースをダウンロード wget "ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora-secondary/releases/23/Everything/source/SRPMS/p/pam_mysql-0.7-0.20.rc1.fc23.src.rpm" # ローカルでビルド rpmbuild --rebuild pam_mysql-0.7-0.20.rc1.fc23.src.rpm # 環境によってrpmファイルの名前が違うので確認してから、ようやくpam_mysqlをインストール #yum localinstall /root/rpmbuild/RPMS/x86_64/pam_mysql-0.7-0.20.rc1.amzn2.x86_64.rpm   yum localinstall /root/rpmbuild/RPMS/x86_64/pam_mysql-0.7-0.20.rc1.el7.x86_64.rpm | 
2, MySQLのインストール
そもそもMySQLが入っていなかった…。インストールしよう。
https://qiita.com/nooboolean/items/7efc5c35b2e95637d8c1
Mysql 5.7* パスワード強度の強要を止めさせる。セキュリティポリシーをMEDIUM(数字・小文字・大文字・記号の4種類必須)からLOW(最低文字数だけ)へ変更
https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273
| 1 2 3 4 | mysql> show variables like 'validate_password%'; mysql> set global validate_password_length=8; # 文字列の長さを変更 mysql> set global validate_password_policy=LOW; # ポリシーを変更(数字・小文字・大文字・記号の4種類必須はキツい…。) mysql> show variables like 'validate_password%'; | 
MySQLのDBインスタンス(ftpusers)、vsftpdからMySQLへの接続ユーザ(ftpuser)、FTPユーザの管理テーブル(users)、ログテーブル(logs)を作る
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # mysql -u root -p mysql> create database ftpusers; mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER on ftpusers.* to ftpuser@localhost identified by '12345678'; mysql>use ftpusers; Database changed create table users(           id int AUTO_INCREMENT NOT NULL,           name char(128) binary NOT NULL,           passwd char(128) binary NOT NULL,           primary key(id)       ); create table logs (           msg varchar(255),           user char(128),           pid int,           host char(128),           rhost char(128),           logtime timestamp       ); | 
3, vsftpdからMySQサーバへ接続できるMySQLのアカウント(ユーザIDとパスワード)を記述
| 1 2 3 4 5 6 | touch /etc/pam.d/vsftpd_mysql chmod 644 /etc/pam.d/vsftpd_mysql # ファイルの内容は以下の通り auth       required     /lib64/security/pam_mysql.so user=ftpuser passwd=12345678 host=localhost db=ftpusers 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=ftpuser passwd=12345678 host=localhost db=ftpusers 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 | 
4, ftpポートとデータ転送用ポート(50000から50050)を開放
| 1 2 3 4 5 | firewall-cmd --permanent --zone=public --add-service=ftp firewall-cmd --reload firewall-cmd --permanent --zone=public --add-port=50000-50050/tcp firewall-cmd --reload | 
5, /etc/vsftpd/vsftpd.confに記述を追加
| 1 2 3 4 5 6 | # vsftpdkからMySQL(MariaDB)への接続情報 pam_service_name=vsftpd_mysql # 実行するlinuxユーザ guest_username=apache # 各FTPユーザの情報が置かれているフォルダパス user_config_dir=/etc/vsftpd/userconf | 
| 1 2 3 4 | # 各FTPユーザの情報フォルダを作っておく mkdir /etc/vsftpd/userconf systemctl restart vsftpd | 
6, FTPユーザの追加(二人目以降も同様)
| 1 2 3 4 5 6 7 8 9 | MySQLへFTPユーザ情報をINSERT insert into users (name,passwd) values('aaa',password('12345678')); # ホームディレクトリ作成 mkdir /var/www/html/aaa chmod 777 /var/www/html/aaa # ホームディレクトリ指定する echo 'local_root=/var/www/html/aaa' > /etc/vsftpd/userconf/aaa | 
これで、MySQLにレコードを作って、ホームディレクトリと設定ファイルを追加すれば、FTPユーザを追加できるようになった。
linuxコマンドを実行しなくても良い所が良いね!