解析Linux下vsFTP安全认证

2018-03-03 18:11
网络安全和信息化 2018年9期
关键词:配置文件命令账户

基本的用户安全管理功能

vsFTP是基于PAM进行用户的安全认证的,如果让其支持虚拟用户,就必须修改PAM配置文件。PAM本身其实是一个框架,支持的认证机制很丰富,对应的认证模块也很多,允许用户灵活的定制所需的认证机制。

PAM需要依靠“/etc/pam.d”目录下的各种配置文件,以及在“/lib/security”或“/lib64/security”目录下的认证模块信息。vsFTP是安全性很高的FTP,对文件权限的检测很严格。在默认情况下,使用“/var/ftp”目录作为FTP根目录。该目录只允许Root账户有写权限,而对于“vsftpd”进程来说,对应的是“FTP”账户不具有写权限。

为了满足文件上传要求,只能在该目录中创建子目录,用来让用户上传文件。例如在“/var/ftp/pub”目录中存储公开的文件。vsFTP的安装很简单,执行“yum install vsftpd”命令安装。执行“service vsftpd start”、“chkconfig vsftpd on”命令启动vsFTP服务。vsFTP的用户类型包括anonyous匿名用户、系统用户和虚拟用户三类,实际上不管哪一类,都需要映射为与之对应的系统用户。例如匿名用户会被映射为“FTP”用户。每个用户都对应各自的家目录,例如执行“finger ftp”命令,可以看到FTP用户对应的是“/var/ftp”目录。进入“/etc/vsftpd”目录,执行“vim vsftpd.conf”命令,打开vsFTP配置文件。

在“anonymous=”和“local_enable=”栏中可以设置是否开启匿名和系统用户。为保证可以执行写操作,需要事先 执行“setenforce 0”命令将Selinux关闭。在“write_enable=”栏中设置是否允许利用系统账户上传文件。在“anon_upload_enable=”栏中设置是否允许匿名用户上传文件。

注意,执行“ps aux|grep vsftpd”命令,可以看到vsFTPS进程是以FTP用户身份运行。

执行“ls -ld /var/ftp/”命令,显示该目录属主为Root账户。对于匿名用户来说,虽然允许其上传文件,但是还必须开放文件写权限。执行“mkdir /var/ftp/uploadfile”、“setfacl-m u:ftp:rwx /var/ftp/uploadfile/”命令,为FTP用户创建名为“uploadfile”的目录,并开放写权限。这样,匿名用户就可以向该目录上传文件了。

注意,对于匿名用户来说,无法删除文件和创建目录操作,除非将“anon_mkdir_write_enable=”和“anon_other_write_enable=”的值均设置为“Yes”。

为防止以系统用户身份登录FTP后,在系统中随意切换目录,必须禁锢在其家目录中。需要删除“chroot_list_enable=Yes”和“chroot_list_ file=/etc/vsftpd/chroot_list”两行前面的“#”号激活。在“/etc/vsftpd”目录下执行“touch chroot_list”命令,创建“chroot_list”文件。执行“vim chroot_list”命令进行编辑,在其中添加需要禁锢的所有用户名(例如“ftpuser”等),执行“service vsftpd restart”命令重启vsFTP,这样当使用预设的用户登录FTP后,就只能在其家目录中活动。如果希望禁锢所有的用户,可以编辑“vsftpd.conf”文件,将上述指令前面恢复“#”号禁用,之后添加“chroot_local_user=Yes”行即可。

默认情况下在“/etc/vsftpd”目录下执行“cat ftpusers”命令打开该文件,存储在其中的所有用户(例如 root、daemon、operator等)均禁止访问vsFTP服务。这是因为vsFTP的用户认证机制受到PAM控制,执行“cat/etc/pam.d/vsftpd”命令,打开对应的PAM认证文件,可以看到其中包含“auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr= succeed”行,表示对于“ftpusers”文件中的所有账户的敏感度为拒绝状态,自然无法正常访问FTP服务了。在vsFTP配置文件中 的“userlist_enable=”的值为“Yes”,意味着当在“/etc/vsftpd”目录下打开“user_list”文件,其中的用户也是无法访问vsFTP的。只有将该文件中的所有用户名清空,上述“ftpusers”文件才真正拥有控制vsFTP的用户访问功能。

如果在vsFTP配置文件中添加“userlist_deny=No”行,则刚好相反,表示仅仅允许“user_list”文件中的用户访问vdFTP服务,如果修改 为“userlist_deny=yes”行,则禁止该文件中的用户访问,这就实现了黑白名单功能。为了控制vsFTP的资源访问机制,可以在配置文件中的“max_clients=”和“max_per_ip=”栏分别定制许可的客户端连接数及每个客户IP运行连接的最大值。

