hack のためのネタ帳, etc,,,

未解決案件

状況

2021-02-08、2021-02-10 くらいにプロトタイピングしてた際の話。
シングルユーザー環境でしか使ってないので、そこまで神経質になる必要は無い気もするんだけど、
認証付きのページに対して wget でバッチ処理をしたいので、shell script から wget を呼んで認証をさせる際にパスワードを安全に渡したい。
しかし --password オプションだと、ps -o args するとオプションに指定したパスワードが見えてしまうし、コマンドラインから呼んだ場合 history に password が残ってしまう。
コマンドラインから wget を一回だけ呼ぶだけなら --ask-password で対話的に password を聞いてもらえば解決するんだけど、shell script から複数回呼ぶ場合、wget を呼ぶ度に毎回 password を聞かれるため実用に適さない。

解決にならない方法

shell script の先頭で、
#!/usr/bin/env bash

# askpass () # <msg>
#   Helper command for --use-askpass of wget.
#   Return $HTTPUSER and $HTTPPASS
read WGET < <(type -p wget true)
if [ /proc/$PPID/exe -ef "$WGET" ]; then
  [[ "$1" =~ @ ]] && echo "$HTTPPASS" || echo "$HTTPUSER"
  exit
fi

function readp () # <prompt>
#   read -p helper.
{
  local result
  read -p "$1" result && echo "$result"
}

function askpass ()
{
  export HTTPUSER HTTPPASS
  local getpw; readarray -t getpw < <(type -p getpw.bash ${WGET_ASKPASS:+"$WGET_ASKPASS"} ${SSH_ASKPASS:+"$SSH_ASKPASS"} readp || echo readp)
  [ -z "$HTTPUSER" ] && read -p "Username: " HTTPUSER
  [ -z "$HTTPPASS" ] && HTTPPASS="$("$getpw" "Password: ")"
}
のようにしておいて、wget を呼ぶ際は
askpass
wget --use-askpass="$0" "https://example.com/"
のようにして wget の --use-askpass に $0 (今実行している shell script)を渡すようにしてやる。

とりあえずこうしておけば export した HTTPUSER, HTTPPASS を子プロセスの wget に限定して標準入出力経由で渡すように出来るため
ps -o args でパスワードが表示されてしまう問題は解決出来る。
しかし、環境変数に export してるので、/proc/<PID>/environ を参照できる場合 HTTPPASS に設定したパスワードが見えてしまうという問題が新たに生じてしまう。
少なくとも Ubuntu 20.04.2 LTS の場合は /proc/<PID>/cmdline は 444 だけど、/proc/<PID>/environ は 400 なので、状況的には多少マシにはなっているみたいなんだけど、Cygwin の場合はどちらも 444 なので状況をまったく改善できてない。
行数多くて煩雑な割に、効果が極めて限定的なのが辛いところ。

出来ればプロセスの親子間でパスワードの情報を閉じさせたいのだが、何か良い方法はないものだろうか?

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます