已索引

需求描述

行外系统计划通过专线与行内系统交互,需要向行内系统传输文件。
考虑到通过应用接口传输文件代码改造量巨大,且该系统在其他行也是通过 ftp 传输文件,故决定采用 ftp 来传输文件。
为了尽可能的保证安全,我们采用 ssh 通过的 sftp 服务,且将业务用户限制在其家目录下。假设业务用户为 cysftp。

配置过程

创建用户与目录:

# useradd -s /sbin/nologin cysftp
# chown root.cysftp /home/cysftp
# chmod 750 /home/cysftp

# mkdir /home/cysftp/upload
# chown cysftp.cysftp /home/cysftp/upload
# chmod 700 /home/cysftp/upload

修改 SSHD 配置文件:

# vim /etc/ssh/sshd_config

# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server    注释掉该行,增加下面一行
Subsystem       sftp    internal-sftp

# 在文件最后增加如下内容(可参考文件中的现有示例)
Match User cysftp
        ChrootDirectory %h
        X11Forwarding no
        AllowTcpForwarding no
        PermitTTY no
        ForceCommand internal-sftp

重启 SSHD 服务:

# systemctl restart sshd

在客户端连接测试:

# sftp cysftp@192.32.2.21
cysftp@192.32.2.21's password: 
Connected to 192.32.2.21.
sftp> pwd
Remote working directory: /
sftp> dir
upload  
sftp> cd upload
sftp> put initial-setup-ks.cfg
Uploading initial-setup-ks.cfg to /upload/initial-setup-ks.cfg
initial-setup-ks.cfg                                                                                                 100% 2232   860.4KB/s   00:00    
sftp> dir
initial-setup-ks.cfg     
sftp> pwd
Remote working directory: /upload
sftp> 

相关说明

在 SSHD 中,如果使用了 ChrootDirecotory 指令,SSH 服务要求该目录由 root 拥有,且非root用户不能该目录的写权限(包括 ACL)。
假设业务用户为 cysftp,为了让业务用户能够正常使用该目录,建议设置其家目录属主为 root.cysftp,权限为 750。
如果业务用户需要写的话,可以在其家目录下创建一个业务用户独有的目录。

OWNER 如果不设置成 root,或者有其它用户对该目录有写权限的话,登录失败,报错如下:

# sftp cysftp@192.32.2.21
cysftp@192.32.2.21's password: 
packet_write_wait: Connection to 192.32.2.21 port 22: Broken pipe
Couldn't read packet: Connection reset by peer

在服务器的 /var/log/secure 日志中可以看到如下错误:

sshd[2105]: fatal: bad ownership or modes for chroot directory "/home/cysftp" [postauth]

如果目录对业务用户没有读权限的话,能登录,执行命令报错如下:

sftp> dir
remote readdir("/"): Permission denied
sftp> 
-- By 许望(RHCA、OCM、VCP)
最后修改:2025 年 07 月 01 日 01 : 00 PM
如果觉得我的文章对你有用,请随意赞赏