文件服务:
ftp:应用层,C/S,文件共享;file transfer protocol;
nfs,cifs:文件系统接口,网络文件系统;
nfs:network file system
cifs:common internet file system
samba
网络存储:
NAS:Network Attached Storage,文件服务器,nfs或cifs,文件级别;
SAN:Storage Area Network,块级别共享服务,分区–>格式化–>创建文件系统;IPSAN, FCSAN;
ftp:
file transfer protocol,21/tcp
C/S:
Client –> ftp–>Server
Client:Connect
Server:Listen
连接:
命令连接:命令传输,连接一直存在;
数据连接:数据传输,按需创建;
数据连接的建立模式:
主动模式:服务器通过20/tcp主动连接客户端的命令连接端口向后最近一个空闲端口;PORT;
被动模式:客户端发出数据请求后,服务端会响应一个打开的临时使用的随机端口,客户端对此端口进行请求;PASV;
数据传输模式:
文本格式:ASCII
二进制格式:BINARY
协议安全:
明文:数据、认证时传输账号和密码均是明文 ;
安全增强:
ftp over ssl/tls:ftps
ftp over ssh:sftp
虚拟用户账号;
c/s:
Server:
Windows:Serv-U, IIS, …
开源解决方案:
wuftpd:Washington University ftp daemon
vsftpd:Very Secure ftp daemon
proftpd, pureftpd, …
Client:
GUI:flashfxp, cute, filezilla, gftp, …
CLI:ftp, lftp, …
vsftpd:
程序环境:
主程序:/usr/sbin/vsftpd
Unit File:/usr/lib/systemd/system/vsftpd.service
配置文件:/etc/vsftpd/vsftpd.conf
文档路径映射:
fedora, /home/fedora/pub/a.txt –> ftp://HOST:PORT/pub/a.txt
用户的家目录映射:访问vsftpd服务必须以某个系统用户的身份进行;此用户的家目录即为文档映射的根目录;
匿名用户:anonymous,映射为一个系统用户,此用户为ftp;
配置:vsftpd.conf
directive VALUE,…
directive:指令之前不能存在任何字符,包括空白;
匿名用户:
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
本地用户:
local_enable=YES
write_enable=YES
认证服务:
pam_service_name=vsftpd
/etc/pam.d/vsftpd
pam: pluggable authencate module
切换目录时的提示信息:
dirmessage_enable=YES
.messages
修改上传文件的属主:
chown_uploads=YES
chown_username=USERNAME
禁锢用户于自己的家目录:
会引入别的风险,因此,要求用户对自己的家目录不能有写权限;
(1) 禁锢所有用户
chroot_local_user=YES
(2) 禁锢部分用户
(a) 白名单:名单中的用户不被禁锢;
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
(b) 黑名单:名单中的用户被禁锢
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
user_list控制用户访问vsftpd:
(1) 白名单
userlist_enable=YES
userlist_deny=NO
(2) 黑名单,默认
userlist_enable=YES
userlist_deny=YES
虚拟用户账号:
vsftpd依赖pam完成认证,pam存储支持的认证方式,vsftpd都可调用;
账号密码存储于何处?
文件、MySQL、ldap、redis、…
pam_mysql模块
CentOS 6:epel
CentOS 7:编译安装
编译:
(1) 编译环境;
(2) 依赖关系:mariadb-devel, pam-devel
# ./configure –with-pam=/usr –with-mysql=/usr –with-pam-mods-dir=/usr/lib64/security/
# make install
MySQL设置:
mysql> CREATE DATABASE vsftpd;
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'mageedu';
mysql> CREATE TABLE vsftpd.users (uid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY,name VARCHAR(100) NOT NULL PRIMARY KEY,password CHAR(48) NOT NULL);
mysql> INSERT INTO users (name,password) VALUES ('tom',PASSWORD('mageedu')),('jerry',PASSWORD('mageedu')),('lucy',PASSWORD('mageedu'));
准备要映射成为的系统账号:
# mkdir -pv /ftproot/{pub,upload}
# useradd -d /ftproot vuser
# setfacl -m u:vuser:rwx /ftproot/upload
准备基于mysql认证的pam配置文件:/etc/pam.d/vsftpd.mysql
auth required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
配置vsftpd启用虚拟用户,并使用指定的pam service:vsftpd.conf
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=vuser
配置每虚拟用户拥有不同的权限:vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_conf
# mkdir /etc/vsftpd/vusers_conf
# touch USERNAME
权限配置指令:
anon_upload_enable
anon_mkdir_write_enable
anon_other_write_enable