文件传输协议
TP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接收客户端发出的相关FTP命令与参数。FTP服务器普遍不属于内网中,具有容易搭建、方便管理的特点。有些FTP客户端工具还可以支持文件的多点下载及断点续传技术。
FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。
FTP协议工作模式:
主动模式:FTP服务器主动向客户端发起连接请求。
被动模式:FTP服务器等待客户端发起连接请求(FTP默认工作模式)。
防火墙一般是用于过滤外网进入内网的流量,因此需要将FTP的工作模式设置为主动模式,才可以传输数据。下图是FTP协议传输的拓扑图
vsftpd(very secure ftp demon,非常安全的FTP守护进程)是一款运行在Linux系统上的FTP服务程序。配置yum,然后就可安装vsftpd
# yum install vsftpd
清空防火墙的策略,并保把当前已经被清理的防火墙策略状态保存下来
# iptables -F
# service 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
vsftpd服务程序常用的参数以及作用
vsftpd服务程序
vsftpd作为更加安全的文件传输的服务程序,允许用户三种认证模式登陆到FTP服务器上。
匿名开发模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。
本地用户模式:是通过Linux系统本地的账号密码信息进行认证的模式,相较于匿名开发模式更安全,而且配置也简单。但如被黑客破解了,就可以控制服务器。
虚拟用户模式:是这三种模式中最安全的一种认证模式,需要为FTP服务单独建立用户数据库文件,虚拟出口令验证的账号信息,这些账户信息在服务器系统中实际是不存在的,仅供FTP服务认证使用。
ftp是命令行界面方式管理FTP传输服务的客户端工具,先安装ftp客户端工具
# yum install ftp
匿名开发模式
这种模式是最不安全的模式,一般用来访问不重要的公开文件,生产环境中尽量不要存放重要文件。当然,采用防火墙管理工具(如Tcp-wrappers服务程序)将vsftp服务程序允许访问的主机范围设置为企业内网有可提供基本的安全性。
vsftpd服务程序默认开启了匿名开放模式,我们要做的就是匿名用户的上传、下载文件的权限,及匿名用户创建、删除、更名文件的权限。注意,这些权限会带来危险。
可以向匿名用户开放的权限参数及作用:
修改完后保存退出并从起vsftpd服务程序。还要加入开机启动项中。
# systemctl restart vsftpd
# systemctl enable vsftpd
出现错误,排除思路: 防火墙,权限,SELinux安全上下文
如出现如下错误:
则,修改
# chmod a-w /var/ftp
配置文件中添加
allow_writeable_chroot=YES
本地用户模式
本地用户模式使用的权限参数及作用
配置文件
重启服务后,连接权限阻止
(root用户登录被拒绝。因为vsftpd服务程序的目录中存放着用户名单文件ftpusers和user_list,这两个文件里面有某用户名,就限制这个用户登录到FTP服务器上)。
我们把这两个文件里面root给去掉,当然也可以用一个没有普通用户的登录试试。
然后用root登录即可看到成功
虚拟用户模式
相对前两个模式安全性有了提升,配置也就复杂些。
第一步:创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。
# cd /etc/vsftpd/
# vim vuser.list
zhangsan
redhat
lisi
redhat
上面的明文信息不安全也不符合vsftpd服务程序直接加载的格式,需要用db_load命令用哈希算法将原始明文信息文件转换成数据库文件,并且降低数据库文件的权限,然后把原始的明文信息文件删除。
# db_load -T -t hash -f vuser.list vuser.db
# file vuser.db
# chmod 600 vuser.db
# rm -f vuser.list
第二步:创建vsftpd服务程序用于存储文件的根目录及虚拟用户映射的系统本地用户。
FTP服务用于存储文件的根目录指的是,当虚拟用户登录后访问的默认位置。
前面建的用户比如,张三是个虚拟用户,如果建了文件会出现文件权限错误,所以张三映射到本地用户,这样本地用户的家目录为虚拟用户做了个映射。
添加本地用户,家目录为/var目录中,不允许登录FTP服务器
# useradd -d /var/ftproot -s /sbin/nologin vuser
# ls -ld /var/ftproot/
# chmod -Rf 755 /var/ftproot/
第三步:建立用于支持虚拟用户的PAM文件。
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,是系统管理员可以根据需求灵活调整服务程序的不同认证方式。
PAM采取的分层设计(应用程序层、应用接口层、鉴别模块层)
新建一个用于虚拟用户认证的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
第四步:在vsftpd服务程序的主配置文件中通过pam_service_name 参数将PAM认证文件的名称修改为vsftpd.vu。当应用程序需要PAM认证是,需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
默认的参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。
把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu即可。
利用PAM文件进行认证时使用的参数及作用
修改配置文件
第五步:为虚拟用户设置不同的权限。
如,张三上传、创建、修改、查看、删除文件,李四查看文件。
只需新建一个目录,分别建两个文件zhangsan和lisi。zhangsan设置写入允许的相关权限即可(使用匿名用户的参数)
# 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参数来定义两个虚拟用户不同权限的配置文件所存放路径,重启服务并加入开机启动中
第六步:设置SELinux域允许策略,然后用虚拟用户模式登陆FTP服务器。
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on
分别用zhangsan 和 lisi进行验证
最后总结一下在使用不同的方式登录文件传输服务器后,默认所在的位置:
TFTP简单文件传输协议
简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。占用的端口号为69,不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。
第一步:安装
# yum install tftp-server tftp xinetd
第二步:在RHEL 8系统中,tftp所对应的配置文件默认不存在,需要用户根据示例文件(/usr/share/doc/xinetd/sample.conf)自行创建。在xinetd服务程序中开启,把默认的禁用disable参数改为no。
修改后,重启服务并加入开机启动中,考虑有些系统的防火墙可能默认没允许UDP协议的69端口,还要手动将端口号加入到防火墙的允许策略中。
# systemctl restart tftp
# systemctl enable tftp
# systemctl restart xinetd
# systemctl enable xinetd
# firewall-cmd --permanent --add-port=69/udp
# firewall-cmd --reload
第三步:验证。TFTP根目录为/var/lib/tftpboot。可用刚tftp命令尝试访问其中的文件。
tftp命令中可用的参数以及作用
Samba文件共享服务
SMD(Server Message Block)服务器消息协议,旨在解决局域网内的文件或打印机等资源共享问题。
先要安装Samba服务程序
# yum install samba
由于Samba服务程序主配置文件,注释信息太多,所以改名,然后进行cat 读取,再用grep -v 参数 方向选择,分别去掉所有以井号和分号开头的注释信息行,对于剩余的空白行可以用^$参数来表示并进行反选过滤,最后把过滤后的可有参数信息通过重定向覆盖吸入到原始文件名称中。
# vim /etc/samba/smb.conf
# systemctl restart smb
# systemctl enable smb
最后需要的就剩下
Samba服务程序中的参数及作用
行数 | 参数 | 作用 |
---|---|---|
1 | # See smb.conf.example for a more detailed config file or | 注释信息 |
2 | # read the smb.conf manpage. | |
3 | # Run ‘testparm’ to verify the config is correct after | |
4 | # you modified it. | |
5 | [global] | 全局参数 |
6 | workgroup = SAMBA | 工作组名称 |
7 | ||
8 | security = user | 安全验证的方式,总共有4种 |
9 | ||
10 | passdb backend = tdbsam | 定义用户后台的类型,总共有3种 |
11 | ||
12 | printing = cups | 打印服务协议 |
13 | printcap name = cups | 打印服务名称 |
14 | load printers = yes | 是否加载打印机 |
15 | cups options = raw | 打印机的选项 |
16 | ||
17 | [homes] | 共享名称 |
18 | comment = Home Directories | 描述信息 |
19 | valid users = %S, %D%w%S | 可用账户 |
20 | browseable = No | 指定共享信息是否在“网上邻居”中可见 |
21 | read only = No | 是否只读 |
22 | inherit acls = Yes | 是否继承访问控制列表 |
23 | ||
24 | [printers] | 共享名称 |
25 | comment = All Printers | 描述信息 |
26 | path = /var/tmp | 共享路径 |
27 | printable = Yes | 是否可打印 |
28 | create mask = 0600 | 文件权限 |
29 | browseable = No | 指定共享信息是否在“网上邻居”中可见 |
30 | ||
31 | [print$] | 共享名称 |
32 | comment = Printer Drivers | 描述信息 |
33 | path = /var/lib/samba/drivers | 共享路径 |
34 | write list = @printadmin root | 可写入文件的用户列表 |
35 | force group = @printadmin | 用户组列表 |
36 | create mask = 0664 | 文件权限 |
37 | directory mask = 0775 | 目录权限 |
security参数代表用户登录Samba服务时采用的验证方式。总共有4种可用参数。 | ||
share:代表主机无须验证密码。这相当于vsftpd服务的匿名公开访问模式,比较方便,但安全性很差。 | ||
user:代表登录Samba服务时需要使用账号密码进行验证,通过后才能获取到文件。这是默认的验证方式,最为常用。 | ||
domain:代表通过域控制器进行身份验证,用来限制用户的来源域。 | ||
server:代表使用独立主机验证来访用户提供的密码。这相当于集中管理账号,并不常用。 |
在5、6版本中替换成了用smbpasswd命令来设置独立的Samba服务账号和密码。
到了RHEL 7/8版本将传统的验证方式换成使用tdbsam数据库进行验证。这是一个专门用于保存Samba服务账号密码的数据库,用户需要用pdbedit命令进行独立的添加操作。
配置共享资源
全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对改资源有效。
用于设置Samba服务程序的参数以及作用
第一步:创建用于访问共享资源的账号信息。Samba默认使用的是用户口令认证模式(user)。
这种认证模式可以确保仅让密码且授信的用户访问共享资源。不过需要先建账户信息数据库之后才可用口令认证模式。另外数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件权限属性混乱。
pdbedit用于管理SMB数据库账户信息,格式为“pdbedit [选项] 账户”。
用于pdbedit命令的参数及作用
# id linuxprobe
# pdbedit -a -u linuxprobe
第二步:创建用于共享资源的文件目录。要考虑权限及SELinux安全上下文的限制。
# mkdir /home/database
# chown -Rf linuxprobe:linuxprobe /home/database
# semanage fcontext -a -t samba_share_t /home/database
# restorecon -Rv /home/database
第三步: 设置SELinux服务与策略,允许通过Samba服务程序访问普通用户家目录。
# getsebool -a | grep samba
# setsebool -P samba_enable_home_dirs on
第四步:在Samba主配置文件中,按照格式写入共享信息。
第五步:Samba服务重启并清空iptables防火墙。
# systemctl restart smb
# systemctl enable smb
# iptables -F
# service iptables save
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload
第六步:可以使用“systemctl status smb”命令查看服务器是否启动了Samba服务。如果想进一步查看Samba服务都共享了哪些目录,则可以使用smbclient命令来查看共享详情;-U参数指定了用户名称(用哪位用户挂载了Samba服务,就用哪位用户的身份进行查看);-L参数列出了共享清单。
smbclient -U linuxprobe -L 192.168.153.10
Windows访问文件共享服务
无论Samba共享服务是部署windows系统上还是部署在linux上,通过windows系统进行访问是,其步骤和方法一样。
例如:Windows访问linux上Samba服务
在运行中直接录入\192.168.153.10,如果linux上的iptables关了。就可以登录共享界面了,注意:假如你的登录的账号和系统账号一样,但是Samba的密码不一定是你登录系统用户的密码。两者密码可以不一致,Samba有独自的账号和密码。
进入之后可以创建、修改、删除、更名等操作。
因windows缓存问题,如果再次登录不行可以尝试重启Windows客户端
Linux挂载共享
在客户端安装支持文件共享服务的软件包(cifs-utils)
# yum install cifs-utils
在Linux客户端创建一个用于挂载Samba服务共享资源的目录。mount命令中的-t参数用于指定协议类型,-o参数用于指定用户名和密码,最后追加上服务器IP地址、共享名称和本地挂载目录即可。
服务器IP地址后面的共享名称指的是配置文件中[database]的值,而不是服务器本地挂载的目录名称。
# mkdir /database
# mount -t cifs -o username=linuxprobe,password=redhat //192.168.10.10/database /database
# df -h
如不想每次都输入用户密码,在客户端按照Samba服务的用户名、密码、共享域的顺序将相关信息写入到一个认证文件中。为了安全把这个认证文件的权限改为仅root管理员才能够读写:
# vim auth.smb
username=linuxprobe
password=redhat
domain=SAMBA
# chmod 600 auth.smb
在客户端上创建一个用于挂载Samba服务共享资源的目录,并把挂载信息写入到/etc/fstab中,确保共享挂载信息在服务器重启后依然生效。
# mkdir /database
# vim /etc/fstab
//192.168.10.10/database /database cifs credentials=/root/auth.smb,_netdev 0 0
# mount -a (可能包含权限问题,需要授权chmod )
# df -h