FTP创建虚拟用户

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 610 2021 ftpusers
  -rw------- 1 root root  361 610 2021 user_list
  -rw------- 1 root root 5116 410 21:19 vsftpd.conf
  -rwxr--r-- 1 root root  338 610 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 411 09:17 vuser
-rw------- 1 root root 12288 411 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 410 21:59 log

# 更改虚拟用户根目录所属权限为ftp
[root@local weihu]# chown -R FTP:FTP log
[root@local weihu]# ll
总用量 0
drwxr-xr-x 2 FTP FTP 6 410 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

517 10:34:13 local systemd[1]: Starting Vsftpd ftp daemon...
517 10:34:13 local systemd[1]: Started Vsftpd ftp daemon.
517 10:34:31 local vsftpd[1544]: pam_unix(vsftpd:auth): check pass; user unknown
517 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

再次登录成功
  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值