FTP服务

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认证,传输加密,权限分别定义得到实现

注意: 当开启虚拟用户的时候,本地用户登录也默认到了被虚拟用户映射的本地用户的家目录。。

                                

  

         

     

          

         

原文地址:https://www.cnblogs.com/gandefeng/p/6838869.html