Ubuntu Server 第九章 文件服务

Ubuntu Server 第九章 文件服务

在文件服务之前,先提下网络。网络是一个意外的产物,最早在美国国防部提出,出于战争的需要,担心军事指挥中心被摧毁,设计了一套去中心化的系统(APPAnet)。NSF利用APPanet发展出来的TCP/IP通讯协议,建立的NTFnet广域网,后来越来越多的组织接入使NSfnet成为Internet的骨干网之一。总结一下

  • 网络诞生的最初的是去中心化和资源共享
  • 文件共享是初期最主要的资源共享形式

文件共享从发展至今出现了很多共享服务,很多已经被逐渐不用,有些我们现在还能见到应用场景。

下面逐一介绍这些共享服务

FTP与vsftp

FTP是早起互联网的重要服务,在安全这个概念产生之前,被广泛的使用。原因在于,FTP的传输是明文的,对中间人攻击没有抵抗力。后面也出现了很多安全的传输服务,比如第七章中的SFTP,利用SSH隧道和FTP结合;或者是FTPS,利用FTP和SSL来增强其安全性。那么FTP是不是完全没用了呢?不是的,比如开源镜像站、产品文档,这种场景下,它不需要加密,它的目的就是为了让更多人看到,而且部署方便、快捷。或者在企业内网环境下,我们认为内网是可信网络,使用FTP共享资源仍然是一个很好的选择。针对不同平台,FTP的服务端也有不同的实现。

  • FTP的服务端软件:SERVER U (win ) ,vsftpd(llinux),Proftpd(linux)

这里主要介绍vsftpd。FTP服务端一般不仅有下载功能,同时还能上传客户端的文件,出于安全考虑,一般部署在企业防火墙之外。直接暴露在公网下,禁止上传文件。同时读取文件采用只读的方式进行挂载。

sudo apt install vsftpd #安装vsftpd
#有使用过FTP的朋友知道可以匿名查看FTPAnonymous,实际上安装过程中生成了一个名为"FTP"的账号匿名登录使用的是名为FTP账号
sudo cat /etc/passwd |grep ftp #查看到名为FTP的shell为nologin意为不允许登录主目录在"/srv/ftp"
sudo cat /etc/shadow |grep ftp #它的密码也为*,代表没有密码
netstat -pantu |grep 21   #查看端口是否开启,默认使用21可修改
sudo systemctl start  vsftpd.service #开启服务
sudo service vsftpd status #查看服务运行状态

复制

vsftpd使用系统用户账号来作为FTP用户账户的,如果状态正常(active),可以使用同一网络下的ftp客户端访问,命令行下使用 ftp ip (所有发行版都自带这个命令,ip为开启FTP服务的主机IP地址)输入用户名和密码;使用浏览器(任意浏览器)输入 ftp://ip ,按照提示输入用户名和密码(默认禁止匿名登录),即可进入FTP客户端页面。笔者使用的宿主机是win 7,打开文件夹地址栏,输入 ftp://username:password@ip ,默认的页面的登录用户的主目录。

vsftpd已经安装完成,接下来进行配置,vsftpd有两种配置模式.

  • 匿名模式(anonymous)
  • 认证模式(Standard)

配置文件处于 /etc/vsftpd.conf

sudo vim /etc/vsftpd.conf
anonymous_enable=YES #默认为NO更改为YES启用匿名模式
local_enable=NO #默认YES更改为NO,关闭认证模式
sudo systemctl restart vsftpd.service
sudo systemctl status  vsftpd.service #惯例重启服务查看状态有无异常
#再次使用FTP客户端访问测试输入用户名为"anonymous""anonymous"对应操作系统的"FTP"账号密码为空浏览器win文件浏览器等客户端会自动尝试使用匿名账号登录

复制

登上去你会发现没有文件,为什么会这样呢?因为"FTP"账号的主目录 /srv/ftp 下没有文件,当你在该目录下生成文件时,客户端便能访问到该文件。

sudo vim /etc/vsftpd.conf #继续配置
write_enable=YES #将前面的#号去掉全局配置启用允许写入
anon_upload_enable=YES#允许匿名用户上传
anon_mkdir_write_enable=YES #允许匿名用户建立目录
sudo systemctl restart vsftpd.service
sudo systemctl status  vsftpd.service #重启访问测试

复制

虽然设置了匿名用户上传,如何你真的测试了,就会发现,任然无法在FTP根目录下匿名上传、创建文件,这是因为vsftpd默认对用户做了限制,不允许匿名用户在根目录下上传、创建文件(包括文件夹)。

