概念
- FTP服务是应用层文件共享服务,C/S模式;
- 服务端软件:Wu-ftpd,Proftpd,IIS;常用:vsftpd ,CentOS默认FTP服务软件;
- 客户端软件:ftp,lftp,wget,curl;
- 双通道协议,数据通道和命令通道;
- 服务器两种模式:
主动(PORT style),服务器端命令和数据端口都是固定:
命令(控制):客户端:随机port >>>> 服务器:tcp21
数据:客户端:随机port >>>> 服务器:tcp20
被动(PASV style),服务器命令端口固定,数据端口随机
命令(控制):客户端:随机port >>>> 服务器:tcp21
数据:客户端:随机port >>>> 服务器:随机port
服务端数据传输端口随机值通过命令端口确认:
例如,客户端通过命令端口发送信息“227 Entering Passive Mode (192,168,30.99,231,145)”
那么服务器数据端口为:231*256+145 - 用户认证:
匿名用户:ftp,anonymous,即linux默认账号ftp。ftp登录后的共享文件位置默认/var/ftp
系统用户:即能够登录系统的账号,使用本身账号名和密码登录。ftp登录后共享文件位置是用户家目录。
虚拟用户:独立创建的虚拟专用用户,它映射成指定系统用户,拥有独立的用户和密码文件。共享文件位置是其映射的系统用户家目录
使用情景
-
匿名用户使用场景
a. 服务端yum install vsftpd
b. 客户端yum install ftp
c. 客户端使用匿名用户登录ftp服务器:
d. 在服务端为ftp用户添加写权限,客户端才可以上传
e. 客户端上传文件
f. 默认ftp用户上传文件后不可删除和修改。此功能由/etc/vsftpd/vsftpd.conf 中anon_other_write_enable=NO控制,默认NO
g. 默认ftp用户不可创建目录。此功能由anon_mkdir_write_enable=NO参数控制,默认NO -
Linux系统用户使用场景
a. 使用服务端存在的用户ftp1用户登录ftp共享,其登录默认路径在ftp1家目录
b. 上传,读取,删除文件都没有问题
c. 创建目录也没有问题
d. 使用服务端真实用户访问不安全,默认情况甚至能拿到passwd文件,不安全。和我们期望的只用在ftp共享用途不符。
e. 在服务端/etc/vsftpd/vsftpd.conf中配置chroot_local_user=YES(默认NO),禁锢所有用户ftp方式只能访问自己的家目录,同时需要添加allow_writeable_chroot=YES才能使用系统用户正常使用。vim /etc/vsftpd/vsftpd.conf
测试:
d. 使用系统用户ftp共享时,更多的是要将ftp登录目录设置成指定目录,而非用户家目录
配置文件参数local_root=/ftpsharedir 指定非匿名用户登录所在目录
服务端配置参数,创建共享目录,设置共享目录权限:
客户端测试:
服务端查看结果:
-
基于SSL的FTP场景
[root@server 08:51:09 ~]#ldd /usr/sbin/vsftpd|grep ssl #########查看是否支持SSL libssl.so.10 => /lib64/libssl.so.10 (0x00007faef9e95000) [root@server 08:51:37 ~]# [root@server 08:51:37 ~]# [root@server 08:51:45 ~]# [root@server 08:51:46 ~]# [root@server 08:51:50 ~]#cd /etc/pki/tls/certs/ [root@server 08:52:00 certs]#ls ca-bundle.crt ca-bundle.trust.crt make-dummy-cert Makefile renew-dummy-cert [root@server 08:52:01 certs]#make vsftpd.pem ##########创建证书 umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \ cat $PEM1 > vsftpd.pem ; \ echo "" >> vsftpd.pem ; \ cat $PEM2 >> vsftpd.pem ; \ rm -f $PEM1 $PEM2 Generating a 2048 bit RSA private key .........................................+++ ..........................................+++ writing new private key to '/tmp/openssl.TN6JT4' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:vsftpd.com Organizational Unit Name (eg, section) []:ftp Common Name (eg, your name or your server's hostname) []:www.vsftpd.com Email Address []: [root@server 08:53:09 certs]#openssl x509 -in vsftpd.pem -noout -text #########自签名 Certificate: Data: Version: 3 (0x2) Serial Number: f7:b7:03:4e:75:de:c7:89 Signature Algorithm: sha256WithRSAEncryption Issuer: C=CN, ST=beijing, L=beijing, O=vsftpd.com, OU=ftp, CN=www.vsftpd.com Validity Not Before: Jun 28 08:53:09 2018 GMT Not After : Jun 28 08:53:09 2019 GMT Subject: C=CN, ST=beijing, L=beijing, O=vsftpd.com, OU=ftp, CN=www.vsftpd.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b0:ed:db:28:a6:b4:57:e2:08:a2:0e:11:34:9f: 45:13:72:8b:56:b4:a3:0f:3c:e4:0c:1a:30:0c:05: 6e:58:2d:3b:29:a3:49:70:8a:c5:e7:10:fd:9e:a8: dd:05:48:84:0a:cd:80:8e:58:d7:2d:ae:fa:f5:fd: 9d:cd:81:25:87:5a:2f:7b:17:fc:d3:fa:e5:ca:9f: 4d:96:68:ee:cb:11:b6:3c:1f:d6:3d:36:90:16:3d: 9c:4e:a9:a0:c4:b8:2f:92:fa:a1:21:30:3f:80:de: 37:e5:fb:25:da:db:14:38:91:06:84:5a:b1:9e:e6: 07:e7:08:44:63:18:29:6c:b5:fc:66:05:c4:3a:96: 83:56:41:99:3e:69:c5:31:95:d9:68:c9:57:97:75: de:dd:5c:d8:cb:16:41:2d:ab:72:56:f5:e0:f4:99: 50:3b:c2:08:8d:28:4b:c3:44:a6:95:b1:63:c0:17: 83:df:97:0f:27:cb:1d:e3:2b:92:4f:77:02:38:b0: 7f:95:51:d2:3e:c3:4e:b2:c3:b0:a2:9c:ef:28:87: 6c:2e:ba:a5:af:e8:d6:2f:50:f2:3b:85:2f:ca:85: 36:a8:59:66:a3:98:e7:13:88:34:22:7e:9f:4b:5a: 6a:08:62:4a:2b:56:25:46:77:39:f5:e8:01:61:36: 02:b7 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 4E:6B:57:43:5A:AD:DF:BF:79:33:86:7C:D2:31:70:A2:16:3A:DA:4B X509v3 Authority Key Identifier: keyid:4E:6B:57:43:5A:AD:DF:BF:79:33:86:7C:D2:31:70:A2:16:3A:DA:4B X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha256WithRSAEncryption 2d:be:c6:a6:af:d5:77:8e:f2:6c:ab:97:b7:28:07:71:35:80: c4:2f:1f:2b:a1:d8:fe:4b:f7:6d:0c:a7:28:16:e2:c9:2e:09: ff:b0:32:e2:b1:78:4c:66:db:a5:74:8b:94:1f:a3:52:e3:a7: c1:b2:fc:8a:6e:48:7c:1a:78:53:69:6f:cb:61:26:a4:dc:67: f3:43:ce:34:46:88:1c:11:a6:53:30:16:9b:8a:16:ad:58:d9: 3d:b1:9d:36:93:5d:7c:3a:9f:a3:ff:13:16:ca:6c:5c:69:c7: 72:6e:cb:d5:e7:21:97:f2:72:44:7f:6f:3c:6e:1e:80:9e:a9: 11:96:48:7d:d8:1a:7c:f8:fd:a6:d8:80:77:de:00:33:98:82: c4:9a:04:7d:d0:be:f0:f9:a1:7d:6c:9c:65:2c:fb:7e:c0:36: 9f:aa:be:f4:da:a5:0c:7b:25:87:f2:1a:fb:64:19:ac:dd:65: 9a:60:7e:fe:c8:5b:76:40:45:cb:ea:c0:79:9e:d7:29:ae:70: cb:7a:aa:15:09:c8:ff:0a:d0:26:f9:92:43:c5:37:97:07:6c: 81:5b:54:cb:79:b2:f8:0d:6c:05:ef:32:69:36:0f:e1:0a:3f: e6:cf:5b:c0:55:be:a4:9b:9f:76:de:cc:44:ff:59:43:e0:53: e9:8e:f8:04 [root@server 08:53:42 certs]#vim /etc/vsftpd/vsftpd.conf #########修改配置文件,添加以下行 ssl_enable=YES force_local_logins_ssl=YES force_local_data_ssl=YES rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
用filezilla等工具测试
- 使用虚拟用户访问场景
a. 创建虚拟用户数据库文件
[root@server 09:29:53 certs]#vim /etc/vsftpd/vuser.txt vuser1 password1 vuser2 password2 [root@server 09:32:11 vsftpd]#db_load -T -t hash -f vuser.txt vuser.db [root@server 09:32:57 vsftpd]#chmod 600 vuser.db
b. 创建映射系统用户和FTP访问目录
[root@server 09:34:05 vsftpd]#useradd -d /var/ftproot -s /sbin/nologin testuser [root@server 09:35:12 vsftpd]#chmod +rx /var/ftproot/ [root@server 09:35:28 vsftpd]#chmod -w /var/ftproot/ [root@server 09:36:17 vsftpd]#mkdir /ftpshare [root@server 09:36:31 vsftpd]#setfacl -m u:testuser:rwx /ftpshare [root@server 10:12:06 vuser.d]#vim /etc/vsftpd/vsftpd.conf ####添加以下行 chroot_local_user=YES allow_writeable_chroot=YES local_root=/ftpshare
c. 创建pam配置文件
[root@server 09:39:57 vsftpd]#vim /etc/pam.d/vsftpd.db #######添加以下行 auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
d. 指定pam配置文件
[root@server 09:40:56 vsftpd]#vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=testuser pam_service_name=vsftpd.db
e. 为虚拟用户建立独立配置文件
[root@server 09:46:29 vsftpd]#mkdir /etc/vsftpd/vuser.d/ [root@server 09:46:51 vsftpd]#echo "user_config_dir=/etc/vsftpd/vuser.d/" >> /etc/vsftpd/vsftpd.conf [root@server 09:47:38 vsftpd]#cd /etc/vsftpd/vuser.d/ [root@server 09:48:03 vuser.d]#vim vuser1 ######添加以下行 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@server 09:51:53 vuser.d]#cat vuser1 > vuser2
f. 客户端验证: