目录
[什么是 SFTP?](#什么是 SFTP?)
[SFTP 的基本特性](#SFTP 的基本特性)
[使用 SFTP 进行文件传输](#使用 SFTP 进行文件传输)
[启动 SFTP 会话](#启动 SFTP 会话)
[SFTP 交互式命令](#SFTP 交互式命令)
[非交互式 SFTP 使用](#非交互式 SFTP 使用)
[什么是 SCP?](#什么是 SCP?)
[SCP 的安全隐患](#SCP 的安全隐患)
[1. 优先选择 SFTP](#1. 优先选择 SFTP)
[2. 使用 SSH 密钥认证](#2. 使用 SSH 密钥认证)
[3. 限制用户权限](#3. 限制用户权限)
[4. 监控文件传输活动](#4. 监控文件传输活动)
[5. 使用防火墙限制访问](#5. 使用防火墙限制访问)
前言:
在 Linux 系统管理中,文件传输是日常工作中不可或缺的一部分。然而,在不安全的网络中传输文件可能会带来严重的安全风险。OpenSSH 套件提供了多种安全文件传输工具,其中
sftp和scp是最常用的两种。本文将深入探讨这些工具的使用方法、安全性考量以及最佳实践。
什么是 SFTP?
SFTP(SSH File Transfer Protocol)是 OpenSSH 套件的一部分,它通过 SSH 连接提供安全的文件传输功能。与传统的 FTP 不同,SFTP 将所有数据(包括身份验证信息和文件内容)进行加密传输,有效防止了中间人攻击和数据窃听。
SFTP 的基本特性
-
加密传输:所有数据在传输前都经过加密
-
身份验证安全:支持密码认证和密钥认证
-
交互式操作:提供类似 shell 的交互界面
-
功能丰富:支持文件列表、目录切换、权限修改等操作
使用 SFTP 进行文件传输
启动 SFTP 会话
要启动 SFTP 会话,使用以下命令格式:
bash
sftp [user@]host[:/path]
参数说明:
-
user@:可选的用户名,如果省略则使用当前本地用户名 -
host:远程主机地址 -
:/path:可选的远程路径
示例:
bash
sftp remoteuser@remotehost
连接成功后,终端会显示 sftp> 提示符,表示已进入交互式 SFTP 会话。
SFTP 交互式命令
SFTP 会话支持多种命令,这些命令在远程文件系统上的操作方式与本地系统类似:
基本导航命令
-
ls:列出远程目录内容 -
cd path:切换到远程目录 -
pwd:显示远程当前工作目录 -
mkdir dirname:创建远程目录 -
rmdir dirname:删除远程目录
本地操作命令
在命令前添加 l 字符可以在本地主机上执行命令:
-
lls:列出本地目录内容 -
lcd path:切换到本地目录 -
lpwd:显示本地当前工作目录
示例:
bash
sftp> pwd
Remote working directory: /home/remoteuser
sftp> lpwd
Local working directory: /home/user
文件传输操作
上传文件到远程系统
使用 put 命令将本地文件上传到远程系统:
bash
sftp> mkdir hostbackup
sftp> cd hostbackup
sftp> put /etc/hosts
Uploading /etc/hosts to /home/remoteuser/hostbackup/hosts
/etc/hosts 100% 227 0.2KB/s 00:00
递归上传目录
使用 -r 选项可以递归上传整个目录树:
从远程系统下载文件
使用 get 命令从远程系统下载文件:
bash
sftp> get /etc/yum.conf
Fetching /etc/yum.conf to yum.conf
/etc/yum.conf 100% 813 0.8KB/s 00:00
非交互式 SFTP 使用
对于简单的下载操作,可以在不进入交互式会话的情况下直接执行:
bash
sftp remoteuser@remotehost:/home/remoteuser/remotefile
注意:这种单命令行语法只能用于下载文件,不能用于上传。
获取帮助信息
在 SFTP 会话中,可以使用 help 命令查看所有可用命令:
bash
sftp> help
Available commands:
bye Quit sftp
cd path Change remote directory to 'path'
chgrp [-h] grp path Change group of file 'path' to 'grp'
chmod [-h] mode path Change permissions of file 'path' to 'mode'
chown [-h] own path Change owner of file 'path' to 'own'
...output omitted...
SCP:传统但存在风险的选择
什么是 SCP?
SCP(Secure Copy)也是 OpenSSH 套件的一部分,它使用 SSH 协议进行安全的文件传输。SCP 命令语法简单,长期以来被系统管理员广泛使用。
SCP 的安全隐患
重要警告:尽管 SCP 使用广泛,但它存在严重的安全问题:
-
代码注入漏洞:SCP 存在已知的代码注入问题,可能允许攻击者在远程服务器上执行任意命令
-
协议设计缺陷:基于历史悠久的 rcp 协议,该协议在设计时并未充分考虑安全性
-
兼容性限制:并非所有安全漏洞都能在保持向后兼容性的前提下得到修复
红帽官方建议
红帽公司明确建议在新的应用或脚本中不再使用 SCP 命令,而应该使用更安全的替代方案,如:
-
SFTP:功能更丰富,安全性更高
-
rsync:支持增量同步,效率更高
安全文件传输最佳实践
1. 优先选择 SFTP
对于大多数文件传输需求,SFTP 应该是首选方案:
-
功能更全面
-
安全性更高
-
交互式操作更友好
2. 使用 SSH 密钥认证
相比密码认证,SSH 密钥认证更加安全:
bash
# 生成 SSH 密钥对
ssh-keygen -t rsa -b 4096
# 将公钥复制到远程主机
ssh-copy-id user@remotehost
3. 限制用户权限
为文件传输创建专用用户,并限制其权限:
-
使用 chroot 监狱限制用户访问范围
-
设置适当的文件权限
-
定期审计用户活动
4. 监控文件传输活动
定期检查系统日志,监控异常的文件传输活动:
bash
# 查看 SSH 连接日志
tail -f /var/log/secure
# 检查 SFTP 会话
ps aux | grep sftp
5. 使用防火墙限制访问
通过防火墙规则限制 SFTP/SSH 端口的访问:
bash
# 只允许特定 IP 访问 SSH 端口
iptables -A INPUT -p tcp --dport 22 -s trusted_ip -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
第一个:
-
-A INPUT:在 INPUT 链的末尾追加一条规则 -
-p tcp:匹配 TCP 协议的数据包 -
--dport 22:匹配目标端口为 22(SSH 默认端口) -
-s trusted_ip:匹配源 IP 地址为 trusted_ip(可信 IP) -
-j ACCEPT:对匹配的数据包执行 接受 动作
第二个:
-
-A INPUT:在 INPUT 链的末尾追加一条规则 -
-p tcp:匹配 TCP 协议的数据包 -
--dport 22:匹配目标端口为 22(SSH 默认端口) -
-j DROP:对匹配的数据包执行 丢弃 动作
实际效果:拒绝所有其他 IP 地址的 SSH 连接请求。
工具对比与选择建议
| 特性 | SFTP | SCP | rsync over SSH |
|---|---|---|---|
| 安全性 | 高 | 低(存在漏洞) | 高 |
| 功能丰富度 | 高 | 低 | 高 |
| 传输效率 | 中等 | 中等 | 高(增量同步) |
| 交互性 | 支持 | 不支持 | 不支持 |
| 推荐程度 | ★★★★★ | ★☆☆☆☆ | ★★★★☆ |
总结
在 Linux 环境下进行安全文件传输时,我们应该:
-
优先使用 SFTP:功能丰富、安全性高、交互友好
-
避免使用 SCP:存在已知安全漏洞,不建议在新项目中使用
-
考虑 rsync:对于需要增量同步的大规模文件传输,rsync 是更好的选择
-
实施安全最佳实践:使用密钥认证、限制权限、监控活动
安全文件传输不仅仅是选择正确的工具,更重要的是建立完善的安全意识和操作流程。通过合理配置和规范操作,我们可以确保文件传输过程既高效又安全。