vsftpd+MariaDB+pam搭建認證FTP服務器

   vsftpd服務是Linux上應用較常見的FTP服務軟件,通過FTP服務共享文件,下載速度快,而且方便,但是,FTP服務是最古老的,卻又是最複雜的服務,它是一個應用層協議,閒話不扯,進入講解。

vsftpd服務器上有着不用等級的用戶:分別有系統用戶、匿名用戶、虛擬用戶
   系統用戶:FTP服務上的系統用戶,操作權限較多,操作較爲危險
   匿名用戶:不需要驗證即可登錄FTP服務器的用戶,用戶名一般爲ftpP或anonymous,密碼爲空
   虛擬用戶:虛擬用戶會被統一映射爲一個特定的系統用戶,訪問此係統用戶共享的資源

 虛擬用戶:
       所有的虛擬用戶都會被統一映射到系統上的一個指定的用戶,當虛擬用戶訪問時,其訪問的共享位置是映射關係的系統用戶的家目錄,而且,對於不同的虛擬用戶,可以被賦予不同的訪問權限,是通過匿名用戶的權限控制參數進行指定的   


響應碼:這些信息在下面的實例中,我們能看到的

1xx: 信息
2xx: 成功類的狀態碼
3xx: 提示需進一步提供補充類信息的狀態碼
4xx: 客戶端錯誤
5xx: 服務端錯誤

    每個服務,最重要的就是它的配置文件,實現某種功能,就得在配置文件中配置,下面就詳細介紹一下我們的vsftpd服務的配置文件。
    使用rpm -ql vsftpd,我們可以查看vsftpd生成的文件
    vsftpd的配置文件在/etc/vsftpd/vsftpd.conf

具體選項如下所示:
 

以下是匿名用戶的相關選項:

  anonymous_enable=YES       #允許匿名用戶登錄
  anon_upload_enable=YES     #允許匿名用戶上傳
  anon_other_write_eable=YES       #允許匿名用戶有更多權限,如創建目錄,刪除目錄

以下是系統用戶的相關選項:

  ocal_enable=YES                #允許系統用戶登錄
  write_enable=YES               #本地用戶是否有寫的權限
  local_umask=022                 #用戶上傳文件後,權限被改爲644 
  chroot_local_user=YES        #這裏是禁錮所有的系統用戶登錄ftp時,將其家目錄作爲根目錄

禁錮指定的系統用戶於其家目錄,並作爲根目錄

  chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd/chroot_list

vsftpd的日誌

 xferlog_enable=YES     #啓用日誌功能
  xferlog_std_format=YES      #日誌的格式
  xferlog_file=/var/log/xferlog      #這項最關鍵,如果開啓前兩項,這項沒有指定,也不會開啓日誌功能

改變上傳文件的屬主

  chown_uploads=YES     #開啓此項功能
  chown_username=$USERNAME  #指定改變爲哪個用戶

 
當vsftpd要完成認證時,就要使用pam,要指定這個配置文件

 pam_service_name=vsftpd

在vsftpd服務器上,我們也可以開啓控制用戶登錄的功能

  userlist_enable=YES
  userlist_deny=YES|NO
  userlist_deny=YES        #這是啓用黑名單
  userlist_deny=YES        #這是啓用白名單

 默認文件爲/etc/vsftpd/user_list
 
額外的配置選項

  max_clients           #最大併發連接數
  max_per_ip           #每個IP可同時發起的併發請求數

傳輸速率:

  anon_max_rate              #匿名用戶的最大傳輸速率,單位是:字節/秒
  local_max_rate              #本地用戶的最大傳輸速率,單位如上

   ftp服務器的用戶數據一般情況可以放在文件系統中或是關係型數據庫中,下面,我將基於vsftpd和MariaDB數據庫還有pam認證,實現vsftpd服務基於關係型數據庫的認證。
   
 拓撲如下:
    
    首先,pam要和MariaDB交互,需要一個第三方的軟件,pam_mysql,一般情況,使用yum安裝,注意的是,這個軟件位於epel源中。
