FTP 是 File Transfer Protocol (文件传输协议)的缩写 ,在 Unix/Linux 系统中经常使用的免费 FTP 服务器软件主要是 VSFTP,vsftp的官方地址:http://vsftpd.beasts.orghtml
FTP工做时会开两个端口,一个命令端口(TCP:21),一个数据端口(TCP:20)node
服务器主动链接客户端linux
FTP 客户端随机开启一个大于1024 的端口 N 向服务器的 21 号端口发起链接,而后开放 N+1 号端口进行监听,并向服务器发出PORT N+1 命令。服务器接收到命令后,会用其本地的 FTP 数据端口(一般是 20 )来链接客户端指定的端口 N+1 ,进行数据传输算法
通道 | client | server | |
---|---|---|---|
命令控制 | 1088 | ------> | 21 |
数据传输 | 1089 | <------ | 20 |
客户端主动连接服务器端数据库
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
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
主配置文件:/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
修改配置文件
$ 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>
修改配置文件
$ 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.
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.
VSFTP 一个称为安全的保证是采用了虚拟用户的认证方式,它靠对 /etc/pam.d/ 目录下指定的一个认证文件对用户进行认证,认证成功后再把虚拟用户映射为本地用户,该本地用户由服务器配置文件里的语句 ftp_username 的值指定。使用虚拟用户认证,则原有系统帐户将再也不可用。
全部虚拟用户会统一映射为一个指定的系统普通帐号:访问共享位置,即为此系统普通用户的家目录,固然每一个虚拟用户也可被赋予不一样的访问权限,经过匿名用户的权限控制参数进行指定
为了实现虚拟用户咱们须要准备的环境
$ sudo mkdir /data $ sudo useradd -m -d /data/ftp -s /bin/false ftpadmin
ubuntu@node1:~$ sudo mkdir /etc/vsftpd/ ubuntu@node1:~$ sudo vim /etc/vsftpd/ftpusers.txt jdyyy 123456 yuanzhi 123456
建立数据库文件须要安装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
# 激活虚拟用户 guest_enable=YES # 虚拟用户映射到系统用户的用户名称(系统用户的名称) guest_username=ftpadmin # 虚拟用户拥有与系统用户相同的权限 virtual_use_local_privs=YES
异常处理
若是配置文件中没有加: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/
可是又没有写的权限了。
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
这样虚拟用户读写删权限都有
$ sudo vim /etc/vsftpd.conf user_config_dir=/etc/vsftpd_user_conf
$ 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
权限 | 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
重启服务