-
虚拟网站主机功能
基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用Apache配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。
因此我们不仅要考虑httpd服务程序的配置因素,还需要考虑到SELinux服务对新开设端口的监控。一般来说,使用80、443、8080等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到SELinux服务的限制。
第1步:分别在/home/wwwroot中创建用于保存不同网站数据的三个目录,并向其中分别写入网站的首页文件。
第2步:在httpd服务配置文件的第46行至48行分别添加用于监听6111、6222和6333端口的参数。
第3步:在httpd服务的配置文件中大约134行处开始,分别追加写入三个基于端口号的虚拟主机网站参数,然后保存并退出,并重启httpd服务。
第4步: 正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合,并用restorecon命令让新配置的SELinux安全上下文立即生效。
第5步:SELinux允许的与HTTP协议相关的端口号中默认没有包含6111、6222和6333,因此需要将这三个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。
# dnf install httpd
# mkdir -p /home/wwwroot/6111
# mkdir -p /home/wwwroot/6222
# mkdir -p /home/wwwroot/6333
# echo "port:6111" > /home/wwwroot/6111/index.html
# echo "port:6222" > /home/wwwroot/6222/index.html
# echo "port:6333" > /home/wwwroot/6333/index.html
# vim /etc/httpd/conf/httpd.conf
37 # Listen: Allows you to bind Apache to specific IP addresses and/or
38 # ports, instead of the default. See also the
39 # directive.
40 #
41 # Change this to Listen on specific IP addresses as shown below to
42 # prevent Apache from glomming onto all bound IP addresses.
43 #
44 #Listen 12.34.56.78:80
45 Listen 80
46 Listen 6111
47 Listen 6222
48 Listen 6333
# vim /etc/httpd/conf/httpd.conf
134 <VirtualHost 192.168.10.10:6111>
135 DocumentRoot /home/wwwroot/6111
136 ServerName www.linuxprobe.com 域名暂不生效随意写
137 <Directory /home/wwwroot/6111> 目录权限
138 AllowOverride None 伪静态
139 Require all granted 允许访问
140 </Directory>
141 </VirtualHost>
142 <VirtualHost 192.168.10.10:6222>
143 DocumentRoot /home/wwwroot/6222
144 ServerName www.linuxcool.com
145 <Directory /home/wwwroot/6222>
146 AllowOverride None
147 Require all granted
148 </Directory>
149 </VirtualHost>
150 <VirtualHost 192.168.10.10:6333>
151 DocumentRoot /home/wwwroot/6333
152 ServerName www.linuxdown.com
153 <Directory /home/wwwroot/6333>
154 AllowOverride None
155 Require all granted
156 </Directory>
157 </VirtualHost>
# ls -ldZ /var/www/html
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333/*
# restorecon -Rv /home/wwwroot/
# semanage port -a -t http_port_t -p tcp 6111
# semanage port -a -t http_port_t -p tcp 6222
# semanage port -a -t http_port_t -p tcp 6333
# semanage port -l | grep http
# systemctl restart httpd
# systemctl enable httpd
# firefox
机器端口:0 - 65535个
-
Apache访问控制
Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。
它通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。
在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。
比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。
第1步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含Successful单词的首页文件。
第2步:打开httpd服务的配置文件,在第161行后面添加下述规则来限制源主机的访问。
这段规则的含义是允许使用Firefox浏览器的主机访问服务器上的首页文件,除此之外的所有请求都将被拒绝。
# dnf install httpd
# mkdir /var/www/html/server
# echo "Successful" > /var/www/html/server/index.html
# vim /etc/httpd/conf/httpd.conf
161 <Directory "/var/www/html/server">
162 SetEnvIf User-Agent "Firefox" ff=1 ##set environment if 判断用户的环境变量 ff 别名
163 Order allow,deny ##用户对一个允许判断,没有允许的全部拒绝
164 Allow from env=ff
165 </Directory>
# systemctl restart httpd
# systemctl enable httpd
# firefox
# iptables -F
# firewall-cmd --zone=public --add-service=http
除了匹配源主机的浏览器特征之外,还可以通过匹配源主机的IP地址进行访问控制。例如,我们只允许IP地址为192.168.10.20的主机访问网站资源,那么就可以在httpd服务配置文件的第161行后面添加下述规则。
# vim /etc/httpd/conf/httpd.conf
161 <Directory "/var/www/html/server">
162 Order allow,deny
163 Allow from 192.168.10.20
164 </Directory>
# systemctl restart httpd
# systemctl enable httpd
# firefox
-
Vsftpd服务传输文件
文件传输协议(File Transfer Protocol,FTP)
vsftpd服务程序三种认证模式(匿名开放模式、本地用户模式、虚拟用户模式)
可插拔认证模块(Pluggable Authentication Module,PAM)
简单文件传输协议(Trivial File Transfer Protocol,TFTP)
为了能够在装有Windows、Linux、UNIX、Mac等不同的操作系统的设备之间解决问题解决文件传输问题,FTP(File Transfer Protocol)文件传输协议应运而生。
FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。
FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术。
FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。
FTP协议有下面两种工作模式
主动模式:FTP服务器主动向客户端发起连接请求。
被动模式:FTP服务器等待客户端发起连接请求(默认工作模式)。
vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。在不影响使用的前提下,能够让管理者自行决定是公开匿名、本地用户还是虚拟用户的验证方式。
# dnf install vsftpd
清空并保存防火墙策略
# iptables -F
# iptables-save
把FTP协议添加到firewalld服务的允许列表中
# firewall-cmd --permanent --zone=public --add-service=ftp
# firewall-cmd --reload
vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf), 通过grep -v 过滤掉注释行信息,并将文件写入到源文件中
# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
# cat /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
vsftpd服务程序常用的参数以及作用
参数 | 作用 |
listen=[YES|NO] | 是否以独立运行的方式监听服务 |
listen_address=IP地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=[YES|NO] | 是否允许下载文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] | 设置用户列表为“允许”还是“禁止”操作 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=[YES|NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES|NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_root=/var/ftp | 匿名用户的FTP根目录 |
anon_mkdir_write_enable=[YES|NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES|NO] | 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限) |
anon_max_rate=0 | 匿名用户的最大传输速率(字节/秒),0为不限制 |
local_enable=[YES|NO] | 是否允许本地用户登录FTP |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/var/ftp | 本地用户的FTP根目录 |
chroot_local_user=[YES|NO] | 是否将用户权限禁锢在FTP目录,以确保安全 |
local_max_rate=0 | 本地用户最大传输速率(字节/秒),0为不限制 |
vsftpd作为更加安全的文件传输协议服务程序,允许用户以三种认证模式登录到FTP服务器上。
匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。
本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。
虚拟用户模式:更安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。
ftp是Linux系统中以命令行界面的方式来管理FTP传输服务的客户端工具。
# dnf install ftp
匿名访问模式
vsftpd服务程序默认关闭了匿名开放模式,需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。
向匿名用户开放的权限参数以及作用
参数 | 作用 |
anonymous_enable=YES | 允许匿名访问模式 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES 匿名
2 anon_umask=022 文件/目录新建后权限大小
3 anon_upload_enable=YES 文件传输
4 anon_mkdir_write_enable=YES 可读可写
5 anon_other_write_enable=YES 其他写入权限 剪切等
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES
重启vsftpd服务程序,让新的配置参数生效
# systemctl restart vsftpd
# systemctl enable vsftpd
在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。在连接到FTP服务器后,默认访问的是/var/ftp目录。
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Permission denied.权限拒绝
# ls -ld /var/ftp/pub
drwxr-xr-x. 2 root root 6 Aug 13 2021 /var/ftp/pub
# chown -R ftp /var/ftp/pub
# ls -ld /var/ftp/pub
drwxr-xr-x. 2 ftp root 6 Aug 13 2021 /var/ftp/pub
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Create directory operation failed.创建目录的操作失败
修改SELinux策略并将策略加入开机启动中 SELinux域
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on
//再次尝试
# ftp 192.168.10.10
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
本地用户模式
本地用户模式使用的权限参数以及作用
参数 | 作用 |
anonymous_enable=NO | 禁止匿名访问模式 |
local_enable=YES | 允许本地用户模式 |
write_enable=YES | 设置可写权限 |
local_umask=022 | 本地用户模式创建文件的umask值 |
userlist_deny=YES | 启用“禁止用户名单”,名单文件为ftpusers和user_list |
userlist_enable=YES | 开启用户作用名单文件功能 |
默认情况下本地用户所需的参数都已经在了,不需要修改。而umask这个参数一般中文被称为权限掩码或权限补码,能够直接影响到新建文件的权限值。
例如Linux系统中新建普通文件后权限是644,新建的目录权限是755,虽然用户都习以为常了,但为什么是这个数呢?
首先不得不说到其实普通文件的默认权限应该是666,目录权限会是777,这是写在系统配置文件中的。但默认值不等于最终权限值,根据公式“默认权限 - umask = 实际权限”,而umask值默认是022,所以实际文件到手就剩下644,目录文件剩下755了。
# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
重启vsftpd服务程序,让新的配置参数生效
# systemctl restart vsftpd
# systemctl enable vsftpd
vsftpd服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers和user_list), vsftpd服务程序目录中的这两个文件只要里面写有某位用户的名字,就不再允许这位用户登录到FTP服务器上。
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>
此文件中包含的用户名,则无法登陆系统中 将两个文件中的root用户删除,就可以root用户登录了
# cat /etc/vsftpd/user_list
# cat /etc/vsftpd/ftpuserss
同样是禁止用户登录的功能,却要做两个一摸一样的文件呢?
其实在user_list文件上面,如果把上面主配置文件中userlist_deny参数值改成NO,那么user_list列表就变成了强制白名单,功能完全是反过来的,只允许列表内的用户访问,拒绝其他人。
修改SELinux策略并将策略加入开机启动中
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): root
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/root/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
虚拟用户模式
虚拟用户模式是这三种模式中最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而不能用于SSH登录服务器。
第1步:重置安装vsftpd服务后。创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。
第2步:创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。
FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
第3步:建立用于支持虚拟用户的PAM文件。
第4步:在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。
当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
第5步:为虚拟用户设置不同的权限( 上传、创建、修改、查看、删除文件)。
第6步:设置SELinux域允许策略,使用虚拟用户模式登录FTP服务器。
# cd /etc/vsftpd/
# vim vuser.list
zhangsan 账号
redhat 密码
lisi 账号
redhat 密码
使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限,然后再把原始的明文信息文件删除。
# db_load -T -t hash -f vuser.list vuser.db
# chmod 600 vuser.db
# rm -f vuser.list
创建映射账户并禁止该账户登录系统
# useradd -d /var/ftproot -s /sbin/nologin virtual
# ls -ld /var/ftproot/
# chmod -Rf 755 /var/ftproot/
新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀
# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
修改配置文件
# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 guest_enable=YES
5 guest_username=virtual 虚拟用户登录xiaofu
6 allow_writeable_chroot=YES
7 local_umask=022
8 dirmessage_enable=YES
9 xferlog_enable=YES
10 connect_from_port_20=YES
11 xferlog_std_format=YES
12 listen=NO
13 listen_ipv6=YES
14 pam_service_name=vsftpd.vu 指定修改后的pam对应
15 userlist_enable=YES
设置权限
# mkdir /etc/vsftpd/vusers_dir/
# cd /etc/vsftpd/vusers_dir/
# touch lisi
# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。
# vim /etc/vsftpd/vsftpd.conf
15 userlist_enable=YES
16 user_config_dir=/etc/vsftpd/vusers_dir
重启vsftpd服务程序,让新的配置参数生效
# systemctl restart vsftpd
# systemctl enable vsftpd
修改SELinux策略并将策略加入开机启动中
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): lisi
331 Please specify the password.
Password:此处输入虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files550 Permission denied.
ftp> exit
221 Goodbye.
PAM可插拔认证模块是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计的思想,包含应用程序层、应用接口层、鉴别模块层
利用PAM文件进行认证时使用的参数以及作用
参数 | 作用 |
anonymous_enable=NO | 禁止匿名开放模式 |
local_enable=YES | 允许本地用户模式 |
guest_enable=YES | 开启虚拟用户模式 |
guest_username=virtual | 指定虚拟用户账户 |
pam_service_name=vsftpd.vu | 指定PAM文件( /etc/pam.d/vsftpd文件) |
allow_writeable_chroot=YES | 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求 |
vsftpd服务程序登陆后所在目录
登录方式 | 默认目录 |
匿名公开 | /var/ftp |
本地用户 | 该用户的家目录 |
虚拟用户 | 对应映射用户的家目录 |
-
TFTP简单文件传输协议
简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。
TFTP的命令功能不如FTP服务强大,甚至不能遍历目录,在安全性方面也弱于FTP服务。
由于TFTP在传输文件时采用的是UDP协议,占用的端口号为69,因此文件的传输过程也不像FTP协议那样可靠。
但是,因为TFTP不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。
tftp-server是服务程序,tftp是用于连接测试的客户端工具,xinetd是管理服务
# dnf install tftp-server tftp xinetd
TFTP服务是使用xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能,专门用于管理那些比较小的应用程序的开关工作,想开启那个服务就编辑对应的xinetd配置文件的开关参数。
在安装TFTP软件包后,还需要在xinetd服务程序中将其开启。在RHEL 8版本系统中tftp所对应的配置文件默认不存在,需要用户根据示例文件(/usr/share/doc/xinetd/sample.conf)自行创建。
# vim /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
重启xinetd服务并将它添加到系统的开机启动项中,将69端口号加入到防火墙的允许策略中
# systemctl restart xinetd
# systemctl enable xinetd
# firewall-cmd --zone=public --permanent --add-port=69/udp
# firewall-cmd --reload
TFTP的根目录为/var/lib/tftpboot。
tftp命令中可用的参数以及作用
参数 | 作用 |
? | 帮助信息 |
put | 上传文件 |
get | 下载文件 |
verbose | 显示详细的处理信息 |
status | 显示当前的状态信息 |
binary | 使用二进制进行传输 |
ascii | 使用ASCII码进行传输 |
timeout | 设置重传的超时时间 |
quit | 退出 |
# echo "i love linux" > /var/lib/tftpboot/readme.txt
# tftp 192.168.10.10
tftp> get readme.txt
tftp> quit
# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures readme.txt Videos
Desktop Downloads Music Public Templates
# cat readme.txt
i love linux