ls -ld /srv/ftp #查看ftp用户主目录
drwxr-xr-x 2 root ftp 4096 Jun  7 07:23 /srv/ftp
#主目录的所有者是root所有组是FTP组而FTP组没有写入权限

复制

FTP是一个共享服务,是否能上传文件,还是受到文件系统权限的限制。没有权限?手动给它权限不就好了吗!

sudo chmod g+w/srv/ftp ,再次测试发现匿名用户验证失败(笔者使用xftp客户端,推荐使用),赶紧恢复。

如何上传文件呢?

sudo mkdir /srv/ftp/upload #创建upload目录
sudo chown ftp:ftp upload/ #更改目录所有者和所有组

复制

使用FTP客户端测试,在upload目录下可以创建目录与上传文件。

ls -l /srv/ftp/upload #查看上传文件的权限
#可以看到权限是755

复制

还记得为什么会是”755“吗?和系统设置的umask有关。root用户的umask值默认是022,普通用户的umask值是002,目录最大的权限是"777",所以使用 sudo 新建的"upload"权限为"drwxr-xr-x",在vsftpdp配置中,也有umask的值。

sudo vim /etc/vsftpd.conf
local_umask=022 #对本地用户生效
anon_umask=022 #默认没有此项配置添加即可对虚拟用户生效匿名用户包括在内
sudo systemctl restart vsftpd.service
sudo systemctl status  vsftpd.service

复制

再次测试,可以看到掩码已经生效。对“upload”目录下的文件进行删除,发现无法进行删除,重命名也无法进行。我们说,目录其实是个索引,删除文件的过程,本质是是对其索引的操作,是否是权限导致的呢?

ls -ld /srv/ftp/upload #查看FTP组对其没有写入权限
sudo chmod 707 /srv/ftp/upload  #注意如果对目录没有执行权限无法进入目录没有读权限无法浏览目录
sudo systemctl restart vsftpd.service
sudo systemctl status  vsftpd.service

复制

测试无法删除,事实上vsftpd做了限制,也有参数对此功能进行限制。

sudo chmod 704 /srv/ftp/upload #恢复权限
sudo vim /etc/vsftpd.conf
anon_other_write_enable=YES #增加该行配置允许删除和重命名文件
sudo mkdir /srv/upload
sudo chown root:ftp /srv/upload/
sudo usermod -d /srv/upload ftp #修改ftp用户的主目录

复制

这里笔者使用xftp客户端测试时发现修改后导致无法认证,使用命令行下的”lftp“具连接测试成功。

上面是匿名用户的一些上传、下载、修改的参数配置,除此之外,比较重要的就是日志。

sudo vim /etc/vsftpd.conf
xferlog_file=/var/log/vsftpd.log #默认注释了,但是是被开启的,可修改路径。
idle_session_timeout=600 #会话超时时长
no_anon_password=YES #匿名用户禁用密码提示
hide_ids=YES #显示属主/属组名称默认UID
#后两个参数我本地测试没有测试成功

复制

我们说FTP工作在TCP 21端口下,但其实这个说法并不准确。TCP 21端口只是作为会话指令通信端口,传输数据时使用的是哪个端口呢?这就涉及到传输模式的问题,FTP构建了两种数据传输模式

  • 主动模式(PORT):FTP Server主动连接客户端
  • 被动模式(PASV):服务端被动,客户端链接服务端建立连接

首先FTP协议是在TCP协议基础上的,在FTP开始前,TCP的三次握手是必须的。

Port模式FTP 客户端首先和FTP 服务器 的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。  Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。 ——FTP文件传输协议两种模式-主动模式和被动模式

两种模式的区别在哪里?谁给数据传输的端口。为什么这点很重要?在IPv4地址枯竭的今天,NAT横行。作为FTP客户端,每次给的数据端口是随机的,到达FTP server时的端口是边界网关NAT后的端口,此时主动模式就会失效。被动模式就好的吗?FTP server服务端对随机的端口指定范围,防火墙指定端口范围开放,就能解决链接问题。(笔者这里其实还有点模糊,建立抓包理解其过程)

sudo vim /etc/vsftpd.conf
pasv_min_port=40001
pasv_max_port=40100 #指定端口范围
sudo systemctl restart vsftpd.service
sudo systemctl status vsftpd.service

复制

以上就是匿名模式下经常用到的一些配置,接下来介绍认证模式的一些常用配置

FTP 安全

vsftpd安装之后默认为认证模式,使用系统用户账户作为FTP用户账户,默认配置下,只有下载权限,没有上传权限,并且可回溯到根目录,存在安全隐患。

