##前言 vsftp配置过于复杂,传输也不安全,还需要额外开服务和端口,安全方面不是很优,考虑通过sftp替换掉vsftp。 ###功能:
- 通过ssh通道连接,无需多开服务和端口
- 自带ssh2的加密传输
- 限制用户目录跳转,只能在指定目录创建和查看
- 无需关闭selinux,增加系统安全性
- 通过facl控制权限,不影响目录原有属性和权限
- 开启了日志记录功能
整理成了一键脚本如下: 需要修改的地方:
- web="test1 test2"
- user_dir="/home/www/"
使用方法:sh sftp.sh
#!/bin/bash
#站点目录,用户名根据站点目录生成,多个站点用空格隔开
#例web="test1 test2",生成的用户为sftp_test1 sftp_test2
web="test1 test2"
user_dir="/home/www/"
ssh_dir="/etc/ssh/sshd_config"
#配置权限,属主必须为root,权限必须为755,facl也不行
chown root.root ${user_dir}
chmod 755 ${user_dir}
#设置sebool值
setsebool ssh_chroot_full_access 1
#配置ssh,开启internal-sftp
if [[ `grep -w internal-sftp ${ssh_dir} | wc -l` -eq 0 ]];then
sed -i "s/Subsystem/#Subsystem/g" ${ssh_dir}
echo "Subsystem sftp internal-sftp -l INFO -f local5" >>${ssh_dir}
fi
for user in ${web};do
if [[ `grep -w "Match user sftp_${user}" ${ssh_dir} | wc -l` -eq 0 ]];then
cat <<EOF >>${ssh_dir}
### START ###
Match user sftp_${user}
ChrootDirectory ${user_dir}
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -l INFO
### END ###
EOF
fi
#开启sftp日志
if [[ `grep "local5." /var/log/sftp.log | wc -l` -eq 0 ]];then
echo "auth,authpriv.*,local5.* /var/log/sftp.log" >>/etc/rsyslog.conf
service rsyslog restart
fi
#添加用户
if [[ `grep -w "sftp_${user}" /etc/passwd | wc -l` -eq 0 ]];then
useradd -M -s /bin/false sftp_${user}
read -s -t 30 -p "请在30S内输入站点${user}用户密码: " password
echo "${password}" |passwd --stdin sftp_${user}
echo "用户生成完毕,用户名为: sftp_${user}"
else
echo "用户sftp_${user}已存在,请检查"
fi
#赋权对应目录给用户
cd ${user_dir}
setfacl -R -d -m u:sftp_${user}:rwx ${user_dir}${user}
setfacl -R -m u:sftp_${user}:rwx ${user_dir}${user}
#去掉不该有的目录权限,增加安全
setfacl -m u:sftp_${user}:--- `ls ${user_dir} | grep -v "${user}"`
done
#重启ssh服务
service sshd restart
#人性化输出
echo "请使用sftp进行连接,端口号:`netstat -anltp | grep LISTEN | grep sshd | grep "0.0.0.0" | awk '{print $4}' | awk -F: '{print $2}'`"
评论区