目录
一般网站开发,小企业都会要求在服务器上安装ftp,我这里使用常用vsfp,使用的是虚拟用户的,虚拟用户也是在指定的系统用户的基础上再进行更细粒度的细分而已。
1.安装vsftp
1.1 dnf安装vsftp
1.1.1 安装vsftp
在linux中FTP最常用的是vsftp,一般建立是基于虚拟用户,即是非linux真实用户来做,
直接复制下面命令即可:
#需要关闭防火墙,如果不关闭则需要添加端口例外,端口为21、5000至5100。
#需要关闭selinux
#------------------------------------------------------直接刷命令 开始--------------------
#1.安装vsftpd-3.0.3-28.el8
dnf -y install vsftpd
systemctl enable vsftpd
#2.基于虚拟用户的配置
cd /etc/vsftpd/
cp vsftpd.conf vsftpd.conf.orig
#写入配置文件含被动模式
cat>>vsftpd.conf<<EOF
#by hua
user_config_dir=/etc/vsftpd/vuser_conf
pasv_enable=YES
pasv_min_port=5000
pasv_max_port=5100
pasv_promiscuous=YES
#force_dot_files=yes
EOF
#3.进行认证,安装Berkeley DB工具
#centos7也可以用db4 db4-utils或libdb libdb-utils
#如果db_load命令不存在则安装
if [ ! -x /usr/bin/db_load ];then dnf install libdb libdb-utils -y;fi;
#创建用户密码文本,单行为用户名,双行为密码
cat>>vuser_passwd.txt<<EOF
t1
123456fa
EOF
#生成虚拟用户认证的db文件,如添加用户则需重新生成vuser_passwd.db然后重启vsftp
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.orig
echo '#%PAM-1.0' >/etc/pam.d/vsftpd
echo 'auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd'>>/etc/pam.d/vsftpd
echo 'account required pam_userdb.so db=/etc/vsftpd/vuser_passwd' >>/etc/pam.d/vsftpd
cat /etc/pam.d/vsftpd
#创建虚拟用户配置文件
mkdir /etc/vsftpd/vuser_conf
cd /etc/vsftpd/vuser_conf/
#下面建立t1账号配置,配置名和用户名一样,有多少个用户名就有多少个配置
cat>>t1<<EOF
local_root=/disk1/tools
local_umask=022
write_enable=YES
guest_enable=yes
guest_username=daemon
anonymous_enable=no
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_umask=002
file_open_mode=0774
EOF
#修改密码文件权限只有root可以读
chmod 600 /etc/vsftpd/vuser_passwd.txt
chmod 600 /etc/vsftpd/vuser_passwd.db
#为了安全禁止匿名用户登陆,如果发现问题可以去掉
sed -i '/anonymous_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf
grep 'anonymous_enable' /etc/vsftpd/vsftpd.conf
#vsftp版本3需要用到,2版本则不需要
echo 'allow_writeable_chroot=YES'>>/etc/vsftpd/vsftpd.conf
#重启vsftp
systemctl start vsftpd
mkdir -p /disk1/tools
chown daemon.daemon /disk1/tools
#------------------------------------------------直接刷命令 结束--------------------------
ps:关于隐藏文件
如要显示隐藏文件,如果不设置的话,可以用ftp客户端选项强制显示
如果开启以'.'开头的文件和目录会被列出来,即使没有使用a标记(ls -a),也就是显示隐藏文件,默认No
force_dot_files=yes
1.1.3 生成的目录结构及说明
刷新上面的安装命令,则会自动生成如下/etc/vsftpd目录,结构如下:
[root@vm81 /]# tree /etc/vsftpd/
/etc/vsftpd/
├── ftpusers #这里是系统用户,这里的用户不允许通过ftp登录,
├── user_list #用户列表userlist_deny为no仅充许此文件用户,yes(默认)则永不充许
├── vsftpd.conf #配置文件,一般不用动
├── vsftpd_conf_migrate.sh #移除旧配置文件
├── vsftpd.conf.orig #这个是对原配置文件进行备份
├── vuser_conf #这个经常用到,这个是用户配置目录,里面的文件名为用户名。
│ └── t1
├── vuser_passwd.db #这个是用户生成后的密码文件,用命令生成的
└── vuser_passwd.txt #这个是我生成的,主要是明文放用户名和密码的,密码文件是根据这个明文件生成的
1.1.4 用户配置文件相关参数说明
# 本地用户登陆后改变的目录,默认是各自家目录
local_root=/disk1/tools
# 本地用户的文件umask码
local_umask=022
# 本地用户写权限
write_enable=YES
是否启用虚拟用户
guest_enable=yes
# 指定本地用户名,用来映射虚拟用户
guest_username=daemon
是否允许匿名用户登陆
anonymous_enable=no
# 如果为YES,匿名用户只能下载可读的文件,如果为no则不能读
anon_world_readable_only=no
# 是否允许匿名用户上传文件,我上面配置匿名关了,所以所有操作都不充许
anon_upload_enable=yes
# 是否允许匿名用户创建目录,我上面配置匿名关了,所以所有操作都不充许
anon_mkdir_write_enable=yes
# 是否允许匿名用户对文件增、删、改,我上面配置匿名关了,所以所有操作都不充许
anon_other_write_enable=yes
#目录为777-值,文件为666-值,新建的目录 权限是755,文件的权限是 644
anon_umask=002
#强制指定上传文件权限为0774
file_open_mode=0774
有兴趣可以看一下《vsftp配置文件详解》
1.1.5 vsftp用户操作说明
以后如果需要往上面增删改操作如下:
#1 添加用户
1)往vuser_passwd.txt添加账号和密码
格式为:行号为单为账号,行号为双为密码
账号
密码
账号
密码
…
如添加名为账号为hua 密码为123456
vuser_passwd.txt文件变成这样:
t1
123456fa
hua
123456
2)vuser_conf添加用户配置文件
vuser_conf目录中已经有现成的t1,直接进行修改即可,配置文件名和账号名一样
cd /etc/vsftpd/vuser_conf/
cp t1 hua
3)生成密码文件并重启服务
#重新生成密码文件并重启vsftp
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
systemctl restart vsftpd
#2 删除用户
这个更简单了,打开vuser_passwd.txt删除账号和密码,然后删除vuser_conf对应以账号命令的用户配置文件
#3修改用户名或密码
打开vuser_passwd.txt找到对应的账号和密码进行修改,或者对vuser_conf对应以账号命令的用户配置文件进行修改,修改后需要执行如下命令重新生成密码文件并重启vsftp
#重新生成密码文件并重启vsftp
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
systemctl restart vsftpd
1.2 测试
我使用cuteftp使用IP进行连接,我这里使用内网IP 192.168.3.81,连接效果如下图:
因为目录为空目录,所以没有东西,我现在测试上传一下文件试下,如果能显示则正常,如下图:
有兴趣的也可以测试一下删除,点上图中已上传的1.htmlà右击“删除”
2.注意事项
2.1 每次修改必须生成一次密码并重启
每一次修改用户账号都必须生成一次密码vuser_passwd.db文件,否则不会生效!!
重启vsftp
#下面是操作命令!
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
systemctl restart vsftpd
2.2 使用guest_username指定系统用户
虚拟用户是基于系统用户的基础上,对权限再进行细分的,所以一定要指定系统用户,在配置文件中使用“guest_username=系统用户”指定。
什么叫做系统用户,简单来讲就是可以在/etc/passwd 查到的用户。
如上例子t1配置文件中guest_username=daemon
daemon是系统用户,可以在/etc/passwd 查到的。
如果是网站的话软件的进程名字。比如我的是nginx的话,就用nginx,如果有php进程我也把php配置文件进程用户改为nginx,这样的好处是web就可以对你上传的文件进行写读删除,因为有的缓存文件是php动态生成的,必须有写入权限!修改权限,删除权限!
比如:我查看nginx和php进程
[root@vm5 ~]# ps -ef|grep nginx|grep -v grep
nginx 1634 1632 0 May23 ? 00:00:05 php-fpm: pool www
root 1648 1 0 May23 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1821 1632 0 May23 ? 00:00:05 php-fpm: pool www
nginx 13818 1632 0 Jun08 ? 00:00:04 php-fpm: pool www
nginx 13851 1632 0 Jun08 ? 00:00:04 php-fpm: pool www
nginx 20165 1648 0 Aug17 ? 00:11:06 nginx: worker process
nginx 20166 1648 0 Aug17 ? 00:11:18 nginx: worker process
nginx 20167 1648 0 Aug17 ? 00:11:05 nginx: worker process
nginx 20168 1648 0 Aug17 ? 00:11:23 nginx: worker process
nginx 23453 1632 0 Jun12 ? 00:00:04 php-fpm: pool www
nginx 29795 1632 0 Jul12 ? 00:00:02 php-fpm: pool www
nginx 29796 1632 0 Jul12 ? 00:00:02 php-fpm: pool www
从上面可以看到nginx和php的启动进程是nginx用户(这个用户查/etc/passwd是存在的)
[root@vm5 ~]# grep nginx /etc/passwd
nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin
这样guest_username配置可以写成“guest_username=nginx”,web的nginx还要能读,主要是网站是php写的,以php进程为主,一般情况都会有缓存目录要对其文件或目录进行增加,删除,修改,所以才配置“guest_username=nginx”,这样ftp虚拟用户t1的权限就和nginx一样了!
如果改为其它用户如daemon,那第目录和文件用户和组都是daemon!你上传了网站文件如果含缓存目录的话,PHP因不能写入和删除,就会出问题!
2.3 FTP客户端使用注意事项
如果用FileZilla Client连接vsftpd,
1.“常规”选项:“登陆类型”用"正常",然后输入用户名和密码
2.“传输设置”选项中:“传输模式”要用修改为“主动”不能用“默认”否则会报错,连接不上
3.“字符集”选项:建议强制用UTF-8,因为我们是centos服务器
如果是cuteftp,直接就可以连接