需求:其他机器需要向我方服务器传数据,要求只能看我方指定目录
目录最好放在/var/opt/sftp/,如果存储不够可以软链接过去

  1. 新建用户并设置密码

groupadd boss_user

useradd -d /data/boss_user -g boss_user boss_user

passwd boss_user

  1. 设置sshd配置文件

cd /etc/ssh/

cp sshd_config sshd_config.back // 备份

vi sshd_config

#下面这行需要注释、否则会报错
# Subsystem     sftp    /usr/libexec/openssh/sftp-server 

#新增以下字段
Subsystem sftp internal-sftp 
Match User boss_user
ChrootDirectory /data/ftp/
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

boss_user是我们要配置的用户
/data/ftp/是我们要制定的目录

  1. 重启sshd服务

service sshd restart

其实我到这一步,已经成功实现了Linux 限制SFTP用户只能访问某个目录​,我的需求是只允许boss_user用户访问/data/ftp/这个目录

  1. 创建目录并设置权限

mkdir /data/ftp

chown -R root:boss_user /data/ftp/

chmod -R 750 /data/ftp/

至关重要的是:

ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;

ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,也就是说权限最大设置只能是755。

注意:由于权限是755,导致非root用户都无法在目录中写入文件,所以需要在ChrootDirectory指定的目录下建立子目录,重新设置属主和权限。

如:

[root@hadoop100 ssh]# cd /data/ftp/
[root@hadoop100 ftp]# ll
total 0
[root@hadoop100 ftp]# mkdir testdir
[root@hadoop100 ftp]# chmod -R 755 testdir/
[root@hadoop100 ftp]# chown boss_user:boss_user /data/ftp/testdir/
  1. 测试一下
    sftp测试只有一个“/”目录,根目录下只有“testdir“
[dop@hadoop101 ~]$ sftp boss_user@192.168.10.100
boss_user@192.168.10.100's password:
Connected to 192.168.10.100.
sftp> ls
testdir
sftp> pwd
Remote working directory: /

ssh是拒绝的

[dop@hadoop101 ~]$ ssh boss_user@192.168.10.100
boss_user@192.168.10.100's password:
This service allows sftp connections only.
Connection to 192.168.10.100 closed.

常见报错:

  1. 登陆时报错:Write failed: Broken pipe, Couldn’t read packet: Connection reset by peer

原因:权限的问题,必须设置目录为属root用户,属sftp用户组。权限为750

  1. 重启sshd时报错:Starting sshd: /etc/ssh/sshd_config line 141: Subsystem ‘sftp’ already defined.

原因:忘记把Subsystem注释,导致/etc/ssh/sshd_config同时存在有两个Subsystem节点

  1. /etc/ssh/sshd_config line 148: Directive ‘UseDNS’ is not allowed within a Match block

把添加的写在文件最后就好了

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