一、
FTP(file transferprotocol):21/tcp,文件共享服务,工作在应用层
NFS(network file system):依赖RPC工作,基于RPC(remote procedure call远程过程调用,主要功能:能让不同主机的两个进程基于二进制格式实现数据通信,而应用层协议不具备这种能力)文件共享服务很多(尤其hadoop的进程依赖于RPC)
SAMBA:SMB/CIFS(common internet file system),用于linux与windows共享文件
FTP:有两个连接:命令连接(21/tcp,一直在线);数据连接(20/tcp,client发起数据下载请求时才打开此连接,文件传输完成就断开,再下载再打开完成再关闭,按需打开按需关闭)
主动模式:server通过20port主动连接client的2002port,若2002port被占用则使用2003,依次向下找一个空闲port,从而client接收server的请求(client的2001port用于命令连接)
被动模式:端口随机(一般>1023,BSD类OS>5000),通过命令连接,server向client发送一报文(此报文由两个随机数组成,如151和20,根据公式151*256+20=port number,从而得出随机端口数),表示server打开一随机端口等待client连接
注:主动、被动都是站在server角度;主动、被动模式同防火墙的关系
杀毒软件(检测文件内容是否危险)
防火墙(tcp,udp这两种协议各65535个port,每个port都是一道门,一个入口,防火墙要做的就是把没用的门给关掉,把不请自来的连接挡在门外,通过策略设定哪个门可进可出,什么时候进出,通过连接追踪功能识别请求和响应间的关系(RELATED,相关联的连接,命令连接和数据连接虽有关联,但又是两个独立的连接))
数据传输模式:文本(html)、二进制(mp3,jpg)(两种FTP都支持)
一般设为自动模式(server与client协商决定),遵循文件本身的特性传输,否则会是乱码
http借助MIME可将二进制转为文本传输,到client再解码
注:结构化程序;半结构化数据;非结构化数据
服务器端程序:
wu-ftpd(washingtonuniversity ftp daemon)文件传输鼻祖,未用模块化设计,所有功能用同一进程实现,导致某一功能出现问题整个软件崩溃
vsftpd(very secure ftpdaemon)安全,快速,短小精悍
proftpd
pureftpd
filezilla(windows,linux都有)
serv-u(windows)
客户端程序:
命令行CLI工具(ftp,lftp)
GUI工具(gftpd)
商业(flashfxp,cuteftp)
filezilla
vsftpd
#yum -y install vsftpd
#rpm ql vsftpd
/etc/vsftpd/vsftpd.conf(主配置文件)
/etc/vsftpd/{ftpusers,user_list}(控制用户登录)
/etc/rc.d/init.d/vsftpd
/etc/pam.d/vsftpd(/lib/security/*,基于pam实现用户认证(SUN公司),pluggableauthentication module可插入认证模块,类似nsswitch仅是框架,背后认证机制非常多,模块也非常多,非常灵活,按需定制的一种认证机制)
/var/ftp(FTP服务根目录,ftp用户家目录,不允许运行vsftpd程序的用户有写权限,若要上传文件在其下创建目录)
/var/ftp/pub(默认提供给用户要下载的文件在此处放置)
#finger ftp(或#grep ftp /etc/passwd)
#ps aux | grep vsftpd
ftp用户三类:匿名用户(anonymous,ftp);系统用户;虚拟用户
注:匿名用户和虚拟用户最终都被映射为系统用户
2XX(成功类信息),3XX(信息不完整,无密码等)
win命令行中:
>ftp 192.168.101.154
:anonymous
>help(支持的命令有ascii,binary,cd,delete,get,ls,lcd,mkdir,pwd)
>bye
#man vsftpd.conf
#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES(定义匿名用户可上传文件)
anon_mkdir_write_enable=YES(定义匿名用户可创建目录)
anon_other_write_enable=YES(定义匿名用户有删除文件权限,以上三行一般不开放,不给匿名用户过多权限)
local_enable=YES(系统用户默认是在自己的家目录下)
write_enable=YES(定义系统用户上传文件)
chroot_list_enable=YES(是否禁锢用户)
chroot_list_file=/etc/vsftpd/chroot_list(此文件中记录禁锢哪些用户,每一行一个用户)
chroot_local_user=YES(所有用户都禁锢)
dirmessage_enable=YES(用户切至某目录的提示信息,可在需要显示提示的目录下建一隐藏文件.message,如#vim /var/ftp/upload/.message)
xferlog_enable=YES(传输日志,如某用户在某时下载了文件记录进日志)
xferlog_file=/var/log/xfer.log
xferlog_std_format=YES(标准格式,便于日志分析软件分析)
chown_uploads=YES(用户上传文件后将属主改为其它用户,一般不启用,否则用户上传文件后无法编辑修改)
chwon_username=whoever(指定上传文件后更改的属主)
idle_session_timeout=600(控制连接相关,单位秒)
data_connection_timeout=120(数据连接相关)
ascii_upload_enable=YES(不要明确定义传输模式)
ascii_download-enable=YES
max_clients=#(定义ftp的资源访问)
max_per_ip=#(每个ip最多几个连接请求)
listen=YES(将vsftpd定义为独立守护进程,若要定义为瞬时守护进程,则在/etc/xinetd.d/下提供一脚本即可)
pam_service_name=vsftpd(默认vsftpd程序认证用户靠pam)
userlist_enable=YES(/etc/vsftpd/ftpusers此文件中的用户都禁止访问ftp,若将/etc/vsftpd/user_list清空,root能否登录才真正取决于/etc/vsftpd/ftpusers)
userlist_deny=YES(若为YES则是拒绝/etc/vsftpd/user_list文件中的用户登录,若为NO则是仅允许/etc/vsftpd/user_list文件中的用户登录使用ftp服务)
注:文件服务权限=文件系统权限*文件共享权限(两者交集,同时具有的权限ftp服务才有)
二、
安全通信方式:ftps(ftp+ssl/TLS);sftp(ssh,openssh有子系统subsystem)
本例中私有CA与vsftpd服务器在同一台物理机上
#vim /etc/pki/tls/openssl.cnf(修改dir=/etc/pki/CA)
#cd /etc/pki/CA
#(umask 077;openssl genrsa -out private/cakey.pem 2048)
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem(FQDN写ca.magedu.com)
#mkdir certs newcerts tls
#touch index.txt
#echo 01 > serial
#mkdir /etc/vsftpd/ssl
#cd !$
#(umask 077;openssl genrsa -out vsftpd.key 1024)
#openssl req -new -key vsftpd.key -out vsftpd.csr(FQDN写ftp.magedu.com)
#openssl ca -in vsftpd.csr -out httpd.crt -days 365
#vim /etc/vsftpd/vsftpd.conf(添加如下信息)
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
ssl_ciphers=HIGH(在win中使用filezilla出现如下错误再使用此项: 错误: 收到服务器的 TLS 警告:Handshake failed (40)。原因:FileZilla不支持默认密码(DES-CBC3-SHA))
在win下使用客户端软件filezilla连接服务器(注意选择显式的FTP over TLS)
三、
vsftpd+mysql+pam实现虚拟用户认证登录ftp:
#yum -y install “Development Tools” “Development Libraries”
#yum -y install mysql mysql-server mysql-devel(注意mysql-devel一定要装上,否则无法实现编译其功能)
#tar xf pam_mysql-0.7RC1.tar.gz
#cd pam_mysql-0.7RC1
#./configure --with-mysql=/usr --with-openssl(若不指/usr,则会在根下去找相应库文件,会出现如下错误:configure: error: Cannot locate mysql client library. Please checkyour mysql installation.)
#make && make install
#mysql
>CREATE DATABASE vsftpd;
>GRANT select ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY ‘vsftpd’;
>GRANT select ON vsftpd.* TO vsftpd@127.0.0.1 IDENTIFIED BY ‘vsftpd’;
>FLUSH PRIVILEGES;
>USE vsftpd;
>CREATE TABLE users (id INT AUTO_INCREMENT NOT NULL,name char(20) BINARY NOT NULL,password char(48) BINARY NOT NULL,PRIMARY KEY(id));
>INSERT INTO users(name,password) values (‘tom’,’magedu’),(‘jerry’,’magedu’);
#vim /etc/pam.d/vsftpd.mysql(pam认证文件,内容中crypt=0表示明文)
auth required /lib/security/pam_mysql.souser=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
account required /lib/security/pam_mysql.souser=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
#useradd -s /sbin/nologin -d /var/ftproot vuser
#chmod go+rx /var/ftproot
#vim /etc/vsftpd/vsftpd.conf(确保开启如下选项,将上例中的ssl有关选项注释掉,防止影响此次实验)
anonymous_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql
user_config_dir=/etc/vsftpd/vusers_dir
#mkdir /etc/vsftpd/vusers_dir
#cd !$
#touch tom jerry
#vim jerry(虚拟用户所能执行的权限都由匿名用户anon的相关选项定义的,所有的虚拟用户都映射到vuser系统用户上,可在指定虚拟用户名命名的文件中指定所特有的权限)
anon_upload_enable=YES
anon_mkdir_write_enable=YES
#service vsftpd restart
#netstat -tnlp | grep :21
#ftp 192.168.101.154
Name (192.168.101.154:root): jerry
331 Please specify the password.
Password:
230 Login successful.
ftp> lcd /etc
Local directory now /etc
ftp> put inittab
local: inittab remote: inittab
227 Entering Passive Mode(192,168,101,154,212,62)
150 Ok to send data.
226 File receive OK.
1666 bytes sent in 0.024 seconds (67Kbytes/s)
>bye
#tail /var/log/secure
#ls /var/ftproot
以上是学习《马哥课程》做的笔记。
1、FTP(filetransfer protocol),以TCP数据包的模式进行服务器与客户端之间的文件传输;
数据连接:TCP20,用于上传下载数据;TCP21,用于发送FTP命令信息;
数据连接的建立类型:主动模式(服务端从20端口主动向客户端发起连接);被动模式(服务端在指定范围内某个端口被动等待客户端连接);
FTP的用户类型:匿名用户(anonymous或ftp);本地用户(账号密码等信息保存在/etc/passwd、/etc/shadow下)
常见的FTP服务端程序:IIS、Serv-U、wu-ftpd、Proftpd、vsftpd(very secure ftp daemon);
常见的FTP客户端程序:CuteFTP、FlashFXP、LeapFTP、Filezilla、gftp、kuftp、FTP命令;
官方站点:http://vsftpd.beasts.org/;
主程序:/usr/sbin/vsftpd;
主配置文件:/etc/vsftpd/vsftpd.conf
用户控制列表文件:/etc/vsftpd/ftpusers、/etc/vsftpd/user_list
2、》匿名权限控制:
anonymous_enable=YES (启用匿名访问
anon_umask=022 (匿名用户上传的权限掩码,无此项默认600
anon_root=/var/ftp (匿名用户的FTP根目录
anon_upload_enable=YES (允许匿名用户上传文件
anon_mkdir_write_enable=YES (允许创建目录
anon-other_write_enable=YES (开放其它写入权限
anon_max_rate=0 (限制最大传输速率,字节每秒
》本地用户权限控制:
local_enable=YES (启用本地系统用户
local_umask=022 (本地用户上传文件的权限掩码
local_root=/home/username (设置本地用户的FTP根目录
chroot_local_user=YES (将用户禁锢在主目录
local_max_rate=0 (限制最大传输速率,字节每秒
》常用的全局配置项:
listen=YES
listen_port=21 (设置监听端口
write_enable=YES (是否启用写入权限
download_enable=YES (是否允许下载文件
max_clients=0 (限制并发客户端连接数
max_per_ip=0 (限制同一IP地址的并发连接数
pasv_enable=YES (开启被动模式
pasv_min_port=50000 (将客户端的数据连接改在50000到60000之间
pasv_max_port=60000
》访问限制:
usrelist_enable=YES、userlist_deny=YES (注:出现在/etc/vsftpd/user_list文件里的用户被拒绝访问
userlist_enable=YES、userlist_deny=NO (注:出现在/etc/vsftpd/ftpusers里的用户拒绝访问,不管user_list做如何更改
》其它安全选项:
connect_timeout=60 (主动模式下,连接信号在60S内得不到客户端响应,强制断线
accept_timeout=60 (被动模式下,等待客户端60S无回应,强制断线
data_connection_timeout=300 (server与client成功建立,由于线路问题300S内无法顺利传送,强制剔除
ftpd_banner=xxx;banner_file=/path (欢迎信息
tcp_wrappers=YES
dirmessage_enable=YES (当用户进入某个目录时,会显示需注意的内容,显示信息的文件默认是.message
message_file=.message
xferlog_enable=YES (用户上传下载的文件都会被记录下来
xferlog_file=/var/log/vsftpd.log
3、虚拟用户的创建及使用:
注:特点:减少系统用户的数据,提高系统的安全性;根据不同的用户,设置不同的访问权限
a创建账号数据:建立虚拟FTP用户的账号数据库文件;创建FTP根目录及虚拟用户映射的系统用户;建立支持虚拟用户的PAM认证文件;
b添加虚拟用户支持:在vsftpd.conf文件中添加支持配置;为个别虚拟用户建立独立的配置文件;
c启动服务并测试:重新加载vsftpd配置;使用虚拟FTP账号访问测试。
详细过程:
》#vi /etc/vsftpd/vusers.list (注:奇数行账号偶数行密码
zhangsan
123
lisi
123
#db_load -T -t hash -f vusers.list vusers.db (centos下需安装db4-utils)
#file vusers.db
#chmod 600 /etc/vsftpd/vusers.*
#ls -lh /etc/vsftpd/vuser.*
#useradd -d /var/ftproot -s /sbin/nologin virtual
#chmod 755 /var/ftproot/
》#vi /etc/pam.d/vsfptd.vu
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
#vi /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
anon_umask=022
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir
#mkdir /etc/vsftpd/vusers_dir
#cd /etc/vsftpd/vusers_dir
#vi zhangsan
anon_upload_enable=YEs
anon_mkdir_write_enable=YES
#touch lisi
》#service vsftpd reload
#测试
注:
vsftpd虚拟用户,生产环境中若出现如下报错,将selinux改为permissive
227 Entering Passive Mode(172,17,101,73,189,74).
150 Here comes the directory listing.
226 Transfer done (but failed to opendirectory).