项目中运用java代码调用ssh连接文件服务器,创建一些用户,这些用户要求只能使用sftp访问文件服务器,不能用ssh访问,且sftp登陆后只能在自己的home目录下活动
1.创建sftpusers组
groupadd sftpusers
2.java中创建用户的代码:
SSH.update("useradd -g sftpusers -s /bin/false " + "-d " + TakeHome.getHome() + "/systems/%s %s", sysname,sysname);
SSH.update("echo '%s'|passwd --stdin %s", password, sysname);
SSH.update("chown root:sftpusers " + TakeHome.getHome() + "/systems/%s",sysname);
SSH.update("chmod 755 " + TakeHome.getHome() + "/systems/%s", sysname);
3.修改服务器上的/etc/ssh/sshd_config
注释掉:
Subsystem sftp /usr/libexec/openssh/sftp-server
添加下面代码:Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /home/BDEP/systems/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
解释一下添加的几行的意思
Subsystem sftp internal-sftp
这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp
这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割
当然,也可以匹配用户
Match User mysftp
这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便
ChrootDirectory /home/BDEP/systems/%u
用chroot将用户的根目录指定到/home/BDEP/systems/%u,%u代表用户名,这样用户就只能在/home/BDEP/systems/%u下活动,chroot的含义,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
ForceCommand internal-sftp
指定sftp命令
AllowTcpForwarding no
X11Forwarding no
这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限
所以遵循以上两个原则
1)我们将/data/sftp/mysftp的所有者设置为了root,所有组设置为sftp
2)我们将/data/sftp/mysftp的权限设置为755,所有者root有写入权限,而所有组sftp无写入权限
4.重启ssh服务
service sshd restart
并在/etc/selinux/config文件中,将SELINUX=""或者其他值,改为disabled,然后重启服务器,或者
setenforce 0