Безопасно ли использовать curl -u username: password http://example.com?

30

Это curl -u username:password http://example.comбезопасно?

Если нет, можете ли вы дать краткое объяснение того, как кто-то может получить ваш пароль?

JDiMatteo
источник
6
если вы используете это в терминале, имеете ли вы в виду, что обе учетные данные хранятся в истории bash?
Франциско Тапиа
15
Такая команда не является безопасной, потому что другой пользователь может использовать, ps -efчтобы увидеть, какие процессы запущены. Когда вы curl -u username:password http://example.comпоявитесь в списке, ваш адрес, имя пользователя и пароль будут скомпрометированы.
Ламберт
Хотя вопрос здесь и по теме, вас также может заинтересовать информационная безопасность StackExchange
IQAndreas

Ответы:

54

Это небезопасно, потому что по умолчанию cURL использует базовую аутентификацию, когда протокол HTTP отправляет ваш пароль в виде открытого текста. Когда вы указываете username:passwordстроку, она преобразуется в строку BASE64 в заголовке HTTP:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Любой, кто сможет перехватить ваш HTTP-трафик (ваш провайдер, любой, имеющий доступ к той же беспроводной точке доступа, что и вы, и т. Д.), Сможет восстановить пароль, просто используя онлайн-конвертер BASE64 .

Протокол HTTPS улучшит ситуацию, установив зашифрованное соединение перед отправкой этого заголовка, предотвращая раскрытие пароля. Однако это применимо только в том случае, если пользователь обращает внимание на запрос подтверждения неизвестных сертификатов, авторизации исключений безопасности и т. Д.

Обратите внимание, что аргументы команды могут быть доступны для других пользователей на той же машине, чтобы увидеть, например ps -ef, файловую систему / proc, в вашей истории bash и в журнале вашего терминала (спасибо за комментарий @ Lambert, отмечающий это). cURL на некоторых платформах пытается скрыть пароль, поэтому, например, ps -efвы, скорее всего, увидите вместо пароля пустое пространство. Однако вместо передачи пароля в качестве аргумента командной строки лучше использовать cURL, запрашивающий пароль напрямую, как обсуждалось в разделе часто задаваемых вопросов cURL .

Дмитрий Григорьев
источник
4
Даже если вы находитесь на платформе, где curl успешно перезаписывает свой собственный argv, чтобы скрыть данные ps, существует период, пока он запускается, прежде чем будет выполнена эта перезапись, когда этот контент уязвим.
Чарльз Даффи
А как насчет дайджест-аутентификации? Не используется ли curl по умолчанию?
rr-
2
Аутентификация @rr Digest чуть лучше, так как она не предотвращает атаки типа «человек посередине», поэтому вам все же лучше использовать HTTPS.
Дмитрий Григорьев
1
@rr Как вы утверждаете, что StartSSL не пользуется доверием большинства браузеров ? Ожидаете ли вы много пользователей Windows 95 или Firefox 1.5?
Хаген фон Айцен
1
@rr ИМХО, вам не доверяют, только если есть проблема с отсутствующими (или неправильными) промежуточными сертификатами на сервере
Хаген фон Айцен
24

Это не безопасно. Параметры командной строки видны всем пользователям.

Tronic
источник
4
Объединившись с @Dmitry Grigoryev, ответ может быть самым точным.
Франциско Тапия
1
Да, я полностью пропустил большую часть проблемы, которую я должен признать.
Дмитрий Григорьев
Команда может быть частью сценария, доступного только для чтения пользователю ...
Пит
2
Команды @Pete для запуска программ (независимо от того, запущены они из скрипта или из терминала) обычно видны всем пользователям через psкоманду и /procфайловую систему. Если команда заканчивается быстро, риск уменьшается, но он все еще там.
RBerteig
2
Ответы @Pete не должны быть эксклюзивными, они дополняют друг друга. Так что во втором ответе можно опустить угрозу, описанную в первом, скорее, было бы излишним повторять ее. И я бы не назвал это утверждение ложным, потому что это не так во всех возможных случаях.
Дмитрий Григорьев
1

Это можно сделать более безопасным способом, используя параметр --netrc-file.

  1. Создайте файл с разрешением 600

Например: vi / root / my-file

машина example.com

логин USERNAME

пароль ПАРОЛЬ

Сохраните и закройте файл

  1. Используйте ниже для доступа к URL с именем пользователя и паролем.

curl --netrc-file / root / my-file http://example.com

  1. Выполнено
Shameer
источник
0

Это небезопасно при использовании схемы HTTP. Чтобы сделать это безопасно, вы должны использовать HTTPS.

Чтобы скрыть пароль от появления в истории команд, укажите только имя пользователя. Curl запросит пароль, если он не указан в команде.

Mohnish
источник
Бесполезный ответ, если HTTPS недоступен. cURL - это «клиент».
mckenzm
0

Короткого ответа нет ... но ....

Если на стороне сервера нет опций, вы можете усилить безопасность.

  1. Если это локальная интрасеть, то изолируйте широковещательный домен и не используйте WiFi или какое-либо радио.
  2. Как говорит Шамер, используйте файл .netrc, храните значения вне кода.
  3. Если вы уверены, что память безопасна, используйте переменные среды. $ PSWD.
  4. Если это автоматизация, запустите из корневого каталога.
  5. ... в контейнере.
  6. ... с виртуальной машины с зашифрованным диском.

Ничто из этого не является менее безопасным, чем браузер, использующий HTTP.

mckenzm
источник