Назад | Перейти на главную страницу

Отключение подстановки команд в оболочке

У меня есть ssh-ящик, в котором работают службы Subversion и Mercurial. При подключении к этому ящику сценарий проверяет, что пользователь выполняет только команды, связанные с mercurial или svn:

    #!/bin/bash
    #
    # Verify that the requested command is an svnserve call.
    #
    # Note that sshd stores the command requested by the client in
    # the variable "SSH_ORIGINAL_COMMAND".

    echo $SSH_ORIGINAL_COMMAND | grep -E '^hg -R'
    ISHG=$?

    if [[ $SSH_ORIGINAL_COMMAND = "svnserve -t" || $ISHG -eq 0 ]]
    then
            exec $SSH_ORIGINAL_COMMAND
    else
            echo "You are only allowed svn access to this server."
    fi

Проблема в том, что проверка hg не очень чиста и не безопасна. Если я включу обратные кавычки в мою удаленную команду ssh, строка «echo $ SSH_ORIGINAL_COMMAND» с радостью выполнит ее. Есть ли у кого-нибудь предложения по тому, как это немного почистить?

Спасибо!

Да. Не используйте для этого оболочку. Напишите программу на языке, который позволит вам убедиться, что единственные исполняемые файлы, которые она будет выполнять, находятся в белом списке.

Mercurial предлагает инструмент именно для этого! Использовать contrib/hg-ssh скрипт, который мы предоставляем для ограничения команд. Файл содержит этот заголовок, чтобы объяснить, как его использовать:

Для использования в ~/.ssh/authorized_keys с command вариант, см. sshd (8):

command="hg-ssh path/to/repo1 /path/to/repo2 ~/repo3 ~user/repo4" ssh-dss ...

(возможно, вместе с этими другими полезными опциями: no-port-forwarding, no-X11-forwarding, no-agent-forwarding)

Это позволяет передавать / передавать SSH из / в репозитории, указанные в качестве аргументов. Если все ваши репозитории являются подкаталогами общего каталога, вы можете разрешить более короткие пути с помощью:

command="cd path/to/my/repositories && hg-ssh repo1 subdir/repo2"

Вы можете использовать сопоставление с образцом вашей обычной оболочки, например:

command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"