apachectl 3分ハッキング
あまりにも最近更新出来ていないので、仕事ネタで更新しておこうと思いついた。
過去のBlogから記事を引っ張りだしてきた。
apachectl 3分ハッキング:
http://myhome.cururu.jp/aquacity/blog/article/91001486526
以下の内容は上記記事の転載である。
自分の記事なので著作権を気にしなくていい♪
ああ、せっかくだから少し見直して多少文章を直しておくかな。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
諸事情で apachectl をハックすることになった。
OSがLinux系の apache では、apachectl を使って httpd(http deamon) の起動・停止を行うのが一般的だろう。
今回、ハックする要件は「httpd 起動の際は必ずSSLを有効にしたい」である。
apachectl start
通常の起動
apachectl startssl(/sslstart/start-SSL)
SSL有効起動
なのは、apacheを使っている方には基本であろう。
この apachectl start をどうにかしたい。
SSL有効起動をするはずが、うっかり通常起動してしまうことを防ぐためだ。
まず、apachectl の中身は実は shell script である。
オレはずっとバイナリかと思っていたので、今まで知らなかった(笑
中を見てみると意外と簡潔でわかりやすい。
### 中略 case $ARG in start) if [ $RUNNING -eq 1 ]; then echo "$0 $ARG: httpd (pid $PID) already running" continue fi if $HTTPD ; then echo "$0 $ARG: httpd started" else echo "$0 $ARG: httpd could not be started" ERROR=3 fi ;; startssl|sslstart|start-SSL) if [ $RUNNING -eq 1 ]; then echo "$0 $ARG: httpd (pid $PID) already running" continue fi if $HTTPD -DSSL; then echo "$0 $ARG: httpd started" else echo "$0 $ARG: httpd could not be started" ERROR=3 fi ;; stop) ### 以下略
これなら3分ハッキングが余裕で可能である。
shell がわからない方のために、2つほど修正方法を紹介しておく。
ちなみに上記は引数("./apachectl start"などとした場合の'start'に当たる部分)ごとの処理を行っている部分の一部抜粋。
「start」と「startssl/sslstart/start-SSL」でほぼ同一処理をしているのがわかる。
違うのは一点、$HTTPD に対して -DSSL オプションを与えているかどうかのみ。
※HTTPD変数はここで紹介していないが、/apache/bin/httpd などを指定している
改修その1:
「'start'オプションが指定されても、SSL有効起動とする」
修正前:
if $HTTPD ; then
修正後:
if $HTTPD -DSSL ; then
これは start 引数指定時処理をhttpdのSSL有効起動としてしまう方法。
または、start) 〜 ;; を全て削除し、
修正前:
startssl|sslstart|start-SSL)
修正後:
start|startssl|sslstart|start-SSL)
こちらは、元々のSSL有効起動処理の引数判定の中に'start'も含めてしまう方法。
いずれにせよ、これらのパターンだと 'start' オプションでもSSL有効起動を行う。
悪い癖がつく、というデメリットも存在するわけだ。
なので、オレは次の方法を使った。
改修その2:
「'start'オプションが指定されたら、エラーメッセージを出力する」
修正前:
start) if [ $RUNNING -eq 1 ]; then echo "$0 $ARG: httpd (pid $PID) already running" continue fi if $HTTPD ; then echo "$0 $ARG: httpd started" else echo "$0 $ARG: httpd could not be started" ERROR=3 fi ;;
修正後:
start) echo "Please Use Command 'startssl/sslstart/start-SSL' ;;
至ってシンプル。
また、見ての通り、apachectl は httpd を起動したりする、ただの shell スクリプトである。
ハック対象 apachectl の apache(httpd) が起動していても、リプレイス可能である。