Пользователь Jail в SFTP + SSH

Я хочу посадить в тюрьму «обычного» пользователя со специальной группой developer для SFTP и SSH.

Пользователь может перемещаться только по /srv/DEVELOPMENT (SSH/SFTP) И через SSH, пользователь может выполнять только ограниченное количество команд (см. сценарий внизу).

Зачем мне это?

Я работаю над небольшим проектом. В последние дни другие разработчики не хотят поддерживать проект своим опытом. Разработчик может редактировать «веб-сайт разработчика» и может запускать/останавливать/перезапускать Node.js приложение через SSH. Следующая мысль: пользователь должен использовать оболочку, чтобы изменить пароль своей учетной записи.

В настоящее время я настроил SSH-Deamon, выполнив следующие действия:

Отправить в тюрьму через 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.

Здесь я удалил ForceCommand в конфигурации SSH-Damon> Вход будет успешным.

Но вот моя проблема

Когда я пытаюсь войти в систему, никакие исполняемые файлы не могут быть использованы:

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 — это пользовательский сценарий оболочки для ограничения команд, например:

    #!/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 "$@"
    cd
    trap "trap=\"\";log LOGOUT;exit" EXIT

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

Этот сценарий оболочки проверяет permission пользователя и принудительно обращается только к каталогу /srv/DEVELOPMENT или подкаталогам.

Не имеет значения, чтобы установить другие логин-оболочки, такие как /bin/bash или другие - при каждом входе в систему SSH-Demon закрывает соединение после сообщения об ошибке XXXX: No such file or directory.

Я пытался установить разные разрешения и прочее. не могу решить проблему с подключением по ssh.

У кого-нибудь есть идея?

Прежде чем ответить

  • да, я знаю возможные причины безопасности (например, для управления разрешениями через мой «собственный» сценарий входа в оболочку)
  • нет, я не хочу устанавливать огромные альтернативы типа schroot или jailkit (найдено в гугле, в первых минутах написано, что эти альтернативы используют полностью несвязанную систему типа виртуальной машины(?) - сообщите мне, если что-то не так с явная информация)

person Adrian Preuss    schedule 31.07.2017    source источник
comment
Когда вы говорите /srv/shell.sh, вы имеете в виду /srv/DEVELOPMENT/srv/shell.sh?   -  person thespinkus    schedule 31.07.2017
comment
Дубликат: stackoverflow.com/a/32653528/2196426   -  person Jakuje    schedule 31.07.2017
comment
@spinkus нет, я имею в виду /srv/shell.sh.   -  person Adrian Preuss    schedule 31.07.2017
comment
@Jakuje это не дубликат. Прочтите связанный вопрос.   -  person Adrian Preuss    schedule 31.07.2017
comment
Это. У вас есть каталог chroot, принадлежащий developer, что неверно.   -  person Jakuje    schedule 31.07.2017
comment
У меня было изменение разрешения на каталоги. Это должен быть root:developer с 750, иначе я получу ошибку в вашем связанном вопросе.   -  person Adrian Preuss    schedule 31.07.2017


Ответы (1)


Вы можете попробовать это, это очень легко использовать.

вы можете заключить пользователя в тюрьму в 3 шага.

  1. Добавить пользователя
  2. создайте джейл с помощью простого файла конфигурации.
  3. посадить этого пользователя в тюрьму.

Инструмент находится по адресу: https://github.com/pymumu/jail-shell.

person Nick    schedule 19.09.2017