FTP
FTP:(File Transfer Protocol )早期的三個應用級協議之一。它最主要的功能是在服務器與客戶端之間進行文件的傳輸。
以vsftp搭建的ftp服務有三種認證模式,分別是匿名,系統用戶和虛擬用戶
匿名用戶:ftp,anonymous,對應Linux用戶ftp
系統用戶:Linux用戶,用戶/etc/passwd,密碼/etc/shadow
虛擬用戶:特定服務的專用用戶,獨立的用戶/密碼文件
虛擬用戶:所有虛擬用戶會統一映射為一個指定的系統帳號:訪問共享位置,即為此系統帳號的家目錄
各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定虛擬用戶
帳號的存儲方式:
文件:編輯文本文件,此文件需要被編碼為hash格式
奇數行為用戶名,偶數行為密碼
db_load -T -t hash -f vusers.txt vusers.db
關系型數據庫中的表中:
實時查詢數據庫完成用戶認證
mysql庫:pam要依賴于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
下面實現基于兩種驗證的vsftpd虛擬用戶。
一、實現基于文件驗證的vsftpd虛擬用戶
實驗環境:centos7.3(ip=192.168.18.131)
iptables -F 關閉防火墻,臨時生效下次重啟機器失效
setenforce 0 關閉SELinux,臨時生效下次重啟機器失效
1.安裝相應的軟件
[root@centos7 ~]# yum -y install vsftpd 這里直接yum安裝就好
2.創建數據庫文件
[root@centos7 ~]# vim /etc/vsftpd/vusers.txt
ftp1 注:奇數行為用戶名
123456 注:偶數行為密碼
ftp2
123456
[root@centos7 ~]#cd /etc/vsftpd/
根據vusers.txt文件來生成將來pam模塊能識別的二進制數據庫
[root@centos7 vsftpd]#db_load -T -t hash -f vusers.txt vusers.db 編碼為hash格式
[root@centos7 vsftpd]#chmod 600 vusers.db 修改權限只能root讀寫
3.創建用戶和訪問FTP目錄
[root@centos7 vsftpd]# useradd -d /var/ftproot -s /sbin/nologin vuser 創建用戶
[root@centos7 vsftpd]#mkdir /var/ftproot 創建用戶vuser的ftp登錄目錄
[root@centos7 vsftpd]#chmod -w /var/ftproot
這里去掉寫權限,是因為虛擬用戶使用的參數是匿名用戶的參數,
因此也是被禁錮在家目錄中的,這就需要家目錄沒有寫權限
[root@centos7 vsftpd]#mkdir /var/ftproot/upload 創建用戶能上傳的文件的目錄
[root@centos7 vsftpd]#setfal -m u:vuser:rwx /var/ftproot/upload 用戶vuser對這個文件有rwx權限
4.創建pam配置文件
[root@centos7 vsftpd]#vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
這里不用加后綴為.db,pam模塊自動識別
5.修改vsftpd.conf配置文件指定定pam配置文件
[root@centos7 vsftpd]#vim vsftpd.conf
guest_enable=YES 開啟用戶映射成guest用戶
guest_username=vuser 指定guest用戶為vuser
pam_service_name=vsftpd.db pam使用的文件 ,改動原來的文件pam_service_name=vsftpd或注釋掉
6.虛擬用戶建立獨立的配置文件
1.創建配置文件存放的路徑
[root@centos7 vsftpd]#mdkir vusers.d
[root@centos7 vsftpd]#vim vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/ 在vsftpd.conf配置文件添加虛擬用戶獨立配置文件目錄
[root@centos7 vsftpd]#cd vusers.d
2.創建ftp1用戶可讀寫,其他用戶只讀
[root@centos7 vusers.d]#vim ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
3.創建ftp2用戶可讀寫,其他用戶只讀并且登錄目錄改變
[root@centos7 vusers.d]#vim ftp2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/ftproot2 若果沒有則去創建并設置相應權限
7.測試
可在另一臺連接測試
[root@cnetos7 ~]#yum -y install ftp 安裝ftp的客戶端
[root@cnetos7 ~]#ftp 192.168.18.131 連接ftp服務端
........
二、實現基MySQL驗證的vsftpd虛擬用戶
實驗環境:centos6.9(ip=192.168.18.130)當mysql數據服務器 。centos7.3(ip=192.168.18.131)當ftp服務器
在各個主機上關閉防護墻和SELinux以免影響實驗結果
iptables -F 關閉防火墻6.7都可用 ,臨時生效下次重啟機器失效
setenforce 0 關閉SELinux 6,7都可用 ,臨時生效下次重啟機器失效
1.在各個主機上安裝相應的軟件包
centos 6.9安裝mysql服務
[root@centos6 ~]#yum -y install mysql-server
[root@centos6 ~]#service mysqld start
[root@centos6 ~]#service mysqld on 開機啟動
[root@centos6 ~]# mysql_secure_installation 開始設置mysql安全密碼
centos 7.3 安裝vsftpd、pam_mysql包
注意:在centos6中pam_mysql由epel6的源中提供可直接yum安裝即可(yum install vsftpdpam_mysql)
在centos7中無對應rpm包,需手動編譯安裝
[root@centos7 ~]#yum -y install vsftpd
[root@centos7 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@centos7 ~]#tar xvf pam_mysql-0.7RC1.tar.gz
[root@centos7 ~]#cd pam_mysql-0.7RC1
[root@centos7 pam_mysql-0.7RC1]# yum -y groupinstall Development tools
[root@centos7 pam_mysql-0.7RC1]#yum -y install mariadb-devel pam-devel 安裝依賴程序包
[root@centos7 pam_mysql-0.7RC1]#./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
[root@centos7 pam_mysql-0.7RC1]#make && make install
2.在數據庫服務器上創建虛擬用戶賬號
[root@centos6 ~]#mysql -uroot -p 進入mysql
mysql> create database ftpdb; 創建一個為ftpdbde 數據庫
mysql> show databases; 查看數據庫
mysql> grant all on ftpdb.* to 'ftpuser'@'192.168.18.%' identified by '123456';
創建一個為ftpuserde 用戶對ftpdb數據庫有最大權限
mysql> create table ftpusers(id int unsigned auto_increment primary key,name char(50),password char(48));
創建表
mysql> desc ftpusers; 查看
mysql> insert into ftpusers(name,password) values('ftp1',password('123456')),('ftp2',password('123456'));
建立用戶ftp1 與 ftp2用戶,為了安全應該使用PASSWORD函數加密其密碼后存儲
mysql> select * from ftpusers; 查看
[root@centos6 ~]#service mysqld restart 重啟服務
設置完成可對建立的賬號測試
在另一臺主機
mysql -uftpuser -h(centos6.9ip) -p123456
mysql> show databases;
3.在FTP服務器上配置vsftpd服務
在FTP服務器上建立pam認證所需文件
[root@centos7 ~]#cd /etc/pam.d/
[root@centos7 pam.d]#vim vsftpd.mysql 創建認證文件
[root@centos7 pam.d]#cat vsftpd.mysql 這里的文件與centos6數據庫里的表一一對應。
auth required pam_mysql.so user=ftpuser passwd=123456 host=192.168.18.130 db=ftpdb table=ftpusers usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=ftpuser passwd=123456 host=192.168.18.130 db=ftpdb table=ftpusers usercolumn=name passwdcolumn=password crypt=2
注意:參考README文檔,選擇正確的加密方式
crypt是加密方式
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函數加密
3表示md5加密
4表示sha1加密
?auth 表示認證
?account 驗證賬號密碼正常使用
?required 表示認證要通過
?pam_mysql.so模塊是默認的相對路徑,是相對/lib64/security/路徑而言,也可以寫絕對路徑;后面為給此模塊傳遞的參數
?user=ftpuser為登錄mysql的用戶
?passwd=123456 登錄mysql的的密碼
?host=192.168.18.130 mysql服務器的主機名或ip地址
?db=ftpd 指定連接msyql的數據庫名稱
?table=ftpusers 指定連接數據庫中的表名
?usercolumn=name 當做用戶名的字段
?passwdcolumn=password 當做用戶名字段的密碼
?crypt=2 密碼的加密方式為mysql password()函數加密
建立相應用戶和修改vsftpd配置文件,使其適應mysql認證
[root@centos7 ~]#useradd -s /sbin/nologin -d /var/ftproot ftpuser -m
[root@centos7 ~]#chmod 555 /var/ftproot centos7 需除去ftp根目錄的寫權限
[root@centos7 ~]#mkdir /var/ftproot/{upload,pub}
[root@centos7 ~]#setfacl –m u:ftpuser:rwx /var/ftproot/upload
建立虛擬用戶映射的系統用戶及對應的目錄
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
添加下面兩項
guest_enable=YES
guest_username=ftpuser
修改下面一項,原系統用戶無法登錄
pam_service_name=vsftpd改成
pam_service_name=vsftpd.mysql
[root@centos7 ~]#systemctl restart vsftpd
[root@centos7 ~]#systemctl enable vsftpd
[root@centos7 ~]#netstat -tnlp 查看端口開啟情況
如果啟用了SELinux不想關掉則可對SELinux進行相關設置
[root@centos7 ~]#restorecon -R /lib64/security
[root@centos7 ~]#setsebool -P ftpd_connect_db 1
[root@centos7 ~]#setsebool -P ftp_home_dir 1
[root@centos7 ~]#chcon -R -t public_content_rw_t /var/ftproot/
測試:利用FTP客戶端工具,以虛擬用戶登錄驗證結果
[root@centos7 ~]#tail /var/log/secure
4.在FTP服務器上配置虛擬用戶具有不同的訪問權限
vsftpd可以在配置文件目錄中為每個用戶提供單獨的配置文件以定義其ftp服務訪問權限,每個虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄可以是任意未使用目錄,只需要在vsftpd.conf指定其路徑及名稱即可
1.配置vsftpd為虛擬用戶使用配置文件目錄
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
添加如下選項
user_config_dir=/etc/vsftpd/conf.d 用戶規則目錄路徑
2.創建所需要目錄,并為虛擬用戶提供配置文件
[root@centos7 ~]#mkdir /etc/vsftpd/vsftpd.conf
[root@centos7 ~]#cd /etc/vsftpd/vsftpd.conf
[root@centos7 vsftpd.conf]#touch ftp1 ftp2
3.配置虛擬用戶的訪問權限
虛擬用戶對vsftpd服務的訪問權限是通過匿名用戶的相關指令進行的。
如果需要讓用戶ftp1具有上傳文件的權限,可以修改/etc/vsftpd/vsftpd.conf/ftp1文件,在里面添加如下選項并設置為YES即可,只讀則設為NO
注意:需確保對應的映射用戶對于文件系統有寫權限
創建ftp1用戶可讀寫,其他用戶只讀
[root@centos7 vsftpd.conf]# vim ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 vsftpd.conf]#vim ftp2
local_root=/var/ftproot2 切換ftp2的目錄所在
5.測試
可在另一臺連接測試
[root@cnetos7 ~]#yum -y install ftp 安裝ftp的客戶端
[root@cnetos7 ~]#ftp 192.168.18.131 連接ftp服務端
Connected to 192.168.18.131 (192.168.18.131).
220 (vsFTPd 3.0.2)
Name (192.168.18.131:root): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
........
總結:在window中亦可使用FileZilla連接測試,如果測試不成功,檢查下防火墻和SELinux的配置,在配置中也注意改動項的字母的書寫,保持相應的一致性。
基于虛擬用戶的用戶存放地點有兩種,二進制文件驗證和MySQL,因為我們的用戶一般不多,使用mysql驗證還要通過TCP三次握手四次分手,比較慢,因此常用二進制文件來進行存放驗證比較好。
如果不足!請多多指教!