翼度科技»论坛 云主机 LINUX 查看内容

Sftp部署及优化

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
1.SFTP规划

SFTP Server Port: 30022
按照项目进行分类,来创建sftp账号
命名规范:
用户名权限sftp目录Chroot目录Group地区+项目+用户(组或个人)rw/r/data/项目/项目/项目项目+RW例:CHN-projectname-arw/data/projectname/projectname/projectnameprojectnameRWCHN-projectname-br/data/projectname/projectname/projectname只有写权限才需要加入对应的组2.配置SFTP

2.1 修改ssh配置

只用第一次修改ssh配置文件
  1. ~]# vi /etc/ssh/sshd_config
  2. #Subsystem        sftp        /usr/libexec/openssh/sftp-server
  3. Subsystem       sftp    internal-sftp
  4. Match Group sftp
  5. Match LocalPort 20912
  6. ChrootDirectory  %h   #chroot到所创建用户时的家目录
  7. ForceCommand    internal-sftp
  8. ~]# systemctl restart sshd
复制代码
3.创建sftp账号

下面是每次创建账号需要的操作
3.1 创建目录结构
  1. ~]# mkdir –p /data/projectname/projectname
  2. ~]# chmod 775 /data/projectname/projectname
复制代码
3.2 创建sftp用户
  1. ~]# useradd -s /bin/false -d /data/projectname CHN-projectname-b
  2. ~]# useradd -s /bin/false -d /data/projectname CHN-projectname-a
复制代码
3.3设置sftp用户密码
  1. ~]# echo ‘CHN-projectname-b:password1’|chpasswd
  2. ~]# echo ‘CHN-projectname-a:password2’|chpasswd
  3. #可以使用其他方式配置密码
复制代码
3.4 创建权限组
  1. ~]# groupadd projectnameRW
复制代码
3.5 把需要写权限加入到权限组中
  1. ~]# usermod -aG projectnameRW CHN-projectname-b
  2. 如果CHN-projectname-a也需要写权限,加入到权限组(projectnameRW)即可
复制代码
3.6 配置目录权限
  1. ~]# chown root:projectnameRW /data/projectname/projectname
复制代码
3.7 配置ACL权限
  1. #针对需要多个用户对同一个目录进行读写,需要使用到ACL权限
  2. 如果是第一次新建,比较简单,2条命令即可
  3. ~]# chmod –R g+s /data/CN-project/CN-project
  4. ~]# setfacl -Rm d:g:groupname:rwx /data/CN-project/CN-project
  5. 如果是已经在使用的sftp,并且sftp的家目录有数据,手动执行以下命令
  6. ~]# chmod -R g+s /data/CN-project/CN-project
  7. ~]# setfacl -Rm d:g:groupname:rwx /data/CN-project/CN-project
  8. ~]# chown -R :groupname /data/CN-project/CN-project
  9. ~]# chmod -R 775 /data/CN-project/CN-project
复制代码
3.8重启sshd服务
  1. ~]# systemctl restart sshd
复制代码
4.sftp客户端使用

4.1 Linux6
  1. ~]# sftp -oPort=30022 CHN-project-user@10.0.0.1
  2. -oPort=30022:SFTP server Port
  3. CHN-project-user:SFTP Username
  4. 10.0.0.1:SFTP Server address
复制代码
4.2 Linux7
  1. ~]# sftp -P 30022 CHN-project-user@10.0.0.1
  2. CHN-project-user@10.0.0.1's password:    <--  输入密码
复制代码
7.sftp开启每个用户连接数限制
  1. ~]# cat /etc/ssh/sshd_config
  2. ......
  3. Subsystem       sftp    internal-sftp -l VERBOSE -f AUTHPRIV
  4. Match Group sftp
  5. Match LocalPort 20912
  6. ChrootDirectory  %h
  7. ForceCommand    internal-sftp -l VERBOSE -f AUTHPRIV
复制代码
8.sftp打开用户认证数量限制
  1. ~]# cat /etc/rsyslog.conf
  2. ......
  3. authpriv.*                        /var/log/sftp.log
复制代码
9.sftp配置每个用户最大打开文件数
  1. ~]# systemctl restart sshd
  2. ~]# systemctl restart rsyslog
复制代码
10.sftp监控项