使用证书加密FTP数据传输

因为FTP协议是以明文传输的,因此使用抓包命令可以很容易捕获密码等敏感信息。

为了保护vsFTP的数据传输安全,就需要进行加密处理。vsFTP支持两种安全通讯方式,包括FTPS和SFTP。前一种采用FTP加SSL或TLS的机制。后一种是基于SSH来实现安全的FTP传输功能。在OPenSSH中提供了名为SubSystem的子模块,可以实现SFTP功能。

要想让vsFTP支持基于FTPS的安全通信方式,首先需要创建一张证书,即私有CA,让其给vsFTP颁发一张证书,之后在vsFTP配置文件中启用相关指令即可。

执行“cd /etc/pki/CA”命令,进入目标路径。执行“mkdir certs newscerts crl”,“touch index.txt”、“echo 01 > serial”、“(umask 077;openssl genrsa -out private/cakey.pem 2048>)”命令,创建基于RAS的长度为2048的密钥。执行“openssl req-new -x509 -key private/cakey.pem -out cacert.pem-days 3650”命令,创建自签名证书,依次输入国家名称、州或省份名称、城市名、组织名等内容。

执行“mkdir /etc/vsftpd/ssl”、“cd /etc/vsftpd/ssl”、“(umask 077;openssl genrsa -out vsftpd.key 2048; )”命令,在目标路径下创建私钥。执行“openssl req -new -key vsftpd.key -out vsftpd.csr”命令,生成证书颁发申请文件,根据提示信息依次输入国家名称、州或省份名称、城市名、组织名、组织单元名称等信息。执行“vim/etc/pki/tls/openssl.cnf/”命令,将该配置文件中的“dir=../../CA”修改为“dir=/etc/pki/CA”。执行“openssl ca -in vsftpd.csr -out vsftpd.crt”命令,在提示栏中依次输入“Y”完成证书签署操作。

进入“/etc/vsftpd”目录,执行“vim vsftpd.conf”文件,在其中添加“ssl_enable=Yes” 行,启动SSL加密功能。添加“ssl_tlsv1=Yes” 和“ssl_sslv3=Yes”行,使其支持TLS V1和SSL V3协议。添加“allow_anno_ssl=No”行,禁止匿名用户使用加密传输。添加“force_local_data_ssl_=Yes”和“force_local_logins_ssl=Yes”行,强制本地用户在登录和传输数据时,必须使用SSL加密协议。添加“rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.crt”,“rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.key”行,分别指定RSA格式的证书和密钥文件路径。保存该文件,并重启vsFTP服务使上述配置生效。

这样,使用非匿名账户无法使用“FTP”命令进行登录,这就需要使用特定的FTP客户端来实现安全传输。例如使用CuteFTP、FileZilla、FlashFXP等。

使用MySQL实现安全认证

前面谈到,vsFTP支持匿名、本地和虚拟用户。对于虚拟用户来说,最重要的是存储用户账户信息的方法。当然,其存储格式必须能够被认证功能支持。

例如,在MySQL中创建名为vsFTP的数据库,其中包含名为“nmyh”的表,在该表中包含名为“Name”和“Mima”的字段。之后将匿名用户信息存储在该表中,当进行vsFTP认证时,只要能让其去查询该表中的信息,如果客户端输入的账户名和密码域该表中的对应行匹配,即可完成认证操作。当然,也可以采取其他合适的用户信息存储方式。

例 如,在“/etc/vsftp/目录中创建名为“nmuser”的文本文件,在其中一行存储用户名,一行存储对应的密码。这样,可以将所有的匿名用户信息存储在该文件中。之后使用“db4_utils”工具中的“db_load”之类的命令,将该文件转换为二进制格式。使用该文件也可以实现vsFTP认证功能,当然,vsFTP的认证其实是基于PAM来实现的,这样就必须修改对应的PAM文件才可以实现上述虚拟用户认证功能。

这里就以使用MySQL数据库实现认证为例进行说明,首先需要安装MySQL数据库和开发环境,具体操作起来并不复杂,执行“yum-y install mysql -server mysql -devel”、“yum -y groupinstall "Development Libraries"”命令即可,这里就不再赘述。

之后需要安装名为“PAM_MySQL”模块。执行“tar zxvf pam_mysql-0.7rc1.tar.gz”、“cd pam_mysql-0.7rc1”、“./configure-with-mysql=/usrl --withopenssl”、“make”、“make install”、“cp /usr/lib/security/pam_mysql.so /lib/security/”等命令,来安装该模块。接下来需要手动编译安装vsFTP,执行“mkdir -pv /usr/share/empty /var/ftp”、“useradd-s /bin/false -d /var/ftp ftp”、“tar xzvf vsftpd-x.x.x.tar.gz”、“cd vsftp-x.x.x”、“make”、“make install”等命令,执行vsFTP的手动编译安装。执行“cp vsftp.conf /etc”、“vim /etc/vsftpd.conf”命令,在vsFTP配置文件中添加“listen=yes”项,使vsFTP进程处于独立运行状态。

