Ubuntu14 vsftp 的安裝和虛擬用戶配置

1、介紹

FTP 是 File Transfer Protocol (文件傳輸協議)的縮寫 ,在 Unix/Linux 系統中經常使用的免費 FTP 服務器軟件主要是 VSFTP,vsftp的官方地址:http://vsftpd.beasts.orghtml

1. FTP 的工做模式

FTP工做時會開兩個端口,一個命令端口(TCP:21),一個數據端口(TCP:20)node

1.主動模式 (Active FTP)

服務器主動鏈接客戶端linux

FTP 客戶端隨機開啓一個大於1024 的端口 N 向服務器的 21 號端口發起鏈接,而後開放 N+1 號端口進行監聽,並向服務器發出PORT N+1 命令。服務器接收到命令後,會用其本地的 FTP 數據端口(一般是 20 )來鏈接客戶端指定的端口 N+1 ,進行數據傳輸算法

通道 client server
命令控制 1088 ------> 21
數據傳輸 1089 <------ 20

2. 被動模式(Passive FTP)

客戶端主動連接服務器端數據庫

FTP 客戶端隨機開啓一個大於1024 的端口 N 向服務器的 21 號端口發起鏈接,同時會開啓 N+1 號端口。而後向服務器發送PASV 命令,通知服務器本身處於被動模式。服務器收到命令後,會開放一個大於 1024 的端口 P 進行監聽,而後用 PORT P 命令通知客戶端,本身的數據端口是 P 。客戶端收到命令後,會經過 N+1號端後鏈接服務器的端口 P ,而後在兩個端口之間進行數據傳輸ubuntu

通道 client server
命令控制 1088 ------> 21
數據傳輸 1089 -- PASV --> 1099

關於二者的區別參考:http://slacksite.com/other/ftp.htmlvim

2.用戶認證方式

1.匿名用戶:ftp

2.系統用戶:Linux系統用戶

3.虛擬用戶:

2、安裝

ubuntu14.04安全

$ sudo dpkg -i vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb 
$ netstat  -lant | grep 21
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN

3、配置文件

  • 用戶認證配置文件:/etc/pam.d/vsftpd
  • 主配置文件:/etc/vsftpd.confbash

  • 匿名用戶(映射爲系統用戶ftp )共享文件位置:/srv/ftp服務器

anonymous_enable=NO             # 是否容許匿名用戶登錄,模式不容許
local_enable=YES                # 容許系統用戶登錄
#write_enable=YES               # 容許登錄用戶進行寫操做,默認不容許 
#local_umask=022                # 用戶登錄後建立文件的umask值
#anon_upload_enable=YES         # 容許匿名用戶上傳文件
#anon_mkdir_write_enable=YES    # 容許匿名用戶建立目錄
dirmessage_enable=YES           # 是否顯示目錄說明文件, 須要收工建立.message文件
use_localtime=YES               # 使用本地時間
xferlog_enable=YES              # 開啓上傳下載日誌
connect_from_port_20=YES        # 數據傳輸端口
#chown_uploads=YES              # 是否改變上傳文件的屬主  
#chown_username=whoever         # 若是是須要輸入一個系統用戶名
#xferlog_file=/var/log/vsftpd.log   # 日誌文件的路徑
#xferlog_std_format=YES         # 是否使用標準的ftp xferlog模式
#idle_session_timeout=600       # session超時時間
#data_connection_timeout=120   # 設置數據傳輸超時時間
#nopriv_user=ftpsecure          # 運行vsftpd須要的非特權系統用戶默認是nobody
#async_abor_enable=YES          # 是否容許運行特殊的ftp命令async ABOR
#ascii_upload_enable=YES        # 是否使用ascii碼方式上傳文件
#ascii_download_enable=YES      # 是否使用ascii碼方式下載文件
#ftpd_banner=Welcome to blah FTP service. # 定製歡迎信息
#deny_email_enable=YES          # 是否容許禁止匿名用戶使用某些郵件地址
#banned_email_file=/etc/vsftpd.banned_emails    # 禁止郵件地址的文件路徑
#chroot_local_user=YES          # 本地用戶禁錮在宿主目錄中
#chroot_list_enable=YES         # 是否將系統用戶限止在本身的home目錄下
#chroot_list_file=/etc/vsftpd.chroot_list    # 列出的是不chroot的用戶的列表   
#ls_recurse_enable=YES          # 是否容許使用ls -R等命令
secure_chroot_dir=/var/run/vsftpd/empty 
pam_service_name=vsftpd         # pam的配置文件名稱 /etc/pam.d/vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

4、 用戶管理

1.匿名用戶

1.1容許虛擬用戶登錄

修改配置文件

$ sudo vim /etc/vsftpd.conf
nonymous_enable=YES
$ sudo service vsftpd restart

測試:

shuowei@gaopeng:~$ ftp 172.16.10.101
Connected to 172.16.10.101.
220 (vsFTPd 3.0.2)
Name (172.16.10.101:shuowei): ftp   # 登錄用戶爲ftp
331 Please specify the password.
Password:                           # 密碼隨意,能夠爲空
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 25 11:12 test.txt
226 Directory send OK.
ftp> get test.txt                   # 有下載的權限
local: test.txt remote: test.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test.txt (0 bytes).
226 Transfer complete.
ftp> delete test.txt                # 沒有寫的權限
550 Permission denied.
ftp>

1.2容許匿名用戶上傳和創建目錄

修改配置文件

$ sudo vim /etc/vsftpd.conf
nonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
$ sudo service vsftpd restart
$ sudo mkdir /srv/ftp/pub
$ sudo chown ftp. /srv/ftp/pub/
$ sudo chmod 777  /srv/ftp/pub/
shuowei@gaopeng:~$ ftp 172.16.10.101
Connected to 172.16.10.101.
220 (vsFTPd 3.0.2)
Name (172.16.10.101:shuowei): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrwxrwx    2 105      112          4096 Jan 25 11:33 pub
-rw-r--r--    1 0        0               0 Jan 25 11:12 test.txt
226 Directory send OK.
ftp> cd pub                 # 進入pub目錄
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir testdir          # 文件建立成功
257 "/pub/testdir" created
ftp> put zabbix-3.0.tar.gz  # 能夠上傳文件
local: zabbix-3.0.tar.gz remote: zabbix-3.0.tar.gz
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
15653160 bytes sent in 0.10 secs (143.7224 MB/s)
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwx------    2 105      112          4096 Jan 25 11:36 testdir
-rw-------    1 105      112      15653160 Jan 25 11:42 zabbix-3.0.tar.gz
226 Directory send OK.

2.系統用戶

1.系統用戶登錄

shuowei@gaopeng:~$ ftp 172.16.10.101
Connected to 172.16.10.101.
220 (vsFTPd 3.0.2)
Name (172.16.10.101:shuowei): ubuntu            # 系統用戶名
331 Please specify the password.
Password:                                       # 系統用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 1000     1000       111462 Jan 25 10:30 vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb
226 Directory send OK.
ftp> pwd
257 "/home/ubuntu"                              # 登錄後在本身的家目錄
ftp> get vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb# 有下載的權限
local: vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb remote: vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb (111462 bytes).
226 Transfer complete.
111462 bytes received in 0.00 secs (52.1582 MB/s)
ftp> delete vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb # 沒有寫的權限 須要開啓write_enable=YES
550 Permission denied.

3.虛擬用戶

VSFTP 一個稱爲安全的保證是採用了虛擬用戶的認證方式,它靠對 /etc/pam.d/ 目錄下指定的一個認證文件對用戶進行認證,認證成功後再把虛擬用戶映射爲本地用戶,該本地用戶由服務器配置文件裏的語句 ftp_username 的值指定。使用虛擬用戶認證,則原有系統帳戶將再也不可用。

全部虛擬用戶會統一映射爲一個指定的系統普通帳號:訪問共享位置,即爲此係統普通用戶的家目錄,固然每一個虛擬用戶也可被賦予不一樣的訪問權限,經過匿名用戶的權限控制參數進行指定

爲了實現虛擬用戶咱們須要準備的環境

  1. 一個不可登錄的系統帳戶,併爲這個系統建立一個家目錄。虛擬帳戶就在這個家目錄裏活動。
  2. 建立虛擬帳戶名單,併爲這些用戶建立一個認證數據庫

3.1建立虛擬用戶

3.1.1.建立本地系統用戶

$ sudo mkdir /data
$ sudo useradd -m  -d /data/ftp -s /bin/false  ftpadmin

3.1.2.創建虛擬帳戶名單

ubuntu@node1:~$ sudo mkdir /etc/vsftpd/
ubuntu@node1:~$ sudo vim /etc/vsftpd/ftpusers.txt
jdyyy
123456
yuanzhi
123456

3.1.3.生成虛擬帳戶的數據庫

建立數據庫文件須要安裝db_util

$ sudo dpkg -i db5.3-util_5.3.28-3ubuntu3.1_amd64.deb  db-util_1%3a5.3.21~exp1ubuntu1_all.deb

生成認證數據庫文件

ubuntu@node1:~$ sudo db_load -T -t hash -f /etc/vsftpd/ftpusers.txt  /etc/vsftpd/ftpusers.db
# -T: 容許使用文本文件信息加載到數據庫中
# -t : 指定加密算法
# -f : 指定文件
ubuntu@node1:~$ sudo chmod  600 /etc/vsftpd/ftpusers.db

建立數據庫的pam文件