sudo vim /etc/vsftpd.conf
local_enable=YES#开启本地用户的认证
chroot_local_user=YES
#默认注释chroot将登录用户锁定在自己的主目录中默认vsftpd禁止主目录可写的用户登录

复制

再次使用客户端登录,提示禁止主目录可写用户登录,默认情况下禁止vsftpd禁止FTP用户登录可写目录,如果在配置里指不可写的目录是否能解决呢?答案是当然的。

sudo mkdir ftp && sudo chmoe -w ftp
sudo vim /etc/vsftpd.conf
chroot_local_user=YES #注意这是一个全局配置登录的FTP用户绑定其主目录
local_root=/home/xiaowu/ftp #与上一条命令一同生效,指定认证用户到该目录

复制

如果我们确实需要上传文件,如何配置呢?

sudo vim /etc/vsftpd.conf
write_enable=YES
chroot_local_user=YES
local_root=/home/xiaowu #注意,设置可写,FTP用户必须拥有文件系统的可写权限
allow_writeable_chroot=YES

复制

事实上,FTP用户根目录可写是一件非常不安全的事,vsftpd官方推荐第一种方法。

chroot_local_user 是对所有用户生效的,某些应用场景下只需要对部分用户生效,一部分用户可以回溯根目录,一部分无法回溯到根目录。

sudo vim /etc/vsftpd.conf
#chroot_local_user=YES #注释掉
local_root=/home/xiaowu/ftp #用户主目录不可写的限制任然在
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list #去掉这两行的注释,list中包含的用户将绑定到主目录
#注意如果"chroot_local_user=YES"未被注释那么效果将是list中的用户不绑定

复制

安装vsftpd之后,vsftpd在”/etc/ftpuers"生成了禁止登陆FTP的账号列表,并且已经存在了一些账号。可以手动添加,达到禁止登陆的效果。

顺便提一下,在企业坏境下,经常有这样一类备份应用,提前设置好参数,能够自动备份到FTP Server。

前面提到FTP是明文传输的协议,为了更安全的使用FTP,FTPS(FTP+SSL)是使用标准FTP协议和指令的增强型FTP协议,为FTP协议和数据通道之间增加了SSL安全功能。前面提到过SFTP,SFTP使用的是SSH隧道加密,FTPS基于 SSL证书 加密;SFTP通常使用的账号均有shell权限的账号,而FTPS的账号都不需要shell权限。

sudo vim /etc/vsftpd.conf
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem #证书位置
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key #私钥位置
ssl_enable=YES #默认为NO

复制

这里多说一下,笔者使用的xftp居然不支持FTPS,推荐使用Filezilla,开源、免费好用。简单介绍下FTPS通信过程。

这里涉及加解密的一些过程,vsftpd安装过程中会生成一证书以及私钥。有机会的话,笔者向大家介绍加解密。建议手动生成证书

openssl genrsa -des3 -out rsa_private.key 2048 #生成加密的私钥输入两次密码
openssl rsa -in rsa_private.key -out rsa_private.key.insecure #转换成不加密的私钥
openssl req -new -key rsa_private.key -out cert.crt#生成证书请求文件
openssl x509 -req -days 365 -in cert.crt -signkey rsa_private.key -out ca-cert.pem #自签名证书
sudo cp ca-cert.pem /etc/ssl/certs
cp rsa_private.key.insecure /etc/ssl/private/rsa_private.key
sudo vim /etc/vsftpd.conf
rsa_cert_file=/etc/ssl/certs/ca-cert.pem #证书位置
rsa_private_key_file=/etc/ssl/private/rsa_private.key #私钥位置
#重启服务略过

复制

FTP客户端重新连接,即发现新的证书。

NFS

NFS就是Network File System的缩写,它最大的功能是通过网络是跨平台共享彼此文件。最早由SUN公司开发。可能你已经熟悉了windows下的文件共享方式,NFS是类unix下最主要的文件共享方法。基于RPC(Remote Procedure Call)协议的应用层协议实现,NFS发展至今天,已经逐渐淡化对RPC的依赖。NFS默认使用TCP 2049端口,协议本身不加密,可结合SSH隧道实现加密,还可以结合Kerberos协议实现认证。NFS采用隐式 身份认证 系统,正是隐藏式的身份认证方式是很多人对NFS有很多疑惑,在下文中,请务必理解其身份认证和权限配置。

