FTP服務搭建配置筆記

一、什麼是文件共享服務?

簡單來講就是文件域存儲塊設備能夠共享給他人使用。html

1.1 實現文件共享服務的三種方式

  1. FTP:屬於應用層服務,能夠跨平臺使用
  2. NFS:屬於內核模式,不能夠跨平臺使用
  3. Samba:能夠跨平臺使用

1.2 實現存儲設備域服務器鏈接的三種方式

  1. DAS:鏈接磁盤
  2. NAS:經過nfs/cifs協議實現網絡文件共享(文件存儲方式),電子郵件、網頁服務器、多媒體流服務、檔案分享等就適用於NAS存儲架構
  3. SAS:經過網線或者光纖實現ISCSI和FCSAN將物理存儲設備鏈接起來使用(塊存儲方式比較底層,須要格式化並掛載當本地磁盤使用),數據庫有關的應用適用於SAS存儲架構

二、FTP簡介

FTP是File Transfer Protocol文件傳輸協議的縮寫,基於網絡來傳輸文件的應用層協議。mysql

FTP可以經過網絡來傳輸文件,主要是由於工做再應用層因此不會受到平臺的限制。linux

2.1 FTP的工做方式

客戶端經過TCP三次握手與服務端創建鏈接,鏈接創建成功以後才能夠進行文件傳輸。sql

  1. FTP的數據傳輸分爲命令數據與文件數據,命令傳輸的就是客戶端要執行的命令,服務端收到後返回給客戶端執行結果,如ls命令就返回給當前目錄下的全部文件個目錄。文件傳輸就是客戶端要傳輸的數據,服務端與客戶端鏈接來傳輸文件數據。
  2. FTP的服務端與客戶端創建鏈接大致有三個步驟,創建鏈接、傳輸數據、斷開鏈接。
  3. FTP是基於TCP協議來傳輸數據的,使用21端口來創建認證通道,20端口來創建數據通道。
  4. FTP是明文傳輸的。
  5. FTP的用戶能夠分爲實體用戶(real user),匿名用戶(anonymous user),訪客用戶(guest user)。

2.2 FTP的工做模式

因爲如今的網絡架構中都會有防火牆來阻止端口與高位端口被主動鏈接,特別20端口是被禁止主動鏈接的,由於20端口是FTP的數據端口,因此爲了解決客戶端或者服務端的防火牆問題,FTP就有了主動和被動兩種工做模式,經過防火牆內的一端來主動鏈接防火牆外端的一方,這樣子就不會被防火牆阻攔。shell

2.2.1 主動模式

通常用於服務端存在防火牆的狀況,客戶端沒法主動鏈接到服務端的20數據端口,須要由服務端主動鏈接到客戶端的兩個端口。數據庫

  1. 兩端在創建TCP通訊通道後,客戶端會發送port請求與服務端的21端口認證鏈接並開放用來創建數據鏈接的高位端口。
  2. 服務端在收到請求後,會經過20端口發送ACK響應請求。
  3. 服務端經過20端口與客戶端發送的高位端口創建數據鏈接通道。
2.2.2 被動模式

通常用於客戶端存在防火牆的狀況,服務端在收到鏈接請求後由於客戶端存在防火牆而沒法達到客戶端高位端口,須要客戶端主動鏈接至服務端的數據傳輸端口。vim

  1. 兩端在創建TCP通訊通道鏈接後,客戶端會發送PASV請求給服務端。
  2. 服務端在收到PASV請求後就會打開一個高位端口做爲數據傳輸端口來響應給客戶端等待客戶端鏈接。
  3. 客戶端在收到響應後,就會去鏈接服務端響應的端口創建數據傳輸通道。

2.3 FTP的用戶類型

  1. 匿名用戶centos

    anonymous或ftp安全

  2. 本地用戶服務器

    帳號名稱、密碼等信息保存在passwd、shadow文件中

  3. 虛擬用戶

    使用獨立的帳號/密碼數據文件

    user_list ftp_user1 123456 /var/pub

三、VSFTPD的安裝及使用

官方網站:http://vsftpd.beasts.org

3.1 關閉防火牆和SELINUX

