ec2@awsで、ProFTPD(FTPサーバ)のアカウントをMySQLのテーブルで管理できるようにしてみた。
vsftpdが一番多い気がするけど、他にもFTPサーバは存在する。
ec2だと、vsftpd-mysqlがうまく動作しないっぽいので、ProFTPDで試してみた。
設定ファイル(/etc/proftpd.conf)がapacheっぽい。
1, proftpdのインストール
1 2 3 4 5 6 7 8 |
# amazon linux2だとepelのレポジトリ・インストールの仕方が違う sudo amazon-linux-extras install epel # proftpdをインストール yum install -y proftpd proftpd-utils #自動起動を有効&再起動します。 sudo systemctl enable proftpd sudo systemctl restart proftpd |
ffftpで接続してみたら、ファイル一覧が表示されない~。
passiveモード対応だと、IPとポート設定が必要だった
/etc/proftpd.confの最後に追記。文法チェックは proftpd -t だけでOK!
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 |
MasqueradeAddress ec2だとパプリックIPを記述 PassivePorts 50000 50050 # 以下はproftpdとmysqlを接続するための設定。 AuthOrder mod_sql.c mod_auth_unix.c LoadModule mod_sql.c LoadModule mod_sql_mysql.c # sha256など標準オプションにないハッシュの時は必要 # LoadModule mod_sql_passwd.c CreateHome on dirmode 755 <IfModule mod_sql_mysql.c> SQLBackend mysql SQLEngine on SQLAuthenticate on SQLLogFile /var/log/proftpd-mysql.log SQLAuthTypes backend # mysqlのpassword()を使う SQLConnectInfo ftpusers@localhost:3306 ftpuser 12345678 SQLUserInfo ftpuser userid passwd uid gid homedir shell SQLGroupInfo ftpgroup groupname gid members #mod_sql_passwd.cの有効のため必須 # SQLPasswordEngine ON #PlaintextやCryptからSHA256に変更(mysql8からpassword関数が使えない!) # SQLAuthTypes SHA256 </IfModule> |
2, mysqlをインストール
https://qiita.com/himatani/items/e1e650992dbc12b8a9b3
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 |
# なぜかec2だとmysqlをyumでインストール出来ない…。MariaDB推しなの? とりあえず外す sudo yum list installed | grep mariadb sudo yum remove mariadb-libs # URLから直接インストール sudo yum install http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm sudo yum install mysql-community-server # バージョンを確認 mysqld -V mysqld Ver 5.7.23 for Linux on x86_64 (MySQL Community Server (GPL)) # mysql起動 systemctl start mysqld.service # 自動起動に変更しておく systemctl enable mysqld.service # rootのパスワードは自動生成されているので確認。/Oq14QzMIi-% と強度最強! cat /var/log/mysqld.log | grep password 2019-07-02T07:03:56.377594Z 1 [Note] A temporary password is generated for root@localhost: /Oq14QzMIi-% # ログインして mysql -u root -p --パスワードの長さだけ設定。 SET GLOBAL validate_password_length=8; -- MEDIUMだと大文字/小文字/数字/記号の4種が必要! SET GLOBAL validate_password_policy=LOW; -- mysqlのrootのパスワードを変更 ALTER USER root@localhost IDENTIFIED BY '8文字以上の好きなパスワード'; #文字コードも買えておく。/etc/my.cnfの最後に追記 [mysqld] character-set-server=utf8 validate-password=OFF #再起動したらパスワード制限をOFF [client] default-character-set=utf8 # mysql再起動 systemctl restart mysqld.service |
3, mysqlをインストールした後に、proftpd-mysqlをインストール(対応したバージョンがインストールされる)
1 |
yum install proftpd proftpd-mysql |
4, proftpdのユーザテーブルを作る
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 |
create database ftpusers; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER on ftpusers.* to ftpuser@localhost identified by '12345678'; use ftpusers; -- ftpユーザ管理用テーブル CREATE TABLE ftpuser ( id int(10) unsigned NOT NULL auto_increment, userid varchar(256) NOT NULL default '', passwd varchar(256) NOT NULL default '', uid smallint(6) NOT NULL default '5500', gid smallint(6) NOT NULL default '5500', homedir varchar(255) NOT NULL default '', shell varchar(16) NOT NULL default '/sbin/nologin', count int(11) NOT NULL default '0', accessed datetime NOT NULL, modified datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY userid (userid) ) COMMENT='ProFTP user table'; --ftpユーザのユーザグループ管理用テーブル CREATE TABLE ftpgroup ( groupname varchar(16) NOT NULL default '', gid smallint(6) NOT NULL default '5500', members varchar(16) NOT NULL default '', KEY groupname (groupname) ) COMMENT='ProFTP group table'; -- FTPユーザ情報をINSERT INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser'); INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES ('exampleuser', password('secret'), 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, now(), now()); |
laravelのeloquentを使うと、こんな感じ。
mysql関数のpassword()を使うので、DB::selectOneを使う(初めて見た!)
1 2 3 4 5 6 7 8 9 10 11 |
$ftpuser = Ftpuser::create([ 'project_id' => $project->id, 'ftp_login_id' => $ftp_login_id, // /etc/proftpd.confのSQLAuthTypes backend # mysqlのpassword()を使う // という設定なので、DB::selectOne(バインディング)でSQL関数のpassword()を使う。 'ftp_login_password' => \DB::selectOne("SELECT PASSWORD(?) AS sql_password", [ $ftp_login_password ])->sql_password, 'uid' => 2001, 'gid' => 2001, 'homedir' => $ftp_upload_path, 'shell' => '/sbin/nologin', ]); |
5,ホームディレクトリを作成
1 2 |
sudo mkdir -p /home/www.example.com sudo chown 2001:2001 /home/www.example.com |
6, ffftpなどで接続できればOK!
ID=exampleuser
PASS=secret
これ以降は、ホームディレクトリとftpuserレコードだけでFTPアカウントが生成できる。