天天看點

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子產品的加載

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>&amp;&amp; </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>&lt;add&gt; &lt;ftpname&gt; &lt;ftppasswd&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;remove&gt; &lt;ftpname&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;rename&gt; &lt;oldusername&gt; &lt;newusername&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;chpasswd&gt; &lt;ftpname&gt; &lt;ftppasswd&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;print&gt;</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,如需轉載請自行聯系原作者