自学Linux:15.VSFTP服务部署

VSFTP服务部署

一. 安装软件

服务器端:vsftpd
客户端:ftp
服务名:vsftpd
端口:20、21、指定范围内随机端口
配置文件:/etc/vsftpd/vsftpd.conf

二. 登陆验证方式

1. 匿名用户验证

用户账号名称:ftp或anonymous
用户账号密码:无密码
工作目录:/var/ftp
默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统,配置文件中配置上传权限,对该目录具有写权限。)

服务器端:

# 修改配置文件
vim /etc/vsftpd/vsftpd.conf

```bash
# 运行匿名用户模式
anonymous_enable=YES
local_enable=YES

# 基础设定
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# 上传
anon_upload_enable=YES
# 权限掩码,匿名上传的文件权限为755、644
anon_umask=022
# 建立文件夹
anon_mkdir_write_enable=YES
# 删除
anon_other_write_enable=YES
# 用户目录
anon_root=/var/ftp/

# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199

登陆

非常重要的点:

默认目录的权限不能上传下载,想要获得上传下载权限,需要在根下面新建子目录并赋权。
根目录,默认anon_root=/var/ftp,所属必需为root,读写权限755
如果需要自定义根目录,必需符合条件2,通常情况下,使用root直接创建目录就OK

# 新建子目录
mkdir -p /var/ftp/upload

# 修改权限
chown -R ftp /var/ftp/upload/
chmod -R 755 /var/ftp/upload/

# 重启服务
systemctl restart vsftpd

# 查询服务器IP
ip addr

# 登陆
ftp://192.168.201.101/

2. 本地用户验证

用户账号名称:本地用户(/etc/passwd)
用户账号密码:用户密码(/etc/shadow)
工作目录:登录用户的宿主目录
权限:最大权限(drwx------)

2.1. 配置文件

重难点:

  • 锁定主目录和设定主目录最好配套使用。
  • 推荐使用被动访问模式。
  • 本地用户掩码为local_umask,虚拟用户掩码为anon_umsak,一定注意区分。
  • vsftpd从2.3.5版本开始,增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报500 OOPS: vsftpd: refusing to run with writable root inside chroot()错误。解决方式不止一种,其中通过配置allow_writeable_chroot=YES的方式最省事、也最正规。
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 运行匿名用户模式
anonymous_enable=NO
local_enable=YES

# 基础设定
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# 锁定主目录
chroot_local_user=YES
# 设定登陆主目录
local_root=/home
# 允许用户对于主目录具有读写权限
allow_writeable_chroot=YES

# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199
2.2. 目录管理(可选)

重难点

自定义根目录,所属必须为root,权限为755,一般情况下,root用户创建的目录就符合要求。
子目录,所属必须为对应建立的用户,权限为700,这样保证自身对于文件夹有所有权限,但是其他用户无法进入。
如果在新建用户的时候指定其用户主目录为子目录,则可以跳过子目录创建阶段。

mkdir /home/FTP
chown -R root:root /home/FTP
chmod -R 755 /home/FTP

# 新增子目录(可选)
mkdir -p /home/FTP/admin_files
chown -R admin:admin /home/FTP/admin_files
chmod -R 700 /home/FTP/admin_files
2.3. 用户管理

重难点

如果新建用户不指定用户主目录,则需要返回3.2. 目录管理创建对应主目录和权限。
用户推荐nologin模式,这样可以放置用户登陆系统。
使用nologin模式后,还需允许nologin用户登陆FTP

# 新建用户
useradd -s /sbin/nologin -d /home/FTP/admin admin
passwd admin

# 禁止用户登陆(可跳过)
usermod -s /sbin/nologin admin

# 更改用户配置(可跳过)
usermod -s /bin/bash admin
usermod -d /home/FTP/admin admin

# 允许 nologin 用户登陆FTP
sed -i '$a /sbin/nologin' /etc/shells 
cat /etc/shells
[root@ftp home]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/sbin/nologin
2.4. 权限配置

使用ll命令可以方便的查看系统文件目录的权限

[root@centos_7 home]# ll
总用量 0

drwx------. 3 nandi nandi 78 7月  16 09:10 nandi
-rwxrw-r--. 1 root  root   0 7月  16 09:45 readme
drwx------. 3 test  test  78 7月  16 09:09 test

上面的信息解读:

以readme为例,可以看到其所属用户为root(第一个表示用户),所属用户组为root(第二个表示组)
-rw-r–r--,一共10个字符,可以分为四段来解读:字符长度为1-3-3-3
第一段:d 表示nandi和test是目录,- 表示 readme 是文件
第二段:rwx,对于二进制码111,十进制为7,表示所属用户对于该文件(夹)具有读r写w执行x的权限。
第三段:rw-,对于二进制码110,十进制为6,表示所属用户对于该文件(夹)具有读r写w的权限。
第四段:r–,对于二进制码100,十进制为4,表示所属用户对于该文件(夹)具有读r的权限。 掌握规则以后,我们要改变权限也简单了

试验: 目的:将readme权限更改为:700
分析:700对应二进制111000000,对应权限为rwx------,由于他本身是文件,所以第一个符号是-,完整的权限为-rwx------

代码:

[root@centos_7 home]# chmod -R 700 readme 
[root@centos_7 home]# ll
总用量 0
drwx------. 3 nandi nandi 78 7月  16 09:10 nandi
-rwx------. 1 root  root   0 7月  16 09:45 readme
drwx------. 3 test  test  78 7月  16 09:09 test
2.5. 登陆
# 重启服务
systemctl restart vsftpd

# 查询服务器IP
ip addr

# 登陆
ftp://192.168.201.101/
2.6. 用户配置文件(可选)

上一步完成以后,就已经成功完成FTP服务器的搭建,但是由于所有本地用户共用一个配置文件,导致很多配置不能根据不同用户的需求来灵活配置。比如,我们想针对不同用户建立不同的根目录,这时用户配置文件就能起到作用:

启用用户配置目录
/etc/vsftpd/vsftpd.conf里面添加语句

# 启用用户配置目录
user_config_dir=/etc/vsftpd/user_conf
# 建立用户配置目录
mkdir -p /etc/vsftpd/user_conf
# 建立用户配置文件
vim /etc/vsftpd/user_conf/test
# 设定登陆主目录
local_root=/home/test

如此反复,注意用户配置文件名和用户名要一样,重启服务以后,不同用户登陆就会进入到各自的根目录当中。

3. 虚拟用户验证

创建虚拟用户用来代替本地用户,减少本地用户曝光率
使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
能够设置严格的权限

3.1. 建立用户

系统映射用户(可选)

虚拟用户为映射到这个用户,以该用户的身份登陆服务器

一般情况下,可以直接使用系统默认的ftp用户,当然也可以自己定义映射用户,映射用户不用修改密码

useradd -s /sbin/nologin vftpuser
#虚拟用户
vim /etc/vsftpd/vusers
test
123
test1
123
test2
123
test3
123
#对应的主目录
#这里一定要把文件所有权改为映射用户。
mkdir /home/test1
mkdir /home/test2
mkdir /home/test3
chown -R ftp:ftp /home/test*
3.2. 加密

安装数据库(必备)yum install db4 db4_utils
加密db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/vusers.db

3.3. 添加pam.d文件

重点:

1.修改pam.d文件以后,本地用户就无法登陆FTP服务器了,因为本地用户使用的验证文件发生了改变。
2.想要保证本地用户和虚拟用户可以同时登陆FTP,请查看5. 本地用户和虚拟用户共存

vim /etc/pam.d/vusers.db
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
3.4. 配置文件
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 启用虚拟用户
anonymous_enable=NO
local_enable=YES
guest_enable=YES

# 映射账户
guest_username=ftp
pam_service_name=vusers.db
anon_umask=022

# 基础设定
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES

# 锁定主目录、允许主目录拥有写权限
chroot_local_user=YES
allow_writeable_chroot=YES

# 上传权限
anon_upload_enable=YES
# 建立文件夹权限
anon_mkdir_write_enable=YES
# 删除权限
anon_other_write_enable=YES

# 添加账户配置目录
user_config_dir=/etc/vsftpd/user_conf

# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199
3.5. 个性化配置

配置文件夹(可跳过)

mkdir /etc/vsftpd/user_conf

配置个性化用户

vim /etc/vsftpd/user_conf/test
# 个性化根目录
local_root=/home/ftpfile/000002000000002
# 不可创建目录
anon_mkdir_write_enable=NO
# 不可编辑文件
anon_other_write_enable=NO
# 不可上传文件
anon_upload_enable=NO
3.6. 登陆
# 重启服务
systemctl restart vsftpd

# 查询服务器IP
ip addr

# 登陆
ftp://192.168.201.101/

4. 本地用户和虚拟用户共存

4.1. 原因分析

Required: 堆栈中的所有 Required 模块必须看作一个成功的结果。如果一个或多个 Required
模块失败,则实现堆栈中的所有 Required
模块,但是将返回第一个错误。也就意味着,required需要所有内容都满足才行,当我们前两条配置虚拟用户登录验证通过后,继续向下面的配置条目进行验证,验证是否是本地用户时结果发现不是,又因为,验证本地用户的control_flag(见上网址中解释)也为required,所以这时候,就会返回错误,也即验证不成功。所以我们不能同时设置虚拟用户和本地用户的control_flag为required。

Sufficient: 如果标记为 sufficient 的模块成功并且先前没有 Required 或 sufficient
模块失败,则忽略堆栈中的所有其余模块并返回成功。我们可以把虚拟用户的验证配置放在最前面,且把control_flag设为sufficient。这样的话,如果遇到是虚拟用户,那么可以通过验证,如果是本地用户,忽略掉sufficient的两条配置规则,只要满足required就行,所以也能通过验证。

4.2. 配置
vim /etc/pam.d/vusers.db
#%PAM-1.0
auth       sufficient   pam_userdb.so   db=/etc/vsftpd/vusers
account    sufficient   pam_userdb.so   db=/etc/vsftpd/vusers
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
上一篇:linux – LVM2 pvdisplay和vgdisplay不同意


下一篇:简易的Zombie_Scann.py(转)