文件服务
我的就是你的 - 你的还是你的
网络诞生最初的动因是去中心化和资源共享
文件是初期最主要的资源共享形式(把文件存放在集中的位置供大家访问)
去中心化是另外一个话题
FTP服务
最古老的就是FTP
- 产生于安全出现之前
- 明文传输一切
- 目前主要用于公开提供的文件下载服务(目前还没消亡)
- 使用简单、兼容性好
- 还有SFTP、FTPS等
FTP服务端软件
为了安全考虑
- 独立部署于企业防火墙之外
- 只读挂载存储或采用只读存储设备(CD / DVD)
vsftp安装和配置和管理
vsftpd – 灵活、安全的FTP服务端软件
安装
1
2
3
4
|
sudo apt install vsftpd
# 安装过程中生成ftp账号(anonymous) 主目录在:/srv/ftp
# 默认是21端口进行会话
|
FTP账号
1
2
3
4
|
# 安装完之后会自动创建一个ftp账号(这个账号是不能使用shell和登录机器 )
/etc/passwd # bin/false 表示不能使用shell
/etc/shadow # * 表示不能使用终端
/srv/ftp # ftp用户主目录
|
配置
两种配置模式
1
2
|
anonymous # 匿名模式(适用于公开共享文件) -- vsftpd安装好之后是默认禁用匿名登陆的
Standard # 认证模式
|
常见FTP客户端
1
2
3
4
5
6
7
8
9
10
11
|
# 用哪个账号登录,看到的文件就是哪个用户的主目录
# 1.使用命令行连接ftp服务器
ftp 192.168.1.130
# 2.浏览器
ftp://192.168.111.130
# 3.ftp客户端访问程序(FileZilla)
# 4.文件同步客户端软件
|
1.匿名登录
配置文件位置
1
|
/etc/vsftpd.conf # 主配置文件
|
开启匿名模式
1
2
3
4
5
6
7
8
9
|
sudo vim /etc/vsftpd.conf
# 修改内容为
anonymous_enable=YES # 启用匿名账号登录
local_enable=NO # 禁用认证用户登录
# 重启vsftpd服务,检查状态
然后使用账号anonymous登录(命令行需要,其他方式不用),密码不用输即可()
看到的目录是`/srv/ftp/`
|
开启匿名账号上传
默认:匿名账号是不允许匿名上传的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
sudo vim /etc/vsftpd.conf
# 修改内容
write_enable=YES # 全局设置(以下配置生效的依赖)
anon_upload_enable=YES # 允许匿名上传文件
anon_mkdir_write_enable=YES # 允许匿名创建目录
# 重启服务,检查状态
sudo systemctl restart vsftpd.service
但是还是不能上传的(因为vsftpd强制禁止在根目录下匿名上传)
Note: ftp的主目录是不能进行上传文件的,因为这个目录对同组用户没有写的权限(`ls -ld`查看当前目录的权限),就算你chmod修改了权限也是不行的
【解决办法】:在根目录新建文件然后上传
sudo mkdir /srv/ftp/upload # 创建上传目录
sudo chown ftp:ftp /srv/ftp/upload # 配置新建文件系统属主数组
# 继续新增配置 /etc/vsftpd.conf
anon_umask=022 # 上传文件权限掩码(让上传的文件配置不同的权限 -- 看自己需要来配置)
anon_other_wrote_enable=YES # 允许删除和重命名(否则删除不了也无法重命名)
|
修改FTP主目录
1
2
|
sudo mkdir /srv/files/ftp
sudo chown -d /srv/files/ftp ftp
|
文件传输日志
默认是开启的,可以查看恶意文件上传记录
1
2
3
4
5
6
|
# sudo vim /etc/vsftpd.conf
xferlog_enable=YES # 默认开启
xferlog_file=/var/log/vsftpd.log # 默认日志存放位置(注释不注释他都默认往里面写,可修改)
# 如果修改,重启服务
|
其他配置
1
2
3
4
5
|
idle_session_timeout=600 # 会话超时时长
no_anon_password=YES # 命令行登录禁用密码提示
hide_ids=YES # 显示属主/数组名称,而不显示uid和gid(uid会比较敏感)
# 重启服务
|
端口
- 会话指令 -> TCP 21端口
- 数据传输模式
- 主动模式(受客户端防火墙影响)– 客户端随机产生一个端口,告诉服务器 ->服务端只使用 20端口
- 被动模式 (兼容性好,建议使用) – 服务端告诉客户端使用哪个端口传输
1
2
3
4
5
|
# 用什么模式,客户端说了算
# 都是客户端随机产生一个端口,告诉服务端
# 被动模式连接
ftp -p 192.168.0.130
|
限定被动模式
数据通信端口
1
2
3
4
|
# sudo vim /etc/vsftpd.conf 新增配置
# 开放一个端口的范围(尽量少开)
pasv_min_port=40001
pasv_max_port=40101
|
然后在服务器端边界防火墙上开放上述100个端口
2.身份认证登录
身份认证登录TFP
- 安装之后的默认配置
- 不能上传
- 可回溯到根目录(
存在安全隐患!!!
–> 使用chroot来解决)
chroot
chroot 将所有
登录用户锁定在自己的主目录里(防止目录回溯)
1
2
3
4
5
6
7
|
# 配置文件 sudo vim /etc/vsftpd.conf
# 全局的配置参数(对所有用户)
chroot_local_user=YES # 但是chroot的根目录不能是可写的
# 重启服务
# 默认主目录可写, 但是chroot的根目录不能是可写的,vsftp的禁止用户登录,好猫短 ————> 怎么办呢?看下面
|
(接上文)两种解决办法:
1.为FTP登录指定新的主目录(建议使用)
1
2
3
4
5
|
sudo mkdir ~/ftp && chmod -w ftp # 新建主目录,并删除写入权限
# sudo vim /etc/vsftpd.conf
local_root=/home/xps/ftp
# 客户端只能看到这个目录里面,跳不出去
|
2.允许根目录写入(不建议,存在安全风险)
1
2
3
4
|
# 配置文件 sudo vim /etc/vsftpd.conf
write_enable=YES
local_root=/home/xps
allow_writeable_chroot=YES
|
chroot 将指定
登录用户锁定在自己的主目录里(防止目录回溯)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 配置文件 sudo vim /etc/vsftpd.conf
# chroot_local_user=YES # 注释掉前面配置的全局的配置项
# 启用用户列表功能
chroot_list_enable=YES # 如果chroot_local_user=YES也开启了,就起了相反的作用(除了指定列表里面的用户之外, 都锁定在主目录里)
# 指定用户列表文件
chroot_list_file=/etc/vsftpd.chroot_list
# 编辑用户账号列表
vim /etc/vsftpd/chroot_list
# 添加用户
xps
ftp
# 重启服务
|
禁止指定FTP登录账号
1
|
/etc/ftpusers # 默认禁止FTP登录账号(将用户加入进去)
|
上传文件权限掩码
1
2
|
# 跟匿名用户的配置是类似的
local_umask=022
|
文件同步客户端
自动把我电脑的新的文件,上传到FTP服务器(类似于备份) – 有一些第三方软件(ubuntu自带的同步软件backup
等)
FTP安全
账号无需shell登录权限
基于证书的加密
开启FTPS:
1
2
3
4
5
6
7
8
9
10
11
|
# 安全性--指的是在数据传输过程中不会被别人嗅探
ssl_enable=YES # 启动FTPS
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # 公钥
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key # 私钥
# 重启服务
# 然后再连接的时候就是加密的了(浏览器需要ftps://ip)
# 怎么加密的呢?
# 简单来说:安装FTP时候默认会生成一对公钥和私钥
# 不建议使用安装FTP时候默认生成的证书,建议手动生成(每个应用一个证书, 每个证书有效期一两年)
|
手动生成证书 –> 替换默认证书(安全考虑):
1.生成秘钥文件
1
2
3
|
# 使用ssl的一个开源组件openssl
openssl genrsa -des3 -out ftp.key 4096 # 1024的已经不安全了
# 然后设置密码保护
|
2.生成不加密的秘钥文件
1
2
3
4
5
6
|
# 先还原为明文的密钥对
openssl rsa -in ftp.key -out ftp.key.insecure # 用完就删掉这个insecure文件
# 改名(这是加密的)
mv ftp.key server.key.secure
# 改名(这是明文的)
mv server.key.insecure ftp.key
|
3.生成证书请求文件(使用上面的明文秘钥) – 实验使用的自签名证书
1
2
|
openssl req -new -key ftp.key -out ftp.csr
# 然后输入一些证书的信息
|
这里使用自签名证书(生产环境建议由证书颁发机构前面生成证书)
3.生成自签名证书
1
|
openssl x509 -req -days 365 -in ftp.csr -signkey ftp.key -out ftp.pem # -days 365有效期
|
4.部署证书
1
2
3
|
# ftp.key放到一个更安全的目录去
sudo cp ftp.key /etc/ssl/private/ # 此目录root才能看
sudo cp ftp.pem /etc/ssl/certs/
|
5.修改/etc/vsftpd.cong
中的key和公钥为刚才手动生成的证书, 然后重启服务
上面的操作也可以合并为一条命令
1
|
openssl x509 -req -node -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pem
|
2.SFTP
: 基于SSH加密隧道传输文件
账号需要shell登录权限(可设置禁止权限)
远程登录那一章已经学了
NFS服务
适用于类UNIX系统
- NFS – Network File System
- 最早由SUN公司开发
- 类unix平台最主要的文件共享方法
- 基于RPC(Remote Procedure Call)协议
- NFS是一个RPC Server (v3 、v4)
- 协议本身不加密,可结合SSH,Kerberos实现加密
- 隐藏式身份验证(难点)
- 权限配置是关键
- 服务端口: TCP
2049
安装
1
2
3
4
5
6
|
sudo apt-get install nfs-kernel-server # 服务端
sudo apt-get install nfs-common # 客户端
# 安装完,服务已经都启动了
ps -ef |grep rpc
ps -ef |grep nfs
|
进程
1
2
3
4
5
|
rpcbind # RPC服务进程
nfsd # NFS主进程(身份识别)
mountd # 根据 /etc/exports 配置验证权限
lockd # 锁定(需C/S同时启用)
statd # 一致性(需C/S同时启用)
|
身份识别
- 客户端提供 UID / GID (与用户名、组名无关)
- 服务器按客户端UID /GID 赋权
- 若服务器无客户端UID / GID账号,则将客户端映射为匿名账号
- nobody / nogroup (uid: 65534)
- 客户端使用root账号(UID 0),默认映射为匿名账号
- 可修改配置文件映射 UID 0 为服务端 ROOT (存在安全隐患)
如果客户端uid和服务端uid相同,则客户端会获得服务器端账号的权限;若不同,则客户端获取服务端的nobody权限(除非客户端是root账号,且服务端启用了客户端的root映射为服务端的root)
隐式的身份认证
权限体系
配置
1
2
3
4
5
6
7
8
9
10
11
12
|
sudo vim /etc/exports # 主配置文件
# 内容:共享目录,谁可以访问我, 权限,(sync是数据先写到内存在硬盘可靠,async是写到内存然后写的硬盘速度快),no_subtree_check是不进行子目录的检查(建议使用)
/exports/public 192.168.1.0/24(rw,sync,no_subtree_check) # 允许访问的范围可以使用通配符: *.lab.com
no_root_squash # 禁用root默认映射为nobody(加在上面括号中的配置中)
#
sudo mkdir -p /exports/public # 创建共享目录
sudo chown nobody:nogroup /exports/public # 设置权限
sudo systemctl restart nfs-kernel-server # 重启服务
sudo exportfs # 查看共享目录
cat /var/lib/nfs/etab # 共享目录
cat /var/lib/nfs/xtab # 客户端信息
|
共享权限
1
2
3
4
5
6
|
ro/rw # 只读/只写
sync / async # 同步写入硬盘 / 暂存于内存中
all_squash # 所有用户全部映射为nobody
anonuid / anongid # 支付那个匿名ID(默认65534)
secure / insecure # 使用1024以下/以上端口
hide / no_hide # 共享 / 不共享NFS子目录
|
客户端挂载
1
2
3
4
5
6
7
8
|
# 和本地挂载设备一样(挂载到本地,但是访问是通过网络流量的)
sudo mount 192.168.0.30:/export/public my_nfs/
# 写入文件的话
1.临时获取root权限,会默认转为nobody
sudo xxxxx
2.
chmod修改其他用户的权限后,直接写入即可(客户端的uid与服务端的uid相同的话)
|
启动挂载
风险:nfs服务器如果出现问题,本地机器启动就会特别慢
1
2
|
# sudo vim /etc/fstab
192.168.1.30:/home /my_nfs/ nfs no_auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 # 建议 no_auto 不自动挂载
|
其他命令
1
2
3
4
|
rpcinfo -p 192.168.1.30 # 查询RPC服务注册状态(客户端与服务端都可以执行)
tail /var/log/kern.log # 服务器日志
showmount -e localhost # 显示共享目录
df -h # 客户端查看挂载
|
企业环境有统一域名和身份验证时
1
2
3
|
# 也要配置这个
sudo vim /etc/idpamd.conf
Domain = lab.com
|
Windows客户端
企业版才可以添加nfs的支持
SAMBA服务
SMB / CIFS 协议
- 全称Server message block / Common internet file system
- 最早由IBM研发,后由微软采用并不断完善
- Windows文件和打印共享(之前使用的SMB协议, 后来改进为cifs协议)
- 端口:TCP 139(局域网), 445() / UDP 137(用来名称解析), 138
- Samba 是开源世界逆向了SMB协议后打造的兼容微软SMB的文件共享服务
- Samba还有其他功能、用途和使用场景
功能不仅限于此,但最常用的用途,还是做文件共享服务:
- NFS只适用于类Unix系统环境
- Samba适用与Windows、Linux混合环境的文件共享需要
Samba实现了CIFS服务的四个基本功能
1.文件和打印共享
2.认证和授权
3.名称解析
4.服务宣告(browsing)
传输协议:
1
2
|
NetBIOS # 局域网
NetBIOS over TCP/IP # 跨网段(把NetBIOS数据包封装之后跨网络传输)
|
后台进程
1
2
3
4
|
Smbd # 文件共享主进程 TCP: 139/445
Nmbd # WINS通信、名称解析 UDP: 137/138
Winbindd # 同步系统账号(把Linux系统的账户拷到samba的用户数据库中进行处理)
其他10多个进程
|
安装
1
|
sudo apt install samba libpam-winbind
|
配置
配置文件:
1
2
|
/etc/samba/dhcp.conf # 指定WINS服务器(跨网段时候用)
/etc/samba/smb.conf # 主配置文件
|
一. 配置验证用户名的Samba服务
1.配置文件/etc/samba/smb.conf
1
2
3
4
5
6
7
8
9
10
11
12
|
workgroup = WORKGROUP # [global] 工作组:net config worktation查看工作组
[Private] # 起个名(共享文件夹的名称)
comment = prvivate share # 描述
path = /srv/private/ # 共享路径
browseable = no # 是否允许访问者可显示它这个共享文件夹(完整账号)
guest ok = no # 禁用来宾账号
writable=yes # 可读写(read only=yes)
create mask = 0700 # 新建文件权限
vaild users=@samba # 可访问共享的用户组(稍后会创建)
#
|
2.创建用户/组/共享文件夹
1
2
3
4
5
6
7
8
9
|
sudo adduser user1
sudo groupadd smaba # 上面配置的组的名称
sudo gpasswd -a user1 samba
sudo smbpasswd -a user1 # 设置用户SMB密码(不是操作系统的密码)
sudo mkdir /srv/private/ # 创建共享目录
sudo setfacl -R -m "g:samba:rwx" /srv/private/ # 设置acl访问控制列表,-m修改 (ll之后看到后面有个+号,表示有更多权限)
getfacl /srv/private/ # 查看权限
testparm # 检测
sudo systemctl restart smbd.service nmbd.service
|
客户端访问
win上可以访问Linux上的Samba文件夹, Linux上也可以访问Linux上的Samba文件夹
Linux
1
2
3
4
5
6
7
8
|
# 图形化
点击Connect to Server,输入地址:
smb://192.168.0.130
# 命令行
smbclient -L //192.168.0.130 # 查看目标都有哪些共享信息
smbclient -L //192.168.0.130 -U user1
mount -t cifs -o username=user1 //192.168.0.130/private/public /mnt # 挂载
|
Windows
1
2
3
4
5
6
7
8
9
10
|
# win+R
\\192.168.0.130
# 命令行工具来访问
net user # 查看会话
net user \\host\private/user1 passwd
net user \\host\private /delete # 删除已经建立的会话
net user g: \\host\private # 映射为本地盘符
net config workstation
|
共享名称以$
结尾的,在win上会认为隐藏共享(Linux上还是会显示)
二. 配置公开访问的Samba服务(开放共享文件件)
将不提供登录账号的用户映射为guest,无需输入密码
1.配置文件
1
2
3
4
5
6
|
#配置文件/etc/samba/smb.conf
[Global] # 起个名(共享文件夹的名称)
workgroup = WORKGROUP
security = user # share已废止、Domain、ADS、Server
map to guest = bad user # 映射为guest
guest ok = yes # 允许来宾账号
|
2.开放共享文件夹
1
2
3
4
5
6
|
[Public]
comment = public share
path = /srv/public/
browseable = yes # 允许看到
writable = yes
guest ok = yes
|
3.创建共享目录
1
2
3
4
5
6
7
8
9
|
mkdir -p /srv/public/
# 设置访问列表(设置user,nobody代表guest)
sudo setfacl -R -m "u:nobody:rwx" /srv/public/
getfacl /srv/public/ # 查看权限
testparm # 检测
# 重启服务
sudo systemctl restart smbd.service nmbd.service
|
客户端访问
同上
服务器信息
1
2
3
|
smbd --version # 查看版本
sudo smbstatus # 查看状态和连接状况
|