それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

openvpn access server の管理画面をcurlで書き換える。

OpenVPNAccess Server のAPIを使って設定を書き換えようと思ったが、APIを探し出したり、管理コマンドをSSH経由で実行するのもめんどくさい。

curl でwebUIを叩いてみることにした。

WEB画面のSSL証明書を更新する例。

DOMAIN=ovpn.example.tld
CERT_PATH=/tmp/${DOMAIN}.crt.pem 
PKEY_PATH=/tmp/${DOMAIN}.privkey.pem 
OVPN_AS_SITE=192.168.2.147:943
OVPN_AS_USER=takuya
OVPN_AS_PASS=takuya
COOKIE=/tmp/ovpn-as.cookie

function cleanup() {

  echo -n 'clean up ..'
  [ -e ${COOKIE}    ] && rm ${COOKIE};
  echo 'done.'

}

function update_cert_ovpn_as(){
  [ ! -e $CERT_PATH ] && exit 1 
  [ ! -e $PKEY_PATH ] && exit 1 

  ## ログインして
  echo -n 'login to openvpn as ..'
  curl -ksL -c ${COOKIE} -b ${COOKIE}  https://${OVPN_AS_SITE}/admin/ > /dev/null
  curl -ksL -c ${COOKIE} -b ${COOKIE} \
   -d username=${OVPN_AS_USER} -d password=${OVPN_AS_PASS} \
    https://${OVPN_AS_SITE}/admin/__login__ > /dev/null
  echo 'done'


  ## フォームIDを取り出して
  echo -n 'get form key  ..'
  POST_ID=$(curl -ksL -c ${COOKIE} -b ${COOKIE}  \
     https://${OVPN_AS_SITE}/admin/web_server |  \
     grep -oP '(?<=name="post_id" type="hidden" value=").+(?=" />)' )
  echo 'done'
  echo POST_ID=$POST_ID

  ## 証明書を更新して
  echo -n 'post cert pkey  ..'
  curl -kvL -c ${COOKIE} -b ${COOKIE} \
  -F cert_option=user_provided \
  -F domain='' \
  -F email='' \
  -F cs.ca_bundle='' \
  -F cs.cert=@${CERT_PATH}\
  -F cs.priv_key=@${PKEY_PATH} \
  -F button='Save Settings' \
  -F post_id="${POST_ID}" \
  https://${OVPN_AS_SITE}/admin/web_server > /dev/null
  echo 'done'

  ## 再起動
  echo -n 'request restart  ..'
  curl -ksL -c ${COOKIE} -b ${COOKIE} \
  -F button='Update Running Server' \
  -F cert_option=user_provided \
  -F domain='' \
  -F email='' \
  -F cs.ca_bundle='' \
  -F cs.cert='' \
  -F cs.priv_key='' \
  -F post_id="${POST_ID}" \
  https://${OVPN_AS_SITE}/admin/web_server  > /dev/null
  echo 'done'

}

update_cert_ovpn_as;
cleanup;

WEB画面があれば、APIが分からなくても、curl でサクッとスクレイピングできて便利ですね。

cookieとリダイレクトを扱う。

コツとしては、次の箇所。

curl -ksL -c ${COOKIE} -b ${COOKIE}  $URL

発行されるCookieを保存しつつ、リクエストにつかう。これでリクエストのセッションが維持できる

CSRF キーを取り出す

もう一つがCSRFのキーを取り出すgrepの箇所

POST_ID=$(curl -ksL -c ${COOKIE} -b ${COOKIE}  \
     https://${OVPN_AS_SITE}/admin/web_server |  \
     grep -oP '(?<=name="post_id" type="hidden" value=").+(?=" />)' )

WEBフォームにはCSRFトークンがついているので、CSRFトークンを取り出してリクエストに使う。

上記のコツを覚えておく

上記のコツを覚えておけば、あとはChromeの開発ツールでリクエストパラメタを見ていればWEB管理画面程度であればリクエストを発行して更新できて便利。