vsftp通過pam集成mysql身份驗證

1 前言

需要解決由FTP上傳的文件自動以某個應用程序的身份保存的唯一方式是使用VSFTP的虛擬用戶,由於筆者對MySQL比較熟悉,所以利用PAM_MySQL模塊將VSFTP與MySQL集成。另外,本文不但整理了CentOS6與CentOS7的安裝配置方法,而且同時涵蓋了RPM包與編譯兩種安裝方法。

2 理論基礎

2.1 PAM模塊的介紹

所謂虛擬用戶,即通過pam模塊將vsftp與數據庫集成,將vsftp的傳統身份驗證方式變成通過數據庫中保存的帳號密碼驗證,用戶的身份並非系統用戶,而需由pam模塊虛擬出來的用戶,故稱虛擬用戶。

2.2 PAM模塊的加載

vim /etc/pam.d/vsftpd

注:通過編輯pam.d目錄下的規則實現加載

2.3 PAM模塊的選項

配置例子:

auth       optional     pam_mysql.so user=root passwd=password
account    required     pam_mysql.so user=root passwd=password

其他選項

-- verbose 設置爲1則顯示詳細的調試信息,默認0
-- debug 開啓調試模式
-- user mysql數據庫認證的用戶名
-- passwd mysql數據庫認證的密碼
-- host mysql數據庫的主機名稱或IP
-- db 包含驗證信息的數據庫名稱
-- table 包含驗證信息的數據庫表名稱
-- update_table 包含密碼更高的數據庫表名稱,不配置默認賦予table的值
-- usercolumn 包含驗證的用戶名列
-- passwdcolumn 包含驗證的密碼列
-- statcolumn 標記用戶狀態的列
  --- 0表示用戶已經過期;
  --- 1表示要求用戶更改密碼
-- crypt 密碼加密方式,
  --- 0無加密,默認爲此值;
  --- 1使用crypt(3)函數加密;
  --- 2使用MySQL的PASSWORD函數加密;
  --- 3使用普通十六進制md5加密;
  --- 4使用普通十六機制SHA1加密;
-- md5 使用md5進行crypt(3)哈希,當crypt設置爲“Y”纔有效,默認false
-- use_323_passwd 使用MySQL版本3風格的加密功能(兼容遷移),默認false
-- where 查詢的附加條件如 [where=Host.name="web" AND User.active=1]
-- sqllog 設置爲“true”或“yes”,則啓用SQL日誌記錄,默認false
-- logtable 存儲日誌的表名稱
-- logmsgcoumn 該列存儲日誌的消息
-- logusercolumn 該列存儲產生日誌的用戶名
-- logpidcolumn 該列存儲產生日誌的進程PID

注:以上是本人對原文的理解翻譯(詳細請參閱源碼包的README文件),如果有誤歡迎指正。

3 實踐部分

3.1 環境配置

3.1.1 安裝配置工具

yum install -y wget vim

3.1.2 安裝編譯工具包(可選,編譯安裝才需要)

yum install -y gcc gcc-c++ make expat-devel

3.1.3 MySQL安裝


1)配置MySQL的源

vim /etc/yum.repos.d/mysql56-community.repo

輸入如下內容:

# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.mysql.com/RPM-GPG-KEY-mysql

2)安裝數據庫相關包

yum install -y mysql-community-server mysql-community-devel mysql-community-client

3.1.4 安裝相關包

yum install -y vsftpd pam-devel httpd

3.1.5 下載pam模塊可選,編譯安裝才需要)

wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz

3.1.6 開啓防火牆端口

In CentOS 6:

vim /etc/sysconfig/iptables

加入如下行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:60000 -j ACCEPT

重啓防火牆服務:

/etc/init.d/iptables restart

In CentOS 7:

firewall-cmd --permanent --add-service ftp
firewall-cmd --permanent --add-port 50000-60000/tcp
firewall-cmd --reload
firewall-cmd --list-all

3.1.7 關閉selinux

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

3.2 安裝pam模塊

3.2.1 yum方式安裝

In CentOS 6:

yum install -y http://dl.fedoraproject.org/pub/epel/6/i386/pam_mysql-0.7-0.12.rc1.el6.i686.rpm

注:下載頁面,

http://dl.fedoraproject.org/pub/epel/6/i386/

In CentOS 7:

yum install -y ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/20/Everything/x86_64/os/Packages/p/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm

注:下載頁面,

http://rpm.pbone.net/index.php3/stat/4/idpl/25165183/dir/fedora_20/com/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm.html

3.2.2 編譯安裝方式可選,編譯安裝才需要)

1)解壓安裝包

tar -xf pam_mysql-0.7RC1.tar.gz

2)編譯並安裝

cd pam_mysql-0.7RC1
./configure --with-mysql=/usr/bin/mysql_config
make && make install

如果提示錯誤以下錯誤:

configure: error: Your system doesn't appear to be configured to use PAM. Perhaps you need to specify the correct location where the PAM modules reside.

可增加參數解決:

./configure --with-mysql=/usr/bin/mysql_config --with-pam-mods-dir=/usr/lib64/security

3.3 配置數據庫

3.3.1 啓動服務並配置自動啓動

In CentOS 6:

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

In CentOS 7:

systemctl start mysqld
systemctl enable mysqld

3.3.2 初始化數據庫

mysql_secure_installation

嚮導如下:

[...]
Enter current password for root (enter for none):
OK, successfully used password, moving on...
[...]
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!
[...]
Remove anonymous users? [Y/n] y
 ... Success!
