Предотвратить отображение аргумента командной строки в истории bash или ps -ef со сценарием bash

У меня есть код Java, который выполняет сценарий bash, который, в свою очередь, выполняет инструмент командной строки, для запуска которого требуются аргументы командной строки.

Одним из этих аргументов командной строки для этого инструмента является пароль в виде простого текста.

Скрипт примерно такой:

#!/bin/bash

# script.sh
# some setup code 

<cli-tool-executable> -arg1 <arg1> -arg2 <arg2> ... -password <password>

и я вызываю это из кода Java через apache commons exec делать что-то вроде

CommandLine commandLine = new CommandLine("bash");

// bash script that runs the tool
commandLine.addArgument("script.sh");

// add other arguments
commandLine.addArgument(...);

// execute
new DefaultExecutor().execute(commandLine);

Учитывая это в его нынешнем состоянии, если бы я запустил ps -ef или посмотрел историю bash, я смог бы увидеть аргументы командной строки, предоставленные инструменту cli, включая пароль, в виде простого текста, что, очевидно, не очень хорошо.

В идеале я бы хотел, чтобы пароль был каким-то образом запутан или вообще не отображался.

Я провел большую половину дня, пытаясь найти другие решения для этого, и в процессе обнаружил, что:

  • Есть некоторые потенциально хакерские способы сделать это с кодом C, которые не обязательно безопасны или рекомендованы.
  • Нежелательно когда-либо передавать пароли таким образом (совершенно очевидно), и всегда лучше делать это через файл, права доступа которого контролируются каким-либо безопасным способом, или через среду и передачу как стандартный ввод, или просто через код сам. К сожалению, ни один из вариантов для меня не подходит (инструмент не поддерживает его - он просто ожидает параметр командной строки с именем -password со строковым паролем, который не считывает какие-либо переменные среды или что-то подобное).
  • Я все еще не совсем уверен, что то, что я пытаюсь сделать, вполне возможно

Я пытался помещать вещи в переменные среды и передавать их в аргумент -password, я пытался поместить их в файл и пытался сделать cat passwordfile в аргументе пароля, но во всех случаях, которые я пробовал, это не похоже на показать аргумент пароля.

Есть у кого идеи/рекомендации по этому поводу? Спасибо.


person Arjun Mehta    schedule 26.04.2019    source источник
comment
Вы можете упростить воспроизведение: когда вы запустите secret=7;sleep $secret &, вы найдете sleep 7 с ps -f. Как этого избежать?   -  person Walter A    schedule 27.04.2019
comment
Я не проверял serverfault.com/a/592941, у вас это работает?   -  person Walter A    schedule 27.04.2019


Ответы (1)


Возможно, это долгий путь, но вы можете запустить свою команду внутри экземпляра docker bash (с правильным настройка безопасности). Например, с Dockerfile

FROM bash:4.4
COPY script.sh /
CMD ["bash", "/script.sh"]

В качестве альтернативы для изучения есть API движка Docker (нажмите на вкладку HTTP) , в основном большую часть того, что делает клиент Docker.

person LMC    schedule 26.04.2019
comment
спасибо за предложение. Я не совсем уверен, что это сработает для моего варианта использования из-за конкретных ограничений в отношении сред, в которых будет работать скрипт. - person Arjun Mehta; 26.04.2019
comment
Докер AFAIK так же безопасен, как и хост. Если скрипт может работать на данном хосте, он может работать внутри докера на том же хосте. - person LMC; 26.04.2019
comment
Команды AFAIK, работающие в докере, отображаются в ps -ef хоста. - person Walter A; 27.04.2019
comment
Всегда есть надежда, кажется, что hidepid можно использовать для повышения безопасности в этом случае. Если только ты не доверяешь руту, лол - person LMC; 27.04.2019