FTP: File Tansfer Protocol 应用层文件共享服务
主要监听在TCP/21 (也有UDP/21)
RPC: Remote Procedure Call 远程过程调用
能够让位于不同主机上的两个进程能够基于二进制的格式实现数据通信
应用层协议的不具备这种能力
Hadoop,NFS
Samba: CIFS MB 跨平台共享,比较底层的协议
FTP 有两个连接,两种模式
21 号端口为控制连接,一直在线,支持文本连接,基于套接字
get,mget,put,mput,cd,ls等
20 号端口为数据传输(主动模式),当有数据传输的时候才连接,按需打开,按需关闭
主动模式:服务端21号端口主动连接客户端发起控制连接的下一个端口,如果被暂用,则再下一个,直到连接到递增的空闲端口位置,但因为有个弊端:客户端一般是有防火墙的,所以服务器主动连接可能会失败,所以采用得少
被动模式:服务端通过命令连接告诉客户段自己打开了一个端口{随机数x256+20},让客户端过来连,两边端口都随机,服务器防火墙有连接追踪功能,能够识别请求响应的状态
数据传输模式两种,遵循文件本身的格式,服务器和客户端协商
文本:html
二进制: mp3,jpeg
互联网的数据类型:结构化数据,半结构化数据,非结构化数据
服务端软件 vsftp: very secure ftp daemon
proftp :功能多
wu-ftpd:ftp鼻祖,功能强大,非模块化设计
windows 平台: serv-u , Filezilla
客户端程序:
CLI: ftp,lftp
GUI:gftp,FlashFXP.Filezilla
VSFTPD:
配置文件 /etc/vsftp 脚本 /etc/init.d/vsftpd 主程序 /usr/sbin/vsftpd
支持虚拟用户
基于PAM用户认证(相当于nsswith的框架)配置文件/etc/pam.d/* 模块 /lib/security/* 或 /lib64/security/*
受selinux控制
服务的根目录 /var/ftp (属主和属组为root)
下载安装
wget ftp://IPADDR/PATH/TO/SOME/WHERE -O /PATH/TO/SOMEWEHRE
yum install vsftpd
rpm -ql vsftpd
三类用户: 匿名用户,虚拟用户,本地用户
每种用户都映射到一个本地用户
finger ftp (ftp用户的家目录为/var/ftp)
ftp 为匿名用户映射的用户
共享文件放在/var/ftp/pub
连接ftp服务
ftp IP
匿名:anonymous 密码:空
>help 查看ftp能使用的命令
lcd 在ftp模式下切换本地目录
配置文件
man vsftp.conf
默认本地用户登录到用户的家目录下,且不禁锢用户切换目录
抓包 tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host x.x.x.x 可以看到所有的过程都是明文的
浏览器登录本地用户: ftp://username:userpassword@ipaddr (repo文件的baseurl可以这样写)
/var/ftp 和/var/ftp/pub 的属主和属组都是root 尽管配置文件中打开匿名用户上传的权限,但上传的时候仍然Could not create file 因此需重新创建一个匿名用户可以上传的目录或者更改原目录的权限
在此在/var/ftp下mkdir upload 然后更改权限
setfacl -m u:ftp:rwx /var/ftp/upload (单独给某个用户开权限!!匿名登录时,anonymous=ftp 即用户名输入ftp等同于annoymous)
getfacl /var/ftp/upload 查看文件或者文件夹特殊权限
文件服务权限=文件系统权限和文件共享权限的交集
此时仍不能删除(delete)文件和创建目录,权限分离需开启其他权限
重启vsftp会断开连接
dirmessage_enable=YES定义切换到某个目录的提示信息 在该目录下创建隐藏文件,写入要提示的信息
xferlog_enable=YES 定义传输日志
xferlog_file=/var/log/xferlog 传输日志路径
chroot_local_user=YES 禁锢所有本地用户在自己的家目录
选择型禁锢,启用一下两项,并创建chroot_list
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES 是否工作为standalone,可以由xinetd代为管理
如果要交由xinetd接管,需要在/etc/xinetd.d/下提供 一个配置文件
userlist_enable=YES 默认情况在ftpusers中的用户禁止登录
/etc/vsftpd/user_list 清空 1,$d user_list认证先于ftpusers 即在user_list定义的用户密码都无法输入,清空后才ftpusers认证(PAM认证调用/etc/pam.d/vsftpd)
userlist_enable=YES 表示启用user_list文件 默认写在该文件的用户都是不能登录的
如果要让卸载user_list 里的用户登录
添加或者启用 userlist_deny=YES 拒绝(默认动作)黑名单
userlist_deny=NO 不拒绝 即是只能在user_list里的用户可以登录 白名单
FTP 安全通信:
ftps: ftp+ssl/tls
sftp:openssh提供的子系统 SubSystem 基于ssh来实现的
要创建ftps 先要创建CA(私有CA)给vsftpd发证书 然后配置vsftpd
开启: ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=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_cert.pem
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem
配置CA:(可以脚本创建)
cd /etc/pki/CA
mkdir certs newcerts crl
touch index.txt (创建数据库文件)
echo 01 > serial (创建证书序列文件)
创建CA私钥
[root@localhost CA]# umask 077 ; openssl genrsa -out private/cakey.pem 2048 Generating RSA private key, 2048 bit long modulus .................................................+++ ..................+++ e is 65537 (0x10001)
生成自签证书
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem 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) []:CQ Locality Name (eg, city) [Default City]:YB Organization Name (eg, company) [Default Company Ltd]:GAN Organizational Unit Name (eg, section) []:Test Common Name (eg, your name or your server's hostname) []:localhost Email Address []:
创建vsftpd私钥
[root@localhost ssl]# umask 077;openssl genrsa -out vsftpd.key 2048 Generating RSA private key, 2048 bit long modulus ....+++ ...................................................+++ e is 65537 (0x10001)
创建vsftpd证书申请
[root@localhost ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr
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) []:CQ Locality Name (eg, city) [Default City]:YB Organization Name (eg, company) [Default Company Ltd]:GAN Organizational Unit Name (eg, section) []:vsftpd Common Name (eg, your name or your server's hostname) []:localhost Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
为vsftpd颁发证书
[root@localhost ssl]# openssl ca -in vsftpd.csr -out vsftpd.crt Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: May 14 06:18:58 2017 GMT Not After : May 14 06:18:58 2018 GMT Subject: countryName = CN stateOrProvinceName = CQ organizationName = GAN organizationalUnitName = vsftpd commonName = localhost X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 3F:AB:15:73:FC:E5:EF:79:1C:02:DD:F4:D9:2D:00:CC:1C:9E:FF:D4 X509v3 Authority Key Identifier: keyid:92:C0:F6:6F:46:E3:67:E1:F8:68:20:36:F0:97:19:EC:28:E0:40:F5 Certificate is to be certified until May 14 06:18:58 2018 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
编辑vsftpd配置文件,加入或开启
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=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_cert.pem
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem
Fillzilla和FlashFXP验证证书生效
虚拟用户:
其他:vsftpd虚拟用户和本地用户不能共存的解决方法
按正常情况配置添加完虚拟用户发现:虚拟用户和本地用户不能共存,即虚拟用户可以登录ftp,但是本地用户不能登录的ftp,在看众多教程中完全没有提到/etc/pam.d/vsftpd里面为什么要这样写,配置完后虚拟用户可以登录,而本地用户包含被映射的用户不能登录那应该是pam验证的时候就没有给本地用户过。搜索PAM相关资料,发现如果把/etc/pam.d/vsftpd 中的
auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd
注释掉,然后把里面其它的内容都打开注释(网上大部分教程教建立虚拟用户时,都说把上面两句加入/etc/pam.d/vsftpd中,然后把里面的其它东 西注释掉),这时候再尝试,发现本地用户能登录,但是虚拟用户的验证又去掉了,这也证明了是pam模块认证的问题让虚拟用户和本地用户不能共存。
所以就去了解了一下pam配置的内 容,如下网址:http://www.ibm.com/developerworks/cn/linux/l-pam/
里面提到:
Required: 堆栈中的所有Required需要所有的内容都满足才行,当我们前两条配置虚拟用户登录验证通过后,继续向下面配置条目验证,验证是否是本地用户结果发现不是,又因为,验证本地用户的control_flag也为required 所以这时候 就会返回错误,也即是验证不成功,所以我们不能同时设置虚拟用户和本地用户的control_flag为required 按照上面说的
sufficient:如果标记为sufficient 的模块成功并且先前没有 required 或者sufficient模块失败,则忽略堆栈中的所有其余模块并返回成功,我们可以把虚拟用户的验证配置放在最前面,且把control_flag设置为sufficient 这样的话如果遇到事虚拟用户,那么验证可以通过如果是本地用户 忽略掉sufficient的两条配置规则 只要满足required就行,所以也能同过验证
如下为/etc/pam.d/vsftpd的内容
#%PAM-1.0
auth sufficient pam_userdb.so db=XXXXXX
account suffficient pam_userfb.so db=XXXX
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftp/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
上面两行为后面加上 虚拟用户pam认证需要的配置条目 下面为原来的vsftpd的认证配置规则可以看到 本地用户的是password-auth 从这里可以看出如果需要虚拟用户和本地用户共存 两部分都不能注释 。
PAM: 每行分三个字段:类别(type) 控制标识(flag) 模块与参数
类别分四种:
auth:认证;authentication主要用来检验使用者身份,通常需要密码检验,所以一般后续接的模块是用来验证用户身份
account:大部分是进行授权authorization,验证使用者是否具有正确的权限,当使用一个过期的密码,就无法正确登录了
session:使用者在登录或者有效期间,PAM给的环境设定
password:密码,主要在提供验证的修订工作,修改变更密码
一般是有顺序的,先要验证(auth)身份后,系统才能够由用户的身份给予权限(account)设定,而会话期间与注销期间也才需要记录登入和注销的信息(session),如果在运作期间需要密码修订,才会有(password)的类别
控制标识分四中
required:若验证成功,则带有success的标志,若失败则带有failure标志,但不论成功或者失败都会继续向后的验证流程,由于后续的验证流程可以继续,因此相当有利于资料的登录(log)
requisite:若失败则立即返回原程序failure标志,终止后续的验证,若成功,则带有success的标志继续后续的验证
sufficient:若成功,立即返回原程序success,并终止后续的验证流程,若失败则带有failure标志后继续验证后面的流程和requisite相反
optional:目的大多是在显示信息,并不用在验证方面
基于Berkerley DB的虚拟用户的实例
创建虚拟用户的根目录
[root@localhost ~]# mkdir /var/virtul_user_dir
创建被虚拟用户映射的本地用户
[root@localhost ~]# useradd -d /var/virtul_user_dir/ -s /sbin/nologin virtual useradd: warning: the home directory already exists. Not copying any file from skel directory into it.
创建虚拟用户清单
[root@localhost vsftpd]# umask 077;touch virtual_user_list
利用db_load将清单列表转换成用户数据库
[root@localhost vsftpd]# db_load -T -t hash -f virtual_user_list virtual_user_list.db
编辑vsftpd主配置文件,启用虚拟用户,添加或者启用下列选项:
guest_enable=YES guest_username=virtual user_config_dir=/etc/vsftpd/virtual_user_conf
创建虚拟用户配置文件目录
[root@localhost vsftpd]# mkdir virtual_user_conf
分别创建每个虚拟用户的配置文件
[root@localhost virtual_user_conf]# touch user1 user2 user3
配置PAM认证:
#%PAM-1.0 # auth sufficient pam_userdb.so db=/etc/vsdtpd/virtual_user_list account sufficient pam_userdb.so db=/etc/vsdtpd/virtual_user_list session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
至此,虚拟用户和本地用户及匿名用户都可分开控制登录,可结合ssl/tls加密传输和登录过程
基于MySQL数据库的虚拟用户的实例:
安装mysql-server,mysql-devel等
[root@localhost ~]# rpm -qa|grep mysql mysql-5.1.73-8.el6_8.x86_64 mysql-libs-5.1.73-8.el6_8.x86_64 mysql-devel-5.1.73-8.el6_8.x86_64 mysql-server-5.1.73-8.el6_8.x86_64 [root@localhost ~]# rpm -qa|grep pam pam_passwdqc-1.0.5-8.el6.x86_64 pam_krb5-2.3.11-9.el6.x86_64 gnome-keyring-pam-2.28.2-8.el6_3.x86_64 pam-1.1.1-20.el6.x86_64 fprintd-pam-0.1-22.git04fd09cfa.el6.x86_64 pam-devel-1.1.1-20.el6.x86_64
编译安装pam_mysql模块
[root@localhost ~]# tar xvf pam_mysql-0.7RC1.tar.gz [root@localhost ~]# cd pam_mysql-0.7RC1 [root@localhost pam_mysql-0.7RC1]# ./configure --with-openssl --with-pam-mods-dir=/lib64/security/ [root@localhost pam_mysql-0.7RC1]# make && make install [root@localhost pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql* -rwxr-xr-x. 1 root root 874 May 14 20:43 /lib64/security/pam_mysql.la -rwxr-xr-x. 1 root root 135902 May 14 20:43 /lib64/security/pam_mysql.so
创建ftpuser用户数据库,授权查询,插入用户记录
[root@localhost pam_mysql-0.7RC1]# service mysqld start [root@localhost pam_mysql-0.7RC1]# mysql -uroot mysql> create database vsftp; mysql> create table ftpusers( -> id smallint auto_increment not null, -> name char(20) binary not null, -> password char(48) binary not null, -> primary key (id)) -> ; mysql> desc ftpusers; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | id | smallint(6) | NO | PRI | NULL | auto_increment | | name | char(20) | NO | | NULL | | | password | char(48) | NO | | NULL | | +----------+-------------+------+-----+---------+----------------+ mysql> grant select on vsftp.* to virtual@localhost identified by 'virtual'; Query OK, 0 rows affected (0.00 sec) mysql> grant select on vsftp.* to virtual@127.0.0.1 identified by 'virtual'; Query OK, 0 rows affected (0.00 sec) mysql> insert into ftpusers (name,password) value ('tom',password('tom')),('jerry',password('jerry')); mysql> select * from ftpusers; +----+-------+-------------------------------------------+ | id | name | password | +----+-------+-------------------------------------------+ | 1 | tom | *71FF744436C7EA1B954F6276121DB5D2BF68FC07 | | 2 | jerry | *09FB9E6E2AA0750E9D8A8D22B6AA8D86C85BF3D0 | +----+-------+-------------------------------------------+
mysql> flush privileges;
重新再修改PAM认证配置文件
#%PAM-1.0 # auth sufficient pam_mysql.so user=virtual passwd=virtual host=localhost db=vsftp table=ftpusers usercolumn=name passwdcolumn=password crypt=0 account sufficient pam_mysql.so user=virtual passwd=virtual host=localhost db=vsftp table=ftpusers usercolumn=name passwdcolumn=password crypt=0 auth sufficient pam_userdb.so db=/etc/vsftpd/virtual_user_list account sufficient pam_userdb.so db=/etc/vsftpd/virtual_user_list session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
此时需注意crypto=后面的值,在pam_mysql-0.7RC1的README指出其意义:
crypt (plain)
The method to encrypt the user's password:
0 (or "plain") = No encryption. Passwords stored in plaintext.
HIGHLY DISCOURAGED.
1 (or "Y") = Use crypt(3) function.
2 (or "mysql") = Use MySQL PASSWORD() function. It is possible
that the encryption function used by PAM-MySQL
is different from that of the MySQL server, as
PAM-MySQL uses the function defined in MySQL's
C-client API instead of using PASSWORD() SQL function
in the query.
3 (or "md5") = Use plain hex MD5.
4 (or "sha1") = Use plain hex SHA1.
设置不当可能导致mysql查询失败
至此,虚拟用户,匿名用户,本地用户,通过系统自带BerkerleyDB或MySQL+PAM认证,传输加密,权限分别定义得到实现
注意: 当开启虚拟用户的时候,本地用户登录也默认到了被虚拟用户映射的本地用户的家目录。。