ssh配置内置sftp并使用密钥对登录

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
相关推荐
不会就选b8 小时前
Linux之TCP理论<1>
linux·运维·服务器
倔强的石头1069 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
java·运维·开发语言
Android系统攻城狮10 小时前
Linux Gstreamer深度解析之gst_audio_encoder_get_frame_samples_min调用流程与实战(六十)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
_upupup11 小时前
Linux中的自动化构建——make/Makefile
linux·运维·自动化
还卿一钵无情泪11 小时前
Docker 部署Unsloth 绕开环境配置难题
运维·人工智能·docker·ai·容器·nlp·干货
打工仔折腾 AI12 小时前
Docker镜像分层与卷挂载到底怎么工作:一次文件系统层面的实测分析
运维·人工智能·后端·python·docker·容器·性能优化
大猫会长13 小时前
调用codebuddy集成的supabase授权白屏解决方法
linux·运维·服务器
夜之眷属14 小时前
服务器被挖矿病毒入侵的排查与清理实录
运维·服务器
极客先躯14 小时前
高级java每日一道面试题-2026年01月20日-实战篇[Docker]-如何实现镜像的跨区域复制?
java·运维·docker·容器·架构图
韩振方14 小时前
为什么服务显示占了 8G,实际内存却没那么多?
运维