2018-10-22 from–https://blog.csdn.net/axing2015/article/details/83187315

新增的文件以及文件夹(不需要执行,下面用到的时候会创建)

touch /home/login_user.txt #存放虚拟用户名和密码(单行用户名,双行密码)
/etc/vsftpd/login_user.db #虚拟库(认证)文件
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_back #备份
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_back #备份
mkdir /etc/vsftpd/vsftpd_user_conf #虚拟用户配置文件目录
touch /etc/vsftpd/vsftpd_user_conf/jin01 #虚拟用户配置文件

1、安装

yum install -y vsftpd #vsftpd安装程序,配置文件默认在 /etc/vsftpd
yum install -y pam* db4* #vsftpd虚拟登陆账户必要依赖包

 

2、建立虚拟用户
1)创建用户名和密码

vi /home/login_user.txt #编辑
jin01 #单行:用户名
123456 #双行:密码
:wq #退出保存

 

2)生成虚拟库(认证)文件

执行下面命令生成虚拟库(认证)文件

db_load -T -t hash -f /home/login_user.txt /etc/vsftpd/login_user.db

 

虚拟库(认证)文件只对 root 用户可读写

chmod 600 /etc/vsftpd/login_user.db

 

扩展

-rw——- (600) #只有拥有者有读写权限。
-rw-r–r– (644) #只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx—— (700) #只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) #拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx–x–x (711) #拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) #所有用户都有文件读、写权限。
-rwxrwxrwx (777) #所有用户都有读、写、执行权限。

 

3)配置 PAM 文件

先备份 vsftpd,再修改 vsftpd

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_back #备份
vi /etc/pam.d/vsftpd #编辑

 

在文件 vsftpd 最上面增加下面内容

auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/login_user
account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/login_user

 

pam_userdb.so 的目录在 /usr/lib64/security/pam_userdb.so
login_user 即是 login_user.db
PAM 关键字解释,请参考PAM可插拔的认证模块详解

4)增加系统用户,来对应所有虚拟用户,虚拟用户使用系统用户来访问ftp服务器

系统用户 ftpuser ,登录目录 /home/ftpuser ,禁止登录

useradd ftpuser -d /home/ftpuser -s /bin/false
chown ftpuser:ftpuser /home/ftpuser

 

useradd 命令参考 http://www.runoob.com/linux/linux-comm-useradd.html
chown 命令参考 http://www.runoob.com/linux/linux-comm-chown.html

5)修改配置文件 vsftpd.conf ,使虚拟用户可以访问 vsftpd 服务器

先备份,后修改

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_back #备份
vi /etc/vsftpd/vsftpd.conf #修改

 

增加下面配置

#使用PAM验证
pam_service_name=vsftpd
#启用虚拟用户,激活虚拟账户
guest_enable=YES
#把虚拟账户绑定为系统账户ftpuser
guest_username=ftpuser
#虚拟用户配置文件目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf

 

6)配置虚拟用户配置文件

建立 vsftpd_user_conf 配置文件目录

mkdir /etc/vsftpd/vsftpd_user_conf

 

设置虚拟用户配置文件,与虚拟账户同名,上面的 2.1

vi /etc/vsftpd/vsftpd_user_conf/jin01

 

配置 jin01 文件,增加下面配置

#浏览FTP目录和下载
anon_world_readable_only=NO
#允许上传
anon_upload_enable=YES
#允许建立和删除目录
anon_mkdir_write_enable=YES
#允许改名和删除文件
anon_other_write_enable=YES
#指定虚拟用户在系统用户下面的路径,限制虚拟用户的家目录,虚拟用户登录后的主目录。
local_root=/home/ftpuser

 

3、启动 vsftpd 或重启 vsftpd

systemctl start vsftpd #启动
systemctl restart vsftpd #重启

 

4、解决登录异常

暂时不用

setsebool -P tftp_home_dir 1

 

执行下面命令解决 500 OOPS: cannot change directory:/home/ftpuser 异常

setsebool -P ftpd_full_access 1

 

注意:在 centos7 已经没有 ftp_home_dir,使用 tftp_home_dir 替代了

在配置文件 /etc/vsftpd/vsftpd.conf 中增加下面配置,解决 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 异常

allow_writeable_chroot=YES

 

登录看不到目录问题
确保 在配置文件 vsftpd.conf 中有

#随机端口
pasv_min_port=30000
pasv_max_port=30100

 

再开启端口,执行下面命令

# 开放端口,永久
firewall-cmd –zone=public –add-port=30000-30100/tcp –permanent
# 重载配置文件
firewall-cmd –reload
# 重启firewalld服务
systemctl restart firewalld

 

5、vsftpd.conf 文件配置说明(可以直接复制使用)

#不允许匿名登录(默认YES)
anonymous_enable=NO

#允许本地登录,可以确保任何非匿名用户可以登录工作,包括虚拟用户(默认NO)
local_enable=YES

#启用任何形式 FTP 写入命令(默认NO)
write_enable=YES

#本地用户创建文件的默认权限(默认077)
local_umask=022

