在SFTP + SSH中监禁用户

问题描述:

我想监禁一个“正常”用户,并为SFTP和SSH特殊组developer在SFTP + SSH中监禁用户

用户只能通过SSH在/srv/DEVELOPMENT(SSH/SFTP)上导航,用户只能执行命令限制(请参阅底部的脚本)。

为什么我要这个?

我在一个小项目上工作。最后几天,另一位开发人员不愿意用他们的经验来支持这个项目。开发人员可以编辑“开发人员网站”,并可以通过SSH启动/停止/重新启动一个Node.js应用程序。接下来的想法是:用户必须使用shell来更改他们的账户密码。

目前,我已经配置了SSH-守护进程与以下步骤:

*超过SFTP

Match Group developer 
    X11Forwarding no 
    AllowTcpForwarding yes 
    ChrootDirectory /srv/DEVELOPMENT 
    ForceCommand internal-sftp 

加入用户通过以下命令/选项:

useradd --base-dir /srv/ --home-dir /srv/ --no-user-group --shell /srv/shell.sh $USERNAME 
usermod -G developer $USERNAME 
id $USERNAME 
passwd $USERNAME 

当前目录权限

/srv    developer:root 0755 
/srv/DEVELOPMENT developer:root 0750 
/srv/DEVELOPMENT/* developer:root 0777 

SFTP它工作正常。通过SSH监控用户的第二部分目前有点难度。这一步目前不会工作,这就是我的问题

该chroot是有限的internal-sfpt。当我尝试登录,连接将随消息中止,该连接只允许SFTP:

ssh [email protected] 
[email protected]'s password: 
This service allows sftp connections only. 
Connection to example.com closed. 

在这里,我不得不对SSH-后台程序配置中删除ForceCommand>的登录会成功。

但这里是我的问题

当我尝试登录,没有可执行文件不能使用:

ssh [email protected] 
[email protected]'s password: 
Linux example.com 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) x86_64 
Last login: Sun Jul 30 18:00:11 2017 from **************** 
/srv/shell.sh: No such file or directory 
Connection to example.com closed. 

/srv/shell.sh是一个自定义的shell脚本来限制命令,样品:

#!/bin/bash 
    commands=("man" "passwd" "ls" "account", "whoami", "clear", "cd") 

    RED='\033[0;31m' 
    YELLOW='\033[0;33m' 
    MAGENTA='\033[0;35m' 
    CYAN='\033[0;36m' 
    NC='\033[0m' # No Color 
    INDENTATION=' ' 

    SYSTEM_UPTIME=`uptime --pretty` 
    SYSTEM_USERS=`who -q` 
    SYSTEM_QUOTA="None" 
    SYSTEM_RAM="None" 

    timestamp(){ 
     date +"%Y-%m-%d %H:%M:%S" 
    } 

    log(){ 
     echo -e "[$(timestamp)]\t$1\t$(whoami)\t$2" >> /var/log/developer-user/shell.log; 
    } 

    execute() { 
     # EXIT 
     if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]] 
     then 
      exit 

     # HELP 
     elif [[ "$ln" == "help" ]] 
     then 
      echo "Type exit or q to quit." 
      echo "Commands you can use:" 
      echo " account" 
      echo " help" 
      echo " echo" 
      echo " man <ManPage>" 
      echo " passwd" 
      echo " ls" 
      echo " clear" 
      echo " cd" 

     # CD 
     elif [[ "$ln" =~ ^cd\ .*$ ]] 
     then 
      LAST=`pwd` 

      $ln 

      CURRENT=`pwd` 

      if [[ $CURRENT == "/srv" ]] 
      then 
       log CHANGE_DIR FAILED_PERMISSIONS "$ln" 
       echo -e "${RED}ERROR:${NC} Sorry, you can't change to the previous directory ${YELLOW}\"${CURRENT}\"${NC}." 
       cd $LAST 

      elif [[ ! "$CURRENT" =~ ^/srv/DEVELOPMENT ]] 
      then 
       log CHANGE_DIR FAILED_PERMISSIONS "$ln" 
       echo -e "${RED}ERROR:${NC} Sorry, you can't change to the directory ${YELLOW}\"${CURRENT}\"${NC}." 
       cd $LAST 

      elif [[ `stat -c "%G" ${CURRENT}` == "friendlounge" ]] 
      then 
       log CHANGE_DIR "$ln" 

      else 
       log CHANGE_DIR FAILED_PERMISSIONS "$ln" 
       echo -e "${RED}ERROR:${NC} You have no permissions on ${YELLOW}\"${CURRENT}\"${NC}." 
       cd $LAST 
      fi 
     # ECHO 
     elif [[ "$ln" =~ ^echo\ .*$ ]] 
     then 
      $ln 
      log COMMAND "$ln" 

     # ACCOUNT 
     elif [[ "$ln" = "account" ]] 
     then 
      echo -e "YOUR ACCOUNT:" 
      echo -e "Username: $(whoami)" 

     # OTHERS 
     else 
      ok=false 
      for cmd in "${commands[@]}" 
      do 
       if [[ "$cmd" == "$ln" ]] 
       then 
        ok=true 
       fi 
      done 
      if $ok 
      then 
       $ln 
      else 
       echo -e "${RED}ERROR:${NC} You have no permissions to execute ${YELLOW}\"${ln}\"${NC}." 
       log DENIED "$ln" 
      fi 
     fi 
    } 

    # WELCOME MESSAGE 
    echo -e "${INDENTATION}${MAGENTA}Account:${NC}${INDENTATION}$(whoami)" 
    echo -e "${INDENTATION}${MAGENTA}Date:${NC}${INDENTATION}${INDENTATION}$(timestamp)" 
    echo -e "${INDENTATION}${MAGENTA}Uptime:${NC}${INDENTATION}${INDENTATION}${SYSTEM_UPTIME}" 
    echo -e "${INDENTATION}${MAGENTA}Users:${NC}${INDENTATION}${INDENTATION}${SYSTEM_USERS}" 
    echo -e "${INDENTATION}${MAGENTA}Quota:${NC}${INDENTATION}${INDENTATION}${SYSTEM_QUOTA}" 
    echo -e "${INDENTATION}${MAGENTA}RAM:${NC}${INDENTATION}${INDENTATION}${SYSTEM_RAM}" 

    log LOGIN "[email protected]" 
    cd 
    trap "trap=\"\";log LOGOUT;exit" EXIT 

    # Optionally check for '-c custom_command' arguments passed directly to shell 
    # Then you can also use ssh [email protected] custom_command, which will execute /root/rbash.sh 
    if [[ "$1" == "-c" ]] 
    then 
     shift 
     execute "[email protected]" 
    else 
     while echo -e -n "${RED}$(whoami)${YELLOW}@${CYAN}$(hostname) ${YELLOW}$(pwd) ${MAGENTA}#${NC} " && read ln 
     do 
      execute "$ln" 
     done 
    fi 

该shell脚本检查用户的permission,并强制只有/srv/DEVELOPMENT目录或子目录。

设置其他登录shell如/bin/bash或其他 - 无关紧要 - 在每次登录时,SSH-Demon在错误消息XXXX: No such file or directory后关闭连接。

我曾尝试设置不同的权限和其他。我无法解决通过SSH连接的问题。

任何人有想法?

之前,你回答

  • 是的,我知道可能存在的安全原因(样品时,在我的“自己的”壳登录脚本来管理权限)
  • 没有,我不t想要安装像schrootjailkit(在google上发现,阅读第一分钟说,这些替代方案使用像虚拟机(?)这样的完全解耦的系统)的巨大替代方案 - 告诉我,何时显式信息出错)
+0

当你说/srv/shell.sh你的意思/srv/DEVELOPMENT/srv/shell.sh? – spinkus

+0

Duplicate:https://*.com/a/32653528/2196426 – Jakuje

+0

@spinkus不,我的意思是/srv/shell.sh。 –

您可以试试这个,它使用起来非常简单。

你可以在3个步骤中监禁一个用户。

  1. 添加用户
  2. 创建一个*用一个简单的配置文件。
  3. *这个用户。

该工具位于:https://github.com/pymumu/jail-shell