# 備份原來的pam文件
$ sudo cp /etc/pam.d/vsftpd  /etc/pam.d/vsftpd.bak
# 拷貝pam模板文件到/etc/pam.d/
$ sudo cp /usr/share/doc/vsftpd/examples/VIRTUAL_USERS/vsftpd.pam /etc/pam.d/vsftpd
# 編譯新的pam文件
# 注意pam_userdb.so的位置,模板中/lib/security/pam_userdb.so是找不到的
# 根據系統的狀況改,db=/etc/vsftpd/ftpusers ftpuser是認證數據庫文件的文件名,這裏不須要加後綴
$ sudo vim /etc/pam.d/vsftpd
auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/ftpusers
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/ftpusers

3.1.4.修改配置文件

# 激活虛擬用戶
guest_enable=YES
# 虛擬用戶映射到系統用戶的用戶名稱(系統用戶的名稱)
guest_username=ftpadmin
# 虛擬用戶擁有與系統用戶相同的權限
virtual_use_local_privs=YES

3.1.5.重啓服務

 

異常處理

若是配置文件中沒有加:virtual_use_local_privs=YES

登錄報錯:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

shuowei@gaopeng:~$ ftp 172.16.10.101
Connected to 172.16.10.101.
220 (vsFTPd 3.0.2)
Name (172.16.10.101:shuowei): jdyyy
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
ftp>

去除系統用戶家目錄寫權限

$ sudo chmod a-w /data/ftp/

可是又沒有寫的權限了。

3.1.6.最終配置

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
guest_enable=YES
guest_username=ftpadmin
virtual_use_local_privs=YES

這樣虛擬用戶讀寫刪權限都有

3.2. 實現虛擬用戶不一樣權限

3.2.1 修改FTP主配置文件

$ sudo vim /etc/vsftpd.conf
user_config_dir=/etc/vsftpd_user_conf

3.2.2給每一個虛擬用戶建立一個獨立的權限配置文件-版本1

$ sudo mkdir /data/ftp/jdyyy
$ sudo mkdir /etc/vsftpd_user_conf
$ sudo vim /etc/vsftpd_user_conf/jdyyy
# 只有上傳權限,沒有下載權限
write_enable=YES
virtual_use_local_privs=NO
anon_upload_enable=YES
anon_world_readable_only=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=NO

$ sudo vim /etc/vsftpd_user_conf/yuanzhi
# 只有下載權限
write_enable=NO
virtual_use_local_privs=NO
anon_upload_enable=NO
anon_world_readable_only=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 注意ftp文件夾的權限
ubuntu@node1:/$ ll /data/
total 12
drwxr-xr-x  3 root     root     4096 Jan 25 16:17 ./
drwxr-xr-x 23 root     root     4096 Jan 25 16:17 ../
drwxr-xr-x  4 ftpadmin ftpadmin 4096 Jan 25 17:50 ftp/
# 主配置文件
ubuntu@node1:/$ grep -Ev "(^#|^$)" /etc/vsftpd.conf  
listen=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
guest_enable=YES
guest_username=ftpadmin
virtual_use_local_privs=YES
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd_user_conf

3.2.3給每一個虛擬用戶建立一個獨立的權限配置文件-版本2

​權限 upload download admin
下載 - + +
上傳 + - +
建立目錄 + - +
刪除 - - +
root@node1:~# ls -ld /data/ftp/*
drwxr-xr-x 2 ftpadmin ftpadmin 4096 Jan 28 18:50 /data/ftp/download
drwxr-xr-x 3 ftpadmin ftpadmin 4096 Jan 28 18:54 /data/ftp/upload

vsftpd服務的主配置文件
ubuntu@node1:~$ grep -Ev "(^#|^$)" /etc/vsftpd.conf 
listen=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
guest_enable=YES
guest_username=ftpadmin
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd_user_conf

建立不一樣用戶各自的的配置文件

root@node1:~# ls /etc/vsftpd_user_conf/
admin  download  upload

ubuntu@node1:~$ cat /etc/vsftpd_user_conf/download 
write_enable=NO
anon_upload_enable=NO
anon_world_readable_only=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_root=/data/ftp/download

ubuntu@node1:~$ cat /etc/vsftpd_user_conf/upload 
write_enable=YES
anon_upload_enable=YES
anon_world_readable_only=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=NO
local_root=/data/ftp/upload


ubuntu@node1:~$ cat /etc/vsftpd_user_conf/admin
write_enable=YES
anon_upload_enable=YES
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

生成用戶數據庫文件

ubuntu@node1:~$ cat  /etc/vsftpd/ftpusers.txt upload
123456
download
123456
admin
admin
ubuntu@node1:~$ sudo db_load -T -t hash -f /etc/vsftpd/ftpusers.txt  /etc/vsftpd/ftpusers.db

重啓服務

相關文章
相關標籤/搜索