御林招新题:文件服务器

学习文件服务器的基本知识、搭建Samba 和 SFTP

文件共享协议理解

  • 任务:简要解释 SMB/CIFSSFTP 这两种文件共享协议的作用和主要区别。
  • SMB(Server Message Block)/CIFS(Common Internet File System)
    • 是一种网络文件共享协议,主要用于在局域网内实现文件和打印机等资源的共享。它允许不同计算机之间通过网络访问彼此的文件、目录,就像访问本地文件一样方便
    • 典型应用场景:在 Windows 网络环境中,如,在企业内部的 Windows 办公网络里,员工的电脑可以通过 SMB 协议访问文件服务器上的共享文件夹,实现文档的集中存储和多人协作编辑;学校的计算机教室中,教师机能通过该协议向学生机共享教学资料
    • CIFS 脱胎于 SMB,CIFS 兼容性较好,是不同操作系统和网络环境提供一种通用的文件共享解决方案
  • SFTP(SSH File Transfer Protocol)
    • 基于 SSH(Secure Shell)的文件传输协议,它利用 SSH 的安全特性,在文件传输过程中提供加密保护,确保数据在网络传输时的安全性,防止被窃听或篡改。
    • 典型应用场景:常用于 Linux 系统以及跨平台环境下的安全文件传输。比如,在 Linux 服务器之间进行文件备份和同步时、在开发者需要从本地向远程 Linux 服务器上传代码或下载日志文件时,使用 SFTP 可以保证传输的文件不被非法获取
  • 区别
    • SMB/CIFS:Windows 网络原生,使用方便;局域网环境下,传输文件高效;但是安全性有所不足
    • SFTP:兼容性较好;由于加密消耗,性能会有所下降;功能相对来说比较单一,专注于文件上传、下载;基于 ssh 协议,数据传输稳定、可靠
  • 具体操作
    • 描述 SMB/CIFS 的典型应用场景(例如在 Windows 网络中)。
    • 描述 SFTP 的典型应用场景(例如在 Linux 和跨平台环境中)。

Samba 服务配置(SMB/CIFS)

  • 任务:安装并配置 Samba,实现局域网内文件的共享访问。

  • 具体操作

    • 在你的 Linux 服务器上安装 Samba。

    sudo yum install samba samba-client samba-common

    • 创建一个专用于 Samba 的用户,并设置密码。
    1
    2
    3
    
    [root@localhost frps]# sudo useradd sambauser
    [root@localhost frps]# sudo smbpasswd -a sambauser
    ......
    
    • 修改 /etc/samba/smb.conf 配置文件,创建一个共享目录,并确保只有你创建的用户可以访问。
    1
    2
    3
    4
    5
    6
    
    sudo mkdir -p /home/samba/share
    sudo chown sambauser:sambauser /home/samba/share
    sudo chmod 755 /home/samba/share
    sudo vim /etc/samba/smb.conf
    # 重启生效
    sudo systemctl restart smb nmb
    
    1
    2
    3
    4
    5
    6
    7
    8
    
    [myshare] # smb.conf
        comment = My Samba Share
        path = /home/samba/share
        valid users = sambauser
        writable = yes
        browseable = yes
        create mask = 0755
        directory mask = 0755
    
    • 验证:在另一台局域网内的电脑(例如 Windows 或 macOS)上,通过网络邻居或文件管理器访问你的共享目录,并上传一个文件进行测试。

    Windows 需要在控制面版里启用 SMB、重启

    注意:直接在地址栏输入\\192.168.109.100 即可!!

    上传了一个文件到 sambauser,OK

    image-20251019163353891

