Pure-ftpd + TLS


市面上FTP林林總總,Pure-ftpd算是大家滿常用的一個FTP服務

FTP的protocol又大致分為FTP/SFTP/FTPS

FTP:就是我們直接使用21port登入的protocol
SFTP:使用SSH 22port登入的protocol
FTPS:採用SSL/TLS加密data層傳輸的protocol

所以可以看出一般FTP服務在傳輸跟資料的層面都是未加密的
採用SSL/TLS加密就可以保護資料

過程其實很簡單
我這邊使用CentOS5.2搭配pureftpd-1029和MySQL5144

請先安裝MySQL,我這邊使用手動compile安裝

#./configure –prefix=/opt/mysql5144
#make
#make install
#cp mysql-5.1.44/support-files/my-medium.cnf /etc/my.cnf
#cd mysql5144/bin
#./mysql_install_db --user=mysql
#./mysqld_safe --user=mysql & (啟動mysql)
#mysqladmin –u root password '密碼'



到這邊安裝就算完成了,接下來進入DB設定資料
#cd /opt/Servers/mysql5144/bin/
#./mysql –u root –p

    SHOW DATABASES;
    CREATE DATABASE pureDB;
    USE pureDB;

    CREATE TABLE (貼表格內語法)


CREATE TABLE `pure_ftpusers` (
`user` varchar(20) NOT NULL default '',
`status` enum('0','1') NOT NULL default '0',
`password` varchar(40) NOT NULL default '',
`uid` varchar(5) NOT NULL default '800',
`gid` varchar(5) NOT NULL default '800',
`aid` varchar(5) NOT NULL default '',
`dir` varchar(128) NOT NULL default '',
`ulbandwidth` smallint(5) NOT NULL default '0',
`dlbandwidth` smallint(5) NOT NULL default '0',
`comment` tinytext NOT NULL,
`ipaccess` varchar(15) NOT NULL default '*',
`quotasize` smallint(5) NOT NULL default '0',
`quotafiles` int(11) NOT NULL default '0',
`create_date` date default NULL,
`update_date` date default NULL,
PRIMARY KEY (`user`),
UNIQUE KEY `user` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO pureDB.pure_ftpusers (user,status,password,aid,dir,comment,ipaccess,create_date,update_date) VALUES ('david2','1',md5('12345'),'0001','/opt/FTP_accounts/david2','','*',Now(),Now());


Ctrl+C(離開)


#mkdir –p /opt/FTP_accounts/david2
#chmod 777 zora2
#./mysql –u root –p


建立虛擬user資料

USE pureDB;

新增資料行(貼表格內語法)


到這邊就新增完第一位虛擬user了。
pureftpd的好處就是可以不用建立系統user,使用虛擬user來管理,安全性相對提高許多


再安裝pureftpd,我用手動compile的方式安裝

./configure --prefix=/opt/pureftpd1029 --with-everything --with-paranoidmsg --without-capabilities --with-virtualchroot --with-mysql=/opt/Servers/mysql5144/ --with-tls --with-certfile=/etc/ssl/private/

稍微解釋一下
--prefix=PATH
--with-everything 並不一定是全部功能都有裝到
--with-mysql=MySQL_PATH
--with-tls 這邊一定要啟用
--with-certfile=/etc/ssl/private 指定存放憑證的位置

我建議是將tls和certfile都加進去安裝,那如果已經安裝完想要新增TLS加密功能呢?
請重新compile一次,記得參數要一樣,否則會有錯誤。

compile若有錯誤

ERROR:comile pureftp"Your MySQL client libraries aren't properly install"

請執行以下步驟
#cp /opt/mysql5144/lib/mysql/*.* /usr/lib/
#cp /opt/mysql5144/lib/mysql/*.* /usr/lib64/

#make
#make install

這邊有個重點,因為pureftpd作者的疏忽,有一個檔案並不會隨著compile被放到資料夾
所以我們必須手動更改權限及放入

#chmod 755 pure-ftpd-1.0.29/configuration-file/pure-config.pl


#cp -rp pure-ftpd-1.0.29/configuration-file/pure-config.pl /opt/pureftpd1029/sbin/

接著放入pure-ftpd以及mysql的conf

#cp -rp pure-ftpd-1.0.29/configuration-file/pure-ftpd.conf /opt/pureftpd1029/etc/

#cp -rp pure-ftpd-1.0.29/pureftpd-mysql.conf /opt/pureftpd1029/etc/

etc資料夾請自己mkdir建立

        接著建立mysql.sock軟連結</div>


#mkdir /var/lib/mysql
#cd /var/lib/mysql
#ln –s /tmp/mysql.sock   



然後設定pure-ftpd.conf以及pureftpd-mysql.conf
這邊我就不贅述,但是以下是啟用TLS的重點

pure-ftpd.conf裡有TLS,請務必打開
分為 0 | 1 | 2 三種模式,分別代表不使用/兼容/強制 FTPS
通常會設1

接著我們必須產生加密用的憑證,我們使用openssl自己簽發

先建立放置憑證的資料夾(compile時可選擇),我寫入的路徑是預設/etc/ssl/private

首先,要先產生key
這邊的key,就是private key的意思,總不希望憑證沒有key吧

openssl genrsa -des3 -out server.key 2048


這樣是生成rsa私鑰,des3算法,openssl格式,2048位強度

 server.key是密鑰文件名
生成這樣的key,需要一個至少四位數密碼

接著產生crt


openssl req -new -x509 -key server.key -out ca.crt -days 3650


這邊產生crt的用意是為了生成待會的pem,記得輸入相關資訊


接著我們產生pureftpd所需要的憑證



cat /etc/ssl/server.key /etc/ssl/server.crt > /etc/ssl/private/pure-ftpd.pem

這是由於pureftpd有他要求的格式(我的理解是這樣),所以我們不能隨便產生一個pem就拿來使用,服務會無法啟動

生成之後記得將key以及crt刪除,並將pem權限改為600


啟動pureftpd:
/opt/pureftpd1029/sbin/pure-config.pl /opt/pureftpd1029/etc/pure-ftpd.conf 

大功告成!




備註:
官方文件說明的很清楚
http://pureftpd.sourceforge.net/README.TLS


如果不想使用key加密的話,官方文件的做法是直接連key一起產生,比較不安全

openssl req -x509 -nodes -newkey rsa:1024 -keyout \
  /etc/ssl/private/pure-ftpd.pem \
  -out /etc/ssl/private/pure-ftpd.pem

記得憑證名稱一定要是pure-ftpd.pem ,否則服務無法啟動
若有錯誤請看/var/log/messeng



設定正確的話,成功連接畫面如上圖

重點整理:
1. pure-ftpd.conf啟用TLS 1
2. 產生憑證key及crt
3. 產生憑證pem
4. client端需設定 “需要透過外顯示TLS的FTP” 才能正確使用FTPS連接到server


參考資料:

非常有用國外重點整理
https://www.howtoforge.com/tutorial/pureftpd-tls-on-centos/

pureftpd官方文件
http://pureftpd.sourceforge.net/README.TLS

openssl private key產生教學
https://hackersir.gitbooks.io/laravel-note/content/apache/ssl.html

如何由key和crt產生pem憑證
http://edoceo.com/howto/pure-ftpd