FTP服务器搭建与应用
实验准备
软件:VMware Workstation Pro
虚拟机:Red Hat Enterprise Linux 7 64 位 两台(一台服务器,一台客户端)
匿名账号FTP服务器、真实账号FTP服务器
FTP应用案例1
【例5.11】学院内部有一台FTP 和Web 服务器,其功能主要是维护学院的网站,内容包括上传文件、创建目录、更新网页等。学院的这些维护工作是委派给计算机系学习部的学生进行的,分别有两个账号 user1和 user2登录FTP服务器,但不能登录本地系统。他们只能对目录/var/www/html进行操作,不能进入该目录以外的任何目录,如图5.7所示。
分析:把 FTP服务器和Web服务器做在一起是企业经常采用的方法,这样方便实现对网站的维护。为了增强安全性,先要仅允许本地用户访问,并禁止匿名用户登录;其次,使用chroot功能将user1和user2锁定在/var/ www/html目录下。如果需要删除文件,则需要注意本地权限。具体配置如下。
1、建立user1和user2账号,并禁止本地登录。
[root@localhost Desktop]# useradd -s /sbin/nologin user1
[root@localhost Desktop]# useradd -s /sbin/nologin user2
[root@localhost Desktop]# echo redhat | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@localhost Desktop]# echo redhat | passwd --stdin user2
Changing password for user user2.
passwd: all authentication tokens updated successfully.
2、配置YUM源,下载VSFTP服务包
[root@localhost Desktop]# mkdir /mnt/cdrom
[root@localhost Desktop]# mount /dev/sr0 /mnt/cdrom/
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost Desktop]# vim /etc/yum.repos.d/a.repo
[a]
name=a
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
[root@localhost 桌面]# systemctl start vsftpd
[root@localhost 桌面]# systemctl status vsftpd
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
Active: inactive (dead)
[root@localhost 桌面]# systemctl start vsftpd
[root@localhost 桌面]# systemctl status vsftpd.service
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
Active: active (running) since 日 2022-10-30 09:57:25 CST; 5s ago
Process: 13429 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 13430 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─13430 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
10月 30 09:57:25 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
3、编辑vsftpd.conf文件,并进行相应修改
[root@localhost 桌面]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO //不允许匿名用户登录
local_enable=YES //允许本地用户登录
local_root=/var/www/html //设置所有本地用户的根目录。当本地用户登录后,会自动进入该目录。
chroot_local_user=NO //是否将用户权限禁锢在FTP目录,以确保安全
chroot_list_enable=YES //启动限制用户的名单
chroot_list_file=/etc/vsftpd/chroot_list //受限制用户名单文件
chroot_ local_ user
设置是否将所有用户限制在工作主目录中,参数取值为yes或no,默认取值为no,当取值为yes时,本地用户成功登录后只能访问自己的工作主目录,不能访问工作主目录以外的其他目录。
chroot_ list_ enable
设置是否启动限制用户的名单,参数取值为yes或no。当取值为yes时,表示本地用户也有些例外,可以访问其工作主目录以外的其他目录,例外的用户在“chroot_ list_file”指定的文件中(默认文件是/etc/vsftpd/ chroot__ list)。
对于chroot_ local__ user和 chroot_ list_ enable 的组合效果,可以参考表。
参数 | chroot_ local_ user= yes | chroot_ local_ user= no |
---|---|---|
chroot_ list_ enable = yes | 所有用户都被限制在其主目录下;使用chroot_ list_ file指定的用户列表,这些用户作为“例外”,不受限制 | 使用chroot_ list_ file指定的用户列表,这些用户作为“例外”被限制在其主目录下,其他用户不受限制 |
chroot_ list_ enable = no | 所有用户都被限制在其主目录下;不使用 chroot__ list__ file指定的用户列表,没有任何“例外”用户 | 所有用户都不被限制其主目录下;不使用chroot_ list_ file指定的用户列表,没有任何“例外”用户 |
注:在vsftpd2.3.5版本更新之后增强了安全检查,将用户限定在了主目录下,该用户的主目录就不能再具有写权限了!若有写权限会报该错误。
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
要修复这个错误,可以通过取消主目录的写权限,或者增加该语句。
allow_writeable_chroot=YES
4、建立/etc/vsftpd/chroot_list文件,并将user1,user2添加在文件中。
[root@localhost home]# vim /etc/vsftpd/chroot_list
user1
user2
[root@localhost html]# grep "#" -v /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
local_root=/var/www/html
allow_writeable_chroot=yes
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@localhost html]# systemctl restart vsftpd.service
[root@localhost html]# firewall-config
5、把FTP协议添加到firewalld服务的允许列表中
6、修改本地权限,设置SELinux域策略。
[root@localhost html]# chmod 777 /var/www/html/
[root@localhost html]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@localhost html]# setsebool -P ftpd_full_access=on
7、验证
[root@localhost html] yum install -y ftp
[root@localhost html] ftp 192.168.1.10
FTP应用案例2
公司现有一台FTP服务器,其IP地址为192.168.1.10。FTP服务器主要负责为公司员工提供相关文档的下载。公司现有三个部门,三个部门分别对应目录/ftp/b1、/ ftp/b2和/ftp/b3,另外设定一个公共目录/ftp/ share。三个部门分别适用userl 、user2和user3账号进行管理。要求如下:各账号只能访问自己所属部门的目录和 share目录。如userl只能访问b1和 public目录,不能访问其他目录。admin账号为管理员,可以访问FTP 服务器上的任何目录。
root@localhost 桌面]# yum install -y vsftpd.x86_64
[root@localhost 桌面]# groupadd b1
[root@localhost 桌面]# groupadd b2
[root@localhost 桌面]# groupadd b3
[root@localhost 桌面]# groupadd myadmin
[root@localhost 桌面]# useradd -G b1,myadmin user1
[root@localhost 桌面]# useradd -G b2,myadmin user2
[root@localhost 桌面]# useradd -G b3,myadmin user3
[root@localhost 桌面]# useradd -G b1,b2,b3,myadmin admin
[root@localhost 桌面]# echo redhat | passwd --stdin user1
更改用户 user1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo redhat | passwd --stdin user2
更改用户 user2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo redhat | passwd --stdin user3
更改用户 user3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo redhat | passwd --stdin admin
更改用户 admin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# mkdir /ftp
[root@localhost 桌面]# mkdir /ftp/b1
[root@localhost 桌面]# mkdir /ftp/b2
[root@localhost 桌面]# mkdir /ftp/b3
[root@localhost 桌面]# mkdir /ftp/share
[root@localhost 桌面]# touch /ftp/b1/a
[root@localhost 桌面]# touch /ftp/b2/b
[root@localhost 桌面]# touch /ftp/b3/c
[root@localhost 桌面]# touch /ftp/share/share.ttx
[root@localhost 桌面]# chown user1:b1 /ftp/b1
[root@localhost 桌面]# chown user2:b2 /ftp/b2
[root@localhost 桌面]# chown user3:b3 /ftp/b3
[root@localhost 桌面]# chown admin:myadmin /ftp/share/
[root@localhost 桌面]# chmod 770 /ftp/b1
[root@localhost 桌面]# chmod 770 /ftp/b2
[root@localhost 桌面]# chmod 770 /ftp/b3
[root@localhost 桌面]# chmod 770 /ftp/share/
[root@localhost 桌面]# vim /etc/vsftpd/vsftpd.conf
[root@localhost 桌面]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_root=/ftp
allow_writeable_chroot=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
[root@localhost 桌面]# touch /etc/vsftpd/chroot_list
[root@localhost 桌面]# systemctl start vsftpd
[root@localhost 桌面]# firewall-config
[root@localhost 桌面]# setsebool -P ftpd_full_access=on
FTP应用案例3
学院内部有一台FTP 和Web 服务器,其功能主要是维护学院的网站,内容包括上传文件、创建目录、更新网页等。学院的这些维护工作是委派给计算机系学习部的学生进行的,分别有两个账号 user1和 user2登录FTP服务器,user1通过FTP服务器远程更新网页文件至自己的家目录,仅允许访问家目录。user2为本地维护账户,不允许登录FTP服务器。
1、配置YUM源,下载VSFTP服务包
[root@localhost Desktop]# mkdir /mnt/cdrom
[root@localhost Desktop]# mount /dev/sr0 /mnt/cdrom/
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost Desktop]# vim /etc/yum.repos.d/a.repo
[a]
name=a
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
[root@localhost 桌面]# yum install -y vsftpd*
[root@localhost 桌面]# yum install -y ftp*
[root@localhost 桌面]# systemctl start vsftpd
[root@localhost 桌面]# systemctl status vsftpd
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
Active: inactive (dead)
[root@localhost 桌面]# systemctl start vsftpd
[root@localhost 桌面]# systemctl status vsftpd.service
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
Active: active (running) since 日 2022-10-30 09:57:25 CST; 5s ago
Process: 13429 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 13430 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─13430 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
10月 30 09:57:25 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
2、创建用户user1,user2
[root@localhost Desktop]# useradd user1
[root@localhost Desktop]# echo redhat | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@localhost Desktop]# useradd user2
[root@localhost Desktop]# echo redhat | passwd --stdin user2
Changing password for user user2.
passwd: all authentication tokens updated successfully.
3、检查网络设置IP地址
[root@localhost Desktop]# nmtui
[root@localhost Desktop]# nmcli device connect eno16777736
Device 'eno16777736' successfully activated with 'f9900da8-2f6c-448c-b0b4-7739d081fc83'.
[root@localhost Desktop]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:feb2:532c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b2:53:2c txqueuelen 1000 (Ethernet)
RX packets 128 bytes 9872 (9.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 106 bytes 12737 (12.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 270 bytes 23160 (22.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 270 bytes 23160 (22.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4、编辑配置文件,将用户锁定在用户家目录
[root@localhost Desktop]# grep "#" -v /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
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
[root@localhost Desktop]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
allow_writeable_chroot=YES
[root@localhost Desktop]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@localhost Desktop]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@localhost vsftpd]# vim ftpusers
user2
[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost html]# firewall-config
5、把FTP协议添加到firewalld服务的允许列表中
6、修改本地权限,设置SELinux域策略。
[root@localhost html]# mkdir -p /var/www/html
[root@localhost html]# chmod 777 /var/www/html/
[root@localhost html]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@localhost html]# setsebool -P ftpd_full_access=on
7、验证
开启一台客户机,配置网络,安装FTP。测试user1成功登录,创建目录成功,user2登录失败。
[root@localhost Desktop]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.2)
Name (192.168.1.10:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,1,10,233,21).
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir 1
257 "/1" created
ftp> bye
221 Goodbye.
[root@localhost Desktop]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.2)
Name (192.168.1.10:root): user2
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
使用物理机cmd测试。结果一致