【linux知识】sftp配置免密文件推送
SFTP配置免密文件推送
- **一、配置 SFTP 用户**
- **1. 创建系统用户(非登录用户)**
- **2. 设置用户密码**
- **3. 创建 SFTP 根目录并设置权限**
- **4. 配置 SFTP 服务(修改 SSH 配置)**
- **5. 重启 SSH 服务使配置生效**
- **二、免密 SFTP 文件推送(基于 SSH 密钥认证)**
- **1. 生成客户端 SSH 密钥对(在推送端执行)**
- **2. 上传公钥到 SFTP 服务器(服务端操作)**
- **3. 测试免密连接(客户端验证)**
- **4. 自动化文件推送脚本示例(客户端)**
- **三、常见问题与解决方案**
- **四、安全注意事项**
以下是 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/user1ForceCommand internal-sftp # 强制使用 SFTPAllowTCPForwarding noX11Forwarding noPermitTunnel noAllowTcpForwarding noChrootDirectory /data/sftp/%uForceCommand internal-sftpAllowTcpForwarding noX11Forwarding 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/user1 和 chmod 755 /data/sftp/user1 |
无法上传文件(权限拒绝) | 子目录无写入权限 | 修改子目录权限为 755 或 700(如 chmod 755 /upload ) |
免密认证失败 | 公钥未正确添加或权限错误 | 检查 authorized_keys 权限是否为 600,属主是否正确 |
用户无法访问指定目录 | Chroot 路径配置错误 | 确保 ChrootDirectory 与用户主目录一致(%u 正确替换) |
四、安全注意事项
- Chroot 目录权限:根目录必须由 root 所有且权限为 755,否则 SFTP 服务会拒绝访问。
- 密钥管理:定期轮换 SSH 密钥,避免公钥泄露导致安全风险。
- 用户权限隔离:通过独立用户组(如
sftp-users
)管理 SFTP 用户,限制其系统访问权限。 - 防火墙配置:确保服务器开放 SSH 端口(默认 22),并限制 SFTP 用户的 IP 访问范围。
通过以上步骤,可实现 Linux 系统中 SFTP 用户的安全配置及免密文件推送功能。