#匿名用户在特定环境下允许上传文件。为了让它生效,选项write_enable必须激活(write_enable是前提),
#匿名ftp用户必须要求上传位置的写的权限。这个设置也要求虚拟用户具有上传功能,
#在默认情况,虚拟用户被当做匿名用户对待(最大限制)权限。(默认NO)
#When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
anon_upload_enable=YES

#匿名 FTP 用户能够创建新目录(默认NO)
anon_mkdir_write_enable=YES

#FTP 用户但第一次进入一个新的目录将会展示消息。在默认情况下,目录扫描.message文件。但是可以通过message_file重写文件的路径(默认NO)
dirmessage_enable=YES

#录上传下载日志,默认放置到/var/log/vsftpd.log。通过设置属性 vsftp_log_file 重写(默认NO)
xferlog_enable=YES

#确保 PORT 传输连接来自端口20(默认NO)
connect_from_port_20=YES

#可以安排上传的匿名文件由其他用户拥有,chown_username进行设置(默认NO)
#chown_uploads=YES
#chown_username=whoever

#日志文件位置,可以覆盖
#xferlog_file=/var/log/xferlog

#传输日志文件的写的格式是标准的xferlog格式(默认NO)
xferlog_std_format=YES

#超时设置,客户端两个命令之间的最大时间(默认300秒)
#idle_session_timeout=600

#数据传输过程中暂停/延迟最长时间超时(默认300秒)
#data_connection_timeout=120

#定义一个唯一的用户,ftp服务器可以将其用作完全隔离且无特权的用户
#nopriv_user=ftpsecure

#服务器将识别异步ABOR请求。不推荐用于安全性(代码非常重要)。但是,不启用它可能会混淆较旧的FTP客户端(默认NO)
#async_abor_enable=YES

#ASCII模式数据传输数据上传(默认NO)
#ascii_upload_enable=YES
#ASCII模式数据传输数据下载(默认NO)
#ascii_download_enable=YES

#可自定义登录欢迎语
#ftpd_banner=Welcome to blah FTP service.

#指定不允许的匿名电子邮件地址的文件。显然对于打击某些DoS攻击非常有用(默认NO)
#deny_email_enable=YES
#可自定义匿名电子邮件地址
#banned_email_file=/etc/vsftpd/banned_emails

#登录之后本地用户(默认)会被限制到其根目录下(默认NO)
chroot_local_user=YES
#提供一个本地用户列表,然后改变他们根目录的位置(登录进来的时候的目录)(默认NO)
#chroot_list_enable=YES
#可自定义本地用户列表位置
#chroot_list_file=/etc/vsftpd/chroot_list

#允许用户使用”ls -R”命令,这个有个很小的风险。因为一个ls -R如果是在大型站点将会消耗大量资源(默认NO)
#ls_recurse_enable=YES

#vsftpd将以独立模式运行并侦听IPv4套接字,与 listen_ipv6 互斥(默认YES)
listen=NO

#监听IPv6套接字,与 listen 互斥(默认NO)
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

#本地用户登录目录
local_root=/home
#匿名用户登录目录
anon_root=/home/ftpuser
#解决异常 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
allow_writeable_chroot=YES
#开启虚拟用户
guest_enable=YES
#虚拟用户映射本地用户
guest_username=ftpuser
#虚拟账户配置位置
user_config_dir=/etc/vsftpd/vsftpd_user_conf
#随机端口
pasv_min_port=30000
pasv_max_port=30100
#与本地时间一致
use_localtime=YES

 

6、扩展之 SELinux

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统

文件位置:/etc/sysconfig/selinux
相关命令:

更多 getsebool 命令
更多 setsebool 命令

查询 ftp 相关设置信息(centos7)

getsebool -a | grep ftp

1

下面注释仅供参考

#关闭这个布尔变量会阻止 vsftpd 读取 public_content_rw_t 类型的文件和目录。如果允许用户通过 FTP 上传文件。必须开放这个布尔变量。
allow_ftpd_anon_write
#当开放这个布尔变量时只有Linux(DAC)的权限来控制访问,通过验证的用户可以读取和写入标记为 public_content_t 或 public_content_rw_t 类型的文件。
allow_ftpd_full_access
#当开放这个布尔变量时vsftpd 允许 cifs_t 类型的文件和目录,因此这个布尔变量启用,可以让你的 FTP 服务器可以使用 Samba 文件系统。
allow_ftpd_use_cif
#当开放这个布尔变量时 vsftpd 允许 nfs_t 类型的文件和目录,因此这个布尔变量启用,可以让你的 FTP 服务器可以使用 NFS 文件系统。
allow_ftpd_use_nfsvsftpd
#当开放这个布尔变量时认证用户可以读写自己的主目录中的文件。
ftp_home_dir
#当开放这个布尔变量时允许vsftpd 连接数据库。
ftpd_connect_db
#当开放这个布尔变量时容许的 httpd 作为 FTP 服务器,并且监听 FTP 端口。
httpd_enable_ftp_server
#当开放这个布尔变量时允许TFTP 访问一个公共的目录
tftp_anon_write