1 前言
需要解決由FTP上傳的檔案自動以某個應用程式的身份儲存的唯一方式是使用VSFTP的虛拟使用者,由于筆者對MySQL比較熟悉,是以利用PAM_MySQL子產品将VSFTP與MySQL內建。另外,本文不但整理了CentOS6與CentOS7的安裝配置方法,而且同時涵蓋了RPM包與編譯兩種安裝方法。
2 理論基礎
2.1 PAM子產品的介紹
所謂虛拟使用者,即通過pam子產品将vsftp與資料庫內建,将vsftp的傳統身份驗證方式變成通過資料庫中儲存的帳号密碼驗證,使用者的身份并非系統使用者,而需由pam子產品虛拟出來的使用者,故稱虛拟使用者。
2.2 PAM子產品的加載
1
<code>vim </code><code>/etc/pam</code><code>.d</code><code>/vsftpd</code>
注:通過編輯pam.d目錄下的規則實作加載
2.3 PAM子產品的選項
配置例子:
2
<code>auth optional pam_mysql.so user=root </code><code>passwd</code><code>=password</code>
<code>account required pam_mysql.so user=root </code><code>passwd</code><code>=password</code>
其他選項
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
<code>-- verbose 設定為1則顯示詳細的調試資訊,預設0</code>
<code>-- debug 開啟調試模式</code>
<code>-- user mysql資料庫認證的使用者名</code>
<code>-- </code><code>passwd</code> <code>mysql資料庫認證的密碼</code>
<code>-- host mysql資料庫的主機名稱或IP</code>
<code>-- db 包含驗證資訊的資料庫名稱</code>
<code>-- table 包含驗證資訊的資料庫表名稱</code>
<code>-- update_table 包含密碼更高的資料庫表名稱,不配置預設賦予table的值</code>
<code>-- usercolumn 包含驗證的使用者名列</code>
<code>-- passwdcolumn 包含驗證的密碼列</code>
<code>-- statcolumn 标記使用者狀态的列</code>
<code> </code><code>--- 0表示使用者已經過期;</code>
<code> </code><code>--- 1表示要求使用者更改密碼</code>
<code>-- crypt 密碼加密方式,</code>
<code> </code><code>--- 0無加密,預設為此值;</code>
<code> </code><code>--- 1使用crypt(3)函數加密;</code>
<code> </code><code>--- 2使用MySQL的PASSWORD函數加密;</code>
<code> </code><code>--- 3使用普通十六進制md5加密;</code>
<code> </code><code>--- 4使用普通十六機制SHA1加密;</code>
<code>-- md5 使用md5進行crypt(3)哈希,當crypt設定為“Y”才有效,預設</code><code>false</code>
<code>-- use_323_passwd 使用MySQL版本3風格的加密功能(相容遷移),預設</code><code>false</code>
<code>-- where 查詢的附加條件如 [where=Host.name=</code><code>"web"</code> <code>AND User.active=1]</code>
<code>-- sqllog 設定為“</code><code>true</code><code>”或“</code><code>yes</code><code>”,則啟用SQL日志記錄,預設</code><code>false</code>
<code>-- logtable 存儲日志的表名稱</code>
<code>-- logmsgcoumn 該列存儲日志的消息</code>
<code>-- logusercolumn 該列存儲産生日志的使用者名</code>
<code>-- logpidcolumn 該列存儲産生日志的程序PID</code>
注:以上是本人對原文的了解翻譯(詳細請參閱源碼包的README檔案),如果有誤歡迎指正。
3 實踐部分
3.1 環境配置
3.1.1 安裝配置工具
<code>yum </code><code>install</code> <code>-y wget vim</code>
3.1.2 安裝編譯工具包(可選,編譯安裝才需要)
<code>yum </code><code>install</code> <code>-y gcc gcc-c++ </code><code>make</code> <code>expat-devel</code>
3.1.3 MySQL安裝
1)配置MySQL的源
<code>vim </code><code>/etc/yum</code><code>.repos.d</code><code>/mysql56-community</code><code>.repo</code>
輸入如下内容:
<code># Enable to use MySQL 5.6</code>
<code>[mysql56-community]</code>
<code>name=MySQL 5.6 Community Server</code>
<code>baseurl=http:</code><code>//repo</code><code>.mysql.com</code><code>/yum/mysql-5</code><code>.6-community</code><code>/el/7/</code><code>$basearch/</code>
<code>enabled=1</code>
<code>gpgcheck=1</code>
<code>gpgkey=http:</code><code>//repo</code><code>.mysql.com</code><code>/RPM-GPG-KEY-mysql</code>
2)安裝資料庫相關包
<code>yum </code><code>install</code> <code>-y mysql-community-server mysql-community-devel mysql-community-client</code>
3.1.4 安裝相關包
<code>yum </code><code>install</code> <code>-y vsftpd pam-devel httpd</code>
3.1.5 下載下傳pam子產品(可選,編譯安裝才需要)
<code>wget http:</code><code>//prdownloads</code><code>.sourceforge.net</code><code>/pam-mysql/pam_mysql-0</code><code>.7RC1.</code><code>tar</code><code>.gz</code>
3.1.6 開啟防火牆端口
In CentOS 6:
<code>vim </code><code>/etc/sysconfig/iptables</code>
加入如下行:
<code>-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT</code>
<code>-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:60000 -j ACCEPT</code>
重新開機防火牆服務:
<code>/etc/init</code><code>.d</code><code>/iptables</code> <code>restart</code>
In CentOS 7:
<code>firewall-cmd --permanent --add-service </code><code>ftp</code>
<code>firewall-cmd --permanent --add-port 50000-60000</code><code>/tcp</code>
<code>firewall-cmd --reload</code>
<code>firewall-cmd --list-all</code>
3.1.7 關閉selinux
<code>setenforce 0</code>
<code>sed</code> <code>-i </code><code>'s/SELINUX=enforcing/SELINUX=disabled/g'</code> <code>/etc/selinux/config</code>
3.2 安裝pam子產品
3.2.1 yum方式安裝
<code>yum </code><code>install</code> <code>-y http:</code><code>//dl</code><code>.fedoraproject.org</code><code>/pub/epel/6/i386/pam_mysql-0</code><code>.7-0.12.rc1.el6.i686.rpm</code>
注:下載下傳頁面,
<a href="http://dl.fedoraproject.org/pub/epel/6/i386/" target="_blank">http://dl.fedoraproject.org/pub/epel/6/i386/</a>
<code>yum </code><code>install</code> <code>-y </code><code>ftp</code><code>:</code><code>//ftp</code><code>.pbone.net</code><code>/mirror/archive</code><code>.fedoraproject.org</code><code>/fedora/linux/releases/20/Everything/x86_64/os/Packages/p/pam_mysql-0</code><code>.7-0.16.rc1.fc20.x86_64.rpm</code>
<a href="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" target="_blank">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</a>
3.2.2 編譯安裝方式(可選,編譯安裝才需要)
1)解壓安裝包
<code>tar</code> <code>-xf pam_mysql-0.7RC1.</code><code>tar</code><code>.gz</code>
2)編譯并安裝
<code>cd</code> <code>pam_mysql-0.7RC1</code>
<code>.</code><code>/configure</code> <code>--with-mysql=</code><code>/usr/bin/mysql_config</code>
<code>make</code> <code>&& </code><code>make</code> <code>install</code>
如果提示錯誤以下錯誤:
<code>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.</code>
可增加參數解決:
<code>.</code><code>/configure</code> <code>--with-mysql=</code><code>/usr/bin/mysql_config</code> <code>--with-pam-mods-</code><code>dir</code><code>=</code><code>/usr/lib64/security</code>
3.3 配置資料庫
3.3.1 啟動服務并配置自動啟動
<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>start</code>
<code>chkconfig mysqld on</code>
<code>systemctl start mysqld</code>
<code>systemctl </code><code>enable</code> <code>mysqld</code>
3.3.2 初始化資料庫
<code>mysql_secure_installation</code>
向導如下:
<code>[...]</code>
<code>Enter current password </code><code>for</code> <code>root (enter </code><code>for</code> <code>none):</code>
<code>OK, successfully used password, moving on...</code>
<code>Set root password? [Y</code><code>/n</code><code>] y</code>
<code>New password:</code>
<code>Re-enter new password:</code>
<code>Password updated successfully!</code>
<code>Reloading privilege tables..</code>
<code> </code><code>... Success!</code>
<code>Remove anonymous </code><code>users</code><code>? [Y</code><code>/n</code><code>] y</code>
<code>Disallow root login remotely? [Y</code><code>/n</code><code>] n</code>
<code> </code><code>... skipping.</code>
<code>Remove </code><code>test</code> <code>database and access to it? [Y</code><code>/n</code><code>] y</code>
<code> </code><code>- Dropping </code><code>test</code> <code>database...</code>
<code> </code><code>- Removing privileges on </code><code>test</code> <code>database...</code>
<code>Reload privilege tables now? [Y</code><code>/n</code><code>] y</code>
3.3.3 建立驗證資料庫
<code>mysql -uroot -p</code>
<code>create database vsftpd;</code>
3.3.4 建立驗證資料表
<code>use vsftpd;</code>
<code>create table </code><code>users</code> <code>(</code>
<code> </code><code>id</code> <code>int auto_increment not null,</code>
<code> </code><code>name char(20) not null unique key,</code>
<code> </code><code>passwd</code> <code>char(48) not null,</code>
<code> </code><code>primary key(</code><code>id</code><code>)</code>
<code>);</code>
3.3.5 添加測試資料
<code>insert into vsftpd.</code><code>users</code><code>(name,</code><code>passwd</code><code>) values (</code><code>'test1'</code><code>,password(</code><code>'123456'</code><code>));</code>
查詢資料庫中的賬号:
<code>select</code> <code>* from vsftpd.</code><code>users</code><code>;</code>
3.3.6 配置驗證賬号
<code>grant </code><code>select</code> <code>on vsftpd.* to vsftpd@localhost identified by </code><code>'abc123'</code><code>;</code>
<code>grant </code><code>select</code> <code>on vsftpd.* to [email protected] identified by </code><code>'abc123'</code><code>;</code>
<code>flush privileges;</code>
3.3.7 測試驗證賬号
<code> </code><code>mysql -uvsftpd -pabc123</code>
3.4 配置vsftp
3.4.1 備份配置檔案
<code>cp</code> <code>/etc/vsftpd/vsftpd</code><code>.conf </code><code>/etc/vsftpd/vsftpd</code><code>.conf.defalut</code>
<code>vim </code><code>/etc/vsftpd/vsftpd</code><code>.conf</code>
輸入如下配置:
<code>listen=YES</code>
<code>anonymous_enable=NO</code>
<code>local_enable=YES</code>
<code>virtual_use_local_privs=YES</code>
<code>write_enable=YES</code>
<code>connect_from_port_20=YES</code>
<code>pasv_min_port=50000</code>
<code>pasv_max_port=60000</code>
<code>pam_service_name=vsftpd</code>
<code>guest_enable=YES</code>
<code>guest_username=apache</code>
<code>chroot_local_user=YES</code>
<code>allow_writeable_chroot=YES</code>
<code>user_sub_token=$USER</code>
<code>local_root=</code><code>/var/www/</code><code>$USER</code>
<code>hide_ids=YES</code>
<code>xferlog_enable=YES</code>
<code>xferlog_file=</code><code>/var/log/vsftpd</code><code>.log</code>
重要代碼解析:
<code>第9行聲明調用PAM_MySQL子產品</code>
<code>第11行決定上傳代碼的屬主是apache,也可以映射到其他本地使用者,請靈活運用</code>
<code>第12行限制使用者chroot,限制FTP使用者浏覽其他非權限目錄</code>
<code>第13和14行根據登入的賬号動态指定使用者根目錄</code>
<code>第15行向FTP使用者顯示屬主和屬組為FTP</code>
3.4.2 配置pam
确認pam_mysql.so的位置:
<code>find</code> <code>/ -name \*pam_mysql.so\*</code>
假設顯示如下:
<code>/lib/security/pam_mysql</code><code>.so</code>
加載認證子產品:
<code>cp</code> <code>/etc/pam</code><code>.d</code><code>/vsftpd</code> <code>/etc/pam</code><code>.d</code><code>/vsftpd</code><code>.defautl</code>
修改配置如下:
<code>#%PAM-1.0</code>
<code>session optional pam_keyinit.so force revoke</code>
<code>#資料庫認證</code>
<code>auth sufficient </code><code>/lib/security/pam_mysql</code><code>.so user=vsftpd </code><code>passwd</code><code>=abc123 host=localhost db=vsftpd table=</code><code>users</code> <code>usercolumn=name passwdcolumn=</code><code>passwd</code> <code>crypt=2</code>
<code>#vsftp預設的其餘認證</code>
<code>auth required pam_listfile.so item=user sense=deny </code><code>file</code><code>=</code><code>/etc/vsftpd/ftpusers</code> <code>onerr=succeed</code>
<code>auth required pam_shells.so</code>
<code>auth include password-auth</code>
<code>#授權和認證也是一樣的</code>
<code>account sufficient </code><code>/lib/security/pam_mysql</code><code>.so user=vsftpd </code><code>passwd</code><code>=abc123 host=localhost db=vsftpd table=</code><code>users</code> <code>usercolumn=name passwdcolumn=</code><code>passwd</code> <code>crypt=2</code>
<code>account include password-auth</code>
<code>session required pam_loginuid.so</code>
<code>session include password-auth</code>
注:請根據pam_mysql.so實際路徑寫,不同的安裝方法位置會有所不同。
3.4.3 建立使用者配置檔案目錄
<code>mkdir</code> <code>-p </code><code>/var/www/test1</code>
3.4.4 配置映射使用者目錄權限
查詢映射使用者的家目錄
<code>cat</code> <code>/etc/passwd</code> <code>| </code><code>grep</code> <code>apache</code>
顯示如下:
<code>apache:x:48:48:Apache:</code><code>/var/www</code><code>:</code><code>/sbin/nologin</code>
修改映射使用者的屬主
<code>chown</code> <code>apache:apache </code><code>/var/www/test1</code>
3.4.5 重新開機服務
<code>/etc/init</code><code>.d</code><code>/vsftpd</code> <code>restart</code>
<code>systemctl restart vsftpd</code>
3.5 測試并調試
3.5.1 監視日志
<code>tail</code> <code>-f </code><code>/var/log/secure</code>
<code>tail</code> <code>-f </code><code>/var/log/vsftpd</code><code>.log</code>
注:如果登陸成功secure中沒有任何日志,但vsftpd.log中會有登陸成功的提示,這時候無論是否能正常使用都表示PAM_MySQL子產品已經配置好,請檢查VSFTP的配置。
3.5.2 嘗試登陸
<code>ftp</code><code>:</code><code>//10</code><code>.168.0.51/</code>
注:如果登陸不成功請根據監視日志的提示資訊排錯。
4 使用者管理工具的使用
4.1 工具的下載下傳
http://down.51cto.com/data/2298015
注:該工具是筆者自己寫的,請按照自己的需求确定是否使用。
4.2 安裝配置
4.2.1 部署工具
<code>tar</code> <code>-xf vsftpcli.</code><code>tar</code>
<code>cp</code> <code>vsftpcli </code><code>/usr/bin/</code>
<code>chmod</code> <code>700 </code><code>/usr/bin/vsftpcli</code>
4.2.2 工具的常量定義
<code>vim </code><code>/usr/bin/vsftpcli</code>
修改以下常量:
<code>mysql_user=</code><code>'root'</code> <code>#資料庫連接配接的賬号</code>
<code>mysql_pass=</code><code>'abc123'</code> <code>#資料庫連接配接的密碼</code>
<code>mysql_host=</code><code>'localhost'</code> <code>#資料庫主機</code>
<code>mysql_host=</code><code>'3306'</code> <code>#資料庫的端口</code>
<code>basedir=</code><code>'/var/www'</code> <code>#網站的根目錄</code>
<code>localuser=</code><code>'apache'</code> <code>#網站的屬主</code>
<code>localgroup=</code><code>'apache'</code> <code>#網站的屬組</code>
4.3 工具的使用
4.3.1 擷取幫助
<code>vsftpcli</code>
<code>Usage: </code><code>/usr/bin/vsftpcli</code> <code><add> <ftpname> <ftppasswd></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><remove> <ftpname></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><rename> <oldusername> <newusername></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><chpasswd> <ftpname> <ftppasswd></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><print></code>
4.3.2 增加使用者
<code>vsftpcli add user1 123456</code>
<code>vsftpcli add user2 123456</code>
<code>vsftpcli add user3 123456</code>
4.3.3 列印使用者
<code>vsftpcli print</code>
4.3.4 删除使用者
<code>vsftpcli remove user2</code>
4.3.5 重命名使用者
<code>vsftpcli rename user3 user2</code>
4.3.6 更改使用者密碼
<code>vsftpcli chpasswd user2 456789</code>
<code></code>
本文轉自 tanzhenchao 51CTO部落格,原文連結:http://blog.51cto.com/cmdschool/1905678,如需轉載請自行聯系原作者