文件服务:
安装开启服务前先关闭selinux,清空iptables策略。避免不必要的麻烦,服务开启后,配置一切正常有需要再根据情况开启。
ftp:应用层,C/S,跨主机的文件共享服务;file transfer protocol nfs,cifs:文件系统接口,网络文件系统;
nfs:network file system sun公司研发 cifs:common internet file system ,windows上的文件共享协议 linux使用samba实现cifs协议,是跨平台使用。 注意:nfs和cifs客户端可以使用mount命令将其挂载到本地系统之上。跟操作本地磁盘效果是一样的。
网络存储:
NAS:Network Attached Storage,文件服务器,nfs或cifs,文件级别; SAN:Storage Area Network,块级别共享服务,分区-->格式化-->创建文件系统;IPSAN, FCSAN;远程主机要使用就要先分区,格式化(创建文件系统),才能挂载。
vsftpd
ftp协议
file transfer protocol,21/tcp C/S: Client --> ftp-->Server Client:Connect Server:Listen 连接: 命令连接:命令传输,连接一直存在; 数据连接:数据传输,按需创建; 数据连接的建立模式: 主动模式:ftp服务器开启21和20两个端口,21命令端口,20为数据传输端口。连接建立时,会协商使用主动还是被动模式。如果时主动模式,则客户端会将自己的一个随机端口发送给服务端。 被动模式:协商为被动模式需要客户端将自己选定的随机端口发送给服务端,服务端使用一个随机端口发送数据给客户端端口。 注意:主动或被动传输模式,在实际网络环境,还是有区别的,用户端一般都是通过nat网络访问,服务器端也有防火墙。 数据传输模式: 文本格式:ASCII 二进制格式:BINARY 协议安全: 明文:数据、认证时传输账号和密码均是明文 ; 安全增强: ftp over ssl/tls:ftps ftp over ssh:sftp 使用虚拟用户账号;尽量不使用系统账号。 vsftpd默认开通系统账号。
应用实现
c/s: Server: Windows:Serv-U, IIS, ... 开源解决方案: wuftpd:Washington University ftp daemon vsftpd:Very Secure ftp daemon proftpd, pureftpd, ... 注意:vsftpd是红帽默认提供的ftp服务软件。 Client: GUI:flashfxp, cute, filezilla, gftp, ... CLI:ftp, lftp, ...
vsftpd
vsftpd: 程序环境: 主程序:/usr/sbin/vsftpd Unit File:/usr/lib/systemd/system/vsftpd.service 配置文件:/etc/vsftpd/vsftpd.conf /etc/vsftpd/ftpusers 这个文件默认是黑名单,名单中的系统用户都不能登录ftp
文档路径映射:
默认匿名用户的路径映射为ftp用户的家目录 系统用户的家目录为,系统用户自己的家目录 虚拟用户的家目录需要根据配置定义,映射到那个系统用户上,就使用那个为家目录 如果使用用户禁锢 chroot功能,则用户的根目录就时其家目录。
fedora, /home/fedora/pub/a.txt --> ftp://HOST:PORT/pub/a.txt 用户的家目录映射:访问vsftpd服务必须以某个系统用户的身份进行;此用户的家目录即为文档映射的根目录; 匿名用户:anonymous,映射为一个系统用户,此用户ftp; [root@centos7 ~]# ls /var/ftp/ pub [root@centos7 ~]# getent passwd ftp ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 匿名用户:不能上传文件,要上传也可以,但是不给其家目录授权写权限,可以给其下子目录授权写权限。
注意:文件共享类的权限,有两类权限,文件系统权限,服务权限。两者的交集,才可以使用户有权限。
setfacl -m u:ftp:rwx /var/ftp/upload/ 服务权限授权,修改vsftpd的主配置文件。 注意:vsftpd默认开启系统上的用户登录,可以在系统上不受约束。 selinux开启也有影响。 lftp yang@192.168.18.133:~> put /etc/fstab put: Access failed: 553 Could not create file. (fstab)####开启selinux不能上传文件。 lftp yang@192.168.18.133:~> put /etc/fstab ###服务器端关闭setenforce 0 1130 bytes transferred ####可以上传文件
实验:
安装vsftpd 在客户端系统上安装lftp和ftp lftp -u username,password 1.1.1.1 使用用户名和密码登录1.1.1.1的ftp服务器 使用ftp命令登录 交互式提示用户输入用户名和密码
配置:vsftpd.conf
directive VALUE,... directive:指令之前不能存在任何字符,包括空白; 匿名用户配置: anonymous_enable=YES ###是否开启匿名用户登录 anon_upload_enable=YES ###是否允许匿名用户上传文件,但是该目录需要先给ftp用户授权写权限,ftp服务仅仅是授权用户上传权限,没有删除权限,删除权限需要单独授权。 anon_mkdir_write_enable=YES ###是否允许匿名用户创建目录 anon_other_write_enable=YES ###是否开启用户的其他写权限。是否允许用户删除文件。 本地用户配置: local_enable=YES 是否开启系统用户 write_enable=YES 是否允许系统用户向自己的家目录写入文件。 默认开启了系统用户登录,用户可以在家目录和系统各目录之间切换。 认证服务: pam_service_name=vsftpd /etc/pam.d/vsftpd pam: pluggable authencate module 切换目录时的提示信息: dirmessage_enable=YES ##进入某个目录后的提示信息 目录下放置.messages文件 修改上传文件的属主: chown_uploads=YES chown_username=USERNAME
禁锢用户于自己的家目录:
会引入别的风险,因此,要求用户对自己的家目录不能有写权限; 系统用户控制: (1) 禁锢所有用户 chroot_local_user=YES (2) 禁锢部分用户 (a) 白名单:名单中的用户不被禁锢; chroot_local_user=YES chroot_list_enable=YES ##起用名单列表 chroot_list_file=/etc/vsftpd/chroot_list ##名单列表位置 (b) 黑名单:名单中的用户被禁锢 chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that # the user does not have write access to the top level directory within the # chroot) #chroot_local_user=YES #chroot_list_enable=YES # (default follows) #chroot_list_file=/etc/vsftpd/chroot_list 不允许用户对根目录有写权限(这里的根指的时用户的家目录),会带来安全风险,所以需要将禁止用户对家目录的文件系统的写权限。 但是还要用户能够上传文件等操作,就要在家目录下创建一个用户有写权限的目录。 注意:如果开启此选项,而用户还对自己的家目录有写权限,ftp服务将拒绝用户登录。除非将用户对家目录的写权限去掉。 一般使用系统用户登录ftp的用户,这类用户一般不让其使用ssh等,登录系统,仅作ftp认证使用。所以去掉用户家目录的写权限,对用户没什么影响。 [root@centos6 ~]# lftp -u yang,123qwe 192.168.18.133 lftp yang@192.168.18.133:~> ls ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
默认开启了系统用户登录,用户可以在家目录和系统各目录之间切换。 默认匿名用户被禁锢在/var/ftp目录下,此为其根目录。
用户控制列表(黑白名单)-定义那些用户能访问,那些用户不能访问ftp
默认使用黑名单控制
/etc/vsftpd/ftpusers ###这各是PAM中定义的不能访问ftp服务的用户列表 /etc/vsftpd/user_list ###这个是ftp服务自己定义的列表,可实现黑白名单的作用。 user_list控制用户访问vsftpd:默认使用黑名单控制。 (1) 白名单 userlist_enable=YES userlist_deny=NO ###不拒绝,则名单为白名单 要作为白名单使用,就要把/etc/vsftpd/user_list这个文件中的用户删掉 填入要加入白名单的用户 (2) 黑名单,默认 userlist_enable=YES userlist_deny=YES ###拒绝,则名单为黑名单 [root@centos7 ~]# cat /etc/vsftpd/user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied.
具体配置文件配置参数。参看man vsftpd.conf
例如控制用户上传下载的速率 服务最大并发连接数 max_clients 2000 允许同时连接客户端数 允许每个ip(客户端)的最大连接数 …
vsftp认证机制:
使用系统自带的pam模块认证。
配置文件中定义了pam认证。 /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd 这里使用的是相对路径,/etc/pam.d的相对路径。 /etc/pam.d/vsftpd [root@centos7 ~]# cat /etc/pam.d/vsftpd #%PAM-1.0 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
虚拟用户账号:
vsftpd登录方式:三种 匿名用户,系统账号(可以登录系统的用户),虚拟账号(与系统无关的自建的账号和密码) vsftpd依赖pam完成认证,pam存储支持的认证方式,vsftpd都可调用; 账号密码存储于何处? 文件、MySQL、ldap、redis、... pam_mysql模块 CentOS 6:epel CentOS 7:编译安装 编译: (1) 编译环境; (2) 依赖关系:mariadb-devel, pam-devel 服务于两个不同的服务,需要这个两个服务的开发包支持。才能编译安装。 下载pam源码解压 # ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security/ # make install
vsftpd使用mysql认证配置步骤
一、MySQL设置:
mysql> CREATE DATABASE vsftpd; mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'mageedu'; MariaDB [(none)]> flush privileges mysql> CREATE TABLE vsftpd.users (uid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY,name VARCHAR(100) NOT NULL PRIMARY KEY,password CHAR(48) NOT NULL); mysql> use vsftpd mysql> INSERT INTO users (name,password) VALUES ('tom',PASSWORD('mageedu')),('jerry',PASSWORD('mageedu')),('lucy',PASSWORD('mageedu')); MariaDB [vsftpd]> DESC user -> ; ERROR 1146 (42S02): Table 'vsftpd.user' doesn't exist MariaDB [vsftpd]> DESC users; +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | uid | smallint(5) unsigned | NO | UNI | NULL | auto_increment | | name | varchar(100) | NO | PRI | NULL | | | password | char(48) | NO | | NULL | | +----------+----------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) MariaDB [vsftpd]> select * from users; -> ; +-----+-------+-------------------------------------------+ | uid | name | password | +-----+-------+-------------------------------------------+ | 2 | jerry | *9A94EE7D14C10908118B62D2DA88E6932E11E438 | | 3 | lucy | *9A94EE7D14C10908118B62D2DA88E6932E11E438 | | 1 | tom | *9A94EE7D14C10908118B62D2DA88E6932E11E438 | +-----+-------+-------------------------------------------+ 3 rows in set (0.00 sec)
二、启用虚拟账号,映射为vuser
准备要映射成为的系统账号: # mkdir -pv /ftproot/{pub,upload} ###为虚拟账号创建家目录。登录ftp后的家目录。 # useradd -d /ftproot vuser ###但是家目录要给为刚创建的目录。随便创建一个用户 这样创建的用户对自己的家目录没有写权限。 # setfacl -m u:vuser:rwx /ftproot/upload ###给upload目录写权限。 配置vsftpd启用虚拟用户,并使用指定的pam service:修改/etc/vsftpd/vsftpd.conf配置文件 pam_service_name=vsftpd.mysql guest_enable=YES ###启用虚拟账号 guest_username=vuser ###将虚拟账号映射为vuser,刚创建的系统用户。 man vsftpd.conf guest_enable If enabled, all non-anonymous logins are classed as "guest" logins. A guest login is remapped to the user specified in the guest_username setting. Default: NO ##默认不开启使用虚拟用户,开启则将虚拟用户映射为系统用户,映射 为的系统用户由guest_username的值决定。 guest_username See the boolean setting guest_enable for a description of what ▽ constitutes a guest login. This setting is the real username which guest users are mapped to. Default: ftp ##默认将虚拟用户映射为ftp这个系统用户
三、重新定义一个pam文件,不再使用系统账号认证,而是使用mysql认证
准备基于mysql认证的pam配置文件:/etc/pam.d/vsftpd.mysql auth required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 注意:auth required 对登录的用户要做认证,使用mysql认证,使用刚才建好的mysql账号登录 ,访问的数据库vsftpd 表为users 用户名使用的字段为name 密码使用的字段为password 加密方式使用加密方式为2 (源码文件中自带README文件中介绍了pam支持的加密方式) account required做账号审计的,账号是否在有效期内等。 两个条件必须同时满足 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.
四、配置每虚拟用户拥有不同的权限:vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_conf chroot_local_user=YES 修改配置文件,禁锢用户 # mkdir /etc/vsftpd/vusers_conf # touch USERNAME 该配置文件功能强大,控制用户行为等。很多参数与/etc/vsftpd/vsftpd.conf的参数相同, 但是不是所有的参数都有效,有些设置是优先于用户配置的。 man vsftpd.conf user_config_dir This powerful option allows the override of any config option specified in the manual page, on a per-user basis. Usage is sim‐ ple, and is best illustrated with an example. If you set user_config_dir to be /etc/vsftpd/user_conf and then log on as the user "chris", then vsftpd will apply the settings in the file /etc/vsftpd/user_conf/chris for the duration of the session. The format of this file is as detailed in this manual page! PLEASE NOTE that not all settings are effective on a per-user basis. For example, many settings only prior to the user's session being started. Examples of settings which will not affect any behviour on a per-user basis include listen_address, banner_file, max_per_ip, max_clients, xferlog_file, etc. Default: (none) 为每个用户创建一个权限配置文件 配置用户权限--配置指令: anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
练习:完成vsftpd的配置,要求;
(1) 基于mysql认证; (2) 设定tom用户,密码为mageedu,有上传文件权限; (3) 上传路径为/upload/
总结: vsftpd 任何用户登录都要由家目录。 匿名用户的家目录默认为/var/ftp 系统用户的家目录为自己系统上家目录 启用虚拟用户,虚拟用户的家目录由配置文中配置的系统用户决定。 虚拟用户公用一个家目录。 支持为每个虚拟用户设立一个配置文件,配置用户账号行为等功能。
用户访问方式(认证方式) 默认是支持匿名用户,和系统用户登录 需要使用其他认证方式需要单独配置。要pam支持的方式,或有其支持pam模块软件。 允许将用户锁定在家目录 匿名用户锁定在/var/ftp/目录下 系统用户没做限制,可以任意切换目录。 用户禁锢,由黑白名单之分。可以控制那些用户禁锢那些用户不禁锢 用户访问授权(userlist)两种控制方式 pam定义和ftp服务定义的授权方式 /etc/vsftpd/ftpusers ###这各是PAM中定义的不能访问ftp服务的用户列表 /etc/vsftpd/user_list ###这个是ftp服务自己定义的列表,可实现黑白名单的作用。
配置服务前先关闭selinux和iptalbes以免引起不必要的错误。如需开启等服务调试完毕再开启。开启后进行测试,设置selinux或iptables
配置vsftpd服务过程中,配置文件错误可能导致服务不能启动,注意配置文件修改 /etc/vsftpd/vsftpd.conf
配置服务不能启动,注意查看 [root@centos7 ~]# systemctl status vsftpd.service 服务不能启动会有简要的提示。
配置mysql认证,用户不能登录问题 查看系统安全日志/var/log/security日志,有关于认证错误的日志。 查看是那个方面出了问题。是vsftpd本身的问题还是pam_mysql模块除了问题。 还是pam提示连接不上数据库。 连接不上数据库,可使用为vsftpd建的mysql账号本地登录(服务端主机上)测试。是否为账号问题。
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56560