[...]
Disallow root login remotely? [Y/n] n
 ... skipping.
[...]
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!
[...]
Reload privilege tables now? [Y/n] y
 ... Success!
[...]

3.3.3 創建驗證數據庫

mysql -uroot -p
create database vsftpd;

3.3.4 創建驗證數據表

use vsftpd;
create table users (
  id int auto_increment not null,
  name char(20) not null unique key,
  passwd char(48) not null,
  primary key(id)
);

3.3.5 添加測試數據

insert into vsftpd.users(name,passwd) values ('test1',password('123456'));

查詢數據庫中的賬號:

select * from vsftpd.users;

3.3.6 配置驗證賬號

grant select on vsftpd.* to vsftpd@localhost identified by 'abc123';
grant select on vsftpd.* to [email protected] identified by 'abc123';
flush privileges;

3.3.7 測試驗證賬號

 mysql -uvsftpd -pabc123

3.4 配置vsftp

3.4.1 備份配置文件

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.defalut
vim /etc/vsftpd/vsftpd.conf

輸入如下配置:

listen=YES
anonymous_enable=NO
local_enable=YES
virtual_use_local_privs=YES
write_enable=YES
connect_from_port_20=YES
pasv_min_port=50000
pasv_max_port=60000
pam_service_name=vsftpd
guest_enable=YES
guest_username=apache
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=$USER
local_root=/var/www/$USER
hide_ids=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log

重要代碼解析:

第9行聲明調用PAM_MySQL模塊
第11行決定上傳代碼的屬主是apache,也可以映射到其他本地用戶,請靈活運用
第12行限制用戶chroot,限制FTP用戶瀏覽其他非權限目錄
第13和14行根據登錄的賬號動態指定用戶根目錄
第15行向FTP用戶顯示屬主和屬組爲FTP

3.4.2 配置pam

確認pam_mysql.so的位置:

find / -name \*pam_mysql.so\*

假設顯示如下:

/lib/security/pam_mysql.so

加載認證模塊:

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.defautl
vim /etc/pam.d/vsftpd

修改配置如下:

#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
#數據庫認證
auth       sufficient   /lib/security/pam_mysql.so user=vsftpd passwd=abc123 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2
#vsftp默認的其餘認證
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      password-auth
#授權和認證也是一樣的
account    sufficient   /lib/security/pam_mysql.so user=vsftpd passwd=abc123 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth

注:請根據pam_mysql.so實際路徑寫,不同的安裝方法位置會有所不同。

3.4.3 創建用戶配置文件目錄

mkdir -p /var/www/test1

3.4.4 配置映射用戶目錄權限

查詢映射用戶的家目錄

cat /etc/passwd | grep apache

顯示如下:

apache:x:48:48:Apache:/var/www:/sbin/nologin

修改映射用戶的屬主

chown apache:apache /var/www/test1

3.4.5 重啓服務

In CentOS 6:

/etc/init.d/vsftpd restart

In CentOS 7:

systemctl restart vsftpd

3.5 測試並調試

3.5.1 監視日誌

tail -f /var/log/secure
tail -f /var/log/vsftpd.log

注:如果登陸成功secure中沒有任何日誌,但vsftpd.log中會有登陸成功的提示,這時候無論是否能正常使用都表示PAM_MySQL模塊已經配置好,請檢查VSFTP的配置。

3.5.2 嘗試登陸

ftp://10.168.0.51/

注:如果登陸不成功請根據監視日誌的提示信息排錯。

4 用戶管理工具的使用

4.1 工具的下載

http://down.51cto.com/data/2298015

注:該工具是筆者自己寫的,請按照自己的需求確定是否使用。

4.2 安裝配置

4.2.1 部署工具

tar -xf vsftpcli.tar
cp vsftpcli /usr/bin/
chmod 700 /usr/bin/vsftpcli

4.2.2 工具的常量定義

vim /usr/bin/vsftpcli

修改以下常量:

mysql_user='root' #數據庫連接的賬號
mysql_pass='abc123' #數據庫連接的密碼
mysql_host='localhost' #數據庫主機
mysql_host='3306' #數據庫的端口

basedir='/var/www' #網站的根目錄
localuser='apache' #網站的屬主
localgroup='apache' #網站的屬組

4.3 工具的使用

4.3.1 獲取幫助

vsftpcli

顯示如下:

Usage: /usr/bin/vsftpcli <add> <ftpname> <ftppasswd>
       /usr/bin/vsftpcli <remove> <ftpname>
       /usr/bin/vsftpcli <rename> <oldusername> <newusername>
       /usr/bin/vsftpcli <chpasswd> <ftpname> <ftppasswd>
       /usr/bin/vsftpcli <print>

4.3.2 增加用戶

vsftpcli add user1 123456
vsftpcli add user2 123456
vsftpcli add user3 123456

4.3.3 打印用戶

vsftpcli print

4.3.4 刪除用戶

vsftpcli remove user2

4.3.5 重命名用戶

vsftpcli rename user3 user2

4.3.6 更改用戶密碼

vsftpcli chpasswd user2 456789


參閱地址:

==================================

PAM-MySQL:

http://pam-mysql.sourceforge.net

http://pam-mysql.sourceforge.net/Documentation/


VSFTPD:

https://security.appspot.com/vsftpd.html#docs

https://security.appspot.com/vsftpd/vsftpd_conf.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章