众所周知SFTP账号是基于SSH账号的,所以在默认情况下访问服务器的权限是非常大的。下面为SFTP用户权限设置方法。
必要条件:
你的openssh-server版本至少得失4.8p1, 因为配置权限需要版本添加的新配置项ChrootDirectory来完成。
如何查看自己服务器上的ssh版本?大家可以尝试以下命令:
$ ssh -V
具体实施步骤:
1. 我们需要创建一个用户组,专门用于sftp用户
$ groupadd sftpusers
2. 我们创建一个用户test
$ useradd -s /bin/false -G sftpuser test
注意这里我们将test用户的shell设置为/bin/false使他没有登陆shell的权限
3. 编辑 /etc/ssh/sshd_config
找到Subsystem这个配置项,将其修改为
Subsystem sftp internal-sftp
然后再到文件最尾处增加配置设定属于用户组sftpusers的用户都只能访问他们自己的home文件夹
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no 保存并关闭文件
4. 修改test用户home文件夹的权限,让其属于root用户
chown root ~test
5. 重启sshd服务
$ service sshd restart
6. 测试用户账号
$ ssh test@localhost
连接会被拒绝或者无法登陆
$ sftp tesst@localhost
登陆后你会发现你的账号无法切换到除自己home目录之外的地方的
常见问题:
如果你链接服务器的时候出现下面的提示:
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。
在Centos 6.6环境使用系统自带的internal-sftp搭建SFTP服务器。
打开命令终端窗口,按以下步骤操作。
0、查看openssh的版本ssh -V
使用ssh -V 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个版本需要升级。
1、创建sftp组groupadd sftp
2、创建一个sftp用户,用户名为mysftp,密码为mysftp
修改用户密码和修改Linux用户密码是一样的。
useradd -g sftp -s /bin/false mysftp //用户名
passwd mysftp //密码useradd -g sftp -s /bin/false mysftp
passwd mysftp
3、sftp组的用户的home目录统一指定到/data/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftp的home为/data/sftp/mysftpmkdir -p /data/sftp/mysftpusermod -d /data/sftp/mysftp mysftp
4、配置sshd_config
文本编辑器打开 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
找到如下这行,用#符号注释掉,大致在文件末尾处。
# Subsystem sftp /usr/libexec/openssh/sftp-server
在文件最后面添加如下几行内容,然后保存。Subsystem sftp internal-sftp Match Group sftp ChrootDirectory /data/sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
5、设定Chroot目录权限chown root:sftp /data/sftp/mysftpchmod 755 /data/sftp/mysftp
6、建立SFTP用户登入后可写入的目录
照上面设置后,在重启sshd服务后,用户mysftp已经可以登录。但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供mysftp上传文件。这个目录所有者为mysftp,所有组为sftp,所有者有写入权限,而所有组无写入权限。命令如下:mkdir /data/sftp/mysftp/upload
chown mysftp:sftp /data/sftp/mysftp/upload
chmod 755 /data/sftp/mysftp/upload
7、修改/etc/selinux/config
文本编辑器打开/etc/selinux/configvi /etc/selinux/config
将文件中的SELINUX=enforcing 修改为 SELINUX=disabled ,然后保存。
在输入命令setenforce 0
8、重启sshd服务
输入命令重启服务。service sshd restart
9、验证sftp环境
用mysftp用户名登录,yes确定,回车输入密码。sftp [email protected]
显示 sftp> 则sftp搭建成功。
10、使用FileZilla FTP Client连接SFTP服务器
输入主机IP地址、用户名、密码、端口连接SFTP服务器,端口默认为22。
FileZilla FTP Client下载
由于SFTP是SSH的一部分(与传统的FTP没有任何关系),因此,配置SFTP不需要传统的FTP服务器软件。仅需要OpenSSH服务器即可。
$ yum install openssh-server openssl
$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
$ vim +132 /etc/ssh/sshd_config
注释掉下面这行
Subsystem sftp /usr/libexec/openssh/sftp-server
添加如下几行
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
解释一下每一行的意思
Subsystem sftp internal-sftp
这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp
匹配sftp组的用户,如果有多个组用逗号分割
也可以使用“Match User mysftp”匹配用户,多个用户之间也是用逗号分割
ChrootDirectory /data/ftp/%u
用chroot将用户的根目录指定到/data/ftp/%u,%u代表用户名,%h表示用户根目录
另一种写法: ChrootDirectory %h
chroot可以参考:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
ForceCommand internal-sftp
指定sftp命令
AllowTcpForwarding no
X11Forwarding no
禁止用户使用端口转发
建立用户和组
$ mkdir -p /data/sftp/
$ groupadd sftp
$ useradd -m -d /data/sftp/user1 -g sftp -s /sbin/nologin user1
#通过上面这条命令建立的用户,其家目录权限是700,需要改成755才可以正常登陆
$ chmod -R 755 /data/sftp/
$ chown root:sftp /data/sftp/
$ chown root:sftp /data/sftp/user1 #重要
错误的目录权限设定会导致在log中出现”fatal: bad ownership or modesfor chroot directoryXXXXXX”的内容
目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限(最大权限755)
因为用了chroot,所以/data/sftp/user1属主一定要是root,并且所属组不能有写入权限,如果上传需要写入在/data/sftp/user1下建立可写属主的文件夹供上传使用。
$ mkdir /data/sftp/user1/upload
$ chown -R user1:sftp /data/sftp/user1/upload
===========================================
2015.01.12补充
在Ubuntu 12.04 64bit系统部按如上方法部署好了SFTP,发现无法登陆,后来在/var/log/auth.log中发现了日志:fatal: bad ownership or modes for chroot directory component “/ftpdata/ftp/”;
于是查看了一下/ftpdata/ftp/的权限,发现该目录的属主是ftp。于是立即将属主修改为root,再次登陆就没问题了
请注意,在Ubuntu系统下,“Match Group sftp”及以后的配置项要写在“UsePAM yes”之后,否则同样无法登陆
===========================================
2015.02.03补充
在Ubuntu 12.04 64bit系统部按如上方法部署好了SFTP,发现无法登陆,FileZilla提示:Received unexpected end-of-file from SFTP server;执行/etc/init.d/ssh restart也不行;
经过百度,发现执行一下initctl restart ssh就OK了
1、创建sftp组 : groupadd sftp
2、创建一个sftp用户,用户名为andy : useradd -g sftp -s /bin/false andy
3、修改密码: passwd andy
4、sftp组的用户的home目录统一指定到/data/sftp下:mkdir -p /data/sftp/andy
5、指定andy的home为/data/sftp/andy:usermod -d /data/sftp/andy andy
6、配置sshd_config: vi /etc/ssh/sshd_config
7、输入/Subsystem搜索到下列内容,然后注释: # Subsystem sftp /usr/libexec/openssh/sftp-server
8、在文件结尾处添加下面后保存:
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
9、设定Chroot目录权限:
chown root:sftp /data/sftp/andychmod 755 /data/sftp/andy
10、建立SFTP用户登入后可写入的目录:mkdir /data/sftp/andy/uploadchown andy:sftp /data/sftp/andy/upload chmod 755 /data/sftp/andy/upload
11、修改:vi /etc/selinux/config#SELINUX=enforcing#改为#SELINUX=disabled
12、输入命令:setenforce 0
13、重启sshd服务:service sshd restart
14、ifcong查询ip,进行登录:sftp [email protected]