文件服务:
vsftpd: 应用层,文件共享;
nfs: 网络文件系统;
samba :cifs协议在Linux主机上的实现,跨平台实现文件系统共享;
网络存储:
NAS: Network Attached Storage,文件服务器,nfs或cifs,文件级别共享接口;
SAN: Storage Area NEtwork,存储区域网络,通过其它网络介质来传输SCSI协议,iSCSI(IP SAN), FC SAN, ...,块级别的共享接口;
ftp:file transfer protocol, 21/tcp
C/S架构
Client <--ftp-->Server
Server:Listen
Client: Connect
连接:
命令连接:传输命令;
数据连接:传输数据;
数据连接工作模式:
主动模式:服务器端通过20/tcp主动连接客户端的命令连接的端口+1的端口;PORT;
被动模式:客户端发出数据请求后,服务端会响应一个打开的临时随机端口给客户端;PASV;
数据传输模式:
文本格式
二进制格式
协议安全:
明文:认证时传输账号和密码的传输亦是明文 ;
安全增强:
ftp over ssl/tls:ftps
ftp over ssh:sftp
C/S:
S:Serv-U, IIS, ...
开源解决方案:
wuftpd:Washington University ftp daemon
vsftpd:very secure ftp daemon
proftpd, pureftpd, ...
C:
GUI:flashfxp, cuteftp, filezilla, gftp, ...
CLI:ftp, lftp, ...
vsftpd
程序环境:
配置文件:/etc/vsftpd/vsftpd.conf
主程序:/usr/sbin/vsftpd
Unit File:/usr/lib/systemd/system/vsftpd.service
文件路径映射:/var/ftp
ftp://ftp.xixi.com/pub/a.txt --> /var/ftp/pub/a.txt
用户的家目录的映射:访问ftp必须以某个系统用户的身份,此用户的家目录即文档目录;
匿名用户:anonymous,要映射为一个系统用户,默认ftp;
用户种类:
匿名用户、系统用户、虚拟用户
配置vsftpd:
配置文件: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
辅助认证配置文件/etc/vsftpd/ftpusers:
pam认证的配置文件:/etc/pam.d/vsftpd
chroot_local_users=YES
禁锢所有的本地用户于自己的家目录中;但需要事先移除用户对家目录的写权限;
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
禁锢指定的文件中的用户于自己的家目录中;但需要事先移除用户对家目录的写权限;
数据传输日志:
xferlog_std_format=YES
xferlog_enable=YES
xferlog_file=/var/log/xferlog
控制可登录vsftpd服务的用户列表:
userlist_enable=YES
是否启用/etc/vsftpd/user_list文件来可登录的用户;
userlist_deny={YES|NO}
YES:黑名单
NO:白名单
虚拟用户:
用户账号存储于何处?
文件,MySQL,Redis, ...
vsftpd的认证功能托管给pam:
Pluggable Authencate Module,认证框架,认证库;
通过模块完成认证功能:/usr/lib64/security/
pam_mysql模块:
./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security
make
make install
准备数据库:
mysql> CREATE DATABASE vsftpd;
mysql> CREATE TABLE vsftpd.users (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(30) NOT NULL UNIQUE KEY,password CHAR(42));
mysql> INSERT INTO vsftpd.users (name,password) VALUES ('tom',PASSWORD('tom')),('jerry',PASSWORD('tom'));
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'vspasswd';
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'vspasswd';
mysql> FLUSH PRIVILEGES;
vsftpd通过pam_mysql进行认证的配置文件:/etc/pam.d/vsftpd.mysql
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vspasswd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vspasswd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
user:连接mysql服务器的用户名,此用户要有权限访问认证vsftpd服务的数据库;
passwd:上面的用户的密码;
host:mysql服务器主机地址;
db:认证vsftpd服务的数据库名称;
table:存放了用户和密码的表;
usercolumn:用户名对应的字段;
passwdcolumn:密码对应的字段;
crypt:密码加密方法;
准备匿名用户映射的系统用户账号:
mkdir /ftproot
useradd -d /ftproot vuser
mkdir /ftproot/{pub,upload}
setfacl -m u:vuser:rwx /ftproot/upload
配置vsftpd: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
为每用户提供配置文件:
/etc/vsftpd/vusers_conf/{tom,jerry}
配置权限的指令:
anon_upload_enable
anon_mkdir_write_enable
anon_other_write_enable
实验如下:
脚本内容