[root@localhost ~]# yum install -y pam_mysql
   
我們可以看看pam_mysql這個軟件生成了哪些文件:

[root@localhost ~]# rpm -ql pam_mysql/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7
/usr/share/doc/pam_mysql-0.7/COPYING
/usr/share/doc/pam_mysql-0.7/CREDITS
/usr/share/doc/pam_mysql-0.7/ChangeLog
/usr/share/doc/pam_mysql-0.7/NEWS
/usr/share/doc/pam_mysql-0.7/README

第一個列出的是pam_mysql的模塊,就是通過它實現MariaDB和pam交互的
另外一個重要的就是README文件,在不會安裝的情況下,可以查看之
   
由於我們的MariaDB數據庫服務器在另外一臺主機上,我們要在這臺主機上新建可以認證的用戶:

MariaDB [(none)]> CREATE DATABASE ftpdb;
Query OK, 1 row affected (0.05 sec)
 
MariaDB [(none)]> USE ftpdb;
Database changed
MariaDB [FTPdb]> GRANT SELECT ON ftpdb.* TO ftp@'172.16.30.10' IDENTIFIED BY '123';
Query OK, 0 rows affected (0.01 sec)
 
MariaDB [FTPdb]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

    以上,我們新建了一個庫,並把庫的權限賦予給了ftp這個用戶,且密碼爲123,上面的ip地址一定要嚴格指定,不然的話,用戶信息泄露,對企業是種損失。

  然後,我們可以在vsftpd服務器上測試,是否能夠連上剛剛這臺數據庫服務器

[root@localhost ~]# mysql -u ftp1 -h IP -p

然後回到mariadb數據庫服務器,創建認證用戶的表

MariaDB [FTPdb]> CREATE TABLE users (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name VARCHAR(50) BINARY NOT NULL,
    -> password CHAR(48) BINARY NOT NULL );
Query OK, 0 rows affected (0.02 sec)

BINARY:比較時,區分大小寫

添加虛擬用戶信息,password是mariadb的內建函數,會編碼加密

MariaDB[FTPdb]>INSERT INTO users (name,password) VALUES ('tom',password('tom')),('bob',password('bob'));
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings:

查看錶中的信息

MariaDB [ftpdb]> SELECT * FROM users;
+—--+——---+—————-———————-----------------+
| id | name  | password                                  |
+—--+—--—-+————————————----------------—-+
|  1 | tom   | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
|  2 | jerry | *531E182E2F72080AB0740FE2F2D689DBE0146E04 |
+—--+——---+———————————-----------------—-+
2 rows in set (0.03 sec)

然後,回到vsftpd服務器,配置一下FTP服務器
1、建立pam認證需要的文件

[root@localhost ~]#vim /etc/pam.d/vsftpd.mysql

添加下面的兩行

auth required /lib64/security/pam_mysql.so user=ftp passwd=123 
host=I172.16.30.10 db=ftpdb  table=users usercolumn=name 
passwordcolumn=password crypt=2 #在上面的README文件中提到過
account required /lib64/security/pam_mysql.so user=ftp  passwd=123 host=172.16.30.10 
db=ftpdb  table=users usercolumn=name passwordcolumn=password crypt=2

上面添加的兩行,加以注意,由於一個字母錯誤,整整糾結近乎一個下午

crypt解析
如果值爲0,表示明文傳輸,不加密
如果爲1,表示使用加密
如果爲2,表示用mysql的內建函數加密
我們可以通過查看pam_mysql生成的README文件

    需要注意的是pam的password()函數和MariaDB的password()函數不一樣,可能導致實驗報錯,在往MariaDB插入數據時,也可以採用明文的形式,上面的crypt的值改爲0

修改vsftpd的配置文件,讓其是基於mysql的認證
建立一個虛擬用戶,映射到系統用戶

useradd –s /sbin/nologin  -d  /ftptest  sysftp
chmod go+rx  /ftptest

加上讀和執行,不要寫權限,保證用戶能進入目錄

配置vsftpd的主配置文件,確保,已有如下選項

anonymous_enable=YES              #必須啓用
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES

然後,加入以下選項,支持來賓用戶

guest_enable=YES
guest_username=sysftp   #上面添加的用戶,這就是要映射的系統用戶

並且,要保證支持pam認證,指定上面新建的vsftpd.mysql的文件

pam_service_name=vsftpd.mysql

我們可以在共享的目錄下創建一個文件,例如test.txt

之後,我們就可以重啓vsftpd服務了,在普通客戶端上驗證,結果如下:

用戶訪問ftp服務器時,都被映射成爲sysftp用戶,共享的文件在/ftptest目錄中。
到此爲止,基於MariaDB的認證就就結束了,但是上面的用戶的權限是一樣的,但是,如何區分每個用戶的權限呢?
   
配置vsftp\服務的配置文件,爲虛擬用戶使用配置文件目錄

[root@localhost ~]#vim vsftpd.conf    #添加如下選項
user_config_dir=/etc/vsftpd/vusers_config   #爲目錄

創建目錄,並且提供配置文件

#mkdir  /etc/vsftpd/vusers_config      #名稱自己定義
[root@localhost ~]#vim tom 給tom定義權限
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_wirte_enable=YES            #具有刪除、創建文件的權限
[root@localhost ~]#vim bob 給bob定義權限
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_wirte_enable=NO

然後,我通過普通客戶端檢測:
tom檢查結果如下:

[root@localhost mysql]# ftp 172.16.30.20
Connected to 172.16.30.20 (172.16.30.20).
220 (vsFTPd 2.2.2)
Name (172.16.30.20:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /etc
Local directory now /etc
ftp> put fstab
local: fstab remote: fstab
227 Entering Passive Mode (172,16,30,20,98,119).
150 Ok to send data.
226 Transfer complete.
962 bytes sent in 0.000212 secs (4537.74 Kbytes/sec)
ftp> mkdir tom
257 "/tom" created
ftp> ls
227 Entering Passive Mode (172,16,30,20,182,207).
150 Here comes the directory listing.
-rw——-    1 502      502           962 Jul 31 21:45 fstab
-rw-r–r–    1 0        0               0 Jul 31 21:39 test.txt
drwx——    2 502      502          4096 Jul 31 21:45 tom
226 Directory send OK.
ftp> delete test.txt
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (172,16,30,20,143,203).
150 Here comes the directory listing.
-rw——-    1 502      502           962 Jul 31 21:45 fstab
drwx——    2 502      502          4096 Jul 31 21:45 tom
226 Directory send OK.
ftp> bye
221 Goodbye.

檢查bob

[root@localhost mysql]# ftp 172.16.30.20
Connected to 172.16.30.20 (172.16.30.20).
220 (vsFTPd 2.2.2)
Name (172.16.30.20:root): bob
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /etc
Local directory now /etc
ftp> put passwd
local: passwd remote: passwd
227 Entering Passive Mode (172,16,30,20,186,223).
550 Permission denied.
ftp> ls
227 Entering Passive Mode (172,16,30,20,144,26).
150 Here comes the directory listing.
-rw——-    1 502      502           962 Jul 31 21:45 fstab
drwx——    2 502      502          4096 Jul 31 21:45 tom
226 Directory send OK.
ftp> mkdir bob
550 Permission denied.
ftp> delete fstab
550 Permission denied.
ftp> bye
221 Goodbye.

  此時,我們的ftp服務就能基於MySQL數據庫的認證訪問登錄了,在不想讓某些用戶具有某些權限時,我們就能對部分用戶進行授權了。


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