sudo apt install nfs-kernel-server #服务端
sudo apt install nfs-common #客户端
ps -ef |grep rpc #查看RPC相关的进程
#其中rpcbind是RPC的服务进程
#rpc.mountd负责客户端来源认证认证成功后接受客户端的挂载请求工作在随机端口即时向RPC注册
#rpc.idmapd负责用户ID映射
#还有这里没出现的lockd锁定需C/S同时启用),statd(一致性需C/S同时启用)
ps -ef |grep nfs #查看NFS相关的进程
#nsfd是NFS的主进程
netstat -pantu #查看RPC启用的TCP 111 端口和NFS 2049端口是否开启

复制

还记得FTP的权限配置吗?NFS和FTP的配置有点类似。NFS本身的配置是一套共享权限,写入读取还要受到文件系统权限的限制,最后的效果是两套权限的交集。

sudo vim /etc/exports #NFS的配置文件
/export 10.10.10.0/24(rw,sync,no_subtree_check)#ro/rw  只读/只写 sync、async 同步写入/暂存于内存
sudo mkdir /export

复制

配置文件中的选项参数说明:

  • all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
  • noallsquash:与all_squash取反(默认设置);
  • root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
  • norootsquash:与rootsquash取反;
  • anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);——Linux NFS服务器的安装与配置

关于权限的分析

  • 客户端连接时候,对普通用户的检查
  • 如果指定了用户映射的身份,身份为指定用户
  • 如果NFS server上有同名用户,身份即同名用户
  • 没有指定,也没有同名,身份被映射为nobody用户。
  • 对root用户的检查
  • 如果指定了anonuid、anonid,root用户将被映射为指定用户
  • 如果设置norootsquash,root用户的身份被压缩为NFS server上面的root
  • 如果设置了all_squash,root用户将被映射为nobody
  • 如果同时设置了,norootsquash失效

在真正挂载之前,先明确身份认证这件事。Linux是UID、GID来区分不同用户的。

NTS服务不具备身份验证的功能,NFS提供了一种身份验证机制来对用户身份进行管理。当客户端访问NFS服务时,NFS Server 会根据情况将用户的身份映射成NFS匿名用户,nobody(UID为65534),nobody是NFS服务在安装过程创建的账号。

sudo cat /etc/passwd |grep nobody

复制

因此共享目录,建议将文件的所有者和所有组更改为nobydy、nogroup。

sudo chown nobody:nogroup /export
sudo systemctl restart nfs-server.service
sudo exportfs #查看共享目录
cat /var/lib/nfs/etab #记录nfs共享信息,可以查看到没有声明的权限参数都进行了默认配置
cat /var/lib/nfs/xtab #链接NFS的客户端信息

复制

这个时候已经可以在另一台机器上进行挂载

sudo apt install nfs-common  #NFS的客户端
sudo mkdir nfs
sudo mount 10.10.10.131:/export nfs #挂载到目录下
sudo vim /etc/fstab     #写入此文件将开启自动挂载
10.10.10.131:/export /nfs nfs nfs auto #规则错误或通信故障都会导致启动错误

复制

其余的一些命令

rpcinfo -p 10.10.10.131 #查看RPC服务的注册状态
tail /var/log/kern.log #查看服务器日志
showmount -e localhost #查看共享目录和sudo exportfs效果相同
df -h #客户端查看挂载

复制

通常企业坏境下还部署其他的身份认证系统,不依靠NSF自身的身份管理。

sudo vim /etc/idpamd.conf #在该文件中配置
Domain=

复制

具体的用途在后面的章节进行介绍。注意,前面虽然说NFS是在类UNIX系统上进行文件共享,但windows下也进行了支持,在高版本的win系统上,可使用添加组件功能手动开启(笔者使用的win7可开启)。


img


SAMBA服务

Samba是什么?

  • samba是基于SMB(ServerMessage Block)的开源软件,用于连接Unix服务器和windows的客户机,执行打印和文件共享等任务。

怎么出现的呢?

  • 天才的Tridgell基于微软和英特尔开发的SMB协议,为了解决UNIX和windows系统之间的共享问题,开发出了SMB Server服务程序。

上一小节介绍的FTP足以让主机之间共享的文件资源,FTP的文件共享本质上是文件传输,不具备文件系统挂载,SMB在设计之初是工作在局域网下,工作在TCP 139端口下,随着网络的不断发展,后有增加了TCP 445,同时NetBios实现名称解析。使用UDP 137 和UDP 138实现数据指令传输。SAMBA还有很多其他的功能、应用场景,本小节主要介绍文件服务。

