vsftp經過pam集成mysql身份驗證

1 前言php

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

2 理論基礎
mysql

2.1 PAM模塊的介紹linux

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

2.2 PAM模塊的加載web

vim /etc/pam.d/vsftpd

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

2.3 PAM模塊的選項shell

配置例子:
數據庫

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

其餘選項apache

-- 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 vsftpd@127.0.0.1 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

相關文章
相關標籤/搜索