SFTP 服务配置

  • 任务:利用 SSH 服务配置 SFTP,实现安全的文件传输和管理。

  • 具体操作

    • 确保你的服务器上已安装 SSH 服务。

    sudo yum install openssh-server

    • 创建一个专用于 SFTP 的新用户,并设置密码。
    • 修改 /etc/ssh/sshd_config 文件,配置 SFTP 子系统,并限制 SFTP 用户只能访问其主目录,无法登录 Shell。
    1
    2
    3
    4
    5
    6
    7
    8
    
    sudo systemctl start sshd
    sudo useradd sftpuser
    sudo usermod -s /sbin/nologin sftpuser # 限制登录系统 shell!
    
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 备份一下配置文件
    vi /etc/ssh/sshd_config
    
    sudo systemctl restart sshd # 重启生效
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    # 注释掉原来的 SFTP 子系统配置
    # Subsystem      sftp    /usr/lib/openssh/sftp-server
    
    # 配置新的 SFTP 子系统,使用 internal-sftp
    # 相比原来的 sftp-server,更便于配置和限制。
    Subsystem sftp internal-sftp
    
    # 匹配 SFTP 用户(这里是 sftpuser)
    # 对用户 sftpuser 应用后续的配置
    Match User sftpuser
        # 强制使用 internal-sftp,无法执行 shell
        ForceCommand internal-sftp
        # 限制用户只能访问其主目录
        ChrootDirectory %h
        # 允许用户进行的操作,这里设置为允许读写等
        # 禁止 TCP 转发和 X11 转发,增强安全性
        AllowTcpForwarding no
        X11Forwarding no
    
    # 这下面还有配置,要剪切到前面,不能放在 Match 下面!
    
    • 验证:使用一个 SFTP 客户端(例如 FileZilla 或 WinSCP)连接到你的服务器,使用 SFTP 用户登录,尝试上传文件,并确认无法执行 Shell 命令。
  • 碰到的一些问题
    • 需要将 ChrootDirectory(即目录,/home/sftpuser,两级都一样) 的权限设置为 755,并且归属于 root sudo chown root:root /home/sftpuser
    • sshd -t 检查 config 的语法、看日志,又发现 usedns 不能在 matchuser 块内,移动一下
    • 就可以了

image-20251019171609664

权限精细化管理

  • 任务:在 Samba 共享中,配置更细致的权限。

  • 具体操作

    • 创建一个 Samba 组。
    1
    2
    3
    4
    5
    6
    
    sudo groupadd sambagrp # 添加系统组
    sudo smbgroupadd sambagrp # 添加 samba 组
    sudo mkdir -p /home/samba/groupshare # 共享目录
    sudo chgrp sambagrp /home/samba/groupshare # 归组
    sudo chmod 770 /home/samba/groupshare # 设置权限
    sudo vim /etc/samba/smb.conf
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    [groupshare]
        comment = Group Share Directory
        path = /home/samba/groupshare
        valid users = @sambagrp
        write list = @sambagrp
        browseable = yes
        read only = no
        create mask = 0660
        directory mask = 0770
    
    1
    2
    3
    4
    5
    
    sudo systemctl restart smb nmb # 重启一下
    # 加一个用户
    sudo useradd groupuser1
    sudo usermod -a -G sambagrp groupuser1 # a 是添加,G是修改用户所属的扩展群
    sudo smbpasswd -a groupuser1
    
    • 配置一个共享目录,允许该组内的所有用户读写,但禁止其他用户访问。
    • 验证:用一个新用户尝试访问,确认其被拒绝;用组内用户访问,确认可以正常读写。
    1
    2
    
    net use # 看连了什么
    net use \\192.168.109.100 /delete # 先把原来的断开
    

    image-20251019174411858

    image-20251019175340113

