sftp服务

本文详细介绍了如何在Linux环境下配置SFTP服务,包括创建目录、设置权限、修改sshd_config文件等步骤,并提供了常见错误的解决方案,如配置项位置不当导致的服务启动失败和MAC算法不匹配问题。

**

Sftp服务

**

一. 创建根目录和组

 [root@localhost ~]# mkdir /sftp/data -p -m 755
 [root@localhost ~]# useradd -g sftp -s /bin/false wei

二. 设置属主权限

[root@localhost ~]# groupadd wei
[root@localhost ~]# chown root:wei /sftp/data/

三. 服务配置

  [root@localhost ~]# vim /etc/ssh/sshd_config

# Subsystem sftp /usr/lib/openssh/sftp-server # 注释下边这行掉
 Subsystem sftp internal-sftp  ## 使用系统默认的sftp服务
 Match User wei #这行用来匹配用户
ChrootDirectory /sftp/data #用chroot将用户的根目录指定到/sftp/data,这样用户就只能在/sftp/data下活动
AllowTcpForwarding no  # 禁用端口转发
X11Forwarding no
ForceCommand internal-sftp # 强制执行内部SFTP,并忽略任何~/.ssh/rc中的命令

四. 重启sshd–>报错

[root@localhost ~]# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.

[root@localhost ~]# systemctl status sshd -l
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Tue 2019-01-15 08:50:29 CST; 3s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 114276 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=255)
 Main PID: 114276 (code=exited, status=255)

Jan 15 08:50:29 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Jan 15 08:50:29 localhost.localdomain sshd[114276]: /etc/ssh/sshd_config line 161: Directive 'Protocol' is not allowed within a Match block
Jan 15 08:50:29 localhost.localdomain systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a
Jan 15 08:50:29 localhost.localdomain systemd[1]: Failed to start OpenSSH server daemon.
Jan 15 08:50:29 localhost.localdomain systemd[1]: Unit sshd.service entered failed state.
Jan 15 08:50:29 localhost.localdomain systemd[1]: sshd.service failed.

解决方案:sftp配置放到文件最后边

Subsystem sftp internal-sftp
Match User wei
ChrootDirectory /sftp/data 
AllowTcpForwarding no
ForceCommand internal-sftp

五. 客户端测试

linux-blof:~ # sftp wei@192.168.137.111
no matching mac found: client hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 server hmac-sha2-256,hmac-sha2-512
Couldn't read packet: Connection reset by peer

解决方案:在服务端/etc/ssh/sshd_config中添加

第一行

KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchan    ge-sha1,diffie-hellman-group14-sha1

第二行

Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-c    bc

第三行

MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96

第四行

KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-s    ha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org

注意注释掉之前的MACs行

重启ssh服务即可
客户端在测试
如果你链接服务器的时候出现下面的提示:

Write failed: Broken pipe
Couldn’t read packet: Connection reset by peer
这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。注意以下两点原则:
目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。
目录开始一直往上到系统根目录为止都不可以具有群组写入权限

### 配置和使用 SFTP 服务SFTP(Secure File Transfer Protocol)是一种基于 SSH 的安全文件传输协议,通常用于在客户端和服务器之间安全地传输文件。以下是如何配置和使用 SFTP 服务器的详细步骤。 --- #### 1. 安装 OpenSSH 服务器 大多数 Linux 发行版默认安装了 OpenSSH 服务器。如果没有安装,可以通过以下命令进行安装: - **Debian/Ubuntu**: ```bash sudo apt update sudo apt install openssh-server ``` - **CentOS/RHEL**: ```bash sudo yum install openssh-server ``` 安装完成后,确保 SSH 服务已经启动: ```bash sudo systemctl start sshd sudo systemctl enable sshd ``` --- #### 2. 配置 SFTP 用户组 为了更好地管理 SFTP 用户,可以创建一个专门的用户组。例如,创建一个名为 `sftpusers` 的组: ```bash sudo groupadd sftpusers ``` 然后,将需要限制为仅使用 SFTP 的用户添加到该组中: ```bash sudo usermod -aG sftpusers username ``` --- #### 3. 修改 SSH 配置文件 编辑 `/etc/ssh/sshd_config` 文件,以配置 SFTP 的限制。找到以下行并进行修改: ```bash # 注释掉默认的Subsystem sftp行 # Subsystem sftp /usr/lib/openssh/sftp-server # 添加以下行以启用internal-sftp Subsystem sftp internal-sftp # 在文件末尾添加以下内容,限制特定组的用户只能使用SFTP Match Group sftpusers ChrootDirectory /sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no ``` 其中: - `ChrootDirectory /sftp/%u` 表示用户的家目录将被限制在 `/sftp/username`。 - `ForceCommand internal-sftp` 强制用户使用 SFTP,而不是普通的 SSH shell。 - `AllowTcpForwarding no` 和 `X11Forwarding no` 禁用不必要的功能,增强安全性。 --- #### 4. 创建 SFTP 用户目录 为每个 SFTP 用户创建一个目录,并设置正确的权限。例如,对于用户 `codetub`: ```bash sudo mkdir -p /sftp/codetub sudo chown root:root /sftp/codetub sudo chmod 755 /sftp/codetub ``` 用户上传的文件应存储在子目录中,例如 `/sftp/codetub/upload`: ```bash sudo mkdir /sftp/codetub/upload sudo chown codetub:sftpusers /sftp/codetub/upload sudo chmod 755 /sftp/codetub/upload ``` --- #### 5. 重启 SSH 服务 完成配置后,重启 SSH 服务以应用更改: ```bash sudo systemctl restart sshd ``` --- #### 6. 测试 SFTP 连接 可以通过命令行或图形化工具测试 SFTP 连接。 ##### 使用命令行连接: ```bash sftp username@server_ip ``` 连接成功后,可以使用以下命令进行文件传输: - **上传文件**: ```bash put local_file_path remote_file_path ``` 例如: ```bash put ./file.txt ./upload ``` - **下载文件**: ```bash get remote_file_path local_file_path ``` 例如: ```bash get ./download/download.txt ./AA ``` ##### 使用图形化工具: 可以使用如 **FileZilla** 或 **WinSCP** 等工具进行 SFTP 连接。配置时需要输入以下信息: - **主机名/IP 地址** - **端口号**(默认为 22) - **用户名** - **密码** --- #### 7. 安全性设置 为了增强 SFTP 服务器的安全性,可以采取以下措施: - **限制用户仅能访问特定目录**:通过 `ChrootDirectory` 配置项限制用户只能访问其家目录。 - **禁用密码登录,使用密钥认证**:生成 SSH 密钥对,并将公钥添加到用户的 `~/.ssh/authorized_keys` 文件中。 - **设置防火墙规则**:通过 `iptables` 或 `ufw` 限制仅允许特定 IP 地址访问 SFTP 服务。 - **定期更新系统和 SSH**:确保系统和 OpenSSH 保持最新版本,以修复潜在的安全漏洞。 --- #### 8. 常见问题解决 - **连接失败**:检查 SSH 服务是否运行,以及防火墙是否允许端口 22。 - **无法上传文件**:确保用户对目标目录具有写权限。 - **权限错误**:检查 `ChrootDirectory` 目录的所有权和权限设置。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值