已索引
需求描述
行外系统计划通过专线与行内系统交互,需要向行内系统传输文件。
考虑到通过应用接口传输文件代码改造量巨大,且该系统在其他行也是通过 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>