运维和管理企业Linux服务器,除了要熟练账务Linux系统本身的维护和管理之外,最重要的是熟练甚至精通Linux系统安装配置各种应用软件,对软件进行调优及针对软件在使用中遇到的各类问题,能够快速定位并解决,
本章向读者介绍进程,线程,企业Vsftpd服务器实战,匿名用户访问,系统用户访问及虚拟用户实战等内容。
8.1 进程与线程的概念及区别
Linux系统各种软件和服务存在于系统,必然会占用系统各种资源,系统资源是如何分配及调度的,本节给大家展示进程,资源及调度相关的内容。
进程(proccess)是计算机中的软件程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体,在当代棉线线程设计的计算机结构中,进程是线程的容器。软件程序是对指令,数据及其组织形式的描述,而进程是程序的试题,通常而言,把运行在系统中的软件程序称之为进程。
除了进程,大家通常会听到线程的概念,线程也被称为轻量级进程(light weight process,LWP),是程序执行刘的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有操作系统资源,但是该线程可与同属进程的其他线程共享该进程所拥有的的全部资源。
程序,进程,线程三者区别如下。
- 程序:程序并不能单独执行,是静止的,只有将程序加载到内存中,系统为其分配资源后才能够执行
- 进程:程序对一个数据集的动态执行过程,一个进程包含一个或者更多的线程,一个线程同时只能被一个进程所拥有的,进程是分配资源的基本单位。进程拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。
- 线程:线程是进程内的基本电镀单位,线程的划分尺度小于进程,并发性更高,线程本身不拥有系统资源,但是该线程可与同属进程的其他线程共享该进程所有的全部资源。每一个独立的线程,都有一个程序运行的入口,顺序执行序列和程序的出口。
程序,进程,线程三者的关系拓扑图如下图:
上图所示,多线程,多线程的区别如下:
- 多进程:每个进程互相独立,不影响主程序的稳定性,某个子进程崩溃对其他进程没有影响,通过增加CPU可以扩充软件的性能,可以减少线程加锁/解锁的影响,极大提高性能。缺点是多进程逻辑控制复杂,需要和主程序交互,需要扩进程便捷,进程之间上下文切换比线程之间上下文切换代价大。
- 多线程:无需跨进程,程序逻辑和控制方式简单,所有线程共享该进程的内存和变量的。缺点是每个线程与主程序共用地址控件,线程之间的同步和加锁控制比较麻烦,一个线程的崩溃会影响到整个进程或者程序的稳定性。
8.2 Vsftpd服务器企业实战
文件传输协议(file transfer protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件,上传文件,下载文件。FTP基于TCP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同时在生成一个单独的TCP连接用于FTP数据传输。用户可以通过客户端向FTP服务器端上传,下载,删除文件,FTP服务器端可以同时提供给多人共享使用。
FTP服务时Client/Server(简称C/S)模式,基于FTP协议实现FTP文件对外共享及传输的软件称之为FTP服务器源端,客户端程序基于FTP协议,则称之为FTP客户端,FTP客户端可以向FTP服务器上传,下载文件。
8.2.1 FTP传输模式
FTP基于C/S模式,FTP客户端与服务器端游两种传输模式,分别是FTP主动模式,FTP被动模式,主动模式均是以FTP服务器端为参照。FTP传输模式如下,其中图(a)为主动模式,图(b)为被动模式。主被动模式详细区别如下。
- FTP主动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器,FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1)。
- FTP被动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,客户端提交PASV命令,服务器会开启一个任意的端口(P>1024),并发送port P命令给客户端。客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
在企业实际环境中,如果FTP客户端与FTP服务端均开放防火墙,FTP需以主动模式工作,这样只需要在FTP服务器端防火墙规则中,开放20,21端口即可。
8.2.2 FTP传输模式
目前主流的FTP服务器端软件包括Vsftpd,ProFTPD,PureFTPD,Wuftpd,Server-UFtp,FileZilla Server等,其中UNIX/Linux使用较为广泛的FTP服务器端软件为Vsftpd。
非常安全的FTP服务进程(very secure FTP daemon,Vsftpd),Vsftpd是在UNIX/Linux发行版本中最主流的FTP服务器程序,有点是小巧轻快,安全易用,稳定高效,满足企业跨部门,多用户的使用等。
Vsftpd基于GPL开源协议发布,在中小企业中得到广泛的应用。Vsftpd可以快速上手,基于Vsftpd虚拟用户方式,访问验证更加安全。Vsftpd还可以基于MySQL数据库作为安全验证,多重安全防护。
8.2.3 Vsftpd服务器安装配置
Vsftpd服务器端安装有两种方法:一是基于YUM安装方式;二是基于源码编译安装,最终实现效果完全一样,本文采用YUM安装Vsftpd,具体步骤如下:
(1)在shell命令行执行如下命令,如下图所示。
(2)Vsftpd安装后的配置文件路径,启动Vsftpd服务及查看进程是否成功,如下图所示。
[root@yunanjiaoyu ~]# rpm -ql vsftpd | more
[root@yunanjiaoyu ~]# systemctl start vsftpd
[root@yunanjiaoyu ~]# ps -ef | grep vsftpd
(3)/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 FTP:使用20端口进行数据传输。
- xferlog_std_format=YES:日志文件将根据xferlog的标准格式写入。
- listen=NO:Vsftpd不以独立的服务启动,通过Xinetd服务管理,建议改成YES。
- Listen_ipv6=YES:启动IPv6监听。
- pam_service_name=vsftpd:登录FTP服务器,依据/etc/pam.d/vsftpd中内容进行认证。
- userlist_enable=YES:vsftpd.user_list和ftpusers配置文件里用户禁止访问FTP。
- tcp_wrappers=YES:设置Vsftpd与tcp wrapper结合进行主机的访问控制,Vsftpd服务器检查/etc/hosts.allow和/etc/hosts.deny中设置来决定请求连接的主机,是否允许访问该FTP服务器。
(4)启动Vsftpd服务后,通过Windows客户端资源管理器访问Vsftpd服务器端,如下图所示。
ftp://192.168.22.12
FTP主被模式的选择,默认为主动模式,设置为被动模式的方法如下:
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=61000
8.2.4 Vsftpd匿名用户配置
Vsftpd默认以匿名用户访问,匿名用户默认访问的FTP服务器发布端路径为/var/ftp/pub,匿名用户只有查看权限,无法创建,删除,修改。如需关闭FTP匿名用户访问,需要修改配置文件/etc/vsftpd/vsftp.conf,将anonymous_enable=YES修改为anonymous_enable=NO,重启Vsftpd服务即可。
如果允许匿名用户能够上传,下载,删除文件,需要在/etc/vsftpd/vsftpf.com配置文件中加入以下代码,详解如下:
- anon_upload_enable=YES:允许匿名用户上传文件。
- anon_mkdir_write_enable=YES:允许匿名用户创建目录。
- anon_other_write_enable=YES:允许匿名用户其他写入权限。
匿名用户完整的vsftpd.conf配置文件代码如下:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_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
由于默认vsftpd匿名用户有两种:anonymous,ftp,所以匿名用户如果需要上传文件,删除及修改等权限,需要vsftpd用户多/var/ftp/pub目录有写入权限,使用chown和chmod任意一种命令均可设置权限,具体设置命令如下:
chown -R ftp pub/
chmod o+w pub/
如上vsftpd.conf配置文件配置完毕,同时权限设置完毕,重启vsftpd服务即可,通过Windows客户端访问,能够上传文件,删除文件,创建目录等操作。如下图所示:
8.2.5 Vsftpd系统用户配置
Vsftpd匿名用户设置完毕,任何人都可以查看FTP服务器的文件,目录,甚至可以修改,删除,文件和目录,如何存放私密文件在FTP服务器端,并保证文件或者目录专属于拥有者呢?Vsftpd系统用户可以实现该需求,解决上述问题。
实现Vsftpd系统用户方式验证,只需在Linux系统中创建多个用户即可,创建用户使用useradd指令,同时给用户设置密码,即可通过用户和密码登录FTP,进行文件上传,下载,删除等操作。Vsftpd系统用户实现方法步骤如下:
(1)Linux系统中创建系统用户yunan1,yunan2,分别设置密码为123456。
[root@yunanjiaoyu ~]# useradd yunan1
[root@yunanjiaoyu ~]# useradd yunan2
[root@yunanjiaoyu ~]# echo 123456 | passwd --stdin yunan1
[root@yunanjiaoyu ~]# echo 123456 | passwd --stdin yunan2
(2)修改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
(3)通过Windows资源客户端验证,使用yunan1,yunan2用户登录FTP服务器,即可上传文件,删除文件,下载文件,yunan1,yunan2系统用户上传文件的家目录在/home/yunan1,/home/yunan2下,如下图所示。
(a)yunan1登录FTP服务器身份验证
(b)yunan1登录FTP服务器上传文件
8.2.6 vsftpd虚拟用户配置
vsftpd基于系统用户访问FTP服务器,系统用户越多越不利于管理,而且不利于系统安全,为了能更加实用vsftpd,可以使用vsftpd虚拟用户方式。
vsftpd虚拟用户原理为虚拟用户没有实际的真是系统用户,而是通过映射到其中一个真是用户以及设置相应的权限来实现访问验证,虚拟用户不能登录Linux系统,从而让系统更加的安全可靠。
vsftpd虚拟用户企业配置步骤如下:
(1)安装vsftpd虚拟用户需要用到的软件及认证模块。
yum install pam* libdb-utils libdb* --skip-broken -y
(2)创建虚拟用户临时文件/etc/vsftpd/ftpusers.txt,新建虚拟用户和密码,其中yunan001,yunan002位虚拟用户名,123456位密码,如果有多个用户,依此格式填写即可。
yunan001
123456
yunan002
123456
(3)生成vsftpd虚拟用户数据库认证文件,设置权限为700。
db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db
chmod 700 /etc/vsftpd/vsftpd_login.db vsftpd_login.*
(4)配置PAM认证文件,/etc/pam.d/vsftpd行首加入如下两行代码:
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
(注释掉里面不相关的参数)
(5)vsftpd虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用,创建用户命令如下:
useradd -s /sbin/nologin ftpuser
(6)完整的vsftpd.conf配置文件代码如下:
#global config Vsftpd 2020
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
userlist_enable=YES
tcp_wrappers=YES
#config virtual user FTP
pam_service_name=vsftpd
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=YES
vsftpd虚拟用户配置文件参数详解如下:
- pam_service_name=vsftpd:虚拟用户启用pam认证。
- guest_enable=YES:启用虚拟用户。
- guest_username=ftpuser:映射虚拟用户至系统用户ftpuser。
- user_config_dir=/etc/vsftpd/vsftpd_user_conf:设置虚拟用户配置文件所在的目录。
- virtual_use_local_privs=YES:虚拟用户使用与本地用户相同的权限。
(7)至此,所有虚拟用户共同使用/home/ftpuser主目录实现文件上传与下载,可以在/etc/vsftpd/vsftpd_user_conf目录创建虚拟用户各自的配置文件,创建虚拟用户配置文件主目录,代码如下:
mkdir -p /etc/vsftpd/vsftpd_user_conf/
(8)以下分别为虚拟用户yunan001,yunan002创建配置文件。
vim /etc/vsftpd/vsftpd_user_conf/yunan001,同时创建私有的虚拟目录,代码如下:
local_root=/home/ftpuser/yunan001
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim /etc/vsftpd/vsftpd_user_conf/yunan002,同时创建私有的虚拟目录,代码如下:
local_root=/home/ftpuser/yunan002
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
虚拟用户配置文件内容详解如下:
- local_root=/home/ftpuser/yunan002:yunan002虚拟用户配置文件路径。
- write_enable=YES:允许登录用户有写权限。
- anon_world_readable_only=YES:允许匿名用户下载,然后读取文件。
- anon_upload_enable=YES:允许匿名用户上传文件权限,只有在write_enable=YES时该参数才生效。
- anon_mkdir_write_enable=YES:允许匿名用户创建目录,只有在write_enable=YES时该参数才生效。
- anon_other_write_enable=YES:允许匿名用去其他权限,例如删除,重命名等。
(9)创建虚拟用户各自虚拟目录,代码如下:
mkdir -p /home/ftpuser/{yunan001,yunan002} ;chown -R ftpuser:ftpuser /home/ftpuser
重启vsftpd服务,通过Windows客户端资源管理器登录vsftpd服务端,测试结果如下图。
(a)yunan001虚拟用户登录FTP服务器
(b)yunan001虚拟用户上传下载文件