# 1.關閉防火牆
systemctl stop firewalld.service
systemctl disabled firewalled.service
# 2.關閉SELINUX
## 2.1 永久關閉,須要重啓服務器
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
reboot
## 2.2 臨時關閉
setenforce 0

3.2 安裝vsftpd

yum install -y vsftpd

3.3 查看安裝生成的文件

[root@ftp ~]# rpm -qa|grep vsftpd
vsftpd-3.0.2-25.el7.x86_64
[root@ftp ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd                   # pam認證文件
/etc/vsftpd
/etc/vsftpd/ftpusers            # 限制登陸文件
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf     # 主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator
/usr/lib/systemd/system/vsftpd.service
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/vsftpd@.service
/usr/sbin/vsftpd                    # 程序文件
/usr/share/doc/vsftpd-3.0.2
/usr/share/doc/vsftpd-3.0.2/AUDIT
/usr/share/doc/vsftpd-3.0.2/BENCHMARKS
/usr/share/doc/vsftpd-3.0.2/BUGS
/usr/share/doc/vsftpd-3.0.2/COPYING
/usr/share/doc/vsftpd-3.0.2/Changelog
/usr/share/doc/vsftpd-3.0.2/EXAMPLE
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.xinetd
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/hosts.allow
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/logins.txt
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2/README
/usr/share/doc/vsftpd-3.0.2/FAQ
/usr/share/doc/vsftpd-3.0.2/INSTALL
/usr/share/doc/vsftpd-3.0.2/LICENSE
/usr/share/doc/vsftpd-3.0.2/README
/usr/share/doc/vsftpd-3.0.2/README.security
/usr/share/doc/vsftpd-3.0.2/REWARD
/usr/share/doc/vsftpd-3.0.2/SECURITY
/usr/share/doc/vsftpd-3.0.2/SECURITY/DESIGN
/usr/share/doc/vsftpd-3.0.2/SECURITY/IMPLEMENTATION
/usr/share/doc/vsftpd-3.0.2/SECURITY/OVERVIEW
/usr/share/doc/vsftpd-3.0.2/SECURITY/TRUST
/usr/share/doc/vsftpd-3.0.2/SIZE
/usr/share/doc/vsftpd-3.0.2/SPEED
/usr/share/doc/vsftpd-3.0.2/TODO
/usr/share/doc/vsftpd-3.0.2/TUNING
/usr/share/doc/vsftpd-3.0.2/vsftpd.xinetd
/usr/share/man/man5/vsftpd.conf.5.gz
/usr/share/man/man8/vsftpd.8.gz
/var/ftp                                    # FTP家目錄
/var/ftp/pub
[root@ftp ~]#

3.4 基於匿名用戶的訪問控制

要配置基於匿名用戶的訪問控制,須要修改vsftpd的主配置文件/etc/vsftpd/vsftpd.conf,主要有下面幾個參數:

  • anonymous_enable=YES:啓用匿名用戶
  • anon_upload_enable=YES:容許匿名用戶上傳文件
  • anon_mkdir_write_enable=YES:是否容許匿名用戶建立目錄,要考慮文件系統上的家目錄,必需要有寫權限
  • anon_other_write_enable=YES:容許匿名用戶更多於上傳或者創建目錄以外的權限,譬如刪除或者重命名
  • anon_umask=077:指定上傳文件的默認全部者和權限
3.4.1 運行匿名用戶登陸

不修改配置文件直接啓動後,直接經過FTP軟件鏈接便可,用戶名默認是ftp,沒有密碼。

systemctl start vsftpd.service

可是此時匿名用戶是不能上傳文件和建立目錄的:

3.4.2 運行匿名用戶上傳文件、建立目錄

開啓容許匿名用戶上傳文件和建立文件夾的權限:

cd /etc/vsftpd/
vim vsftpd.conf
# 開啓下面三個權限
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 進入ftp家目錄,建立一個文件夾並受權
[root@ftp ~]# cd /var/ftp/
[root@ftp ftp]# mkdir -p ./testdir
[root@ftp ftp]# setfacl -m u:ftp:rwx ./testdir/
[root@ftp ftp]# getfacl ./testdir/
# file: testdir/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x
[root@ftp ftp]#

從新登陸ftp,在testdir目錄中能夠建立目錄和上傳文件,可是卻沒有刪除文件和重命名文件的權限。

3.4.3 開啓匿名用戶刪除和重命名權限
vim /etc/vsftpd/vsftpd.conf
# 增長下面的內容,重啓vsftpd服務
anon_other_write_enable=YES
systemctl restart vsftpd.service

測試刪除文件和重命名:

3.5 基於本地用戶的訪問控制

默認狀況下,操做系統的帳戶是能夠直接使用用戶名和密碼登錄的。而且登錄以後,默認進入本身的家目錄。

基於本地用戶的訪問控制也經過修改vsftpd的配置文件來實現,主要有一下幾個參數:

  1. local_enable=YES:是否容許Linux用戶登陸,默認是容許的,固然也能夠禁止
  2. write_enable=YES:是否容許系統用戶上傳文件
  3. local_root=/ftproot:非匿名用戶登陸所在目錄,當使用Linux用戶登陸成功以後,就不會默認在本身的家目錄了。相反,會位於指定的目錄之下
  4. local_umask=022:指定系統用戶上傳文件的默認權限
3.5.1 容許系統用戶登陸並上傳文件
vim /etc/vsftpd/vsftpd.conf
# 默認如下三個參數都是開啓的
local_enable=YES
write_enable=YES
local_umask=022

# 添加一個系統用戶並設置密碼
useradd centos
echo "123456"|passwd --stdin centos

系統用戶默認具備上傳文件、建立目錄、刪除和重命名的權限。

系統用戶默認也能夠進入其餘目錄,因此並不安全,因此若是要啓用系統用戶登錄FTP那麼就要修改配置文件,禁止系統用戶訪問除了家目錄之外的其餘目錄。

3.5.2 配置本地用戶只能訪問本身的家目錄

修改vsftpd.conf配置文件

vim /etc/vsftpd/vsftpd.conf
# 開啓下面的參數
chroot_local_user=YES
# 這個參數是全局的,開啓後全部的本地用戶都不能訪問除了家目錄之外的目錄

可是開啓這個參數以後,因爲vsftpd更新到2.3.5以後,vsftpd加強了安全檢查,若是用戶被限定在了其主目錄下,則該用戶的主目錄不能再具備寫權限了!若是檢查發現還有寫權限,就會報該錯誤。

要解決這個錯誤有兩種方式:

# 1.方式一:將對應家目錄的寫權限去除
chmod a-w /home/centos
# 2.方式二:在配置文件在加入下面的參數
allow_writeable_chroot=YES
3.5.3 配置指定的本地用戶只能訪問家目錄

配置指定用戶只能訪問家目錄,其餘用戶能夠訪問其餘目錄,須要在配置文件中關閉全局設置的參數allow_writeable_chroot=YES,開啓下面兩個參數:

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

而後須要建立指定的文件chroot_list並在文件中指定對應的用戶:

vim /etc/vsftpd/chroot_list
# 限制只能在家目錄
centos

# 重啓vsftpd服務
systemctl restart vsftpd.service
# 新建一個用戶並設置密碼
useradd redhat
echo "123456"|passwd --stdin redhat

用centos用戶訪問,只能在本身的家目錄中:

用redhat用戶訪問,能夠訪問除了家目錄之外的其餘目錄:

3.6 設置chroot

在默認配置中,本地用戶能夠切換到本身家目錄之外的其餘目錄進行瀏覽,並在權限許可的範圍內進行下載和上傳。這樣的設置對於一個FTP服務器來講是不安全的。

若是但願本地用戶登陸以後不能訪問除了家目錄之外的目錄,則須要設置chroot選項,具體設置下面三個選項:

chroot_local_user
chroot_list_enable
chroot_list_file
3.6.1 設置全部用戶只需chroot

只須要將chroot_local_user選項設置爲YES,全部的本地用戶都只能訪問本身的家目錄。

chroot_local_user=YES
2.6.2 設置部分指定用戶執行chroot

須要註釋全局的設置或者設爲NO,而後開啓另外兩個選項:

chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vaftpd/chroot_list

這樣,文件/etc/vaftpd/chroot_list中的用戶就只能訪問本身的家目錄,其餘本地用戶能夠訪問除了家目錄的其餘目錄。

配置基於本地用戶的訪問限制,須要修改配置文件,主要有如下兩種方式:

  1. 限制指定的本地用戶不能訪問,而其餘本地用戶能夠訪問

    userlist_enable=YES
    userlist_deny=YES
    userlist_file=/etc/vsftpd/user_list

    使文件/etc/vsftpd/user_list中指定的本地用戶不能訪問FTP服務器,而其餘的本地用戶能夠訪問FTP服務器。

    userlist_enable=YES
    userlist_deny=NO
    userlist_file=/etc/vsftpd/user_list

3.7 提示信息

3.7.1 登錄提示信息

登錄提示信息圖形界面(FTP軟件)是看不到的,只適用於ftp做爲客戶端的時候。可使用下面的方式進行配置。可是優先級卻不同。

# 若是限制用戶只能訪問家目錄,下面這個配置優先生效
ftpd_banner="Welcome to Mage Ftp Server!"
# 下面這個優先級較上一個配置低
banner_file=/etc/vsftpd/ftpbanner.txt

# 其餘狀況當兩個配置都在的時候,默認banner_file的優先生效

3.7.2 訪問目錄提示信息

當用戶進入某一目錄後,能夠給用戶一個提示消息。用來提示這個目錄的做用。在相應的目錄下新建一個隱藏文件.message,該文件中進行提示信息描述。須要添加以下配置:

dirmessage_enable=YES
message_file=.message

# 在/var/ftp/pub下新建.message
vim /var/ftp/pub/.message
This is the public floder.

3.8 進一步配置VSFTPD

3.8.1 最大傳輸速率限制
local_max_rate=50000
anon_max_rate=30000

上面的設置是將本地用戶的最大傳輸速率限制爲50kbytes/s,匿名用戶最大傳輸速率限制爲30kbytes/s。

3.8.2 設置客戶端鏈接時的端口範圍
pasv_min_port=50000
pasv_max_port=60000

上面的設置將客戶端鏈接時的端口範圍限制在50000-60000之間,提升系統安全性。

3.8.3 基本性能和安全選項配置
# 1.設置空閒用戶會話中斷時間(單位:秒)
idle_session_timeout=6000

# 2.設置空閒的數據鏈接的終端時間(單位:秒)
date_connection_timeout=120

# 3.設置客戶端空閒時的自動中斷和激活鏈接時間(單位:秒)
accept_timeout=60
connect_timeout=60
# 上面的配置將是客戶端1分鐘後自動中斷,在中斷一分鐘後自動激活鏈接

四、VSFTPD虛擬用戶

4.1 虛擬用戶

  • 全部虛擬用戶會統一映射爲一個指定的系統帳號:訪問共享設置,即爲此係統帳號的家目錄。
  • 各虛擬帳戶能夠被賦予不一樣的訪問權限,經過匿名用戶的權限控制參數進行指定。

4.2 虛擬帳號的存儲方式

4.2.1 文本

編輯文本文件,該文件須要被編碼爲hash格式。奇數行爲用戶名、偶數行爲密碼。

db_load -T -t hash -f vusers.txt vusers.db
  • 基於文件驗證的vsftpd虛擬用戶

    # 1.建立用戶數據庫文件
    vim /etc/vsftpd/vusers.txt
    zhangsan
    123456
    lisi
    123456
    
    # 2. 生成數據庫文件
    cd /etc/vsftpd/
    db_load -T -t hash -f vusers.txt vusers.db
    
    # 3.修改數據庫文件權限
    chmod 600 ./vusers.db
    
    # 4.建立系統用戶和訪問FTP目錄
    # 建立系統用戶並指定家目錄
    useradd -d /var/ftproot -s /sbin/nologin vuser
    # 修改家目錄權限
    chmod +rwx /var/ftproot
    
    # 5.建立pam配置文件
    # 修改pam配置文件,讓vsftpd支持pam模塊進行身份驗證
    vim /etc/pam.d/vsftpd.db
    auth required pam_userdb.so db=/etc/vsftpd/vusers
    account required pam_userdb.so db=/etc/vsftpd/vusers
    
    # 6.修改vsftpd主配置文件指定pam配置文件
    vim /etc/vsftpd/vsftpd.conf
    guest_enable=YES
    guest_username=vuser
    pam_service_name=vsftpd.db
    
    # 7.修改虛擬用戶權限配置
    vim /etc/vsftpd/vsftpd.conf
    user_config_dir=/etc/vsftpd/vusers.d/
    # 建立配置目錄並給用戶設置權限(權限配置文件與用戶名同樣)
    mkdir -p /etc/vsftpd/vusers.d/
    cd /etc/vsftpd/vusers.d/
    # 給zhangsan設置權限
    vim zhangsan
    # 虛擬用戶上傳權限
    anon_upload_enable=YES
    # 虛擬用戶建立文件夾
    anon_mkdir_write_enable=NO
    # 虛擬的其餘用戶對指定用戶目錄的寫權限
    anon_other_write_enable=NO
    # 修改登陸目錄至其餘目錄
    # local_root=/ftproot

    重啓vsftpd服務,用zhangsan用戶登陸,只能上傳文件,不能建立文件夾和刪除文件:

    # 給lisi配置權限
    cd /etc/vsftpd/vusers.d/
    vim lisi
    # 虛擬用戶上傳權限
    anon_upload_enable=YES
    # 虛擬用戶建立文件夾
    anon_mkdir_write_enable=YES
    # 虛擬的其餘用戶對指定用戶目錄的寫權限
    anon_other_write_enable=YES
    # 修改登陸目錄至其餘目錄
    #local_root=/ftproot

    重啓vsftpd服務,用lisi帳號登錄,能夠上傳、新建、刪除:

4.2.2 關係型數據庫

實時查詢數據庫完成用戶認證。

  • MySQL

    https://www.cnblogs.com/zhenhui/p/5916116.html

    pam須要依賴於pam_mysql

    • /lib/security/pam_mysql.so
    • /usr/share/doc/pam_mysql-0.7/README
  1. 安裝MySQL及pam_mysql插件
yum install -y mariadb-server pam-devel mariadb-devel vsftpd ftp
# 下載pam_mysql源碼包
wget http://www.huzs.net/soft/vsftpd/pam_mysql-0.7RC1.tar.gz
# 編譯安裝pam_mysql
tar xf pam_mysql-0.7RC1.tar.gz && cd pam_mysql-0.7RC1
./configure --with-openssl --with-pam-mods-dir=/lib/security/
make && make install
  1. 建立vsftpd數據庫和用戶表
# 啓動數據庫
systemctl enable mariadb.service
systemctl start mariadb.service
# 初始化數據庫
/usr/bin/mysql_secure_installation
CREATE DATABASE vsftpd;
use vsftpd;
CREATE TABLE users (
    id int AUTO_INCREMENT NOT NULL,
  name char(20) binary NOT NULL,
  password char(48) binary NOT NULL,
  primary key(id)
);

  1. 建立虛擬用戶
INSERT INTO users(name,password) values('jack',PASSWORD('123456')),('tom',PASSWORD('123456'));

  1. 受權
GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'vsftpdpass';
GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'vsftpdpass';
FLUSH PRIVILEGES;
  1. 配置pam認證
# 1.創建pam認證所需文件
vim /etc/pam.d/vsftpd.mysql
# 2.添加下面兩行
auth required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpdpass host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpdpass host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
  1. 建立虛擬用戶的映射用戶
useradd -s /sbin/nologin -d /var/ftproot vuser
setfacl -m u:vuser:rwx /var/ftproot
  1. 修改vsftpd的配置文件,使其適應mysql認證
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=vuser
  1. 配置虛擬用戶具備不一樣的訪問權限
# 1.配置虛擬用戶有單獨的權限設定
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_conf

# 2.建立所需目錄,併爲虛擬用戶提供配置文件
mkdir /etc/vsftpd/vusers_conf
cd /etc/vsftpd/vusers_conf
# 配置虛擬用戶具備不一樣的訪問權限
vim jack
# 寫入如下內容
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

vim tom
# 寫入如下內容
anon_upload_enable=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
  1. 重啓vsftpd服務並測試
systemctl restart vsftpd.service

登錄jack帳戶,有上傳、新建、刪除、重命名的權限:

登錄tom帳戶,只有上傳的權限:

相關文章
相關標籤/搜索