FTP创建虚拟用户
虚拟用户认证所使用的账号和密码都不是服务器中真实存在的,其安全性比本地用户更好,即使被抓包获取到账号密码都无法直接登录到服务器。配置虚拟用户的流程如下:
(1)vsftpd.conf
中添加支持配置
(2)建立虚拟用户数据库文件vuser.db
(3)建立支持虚拟用户的PAM认证文件 /etc/pam.d/vsftpd
(4)为虚拟用户weihu1
设置不同的权限
(5)创建虚拟用户映射的系统用户FTP
2023.5.18 更新一下内容,按照本章做,有主机会出现pam认证问题,全部注释掉即可,具体查看本文最后说明:后续pam认证问题
1、安装vsftpd
yum -y install vsftpd lftp ftp
2、修改vsftpd.conf配置文件
注意:所以配置文件禁止留有空格注释,可能会有起不来的情况
# 进入vsftpd目录
[root@local vsftpd]# cd /etc/vsftpd/
[root@local vsftpd]# ll
总用量 20
-rw------- 1 root root 125 6月 10 2021 ftpusers
-rw------- 1 root root 361 6月 10 2021 user_list
-rw------- 1 root root 5116 4月 10 21:19 vsftpd.conf
-rwxr--r-- 1 root root 338 6月 10 2021 vsftpd_conf_migrate.sh
# vim修改vsftpd.conf的配置文件
# [root@local vsftpd]# vim vsftpd.conf
local_enable=YES # 允许本地用户模式,由于映射的系统用户为本地用户,因此此项必须开启
pam_service_name=vsftpd # 指定pam认证文件,可修改
更改如下三项:
anonymous_enable=NO # 禁止匿名登录
listen=YES # 允许IPV4独立监听
listen_ipv6=NO # 禁止IPV6
最后一行添加如下,之后保存退出:
guest_enable=YES # 开启虚拟用户模式
guest_username=FTP # 指定虚拟用户账号映射到本地账号FTP
user_config_dir=/etc/vsftpd/vuser_conf # 指定虚拟用户的权限配置目录
allow_writeable_chroot=YES # 允许禁锢的FTP根目录可写
chroot_local_user=YES # 限制用户在家目录中
reverse_lookup_enable=NO #禁止进行dns反向解析,登录变快,非必选
3、建立虚拟用户数据库文件
# 在vsftpd的目录创建用于虚拟用户登录的账号密码,奇数行为用户名,偶数行为密码
# 这里创建了一个用于登录的虚拟用户,weihu1
[root@local vsftpd]# vim vuser
weihu1 # 奇数行为用户名
pwd@weihu123 # 偶数行为密码
# 加密密码,生成db格式,前面都是固定格式,添加文件名生成
[root@local vsftpd]# db_load -T -t hash -f vuser vuser.db
[root@local vsftpd]# ls
vuser vuser.db ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
# 出于安全考虑,可将账户密码文件权限更改为600,可将原账号密码文件 vuser 删除,仅保留vuser.db
[root@local vsftpd]# chmod 600 vuser vuser.db
[root@local vsftpd]# ll vuser*
-rw------- 1 root root 27 4月 11 09:17 vuser
-rw------- 1 root root 12288 4月 11 09:20 vuser.db
4、修改支持虚拟用户的PAM认证文件
# 先找认证的模块
[root@local vsftpd]# find / -name pam_userdb.so
/usr/lib64/security/pam_userdb.so
# 编辑pam认证文件,添加最后来两行,其余全部注释
[root@local vsftpd]# 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
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser #检查账号及密码,数据库不需要写后缀.db
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser # 检查用户是否在有效期内
# 这里的db就是刚才创建的用于登录ftp的虚拟账户密码,指定位置
5、创建虚拟用户的权限配置目录
# 这里就是刚才配置文件中指定的虚拟权限配置目录,用于登录的虚拟用户weihu1的配置文件权限范围
[root@local vsftpd]# mkdir vuser_conf
[root@local vsftpd]# ls
vuser vuser_conf vuser.db ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
# 进入该目录
[root@local vsftpd]# cd vuser_conf/
# 创建weihu1的权限配置文件
[root@local vuser_conf]# vim weihu1
local_root=/home/weihu/log # 虚拟用户的根目录
anon_upload_enable=YES # 拥有文件上传的权限
anon_mkdir_write_enable=YES # 具有建立目录的权限
anon_other_write_enable=YES #(其他写权限,改,删)(此行改为NO后,便没有了删除权限,其他权限不变)
anon_umask=000 # 文件所属组拥有读写权限
6、创建虚拟用户映射的系统用户,即本地账户
# 创建
[root@local vuser_conf]# useradd -s /sbin/nologin FTP
# 验证
[root@local vuser_conf]# tail -1 /etc/passwd
FTP:x:1001:1001::/home/FTP:/sbin/nologin
7、创建虚拟用户weihu1的根目录,并将目录权限更为本地用户FTP所属
[root@local vuser_conf]# cd /home
# 创建虚拟用户的根目录,需要真实存在
[root@local home]# mkdir /home/weihu/log
[root@local home]# ls
FTP weihu
[root@local home]# cd /home/weihu/
[root@local weihu]# mkdir /home/weihu/log # 创建weihu1的根目录
[root@local weihu]# ll # 先查看下目录的权限归属,改成FTP
总用量 0
drwxr-xr-x 2 root root 6 4月 10 21:59 log
# 更改虚拟用户根目录所属权限为ftp
[root@local weihu]# chown -R FTP:FTP log
[root@local weihu]# ll
总用量 0
drwxr-xr-x 2 FTP FTP 6 4月 10 21:59 log
8、重启服务
[root@local weihu]# systemctl restart vsftpd # 重启服务
9、测试
ftp常用命令:
查看:ls
下载文件:
get:单个下载。get /usr/your/1.htm 1.htm
mget:批量下载。mget *.txt
显示下载进度:hash
上传文件:
put:put 1.htm
mput:mput *.htm
更改传输模式:直接输入
binary
ascii
删除文件: mdelete
1. 用另一台机器验证:
[root@local ~]# ftp 192.168.100.101
Connected to 192.168.100.101 (192.168.100.101).
220 (vsFTPd 3.0.2)
Name (192.168.100.101:root): weihu1 # 输入虚拟用户名weihu1
331 Please specify the password.
Password: # 密码:pwd@weihu123
230 Login successful. # 登录成功,证明虚拟用户可登录,剩下的就是虚拟用户权限范围
Remote system type is UNIX. # 远程系统类型为UNIX。
Using binary mode to transfer files. # 使用二进制模式传输文件
ftp> ls
227 Entering Passive Mode (192,168,100,101,246,207). # 进入被动模式
150 Here comes the directory listing. # 目录列表来了
226 Directory send OK. # 目录发送正常
ftp> mkdir my-is-weihu1 # 创建目录my-is-weihu1
257 "/my-is-weihu1" created
ftp> ls # ls查看目录
227 Entering Passive Mode (192,168,100,101,166,236).
150 Here comes the directory listing. # 下面是目录列表
drwx------ 2 1001 1001 6 Apr 11 06:57 my-is-weihu1
226 Directory send OK. # 目录发送成功
2. 回到ftp服务器上验证:
[root@local log]# pwd
/home/weihu/log
[root@local log]# ls
my-is-weihu1 # 存在,虚拟用户weihu1创建目录ok
后续1:
# ftp登录报错 nobody
[root@local home]# ftp 192.168.100.102
Connected to 192.168.100.102 (192.168.100.102).
500 OOPS: cannot locate user entry:nobody # 报错没有nobody用户,ftp报错一般在这提示如:ftpsecure、vsftpd…
ftp> quit
原因:
vsftp默认使用nobody是系统默认处理匿名连接的用户,nobody删除之后就会报错,一般设置/sbin/nologin,不可登录
一些服务进程都会采用一些特殊的帐号来运行,如nobody,news,games等,可以防止程序本身有安全问题的时候,不会被获得root权限
许多系统中都按惯例地默认创建一个nobody,尽量将它的权限缩减至最小
概念:
它们是用来完成特定任务的,是一个普通用户,非特权用户。 使用nobody用户名的’目的’是,使任何人都可以登录系统,
但是其 UID 和 GID 不提供任何特权,即该uid和gid只能访问人人皆可读写的文件,
查看原本系统的nobody的UID和GID,借鉴一下:
[root@local home]# grep nobody /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@local home]#
[root@local home]# grep nobody /etc/group
nobody:x:99:
# 组文件的格式说明:组名:密码:GID:该用户组中的用户列表
创建:
[root@local home]# groupadd -g 99 nobody # 创建nobody组
[root@local home]# grep nobody /etc/group
nobody:x:99:
[root@local home]# useradd -u 99 nobody -g 99 -s /sbin/nologin # 创建用户指定组,不可登录
[root@local home]# tail -1 /etc/passwd
nobody:x:99:99::/home/nobody:/sbin/nologin
ftp测试连接成功,不会直接报错500
后续2:
真实环境下:防火墙需要打开ftp模块
一、iptables服务时:ip_nat_ftp
[root@local ~]# lsmod|grep ftp # lsmod查看已加载的模块
[root@local ~]# modprobe ip_nat_ftp # 临时开启ftp模块
[root@local ~]# echo $?
0
[root@local ~]# lsmod|grep ftp # 再次查看,已加载
nf_nat_ftp 12770 0
nf_conntrack_ftp 18638 1 nf_nat_ftp
nf_nat 26787 1 nf_nat_ftp
nf_conntrack 133053 3 nf_nat_ftp,nf_nat,nf_conntrack_ftp
永久开启:
编辑/etc/sysconfig/iptables-config:加上需要的模块如下:把需要加载的模块加入,无论重启系统还是iptables,但ftp模块始终还是加载的。
IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"
2.iptables规则
如果INPUT 为DROP的情况下
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
如果OUPUET为DROP的情况下
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPIT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
3.iptables重启
/etc/init.d/iptables save 保存新的规则
/etc/init.d/iptables restart 重启
二、firewall服务时:
设置防火墙,允许ftp服务通过:
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
firewall-cmd --list-all
yum install iptables-services #安装
vi /etc/sysconfig/iptables #编辑防火墙配置文件,添加下面红色部分进入iptables,说明:21端口是ftp服务端口;10060到10090是Vsftpd被动模式需要的端口,可自定义一段大于1024的tcp端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10060:10090 -j ACCEPT
:wq! #保存退出
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
后续pam认证问题:
根据该文档一步一步做,最后登录输入用户名、密码死活无法登录的问题解决
如下问题所示:
[root@local vsftpd]# ftp 192.168.100.104
Connected to 192.168.100.104 (192.168.100.104).
220 (vsFTPd 3.0.2)
Name (192.168.100.104:root): weihu1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> ls
530 Please login with USER and PASS.
Passive mode refused.
ftp> exit
查看日志文件:
tail -f /var/log/secure
May 17 13:28:12 local vsftpd[16659]: pam_unix(vsftpd:auth): check pass; user unknown
May 17 13:28:12 local vsftpd[16659]: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=weihu1 rhost=192.168.100.106
或者:
[root@local home]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2023-05-17 10:34:13 CST; 1min 31s ago
Process: 1541 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 1542 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─1542 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
5月 17 10:34:13 local systemd[1]: Starting Vsftpd ftp daemon...
5月 17 10:34:13 local systemd[1]: Started Vsftpd ftp daemon.
5月 17 10:34:31 local vsftpd[1544]: pam_unix(vsftpd:auth): check pass; user unknown
5月 17 10:34:31 local vsftpd[1544]: pam_unix(vsftpd:auth): authentication failure; logname= uid....104
Hint: Some lines were ellipsized, use -l to show in full.
可以看到是pam认证出现问题
解决:
将以上全部注释,只留两行即可
[root@local vsftpd]# 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
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
再次登录成功