执行“/usr/local/sbin/vsftpd &”、“chmod og-w /var/ftp”命令,来启动vsFTP服务。连接到MySQL操作环境,执行“create database vsftp;”命令,创建名为“vsftp”的数据库,执行“grant select on vsftp.*to vsftpd@localhost identified by 'vsftpd';”、“grant select on vsftp.*to vsftpd@127.0.0.1 identified by 'vsftpd';”命令,授权给名为“vsftpd”的用户进行访问,该用密码为“vsftpd”,该账户可以在Linux中手动建立。执行“use vsftp;”、“create table nmyh(id SAMLLINT AUTO_INCREMENT NOT NULL ,name CHAR(20) BINARY NOT NULL,mima CHAR(50) BINARY NOT NULL ,PRIMARY key(id))”命令,创建名为“nmyh”的表,其中存在名为“name”和“mima”的字段,用来存储匿名用户信息。

执行“insertinto nmyh(name,mima)values('ftpuser1','123456');”、“insert into nmyh(name,mima)values('ftpuser2','123456');”命令插入两个用户信息,名称分别为“ftpuser1”和“ftpuser2”。密码均为“123456”。执行“select*from nmyh;”命令,来查看该表中的内容。执行“mysql -uvsftpd -p”命令,以“vsftpd”账户连接MySQL,输入密码后可以正常查看上述数据库。因为上面只为其设置了Select权限。仅仅有匿名用户信息还不够,必须修改用来进行PAM认证的文件。

执行“vim /etc/pam.d/vsftp.mysql”命令,在该配置文件中添加“auth require /lib/security/pam_mysql.so user=vsftpd password=vsftpd usercolume=name passwordcolume=mimacrypt=0”、“account require/lib/security/pam_mysql.so user=vsftpd password=vsftpd host=localhost db=vsftp table=nmyh usercolumn=name pass wordcolumn=mima crypt=0”等行内容。表示当登录vsFTP服务器时必须满足“pam_mysql.so”模块的检查,即从上述MySQL数据表中匹配客户端输入的用户名和密码。在Linux提示符下执行“useradd -s /sbin/nologin -d /var/ftp2 vuser”、“chmod go+rx/var/ftp2”命令,创建名为“vuser”的账户,并设定该账户对应的家目录,并允许其他用户读取和执行其家目录的权限。当然该账户无法正常登录系统。

对vsFTP的配置文件“/etc/vsftpd.conf” 进行修改,设置“anonyous_enable=Yes”、“local_enable=Yes”、“write_enable=Yes”、“anon_upload _enable=Yes”、“anon_mkdir_write_enable=Yes”、“anon_other_mkdir_write_enable=Yes”、“chroot_local_user=Yes”、“guest_enable=Yes”、“guest_username=vuser”、“listen=Yes”,“pam_service_name=vsftpd.mysql”等行,允许来宾账户进行访问。并将来宾账户映射为“vuser”用户,使PAM认证服务使用自定义的“vsftpd.mysql”文件。之后执行“service vsftpd restart”命令重启vsFTP。客户端执行“ftp xxx.xxx.xxx.xxx”命令,即可用上述“nmyh”表中的用户进行登录了。在上述配置文件中允许用户对FTP路径具有读写操作,所以当使用虚拟账户登录后,执行的指令均被匿名用户进行匹配,可以上传下载文件。

控制匿名用户访问权限

当然,针对不同的虚拟账户可设置不同的权限。打开vsFTP的配置文件“/etc/vsftpd/vsftpd.conf”, 添加“user_config_dir=/etc/vsftpd/vusers”行设置用户配置目录。执行“mkdir /etc/vsftpd/vusers”命令创建该目录。执行“cd /etc/vsftpd/vusers”命令进入该目录,为每一个匿名用户创建同名文件。

执行“vi ftpuser1”命令,在该文件中设置“anon_upload_enable=Yes”、“anon_mkdir_write_enable=Yes”和“anon_other_write_enable=Yes”项,允许上传、下载和删除文件,如果设置为“anon_upload_enable=No”、“anon_mkdir_write_enable=No”和“anon_other_write_enable=No”项,则禁止该用户上传、下载和删除文件。

猜你喜欢
配置文件命令账户
只听主人的命令
从Windows 10中删除所有网络配置文件
如何切换Windows 10本地账户与微软账户
互不干涉混用Chromium Edge
探索自由贸易账户体系创新应用
外汇账户相关业务
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
父亲的股票账户
移防命令下达后