SMB(Server Message Block)协议实现文件共享,也称为CIFS(Common Internet File System)。

SAMBA的开发者在开发之初为兼容微软的SMB协议,SMB的源码并不开源。采用的是构造数据包方式,这什么意思呢?SMB发出了数据包是什么样,构造能发相同的数据包的源码即实现其功能。

SAMBA实现了CIFS服务的四个基本功能:

  • 文件和打印共享
  • 认证和授权
  • 名称解析
  • 服务宣告

微软的CIFS协议基于SMB协议,SMB协议基于NetBIOS实现名称解析的。设计NetBIOS 之初,TCP/IP还没出现,局域网主机之间通信是使用主机名称+共享资源+服务类型来进行通信。TCP/IP出现之后,对NetBIos进行了更新,使用NetBIOS over TCP/IP实现跨网段的共享,有学过网络的朋友,比较容易理解。原本不能路由的数据包能够路由了,自然能够跨网段。后面每个功能都对应着一些进程,主要是这几个进程:

  • Smbd:文件共享主进程TCP 139/445
  • Nmbd : WINS通信、名称解析UDP 137/138
  • Winbindd:同步系统账号
  • 其他10多个进程

开始配置

sudo apt install samba  libpam-winbind #安装
sudo vim /etc/samba/dhcp.conf #指定WINS服务器默认配置指向的是本机网卡
sudo vim /etc/samba/Smb.conf #主配置文件

复制

SAMBA服务有两种应用场景

  • 一:对私,需要身份认证才能进行资源共享
  • 二:对公,不需要身份认证,所有人都可以访问到文件

并且这两种场景可以同时部署,即部分文件配置为需要认证才能看到,部分文件不经认证也可以看到。

sudo vim /etc/samba/smb.conf #主配置文件
workgroup = WORKGROUP #Windows下默认的是WORKGROUP根据windows具体情况来配置
[Private] #共享名称
    comment=private share #共享描述
    path=/srv/private #共享目录
    browseable=yes #设置共享是否浏览,“no"表示隐藏
    guesk=ok=no #是否windows下的来宾账号访问
    writable=yes #共享是否具有可写权限
    #read only=yes 可配置为只读
    create mask=0755 #创建文件的权限为755
    valid users=@samba #可访问共享的用户组
#注意缩进

复制


img


使命cmd输入命令也可以看到

sudo adduser smb #新建一个用户设置相关信息
sudo  groupadd samba #创建组
sudo gpasswd -a smb samba #"smb"用户加入"samba"
sudo smbpasswd -a smb #设置"smb"用户使用SAMBA服务的密码
sudo mkdir /srv/private #创建共享目录
ls -ld /srv/private #可以看到目录的所有者和所有组都是root可以将所有组更改为samba这样一来samba组内的用户拥有全部权限了不推荐
sudo setfacl -R -m "g:samba:rwx" /srv/private  #推荐使用acl添加权限这里演示给了全部权限擦头
ls -ld /srv/private #再次查看权限多了一个"+"
getfacl /srv/private #可查看完整权限
testparm #samba服务提供的配置检查工具
sudo systemctl restart smbd.service nmbd.service #sambd服务的smbd和nmbd进程
sudo systemctl status  smbd.service nmbd.service

复制

如果配置没有出错,局域网下的win虚拟机文件浏览器中输入 \\host (host为共享的主机IP),即可看到共享目录,点击目录,输入'smb'和密码(不是用户密码)即可进入目录。


img


使用windows下的cmd命令 net uset 可以查看共享会话,使用 netuse\\host\Private/delete 删除会话。Linux下有挂载命令,windows下也类似。使用 netusex:\\host\Private 可将共享会话映射为一个盘符。

Linux下的文件浏览器能够看到一个以'$'结尾的文件夹,这是前面配置中定义的设备,windows下被隐藏。

smbclient -L //hsot #查看目标服务器信息
smbclient -L //host -U user
mount -t cifs  -o username=smb  //host/Private /mnt #挂载,指定用户smb,默认以当前用户账号
sudo vim /etc/fstab #开机自动挂载
//host/Private /mnt cifs user=smb,pass=smb 0 0

复制

开放共享文件夹

Windows下将不提供登录账号的用户映射为guest,无须输入密码。具体配置方式和私有略有差异,大体是相同的。

sudo vim /etc/samba/smb.conf
[global]
workgroup=WORKGROUP
security=user
map to guest=bad user
guest ok=yes
[Public]
    comment=public share
    path=/srv/public/
    browseable=yes
    writable=yes
    guest ok=yes