赞
踩
背景:
· 现有方式:
1、公司通过FTP服务器将研发数据传输给外部合作公司,外部公司将数据传给公司;
2、员工在外网下载管理员给定的数据,或是将数据传到公司
· 问题1:现有FTP服务器在传输过程中不对数据进行加密、存在泄密风险。如果人工将数据包加密后传输,对方在收到数据后进行解密,会占用双方过多时间
· 问题2:现有FTP服务器运行于被动模式,占用过多的端口甚至是整个IP地址
· 解决方法:通过搭建SFTP服务器,实现对数据进行加密,且仅占用一个TCP端口
搭建过程:
· 系统:CentOS7.9,按最小化安装不带图形界面即可
首先创建sftp用户组,在组的基础上进行统一管理
groupadd sftp
创建sftp目录并设置权限
- # 创建sftp目录
- mkdir /sftp
-
- # 设置目录所有者(如果需要实现ChrootDirectory功能,则目录所有者必须为root)
- chown root:sftp /sftp
-
- # 设置目录权限(如果需要实现ChrootDirectory功能,则目录权限代码不能高于755)
- chmod 755 /sftp
编辑SSH配置文件
# 备份配置文件 cp /etc/ssh/sshd_config{,.bak} # 禁用DNS反向解析、GSSAPI认证功能,防止登录SSH过慢 sed -ri 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config sed -ri 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config # 注释掉配置文件自带的Subsystem sftp /usr/libexec/openssh/sftp-server条目 sed -ri 's/Subsystem/# Subsystem/' /etc/ssh/sshd_config # 添加Subsystem sftp internal-sftp条目 echo 'Subsystem sftp internal-sftp' >> /etc/ssh/sshd_config # 针对用户组sftp匹配规则(多个组名称可用逗号分隔)(匹配用户可写为Match User 用户名) echo 'Match Group sftp' >> /etc/ssh/sshd_config # 规则1:禁止sftp组使用X11图形功能 echo ' X11Forwarding no' >> /etc/ssh/sshd_config # 规则2:禁止sftp组使用端口转发功能(外部用户可将sftp作为跳板访问公司内部其他服务器,存在隐患) echo ' AllowTcpForwarding no' >> /etc/ssh/sshd_config # 规则3:强制sftp组使用sftp组件提供的命令,禁止运行自定义命令 echo ' ForceCommand internal-sftp' >> /etc/ssh/sshd_config # 规则4:用户登录后,将其锁定在其根目录,防止其访问到其他用户的目录 echo ' ChrootDirectory /sftp/%u' >> /etc/ssh/sshd_config # 重启sshd服务使刚才的配置生效,并查看服务是否运行正常 systemctl restart sshd; systemctl status sshd
创建用户(因手工配置比较繁琐,于是编写了以下脚本实现自动创建用户、用户目录、并配置权限)
- # 创建自定义程序
- vi /usr/bin/sftpadd
# 将以下脚本写入到自定义程序中(从#!/bin/bash开始顶格写) #!/bin/bash # 检测脚本是否以Root或sudo权限运行 if [ $UID -ne 0 ];then echo -e "Must run with root or sudo privileges!" exit 0 fi # --help帮助信息 if [[ "$1" == "--help" ]] || [ $# -eq 0 ];then echo -e "\nUsage: sftpadd [user name] [user passwd] [permissions]" echo -e "\nList Of Parameter:" echo -e " username: sftp user name" echo -e " userpasswd: sftp user password" echo -e " permissions: u: mkdir upload, allow reading and writing" echo -e " d: mkdir download, read-only" echo -e "\nExamples 1:" echo -e " command: sftpadd tom 123456 d" echo -e " action: Create user tom, only allow download" echo -e "\nExamples 2:" echo -e " command: sftpadd jerry 123456 ud" echo -e " action: Create user jerry, allow upload and download\n" exit 0 fi # 校验传入参数是否正确 if [ $# -ne 3 ]; then echo -e "Parameter error, Please use sftpadd --help" exit 0 fi # 提取传入值 user_name="$1"; user_passwd="$2"; user_permissions="$3" # 校验用户名是否重复存在 if grep -q "$user_name" /etc/passwd; then echo -e "User already exists!" exit 0 fi # 校验密码是否小于6位 if [ $(echo ${#user_passwd}) -lt 6 ]; then echo -e "User password is less than 6 digits!" exit 0 fi # 校验传入参数是否包含非u/d字符 if [[ "$(echo $3 | sed -e 's/u//' -e 's/d//')" != "" ]]; then echo -e "Permission parameter contains illegal characters! Please use sftpadd --help" exit 0 fi # 创建用户及密码、将用户加入到sftp组、禁止其通过ssh客户端软件登录到服务器 useradd -g sftp -s /sbin/nologin -M "$user_name" >> /dev/null 2>&1 echo -e " Create User Complete: $user_name" echo "$user_passwd" | passwd --stdin "$user_name" >> /dev/null 2>&1 echo -e " Create User Password: $user_passwd" # 生成用户目录的路径 upload_path="/sftp/$user_name/upload/" download_path="/sftp/$user_name/download/" # 创建并回显用户目录 if [[ "$3" =~ "u" ]];then mkdir -p "$upload_path" chown "$user_name:sftp" "$upload_path" chmod 700 "$upload_path" echo -e " Create the upload directory: $upload_path" fi if [[ "$3" =~ "d" ]];then mkdir -p "$download_path" chown "$user_name:sftp" "$download_path" chmod 500 "$download_path" echo -e " Create the download directory: $download_path" fi exit 0
- # 对自定义程序添加可执行权
- chmod +x sftpadd
· 使用方法及参数:
运行sftpadd或sftpadd --help会有详细提示
被创建的用户不具有ssh客户端登录功能(登录后立即闪退),只能用于sftp功能的登录
程序自动且只能以固定模式创建用户目录:如果在创建时添加u参数,则自动创建upload目录并设置用户对其可读写;如果添加d参数,则自动创建download目录并设置用户对其只读
· 使用方法举例1:
有家外部合作公司需要将数据传到本公司,为其创建账号user1 密码123456,并设置其拥有对upload目录的读写权限
运行命令:sftpadd user1 123456 u
程序自动创建用户user1,及用户目录/sftp/user1/upload,并user1对upload目录拥有读写权限
· 使用方法举例2:
公司的数据需要让外部合作公司下载,但是不允许其操作download目录的文件(删除、改名、或是修改数据等),为其创建账号user2 密码123456,并设置其对download仅有只读权限
运行命令:sftpadd user2 123456 d
· 使用方法举例3:
公司某员工需要在外网上传/下载数据,为其创建账号user3 密码123456,其对upload拥有读写权限、对download拥有只读权限。因为Sftp服务器由高权限管理员控制,这样user3普通用户只能将外部数据传到公司,但是无法将公司内部数据私自传出(只能通过管理员将数据放到download目录后进行下载)
运行命令:sftp user3 123456 ud
5. 验证
· 通过sftp命令或是WinSCP、Xshell、FileZilla、Xftp等工具登录服务器,对相关设置进行验证
· 测试user3能否登录
运行sftp user3@127.0.0.1命令,然后输入密码进行登录
· 验证user3登录后是否被锁定到了根目录(无法访问其他用户的文件):
运行ls / 命令,如显示为user3创建的/download /upload目录即为正常
如果显示其他用户的目录或是系统目录,则sshd_config配置文件中的ChrootDirectory参数或是/sftp目录的权限设置有误
· 验证user3对download目录是否具有只读权限
运行mkdir /download/test命令,尝试在download目录创建一个测试目录test
如果提示Permission denied则表示权限设置无误,因为用户对download目录只有只读权限
· 验证user3对upload目录是否具有读写权限
运行mkdir /upload/test 命令,尝试在upload目录创建一个测试目录test,如果未报错则表示权限设置无误,因为用户对upload目录拥有读写权限
6. 端口映射
· 将内网SFTP的22端口通过防火墙或是路由器映射到外网
注意:
请勿将外网IP的22端口映射到内网SFTP服务器的22端口,因为外网有专门的主机去攻击存在漏洞的服务器、或是暴力破解密码,其扫描全球IP的时间大概在5小时左右,服务器映射到外网后不超过1天就会被扫描到。应当采用不容易被猜到用途的端口号比如53110等,而不是直接采用22、或是60022、61022这种容易猜到作用的端口
一定要设置高强度密码,一方面用户密码被暴力破解后容易造成资料丢失、另一方面SSH组件存在安全漏洞的话,攻击者可能通过用户账户获取整个SFTP服务器的控制权
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。