10.1 监控sftp连接数
  1. ~]# cd /etc/logrotate.d/
  2. ~]# vi sftp
  3. /var/log/sftp.log {
  4.     monthly   #默认每月执行一次日志轮询
  5.     missingok  
  6.     rotate 6   #保存6个日志文件
  7.     compress
  8.     delaycompress
  9.     dateext
  10.     create 0600 root root
  11.     sharedscripts
  12.     postrotate
  13.                 /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
  14.     endscript
  15. }
  16. ~]# systemctl restart rsyslog
  17. 测试
  18. ~]# logrotate --dbug --verbose --force /etc/logrotate.d/sftp
复制代码
10.2 sftp日志监控,触发连接数限制

监控sftp日志,指定sftp用户触发连接数限制,告警通知
  1. ~]# cat /etc/security/limits.d/95-sftp-limit.conf
  2. @sftpusername hard nproc 400   #限制用户连接数为200,这里配置数量为连接数*2
复制代码
11.SFTP高可用

11.1 多台sftp底层存储使用阿里云NAS

使用nas作为/data盘. acl授权命令改为nfs4_setfacl.
11.2 多台sftp创建用户时,保持UID,GID一致.

多台sftp server创建用户用此脚本创建.
[code]#!/bin/bash########################################################## Function : Add user in 2 SFTP servers                 ## Version  : 1.0                                        ######################################################################  env define  ############sshuser=osadmin   #多台sftp配置免密用户workdir=/tmpshijian=`date +%Y_%M_%d_%H_%m`server1=10.0.0.1server2=10.0.0.2server3=10.0.0.3server4=10.0.0.4sftpport=30022sshport=22new_user=${1}user_pass=${2}############  env define  ########################   USAGE ############if [[ $# != 2 ]];then    echo -e "\033[31;5mParameter incorrect. Please check below example: \033[0m"        echo -e "\033[33;1mfor example:\033[0m"        echo "ScriptName USER PASSWORD"    exit 1fi############   USAGE #################### Function ################## get /etc/passwd from each serverget_passwd_file() {scp -q ${sshuser}@${1}:/etc/passwd ${workdir}/passwdfile_${1}_${shijian}}### get /etc/group from each serverget_group_file() {scp -q ${sshuser}@${1}:/etc/group ${workdir}/groupfile_${1}_${shijian}}### find the maximum user idfind_max_user_id() {awk -F':' '{ print $3 }' ${workdir}/passwdfile_${1}_${shijian} | grep -v 65534 | sort -n | tail -n 1}### find the maximum group idfind_max_group_id() {awk -F':' '{ print $3 }' ${workdir}/groupfile_${1}_${shijian} | grep -v 65534 | sort -n | tail -n 1}### get max id among all serversget_max_id() {if [ $# -eq 0 ]thenecho "No input , please check"else        min=$1        max=$1        sum=0        for i in "$@"        do                if [ $min -gt $i ]                then                        min=$i                fi                if [ $max -lt $i ]                then                        max=$i                fi        sum=$[$sum+$i]done        echo $maxfi}### check if all server alivecheck_server_alive() {nc -4 -w 2 -z ${1} ${2}if [ $? -eq 0 ]then    echo -e "\033[32;1m ${1} port ${2} alived\033[0m"else        echo -e "\033[31;5m Server ${1} Port ${2} cannot connect , please check it manually ~! \033[0m"        exitfi}### add user in 2 serversadd_user() {for i in {1..4}doserverip=`eval echo '$'"server${i}"`ssh ${sshuser}@${serverip} "sudo /sbin/groupadd -g ${next_gid} ${1}"if [ $? -eq 0 ]then    echo -e "\033[32;1m Group ${1} creation in ${serverip} done \033[0m"else    echo -e "\033[31;5m Group ${1} creation in ${serverip} failed , please check it manually ~! \033[0m"        exitfissh ${sshuser}@${serverip} "sudo /sbin/useradd -s /bin/false -u ${next_uid} -g ${next_gid} ${1}"if [ $? -eq 0 ]then    echo -e "\033[32;1m User ${1} creation in ${serverip} done \033[0m"else    echo -e "\033[31;5m User ${1} creation in ${serverip} failed , please check it manually ~! \033[0m"        exitfissh ${sshuser}@${serverip} "sudo /bin/passwd ${1}

举报 回复 使用道具