未解決案件
2021-02-08、2021-02-10 くらいにプロトタイピングしてた際の話。
シングルユーザー環境でしか使ってないので、そこまで神経質になる必要は無い気もするんだけど、
認証付きのページに対して wget でバッチ処理をしたいので、shell script から wget を呼んで認証をさせる際にパスワードを安全に渡したい。
しかし --password オプションだと、ps -o args するとオプションに指定したパスワードが見えてしまうし、コマンドラインから呼んだ場合 history に password が残ってしまう。
コマンドラインから wget を一回だけ呼ぶだけなら --ask-password で対話的に password を聞いてもらえば解決するんだけど、shell script から複数回呼ぶ場合、wget を呼ぶ度に毎回 password を聞かれるため実用に適さない。
シングルユーザー環境でしか使ってないので、そこまで神経質になる必要は無い気もするんだけど、
認証付きのページに対して wget でバッチ処理をしたいので、shell script から wget を呼んで認証をさせる際にパスワードを安全に渡したい。
しかし --password オプションだと、ps -o args するとオプションに指定したパスワードが見えてしまうし、コマンドラインから呼んだ場合 history に password が残ってしまう。
コマンドラインから wget を一回だけ呼ぶだけなら --ask-password で対話的に password を聞いてもらえば解決するんだけど、shell script から複数回呼ぶ場合、wget を呼ぶ度に毎回 password を聞かれるため実用に適さない。
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 なので状況をまったく改善できてない。
行数多くて煩雑な割に、効果が極めて限定的なのが辛いところ。
出来ればプロセスの親子間でパスワードの情報を閉じさせたいのだが、何か良い方法はないものだろうか?
#!/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 なので状況をまったく改善できてない。
行数多くて煩雑な割に、効果が極めて限定的なのが辛いところ。
出来ればプロセスの親子間でパスワードの情報を閉じさせたいのだが、何か良い方法はないものだろうか?
- getpw.bash
- fetch.sh?
タグ
コメントをかく