【linux知识】sftp配置免密文件推送


以下是 Linux 系统配置 SFTP 用户及免密文件推送的详细步骤,结果以 Markdown 格式呈现:

一、配置 SFTP 用户

1. 创建系统用户(非登录用户)
# 添加用户组(可选,建议创建独立组便于管理)
groupadd sftp-users

# 创建用户并指定所属组(-s /sbin/nologin 禁止登录系统)
useradd -d /data/sftp/user1 -g sftp-users -s /sbin/nologin user1
2. 设置用户密码
passwd user1
3. 创建 SFTP 根目录并设置权限
# 创建用户根目录(需与 useradd -d 指定的目录一致)
mkdir -p /data/sftp/user1

# 确保目录属主为 root(关键!否则 SFTP 服务可能拒绝访问)
chown root:root /data/sftp/user1
chmod 755 /data/sftp/user1  # 目录权限必须为 755 或更低

# 创建用户可写子目录(如上传目录)
mkdir /data/sftp/user1/upload
chown user1:sftp-users /data/sftp/user1/upload  # 设置子目录属主为用户
chmod 755 /data/sftp/user1/upload  # 若需写入权限,改为 755 或 700
4. 配置 SFTP 服务(修改 SSH 配置)
vi /etc/ssh/sshd_config

在文件末尾添加以下内容(启用 Chroot 监狱,限制用户访问范围):

Subsystem sftp /usr/lib/openssh/sftp-server  # 确保该行未被注释

Match Group sftp-users  # 匹配用户组
    ChrootDirectory /data/sftp/%u  # %u 代表用户名,对应 /data/sftp/user1
    ForceCommand internal-sftp  # 强制使用 SFTP
    AllowTCPForwarding no
    X11Forwarding no
    PermitTunnel no
    AllowTcpForwarding no
    ChrootDirectory /data/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    # 可选:限制用户只能访问指定目录(禁止向上访问)
    # 若需写入权限,需确保 Chroot 目录属主为 root 且权限为 755
5. 重启 SSH 服务使配置生效
systemctl restart sshd

二、免密 SFTP 文件推送(基于 SSH 密钥认证)

1. 生成客户端 SSH 密钥对(在推送端执行)
# 生成 RSA 密钥(默认密钥路径:~/.ssh/id_rsa)
ssh-keygen -t rsa -b 4096 -C "sftp-automation"
  • 按提示完成生成,无需设置密码(实现免密)。
2. 上传公钥到 SFTP 服务器(服务端操作)
# 在服务端创建用户密钥目录(若不存在)
mkdir -p /home/user1/.ssh
chmod 700 /home/user1/.ssh  # 目录权限必须为 700

# 将客户端公钥内容写入 authorized_keys 文件
vi /home/user1/.ssh/authorized_keys
# 粘贴客户端 id_rsa.pub 的内容,保存退出

chmod 600 /home/user1/.ssh/authorized_keys  # 文件权限必须为 600
chown -R user1:sftp-users /home/user1/.ssh  # 设置属主和属组
3. 测试免密连接(客户端验证)
# 使用 sftp 命令连接(无需输入密码)
sftp user1@server-ip
  • 若成功连接且无密码提示,说明配置成功。
4. 自动化文件推送脚本示例(客户端)
#!/bin/bash
# 定义变量
SFTP_USER="user1"
SFTP_HOST="server-ip"
REMOTE_PATH="/upload"
LOCAL_FILE="/data/local/file.txt"

# 使用 sftp 命令批量传输(-b 执行脚本)
(
echo "put $LOCAL_FILE $REMOTE_PATH"
echo "bye"
) | sftp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $SFTP_USER@$SFTP_HOST
  • 参数说明
    • -o StrictHostKeyChecking=no:跳过主机密钥检查(适用于自动化场景,生产环境需谨慎)。
    • UserKnownHostsFile=/dev/null:禁止记录主机密钥。

三、常见问题与解决方案

问题现象可能原因解决方案
无法连接 SFTP 服务SSH 服务未启动或端口被防火墙拦截启动 SSH 服务,开放 22 端口(ufw allow ssh
Chroot 目录权限错误根目录属主非 root 或权限高于 755执行 chown root:root /data/sftp/user1chmod 755 /data/sftp/user1
无法上传文件(权限拒绝)子目录无写入权限修改子目录权限为 755 或 700(如 chmod 755 /upload
免密认证失败公钥未正确添加或权限错误检查 authorized_keys 权限是否为 600,属主是否正确
用户无法访问指定目录Chroot 路径配置错误确保 ChrootDirectory 与用户主目录一致(%u 正确替换)

四、安全注意事项

  1. Chroot 目录权限:根目录必须由 root 所有且权限为 755,否则 SFTP 服务会拒绝访问。
  2. 密钥管理:定期轮换 SSH 密钥,避免公钥泄露导致安全风险。
  3. 用户权限隔离:通过独立用户组(如 sftp-users)管理 SFTP 用户,限制其系统访问权限。
  4. 防火墙配置:确保服务器开放 SSH 端口(默认 22),并限制 SFTP 用户的 IP 访问范围。

通过以上步骤,可实现 Linux 系统中 SFTP 用户的安全配置及免密文件推送功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值