1、密钥对登录配置
首先要在登录主机(192.168.1.111)上生成密钥对
ssh-keygen -t rsa -b 2048
生成公钥和私钥,.pub结尾的文件即为公钥

如果要登录要远程主机(192.168.1.112)上需要讲本机(192.168.1.111)的id_rsa.pub内容复制到目标主机上
1)如果有远程主机的登录用户密码直接使用如下命令传输即可(root就用root用户,普通用户登录就用普通用户
ssh-copy-id -i id_rsa.pub root@192.168.1.112
2)手动复制方式:如果配置root用户的免密码登录,就需要在root家目录中进入.ssh文件夹创建authorized.keys文件,并写入生成的公钥内容,如果配置的是其他用户的免密码登录,就需要在其他用户家目录中的.ssh文件夹中创建authorized.keys文件,并将生成的公钥内容写入。
root用户:
本机操作(192.168.1.111)
scp /root/.ssh/id_rsa.pub root@192.168.1.112:/root/.ssh/authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
普通用户:
在远程主机(192.168.1.112)上添加sftp普通用户
useradd ftpuser -d /home/ftpuser -s /sbin/nologin
回到本机(192.168.1.111)
scp /root/.ssh/id_rsa.pub ftpuser@192.168.1.112:/home/ftpuser/.ssh/authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
chown -R ftpuser:ftpuser /home/ftpuser/.ssh
同理如果想配置其他用户实现密钥登录,则将公钥文件拷贝到用户家目录的.ssh里面的authorize_keys文件中即可
普通用户注意authorize_keys文件的所属

2、ssh中配置使用内置的sftp的配置
修改远程主机(192.168.1.112)的ssh配置
vim /etc/ssh/sshd_config
PubkeyAuthentication yes #配置密钥登录
Subsystem sftp internal-sftp #启用ssh内置的sftp
Match LocalPort 20022 #匹配连接端口,这里也可以配置匹配用户 user XXX
AuthenticationMethods publickey #连接方式密钥链接或者password密钥连接
ChrootDirectory /home/ftptest # 限制连接后的查看目录,无法使用上级或其他目录
ForceCommand internal-sftp #使用ssh的内置sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
Match 必须出现在 sshd_config 文件末尾(或全局配置之后),且每个 Match 块只能包含被明确允许的配置指令(如 PasswordAuthentication、ForceCommand、MaxAuthTries 等),不能重复定义非策略类参数(如 Port 或 ListenAddress)。
3、目录权限配置(192.168.1.112)
创建目录
Mkdir /home/ftpuser
设置目录所有权
Chown root:ftpuser /home/ftpuser
确保目录不可写
Chmod 755 /home/ftpuser
创建用户实际可写子目录
Mkdir /home/ftpuser/upload
Chown ftpuser:ftpuser /home/ftpuser/upload
Systemctl restart sshd
重启之后连接远程主机即可
目录权限一定要配置,否则match配置无法生效
如果目录权限不进行配置的话,远程连接就会报如下的错误

SFTP(SSH File Transfer Protocol)作为安全文件传输的标准协议,常用于企业内部或对外提供文件服务。然而,默认情况下,SFTP用户登录后可浏览其家目录以外的路径(取决于shell权限),存在信息泄露风险。因此,限制SFTP用户仅能访问指定目录成为系统安全管理的关键环节。
实现该目标的核心机制是利用OpenSSH中的 ChrootDirectory 指令,将用户"锁定"在特定根目录中,形成类似容器化的隔离环境。此功能依赖于严格的文件系统权限控制和配置逻辑,否则极易因权限不当导致登录失败或安全警告。
常见的误区包括:
- 将 chroot 目录设为用户可写,违反 SSH 安全策略
- SubSystem sftp internal-sftp 未正确放置,导致 Match 块不生效
- 用户主目录归属错误,引发启动子系统失败
- 未使用 ForceCommand 或配置顺序错误,使限制被绕过
核心配置指令解析
| 指令 | 作用说明 | 典型值示例 |
|---|---|---|
| ChrootDirectory | 设定用户的根目录(chroot jail),必须由 root 拥有且不可写 | /sftp/%u |
| ForceCommand | 强制执行命令,通常配合 internal-sftp 使用 | internal-sftp |
| Match User/Group | 条件匹配块,针对特定用户或组应用规则 | Match User sftpuser |
| AllowTcpForwarding | 禁止端口转发增强安全性 | no |
| X11Forwarding | 关闭图形转发以减少攻击面 | no |