web-dev-qa-db-ja.com

cURLに環境からパスワードを取得させる

これ ユーザー名とパスワードでcURLを使用することに関する質問 は私にとって次善の答えを持っています:

  1. _curl -u "user:pw" https://example.com_は、pwをプロセスリストに入れます。
  2. _curl "https://user:[email protected]"_は、pwをプロセスリストに入れます。
  3. curl -u "user:$(cat ~/.passwd)" https://example.comは、pwをプロセスリストに入れます
  4. _curl -u user https://example.com_はpwを要求します
  5. _curl --netrc-file ~/.netrc https://example.com_にはファイルが必要です

#4は安全ですが、このコマンドを1日に数百回実行する可能性があるため、面倒です。 #5は安全に近いですが、そのファイルはrootアクセス権を持つ誰かによって読み取られる可能性があります。

cURL man page は次のように述べています(太字のテキストに注意してください):

_-u/--user <user:password>_

サーバー認証に使用するユーザー名とパスワードを指定します。 _-n/--netrc_および_--netrc-optional_をオーバーライドします。

(コロンを入力せずに)ユーザー名だけを指定すると、curlはパスワードの入力を要求します。

SSPI対応のcurlバイナリを使用してNTLM認証を行う場合を指定するだけで、curlに環境からユーザー名とパスワードを取得させることができます。このオプションを使用した単一のコロン:_-u :_。

環境で_$USER_と_$PASSWORD_(および _$CURLOPT_PASSWORD_ など)を設定しようとしましたが、cURLは次のように呼び出されたときにどちらも取得しません_curl -u : https://example.com_(_-u :_なしでも機能しません)。

NTLMを使用していないため、これは機能しません。私が何かを逃していない限り。

環境を介してのみ資格情報をcurlに渡す方法はありますか?

(回避策は回答に移動しました)

16
Adam Katz

このbashソリューションは、私のニーズに最適であると思われます。それはまともな安全、ポータブル、そして高速です。

_#!/bin/bash
SRV="example.com"
URL="https://$SRV/path"
curl --netrc-file <(cat <<<"machine $SRV login $USER password $PASSWORD") "$URL"
_

これは、 プロセス置換<( command )を使用してサブシェルでcommandを実行し、 ファイル記述子 を入力して「ファイル"親コマンド(この場合はcurl)に。プロセスの置換には here-string (_cat <<< text_、_echo text_のバリアントであり、プロセスリストに何も挿入しない)が含まれ、-のファイル記述子が作成されます。 netrcファイル リモートWebサーバーに資格情報を渡すため。

プロセス置換によって提供されるセキュリティは実際にはかなり健全です。そのファイル記述子は一時ファイルでありでなく、同じシェルインスタンス内の他の呼び出しからも利用できません。したがって、このコンテキストでは 安全に表示されます 。敵対者は、その内容を見つけるために、メモリを掘り下げるか、複雑な攻撃を開始する必要があります。 _$PASSWORD_環境変数もメモリ内にあるため、これによって attack surface が増加することはありません。

_export PASSWORD_を使用していない限り、_ps ewwp $$_のようなトリックでパスワードが明らかになることはありません( このコメント に記載されています)。あまり明確でない変数名を使用することも賢明でしょう。

以下は、上記のコードの単純化された安全でないバージョンであり、それがどのように機能するかを説明するのに役立ちます。

_#!/bin/sh
# INSECURE VERSION, DO NOT USE
SRV=example.com
URL="https://$SRV/path"
TMP=$(mktemp)
printf "machine %s login %s password %s\n" "$SRV" "$USER" "$PASSWORD" > "$TMP"
curl --netrc-file "$TMP" "$URL"
rm -f "$TMP"
_

この安全でないバージョンには多くの欠陥があり、それらはすべて前のバージョンで解決されています。

  • パスワードをファイルに保存します(そのファイルはあなただけが読み取り可能です)
  • 非常に簡単にコマンドラインでパスワードを持っています
  • 一時ファイルはaftercurlが終了するまで残ります
  • Ctrl+c 一時ファイルを削除せずに終了します

そのいくつかは以下によって解決できます:

_#!/bin/sh
SRV=example.com
URL="https://$SRV/path"
TMP=$(mktemp /dev/shm/.XXXXX)  # assumes /dev/shm is a ramdisk
trap "rm -f $TMP" 0 18
cat << EOF > "$TMP"
machine $SRV login $USER password $PASSWORD
EOF
(sleep 0.1; rm -f "$TMP") &  # queue removing temp file in 0.1 seconds
curl --netrc-file "$TMP" "$URL"
_

このバージョンは乱雑で最適ではなく、おそらく安全性が低いと考えられます(ただし、移植性は高くなります)。また、10進数を理解するバージョンのsleepも必要です(システムの負荷が高い場合、0.1秒は速すぎる可能性があります)。


私は元々、私の質問にPerlワンライナーを含む回避策を投稿していましたが、(- Etan Reisnerからのヘルプ を使用して)ここで解決する前にいくつかのより良い方法を試しました文字列方式。これは、軽量(高速)で移植性が高いです。

この時点では、私はそれを「醜い回避策」ではなく「答え」と考えるほどエレガントなので、この公式の答えに移行しました。 @ ghoti彼の答え の+1を指定しました。これは、cURLのコマンドラインプログラムが自分でやりたいことを自分で実行できないことを正しく示していますが、問題の解決に役立たないため、その回答を「受け入れる」ことはできません。

20
Adam Katz

認証情報をcurlに環境だけで渡す方法はありますか?

いいえ、ないと思います。

CURLOPT_USERPWD ドキュメント必要なものについて説明していると思いますが、これは他の言語のcurlライブラリを使用して利用できるオプションです。 PHP、Perl、Cなど.

シェルから実行するcurlバイナリは、そのライブラリのもう1つのフロントエンドですが、CURLOPT_USERPWDなどがcurlバイナリを通じてライブラリに渡される方法は、バイナリのコマンドラインオプションを使用することです。

理論的には、curlライブラリのフロントエンドとして独自のバイナリを記述し、環境変数のサポートを記述できます。

環境サポートを既存のcurlバイナリに表示したい場合は、代わりに環境サポートをハッキングし、ローカル関数を使用して独自にコンパイルすることもできます。

注意してくださいただし、環境変数でさえシェルからプロセステーブルにリークされる可能性があります。 (ps ewwp $$を実行すると何が表示されますか?)

おそらく、アクセスが制限された.netrcファイルが最も安全な方法です。おそらく、--netrc-file curlオプションで使用する一時的な.netrcファイルを生成する必要があります。

私はあなたがあなたの環境にとって最もリスクの少ないソリューションを選ぶか、セキュリティを適切に行う実際の言語で何かを書く必要があると思います。

8
ghoti

ユーザー "Tom、Bom"は、このための適切なソリューションをここに提供します。 https://coderwall.com/p/dsfmwa/securely-use-basic-auth-with-curl

curl --config - https://example.com <<< 'user = "username:password"'

これは、パスワードがプロセスリストに表示されないようにしますが、OPの元の質問には特に対応していません。

環境だけでカールする資格情報を渡す方法はありますか?

@ghotiには、より包括的で有益な答えを与えてくれました。

4
sfgeorge

以前の回答は正解です。最善のオプションは、curlに-nを使用することです(Linuxを使用している場合)。

  1. ファイルを作成する(独自のお気に入りのエディターを使用)

vi ~YOUR_USER_NAME/.netrc

  1. 以下を追加

machine example.com login YOUR_USER_NAME password THE_ACTUAL_PASSWORD

  1. 走る

curl -n https://example.com/some_end_point

2
grepit