Могу ли я предоставить Docker-контейнеру SSH-доступ к хосту, не предоставляя ему также закрытый ключ? - PullRequest
0 голосов
/ 19 апреля 2019

Запрос

Эта команда docker вводит мой ssh-ключ и имя пользователя в контейнер, подключает этот контейнер к удаленному хосту и затем запускает: echo hello world на хосте:

docker run --rm \
    -e "host=the.host" \
    -e "user=my.user.name" \
    -v "/home/me/.ssh/id_rsa:/key" \
    ubuntu:18.04 /bin/bash -c \
        'apt update && apt install -y ssh \
         && ssh -o StrictHostKeyChecking=no $user@$host -i /key
             echo hello world'

Я хочу, чтобы команда могла подключиться к удаленному хосту, но я не хочу, чтобы она могла cat /key и увидела мой ключ ssh.

Какие изменения могутЯ делаю, чтобы добиться этого?


Контекст

Я пишу тестовый бегун.Мой код отвечает за определение того, какие тесты могут быть запущены с какими хостами, но сам тест может не быть написан мной (он извлекается из git-репо при запуске моего тестового бегуна).

Я не беспокоился о том, что мои коллеги злоупотребляли сервером своим тестовым кодом, потому что это злоупотребление было бы видно в системе контроля версий.В этом случае они полу-доверяютЯ * беспокоюсь о том, что кто-то напишет тест, в результате которого мой ключ ssh появится где-нибудь в выводе журнала.

В идеале я сначала установил бы соединение ssh, а затем создал контейнер - каким-то образомпредоставление ему доступа к соединению, но не к ключу.

1 Ответ

0 голосов
/ 22 апреля 2019

Мне нужна была функция Мультиплексирование SSH , о которой я узнал здесь

Этот файл входит в образ докера в ~/.ssh.config

Host foo
    HostName foo.bar.com
    User my.user.name
    ControlMaster auto
    ControlPath ~/.ssh/cm_socket/%r@%h:%p

И этот файл отправляется на хост:

Host foo
    HostName foo.bar.com
    User my.username
    IdentityFile /path/to/key
    IdentitiesOnly yes
    ControlMaster auto
    ControlPath ~/.ssh/cm_socket/%r@%h:%p

Я назвал изображение keylesssh, поэтому эта команда создает контейнер, у которого нет ключа, но имеет папку, в которой будет находиться сокет, если есть существующее соединение.

docker run --rm \
    -v "/home/matt/.ssh/cm_socket:/root/.ssh/cm_socket" \
        keylesssh /bin/bash -c 'ssh dev1 hostname'

Все собрано вот так:

  1. Я открываю ssh-соединение с компьютера, на котором размещен демон Docker, к удаленному хосту
  2. SSH создаст сокет и поместит его в ~ / .ssh / cm_socket с предсказуемым именем
  3. Я создаю контейнер и делюсь с ним этой папкой
  4. Контейнер пытается подключиться к хосту по ssh, замечает, что сокет существует, и использует существующее соединение без аутентификации - ключ не требуется
  5. После завершения теста контейнер выключается
  6. Когда мой код замечает, что контейнер закрывается, я прекращаю соединение master ssh

Я знаю, что это работает, потому что команда hostname разрешает имя хоста удаленного сервера, а не контейнера или узла докера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...