WebDAV 配置

  • 任务:搭建一个支持 WebDAV 协议的文件服务器,通过 HTTP/HTTPS 协议访问文件。

  • 具体操作

    • 选择一个支持 WebDAV 的工具(例如 Nginx 或 Caddy),进行安装。
    1
    2
    3
    4
    5
    6
    7
    8
    
    #wget https://github.com/caddyserver/caddy/releases/download/v2.7.6/caddy_2.7.6_linux_amd64.tar.gz
    #tar -xzf caddy_2.7.6_linux_amd64.tar.gz
    #sudo mv caddy /usr/bin/
    # 失败了,还是用 docker 吧
    sudo mkdir -p /var/www/webdav
    sudo chown -R $USER:$USER /var/www/webdav  # 设置目录所有者,方便后续操作
    vi ~/caddy-webdav/Caddyfile
    # 也失败了,插件不会配,专用 Nginx
    

    参考 如何在 CentOS 7 服务器上通过 Nginx 部署 WebDAV

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    # 下载nginx  
    wget1 https://github.com/nginx/nginx/archive/refs/tags/release-1.26.3.tar.gz  
      # 解压nginx  
    tar xvf release-1.26.3.tar.gz   
      # 切换到nginx目录,下载nginx-dav-ext-module  
    cd nginx-release-1.26.3/  
    wget1 https://github.com/arut/nginx-dav-ext-module/archive/refs/tags/v3.0.0.tar.gz  
      # 解压nginx-dav-ext-module  
    tar -xvf v3.0.0.tar.gz 
    
    # 编辑安装 nginx,并且要指定插件!注意路径
    auto/configure --prefix=/etc/nginx \  
    --conf-path=/etc/nginx/nginx.conf \  
    --sbin-path=/usr/sbin/nginx \  
    --pid-path=/var/run/nginx.pid \  
    --lock-path=/var/run/nginx.lock \  
    --error-log-path=/var/log/nginx/error.log \  
    --http-log-path=/var/log/nginx/access.log \  
    --with-stream --with-http\_dav\_module --with-http\_ssl\_module --with-http\_v2\_module \  
    --add-module=./nginx-dav-ext-module-3.0.0  
    # 编译剩余步骤
    make && make install  
    nginx -V # 验证
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    # vim /lib/systemd/system/nginx.service
    [Unit]  
    Description=A high performance web server and a reverse proxy server  
    Documentation=man:nginx(8)  
    After=network.target nss-lookup.target  
    
    [Service]  
    Type=forking  
    PIDFile=/run/nginx.pid  
    # master... 要删掉!
    ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; #master\_process# on;'  
    ExecStart=/usr/sbin/nginx -g 'daemon on; #master\_process on#;'  
    ExecReload=/usr/sbin/nginx -g 'daemon on; #master\_process on#;' -s reload  
    ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid  
    TimeoutStopSec=5  
    KillMode=mixed  
    
    [Install]  
    WantedBy=multi-user.target 
    
    1
    2
    3
    4
    5
    
    # 重加载systemd配置  
    systemctl daemon-reload  
    systemctl enable nginx.service   
    systemctl start nginx.service  
    systemctl status nginx.service  
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    # vim /etc/nginx/nginx.conf
    server {  
        listen 8089;    
        listen [::]:8089;  
        server\_name localhost;  
        # 认证方式  
        auth\_basic realm\_name;  
    
        # 存放认证用户名、密码文件  
        auth\_basic\_user\_file /etc/nginx/.webdav/auth.list;  
    
        # webdav服务访问的根目录  
        root /cherry\_data;  
    
        dav\_methods PUT DELETE MKCOL COPY MOVE;  
    
        dav\_ext\_methods PROPFIND OPTIONS LOCK UNLOCK;  
    
        dav\_access user:rw group:rw all:r;  
    
        client\_body\_temp\_path /tmp/webdav;  
    
        client\_max\_body\_size 0;  
    
        create\_full\_put\_path on;  
    
        #添加索引指令,如果忘记这项配置,nginx访问会提示403  
     location /{  
                    root /cherry\_data;  
                    autoindex on;  
                    autoindex\_format html;  
                    autoindex\_exact\_size off;  
                    autoindex\_localtime on;  
                    charset utf-8,gbk;  
    
            }  
    }  
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    # 最后
    nginx -s reload  
    cd /etc/nginx/  
    mkdir .webdav  
    cd .webdav/  
    # 设置用户名为admin  
    echo -n 'admin:' | tee -a auth.list   
    openssl passwd -apr1 | tee -a auth.list  
    Password:    #首次输入  
    Verifying - Password:  #再次输入 
    
    mkdir /cherry\_data  
    chmod 777 /cherry\_data  # 访问的目录
    
    • 配置一个 WebDAV 共享目录,并设置基础认证。
    • 验证:使用支持 WebDAV 的客户端(例如 Windows 的网络位置)或浏览器访问,输入用户名和密码,确认可以管理文件。
    • 用 windows 映射挂载的时候,发现不能用 http 协议,得改一下注册表
      • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters BasicAuthLevel 1改2
      • Win + R,services.msc;Webclent 重启

    image-20251019201856643

    image-20251019194944075

性能与安全性

  • 任务:对你的文件服务器进行简单的性能测试和安全加固。

  • 具体操作

    • 性能:使用 dd 命令或其他工具,测试在 Samba 和 SFTP 上传大文件的速度,并进行简单对比。

    Samba:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    PS C:\Users\calendar\Downloads> fsutil file createnew ./test 1073741824
    已创建文件 C:\Users\calendar\Downloads\test
    PS C:\Users\calendar\Downloads> Measure-Command { Copy-Item -Path "C:\Users\calendar\Downloads\test" -Destination "\\192.168.109.100\groupshare" }
    
    
    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 9
    Milliseconds      : 823
    Ticks             : 98231516
    ......
    TotalSeconds      : 9.8231516
    TotalMilliseconds : 9823.1516
    

    stfp:

    image-20251019204534908

    • 安全

      • 为 SFTP 服务配置基于密钥的认证,禁用密码登录。
      • 密钥工具生成密钥,sftpuser / .ssh 目录,创建 authorized_keys 文件,将复制的公钥内容粘贴进去并保存。

      • 禁用密码:PasswordAuthentication 设置为 no

      • 简要说明这种认证方式比密码认证更安全的原因。

      密码认证存在被暴力破解、泄露等风险;而基于密钥的认证使用非对称加密,私钥仅存于客户端且难以破解,公钥即使暴露也无法用于登录,极大提升了安全性,能有效防范密码相关的攻击手段。

Licensed under Calendar