温馨提示×

CentOS SFTP配置进阶技巧

小樊
45
2026-01-10 08:18:13
栏目: 智能运维

CentOS SFTP 配置进阶技巧

一 安全加固与权限模型

  • 使用 internal-sftp 并配合 Match Group 限制仅 SFTP、禁用隧道与 X11,遵循最小权限原则:
    • 建议配置示例:
      Subsystem sftp internal-sftp
      
      Match Group sftpusers
          ChrootDirectory /srv/sftp/%u
          ForceCommand internal-sftp
          AllowTcpForwarding no
          X11Forwarding no
          PasswordAuthentication no
          PubkeyAuthentication yes
      
    • 目录权限要点:ChrootDirectory 及其上级目录必须由 root 拥有且不可被组写,用户只可对“可写子目录”拥有写权限。典型做法:
      sudo groupadd sftpusers
      sudo useradd -g sftpusers -s /sbin/nologin sftpuser
      
      sudo mkdir -p /srv/sftp/sftpuser/uploads
      sudo chown root:root /srv/sftp/sftpuser
      sudo chmod 755 /srv/sftp/sftpuser
      sudo chown sftpuser:sftpusers /srv/sftp/sftpuser/uploads
      sudo chmod 755 /srv/sftp/sftpuser/uploads
      
    • 禁用 root 登录:在全局配置中设置 PermitRootLogin no。以上组合可有效将用户锁定在指定目录并降低攻击面。

二 日志审计与故障排查

  • 提升日志级别便于审计与取证:在 /etc/ssh/sshd_config 设置 LogLevel VERBOSE,重启后在 /var/log/secure 可查看登录、会话与 SFTP 操作细节:
    LogLevel VERBOSE
    sudo systemctl restart sshd
    sudo grep sftpuser /var/log/secure
    
  • 常见故障速查表:
    • 连接立即关闭或登录失败:检查 ChrootDirectory 权限链(从 chroot 目录到根目录必须 root:root 且不可组写)。
    • 登录后无法写入:告知用户仅可写入预先配置的可写子目录(如 uploads),不要尝试写入 chroot 根。
    • “Write failed: Broken pipe”:执行 sshd -t 检查配置语法;修正后再重载。
    • 端口不通:确认 firewalld/云安全组已放行 22/TCP

三 认证与访问控制

  • 推荐 SSH 密钥认证(更安全、可自动化):
    • 客户端生成密钥(示例):
      ssh-keygen -t ed25519 -f ~/.ssh/id_sftpuser -C "sftpuser@sftp"
      # 或 RSA
      ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_sftpuser -C "sftpuser@sftp"
      
    • 服务端集中管理公钥(避免把私钥放服务器),并将 AuthorizedKeysFile 指向 chroot 之外的安全目录:
      sudo mkdir -p /etc/ssh/sftp-keys/sftpuser
      sudo cp id_sftpuser.pub /etc/ssh/sftp-keys/sftpuser/authorized_keys
      sudo chown -R root:root /etc/ssh/sftp-keys/sftpuser
      sudo chmod 600 /etc/ssh/sftp-keys/sftpuser/authorized_keys
      
      # /etc/ssh/sshd_config
      PasswordAuthentication no
      PubkeyAuthentication yes
      AuthorizedKeysFile /etc/ssh/sftp-keys/%u/authorized_keys
      
    • 重载生效:sudo sshd -t && sudo systemctl reload sshd
  • 防暴力破解:部署 fail2ban 监控 /var/log/secure,如:
    sudo yum install -y fail2ban
    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    # jail.local 中启用 [sshd] 段:enabled = true, port = 22, maxretry = 3, bantime = 3600
    sudo systemctl enable --now fail2ban
    
  • 变更默认端口(可选,仅为降低噪音攻击面):在 /etc/ssh/sshd_config 增加 Port 4422,放行 firewalld 端口,并在 SELinux 中注册新端口:
    sudo firewall-cmd --permanent --zone=public --add-port=4422/tcp
    sudo firewall-cmd --reload
    sudo semanage port -a -t ssh_port_t -p tcp 4422
    sudo systemctl restart sshd
    # 客户端:sftp -P 4422 user@host
    
    提示:端口变更并不能替代强认证与访问控制。

四 性能与稳定性优化

  • 使用 internal-sftp(进程内、chroot 后更轻量),必要时可启用压缩(会提高 CPU 占用):
    # 启用压缩(可选)
    Subsystem sftp /usr/libexec/openssh/sftp-server -l COMPRESS
    
  • 连接与资源控制:
    MaxSessions 100
    MaxStartups 50:30:100
    ClientAliveInterval 60
    ClientAliveCountMax 3
    
  • 网络与文件系统:
    • 保障带宽与低丢包;在存储侧使用 ext4/XFS,挂载选项建议 noatime,nodiratime 减少元数据开销。
  • 客户端侧优化:
    • 多小文件先打包再传;必要时使用并发连接密钥认证减少握手与口令开销。

五 自动化与运维脚本

  • 批量新增用户(密钥或密码二选一,示例为密钥):
    #!/usr/bin/env bash
    set -e
    if [[ $# -ne 2 ]]; then
      echo "Usage: $0 <username> <pubkey_file>"
      exit 1
    fi
    U=$1; PUB=$2; G=sftpusers; D=/srv/sftp
    
    sudo useradd -g "$G" -d "$D/$U" -s /sbin/nologin "$U"
    sudo mkdir -p "$D/$U/uploads"
    sudo chown root:root "$D/$U"
    sudo chmod 755 "$D/$U"
    sudo chown "$U:$G" "$D/$U/uploads"
    sudo chmod 755 "$D/$U/uploads"
    
    sudo mkdir -p /etc/ssh/sftp-keys/"$U"
    sudo cp "$PUB" /etc/ssh/sftp-keys/"$U"/authorized_keys
    sudo chown -R root:root /etc/ssh/sftp-keys/"$U"
    sudo chmod 600 /etc/ssh/sftp-keys/"$U"/authorized_keys
    
    echo "User $U created (key-only)."
    # 重载:sudo sshd -t && sudo systemctl reload sshd
    
  • 上线前自检清单:
    • 语法校验:sshd -t
    • 服务状态:systemctl status sshd
    • 端口监听:ss -an | grep -E ‘(:22|:4422)’
    • 日志核验:tail -f /var/log/secure | grep sftp
    • 权限复核:chroot 根目录 root:root 755,可写目录仅授予目标用户。

0