架设sftp服务器
报错无法登录问题:
packet_write_wait: Connection to 10.8.33.126 port 22: Broken pipe
Couldn 't read packet: Connection reset by peer
下面安装步骤整理记录:
情况一:从新增用户开始
先新增一个用户组,提供给 sftp 用户
$ sudo groupadd sfptusers
新增 sftp 的用户
$ sudo useradd -g sftpusers -d /incoming -s /sbin/nologin codetub
$ sudo passwd codetub
确认一下用户是否正确添加
$ grep codetub /etc/passwd
codetub:x:1001:1001::/incoming:/sbin/nologin
如果用户已经添加好,可以使用指令 usermod
来更改使用者的所在 home 主目录, 和限制登录
$ sudo usermod -g sftpusers -d /incoming -s /sbin/nologin codetub
接下来就是要设定sftp-server 了(在sshd_config 中设定, 因为它是属于ssh service 的子系统)
编辑/etc/ssh/sshd_config 档案,并且把原本的Subsystem sftp 注解掉,改成以下设定
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
指定跟目录给sftpusers 群组
如果你不希望sfptusers 群组里的使用者可以离开自己的目录,可以做以下设定,较为安全
在/etc/ssh/sshd_config 的最下方加入以下设定
Subsystem sftp internal-sftp Match user codetub ForceCommand internal-sftp ChrootDirectory %h
其中:
- Match Group sftpusers: 表示下面的设定都是针对属于sftpusers群组里的使用者
- ChrootDirectory /sftp/ %u : 这个路径是用来给通过认证的使用者, 例如使用者codetub的家目录就会是在/sftp/codetub
- ForceCommand internal-sftp : 这个是强制使用internal-sftp 的执行命令,并且忽略掉所有~/.ssh/rc 档案里面的任何指令
建立sftpuser 的root 目录/home/sftp/codetub
$ sudo mkdir -p /home/sftp/codetub
如此一来,/home/sftp/codetub
就等同于codetub 的根目录/
接着要建立一个资料夹让sftp user 可以上传档案的目录incoming
$ sudo mkdir /home/sftp/codetub/incoming
针对目录设定适当的权限
-
将incoming 的目录权限设定给codetub
$ sudo chown codetub:sftpusers /home/sftp/codetub/incoming/
-
确认一下是否有设定正确
确认sftpuser 的目录权限
$ ls -ld /home/sftp/codetub/incoming/ drwxr-xr-x 2 codetub sftpusers 4096 7月26 22:34 /home/sftp/codetub/incoming/
-
[重点来了]这个地方就是我卡最久的地方,因为根目录的权限必须是root 所拥有的,否则就会发生一直无法登入的情况(错误讯息如下)
packet_write_wait: Connection to 10.8.33.126 port 22: Broken pipe
Couldn 't read packet: Connection reset by peer
所以这里一定要格外注意, 下面这两个目录的拥有者都必须是root并且权限设定也都必须是755 (也就是drwxr-xr-x)
确认根目录的权限$ ls -ld /home/sftp/codetub/
drwxr-xr-x 3 root root 4096 7月26 22:34 /home/sftp/codetub/
$ ls -ld /home/sftp/
drwxr-xr-x 3 root root 4096 7月26 22:06 /home/sftp/
重新启动ssh 就大功告成了
$ sudo service sshd restart