一、vsftp
介绍
vsftp是基于GPL发布的FTP服务器软件。
一个是数据端口,一个是控制端口,控制端口一般为21。
而数据端口不一定是20,这和FTP的应用模式有关,如果是主动模式,应该为20,如果为被动模式,由服务器端和客户端协商而定
centos7 安装vsftpd后,默认为被动模式(pasv_enable=YES),允许匿名用户(anonymous)登陆。
安装
yum -y install vsftpd
配置文件vsftpd.conf详解
- 允许匿名用户读写
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
- 允许本地用户登录
local_enable=YES
local_mask=022
- 记录日志
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
- 定制欢迎信息
dirmessage_enable=YES
ftpd_banner=Welcome to chenlf FTP service
chown_username=username #是否改变上传文件的属主,如果是则输入一个系统用户名
- chroot
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list #是否将系统用户限制在自己的home目录下,如果chroot_local_user选择了yes,那么chroot_list_file中列出的是不chroot的用户列表
max_clients=NUMBER #最大用户访问数
- port 设定
connect_from_port_20
如果设为YES,则强制ftp-data的数据传送使用port 20
ftp_data_port
设定ftp数据联机所使用的port,默认为20
listen_port
ftp server 监听的端口,默认为21
pasv_enable 被动模式,默认为YES
pasv_max_port
pasv_min_port
- 更换档案所有权
chown_uploads 用户 YES/NO
若启动,所有匿名上传数据的拥有者被更改为chown_username所设定的使用者。
chown_username
- guest 设定
guest_enable
若启用这项功能,所有非匿名用户登陆者都视为guest,默认关闭
guest_username
定义guest的使用者名称,默认为ftp
- 用户限制文件
用户控制文件vsftpd.ftpusers,所有出现在此文件中的用户就不可以通过ftp登录系统
另一个用户控制文件vsftpd.user_list,当在vsftpd.conf文件中定义了userlist_enable=YES,它才会生效。
userlist_deny=YES(默认),在vsftpd.user_list中定义的用户不可以使用ftp;
当定义了userlist_deny=NO,只有在vsftpd.user_list文件中定义的用户可以使用ftp
- 一般启动vsftp时,我们只会看到一个名为vsftpd的进程运行,但若希望每一个联机都能以独立的进程来呈现,则:
setproctitle_enable=YES
- 限制传输档案的速度
anon_max_rate=50000 #限制匿名用户50KB/s
local_max_rate=200000 #限制本地用户200KB/s
- 针对不同的用户限制速度
新增一行:
user_config_dir=/etc/vsftpd/userconf
新建目录:
mkdir /etc/vsftpd/userconf
在这个目录下新增名为用户名的文件test1,test2
在test1文件中加入一行:
local_max_rate=25000
在test2文件中加入一行:
local_max_rate=30000
- 建立一个防火墙下的ftp
使用PORT FTP mode:
iptables -A INPUT -p tcp -m multiport --dport 21,20 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
这样配置后fpt客户端联机方式不能选择passive mode,否则无法建立数据联机,也就是说客户端
可以连上ftp server 但是执行ls get等指令,便无法操作
使用PASS FTP mode:ftp port 21,ftp-data port :9981到9985
iptables -A INPUT -p tcp -m multiport --dport 21,9981,9982,9983,9984,9985 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
修改vsftpd.conf文件:
listen_port=21
pasv_enable=YES
pasv_min_port=9981
pasv_max_port=9985
这样配置后ftp client联机方式只能选择passvive mode
vsftp 配置虚拟用户
- 配置文件修改
anonymous_enable=NO #禁止匿名用户访问
chroot_list_enable=YES # 限定用户不可以离开主目录
chroot_list_file=/etc/vsftpd/chroot_list
local_enable=YES #本地用户是否可以访问 注:如果为NO 则所有虚拟用户都将不能访问原因:虚拟用户访问在主机上其实是以本地ftp用户访问的
pam_service_name=vsftpd #pam认证文件名在/etc/pam.d/vsftpd
guest_enable=YES #启用虚拟用户功能
guest_username=ftp # 指定虚拟用户的宿主用户 –centos 里面已经有内置的ftp用户了(注:此用户在chroot_list_file=/etc/vsftpd/chroot_list文件里所指定的用户)
user_config_dir=/etc/vsftpd/vuser_conf #设置虚拟用户个人vsftp的服务配置文件
- 查看是否安装 db4 db4-utils
[root@localhost ~]#rpm -qa|grep db4 运行后出现下面内容 说明已经安装可以使用db_load命令(主要是 db4-utils)
db4-devel-4.3.29-10.el5_5.2
db4-4.3.29-10.el5_5.2
db4-devel-4.3.29-10.el5_5.2
db4-4.3.29-10.el5_5.2
db4-tcl-4.3.29-10.el5_5.2
db4-utils-4.3.29-10.el5_5.2
[root@localhost ~]#
如果没安装则要安装db4-utils
[root@localhost ~]#yum -y install db4-utils
- 创建 chroot_list_file=/etc/vsftpd/chroot_list文件
touch /etc/vsftpd/chroot_list
echo ftp >> /etc/vsftpd/chroot_list #(此处ftp 也要是/etc/vsftpd/vsftpd.conf中的guest_username的值)
- 创建虚拟用户目录(密码文本)
[root@localhost ~]#vi /etc/vsftpd/vftpuser.txtx (奇数行为用户名 ,偶数行为密码)
本文中添加如下(用cat 命令查看)
[root@localhost ~]#cat /etc/vsftpd/vftpuser.txtx
hope
hope
- 生成虚拟用户的db文件
[root@localhost ~]#db_load -T -t hash -f /etc/vsftpd/vftpuser.txtx /etc/vsftpd/vftpuser.db
- 生成虚拟用户的认证文件
[root@localhostvsftpd]# vi /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=denyfile=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include system-auth
account include system-auth
session include system-auth
session required pam_loginuid.so
注释掉/etc/pam.d/vsftpd中所有的内容 反正已经不要本地用户的认证了
特别注意 以下区别
32位系统增加以下两句:
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser
64位系统增加以下两句:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account required /lib64/security/pam_userdb.sodb=/etc/vsftpd/vftpuser
这里我发现加了db后缀以后就不识别数据库了
注:db=/etc/vsftpd/vftpuser 中的vftpuser 是你生成的虚拟用户的db文件
- 创建每个虚拟用户自己的配置文件
配置文件的路径是 /etc/vsftpd/vsftpd.conf 中的
user_config_dir=/etc/vsftpd/vuser_conf路径
在 /etc/vsftpd/vuser_conf/下D面创建以用户名为名称的文件(名称是/etc/vsftpd/vftpuser.txtx 下面的奇数行)
[root@localhostvsftpd]# mkdir vuser_conf
[root@localhostvsftpd]# vi /etc/vsftpd/vuser_conf/hope
内容如下
local_root=/var/www(虚拟用户的根目录根据实际修改)
write_enable=YES (可写)
allow_writeable_chroot=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
by default, virtual users are treated with anonymous (i.e. maxi-mally restricted) privilege.
默认情况下,匿名用户所有上传下载,所使用的用户都是ftp用户的权限,若要上传文件,则需要ftp用户有写的权限,若要下载,则需要ftp用户有读的权限,也就是说一般情况下,ftp用户对文件有读权限就对文件有下载权限了文件有三种权限,文件所有人,文件所有组,文件的其他人,这个anon_world_readable_only参数意思是,当他为YES时候,文件的其他人必须有读的权限才允许下载,单单所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载,这是为安全性的一方面考虑,若为NO则只要ftp用户对文件有读权限即可下载
- 给文夹权限(否则不能上传 权限可自定 本人给的是 777)
[root@localhostvsftpd]# chmod 777 /var/www/
- 重启vsftpd
[root@localhostvsftpd]# systemctl restart vsftpd
ftp数字代码意义
110 重新启动标记应答
120 服务在多久时间内ready
125 数据链路埠开启,准备传送
150 文件状态正常,开启数据连接端口
200 命令执行成功
202 命令执行失败
211 系统状态或是系统求助响应
212 目录的状态
213 文件的状态
214 求助的讯息
215 名称系统类型
220 新的联机服务ready
221 服务的控制连接已关闭,可以注销
225 数据连接开启,但无传输动作
226 关闭数据端口,请求的文件操作成功
227 进入passive mode
230 使用者登入
250 请求的文件操作完成
257 显示目前的路径名称
331 用户名称正确,需要密码
332 登入时需要账号信息
350 请求的操作需要进一步的命令
421 无法提供服务,关闭控制连接
425 无法开启数据链路
426 关闭联机,终止传输
450 请求的操作未执行
451 命令终止,有本地的错误
452 未执行的命令,磁盘空间不足
500 格式错误,无法识别命令
501 参数语法错误
502 命令执行失败
503 命令顺序错误
504 命令所接的参数不正确
530 未登入
532 储存文件需要账户登入
550 未执行请求的操作
551 请求的命令终止,类型未知
552 请求的文件终止,储存位溢出
553 未执行请求的命令,名称不正确
二、sftp
sftp有以下优点
- 从安全方面看,sftp会更安全一点
- 线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动
- 用户只能使用sftp,不能ssh到机器进行操作
配置步骤
- 创建sftp服务用户组,创建sftp服务根目录
groupadd sftp
#此目录及上级目录的所有者必须为root,权限不高于755,此目录的组最好设定为sftp
mkdir /data/sftp
chown -R root:sftp /data/sftp
chmod -R 0755 /data/sftp
- 修改sshd配置文件
cp /etc/ssh/{sshd_config,_bk} #备份配置文件
vi /etc/ssh/sshd_config
注释掉/etc/ssh/sshd_config文件中的此行代码:
Subsystem sftp /usr/libexec/openssh/sftp-server
添加如下代码:
Port 2222
Subsystem sftp internal-sftp -l INFO -f AUTH
Match Group sftp
ChrootDirectory /data/sftp/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -l INFO -f AUTH
凡是在用户组sftp里的用户,都可以使用sftp服务;使用sftp服务连接上之后,可访问目录为/data/sftp/username
举个例子:
test是一个sftp组的用户,它通过sftp连接服务器上之后,只能看到/data/sftp/test目录下的内容
test2也是一个sftp组的用户,它通过sftp连接服务器之后,只能看到/data/sftp/test2目录下的内容
- 创建sftp用户
#创建test sftp家目录:test目录的所有者必须是root,组最好设定为sftp,权限不高于755
mkdir /data/sftp/test
chmod 0755 /data/sftp/test
chown root:sftp /data/sftp/test
useradd -g sftp -s /sbin/nologin test #添加用户,参数-s /sbin/nologin禁止用户通过命令行登录
- 在test目录下创建一个可以写的upload目录
mkdir /data/sftp/test/upload
chown -R test:sftp /data/sftp/test/upload
注:sftp服务的根目录的所有者必须是root,权限不能超过755(上级目录也必须遵循此规则),sftp的用户目录所有者也必须是root,且最高权限不能超过755。
- 启动sftp
systemctl restart sshd