いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.146 / 読者数:1342名

こんばんは、うすだです。

このあいだ、家族でちょっと出かけたのですが、下調べをしていなかったため、 途中、道がわからなくなってしまいました。

そんなとき、カーナビがあれば楽勝なのでしょうが、 我が家の車にそんなものはありません。

どないしょー…と思っていたところ、妻が、以下の携帯アプリを使って、 目的地までの経路を、さささっと調べてくれました。

EZ助手席ナビ | EZweb | au by KDDI
http://www.au.kddi.com/josyuseki/index.html

もちろん有料(月額315円、24時間だと157円)なのですが、 携帯のGPS機能で現在位置を確認しながら、 「500m先を右方向です」などとリアルタイムで案内してくれましたので、 迷わずたどり着くことができました。

この手の有料サービスには一切興味を示さない私も、このときばかりは、 その手軽さに衝撃を受けました。

実は、カーナビが欲しいなと常々思っていたのですが、 ポータブルで安いものでも2万円はしますので、 4千円の万歩計すら買うことを躊躇する私にとって、それは雲の上の存在でした。

しかし、これなら、1年フルに使っても、3780円で済みます。
カーナビを買うよりも、安くてお気軽かもしれませんね。

とはいえ、実は、あれから使う機会がなく、今のところ出費は157円だけです。 カーナビの必要性すら疑わしかったことを、思い知らされました。
たいていのモノは、なくてもなんとかなるのかもしれませんね。

結局何も言っていませんが、今回もぼちぼちはりきってまいりましょう。

今回のお題 - もうちょっと Apache を動かしてみる

前回、遅ればせながら、Apache を動かす方法を取り上げました。

Vol.145 - いまさらだけど Apache を動かしてみる
http://www.usupi.org/sysad/145.html

読者さんがごっそり減った、ということはありませんでしたので、前回の宣言どおり、 続きをやらせていただきます。

さて、今回のお題は、以下の2本を予定しています。
今さらなにを、と思われた貴兄は、さくっと宿題までワープしたほうが、 時間の無駄にならなくて済みます。

  • CGI を使えるようにする。
  • ユーザ認証を施す。

また、前提条件は、前回と同様ですので、ご存じないかたは、 前回の本題をご覧ください。


というわけで、最初は CGI です。
CGI を使えるようにするには、大きくわけて2つ方法があります。

  • ScriptAlias ディレクティブを使う。
  • AddHandler ディレクティブを使う。

まず、ScriptAlias ディレクティブを使用して、CGI を使えるようにする方法を、 ご紹介しましょう。

ScriptAlias では、指定したディレクトリ以下にあるファイルが、 みんな CGI プログラムだとみなされて、問答無用で実行されます。

たとえば、/home/usu/httpd/cgi-bin というディレクトリを作成し、 その下に test というシェルスクリプトを置いてみましょう。

  $ mkdir ~/httpd/cgi-bin
  $ cat > ~/httpd/cgi-bin/test << E-O-F
  #!/bin/sh
  echo "Content-Type: text/plain"
  echo ""
  /usr/bin/printenv
  E-O-F
  $ chmod +x ~/httpd/cgi-bin/test

これを、/cgi-bin/ というパスで参照できるようにするため、 httpd.conf に以下の設定を追加します。
(もし ScriptAlias の設定がすでにありましたら、下記に変更します。)

  ScriptAlias /cgi-bin/ "/home/usu/httpd/cgi-bin/"

そして、念のため、以下の設定も追加しておきます。
(先ほどと同じく、同等の設定がありましたら、下記に変更しましょう。)

  <Directory "/home/usu/httpd/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
  </Directory>

そして、以下の手順で、httpd(もしくは apache2)を再起動します。
(手前の2行で確認をしています。確認が不要ならはしょってください。)

  $ /usr/sbin/httpd -f ~/httpd/conf/httpd.conf -t
  Syntax OK
  $ /usr/sbin/httpd -f ~/httpd/conf/httpd.conf -k restart

設定できているかどうか、ブラウザなどからアクセスしてみます。

  $ w3m -dump http://192.168.1.225:65080/cgi-bin/test
  SERVER_SIGNATURE=
  HTTP_KEEP_ALIVE=300
  HTTP_USER_AGENT=w3m/0.5.1+cvs-1.969
  SERVER_PORT=65080
  HTTP_HOST=192.168.1.225:65080
  ...後略...

上記のように、でろっと環境変数の一覧が出力されましたら、成功です。
403 Forbidden などと言われた場合は、設定を疑ってください。
500 Internal Server Error などと言われた場合は、スクリプトに間違いがないか、 確認してください。
あと、エラーログ(logs/error_log)を確認すると、 何かヒントが得られるかもしれません。

ちなみに、cgi-bin ディレクトリは、DocumentRoot の下にあっても動作します。 ただ、設定ミスで CGI ファイルの中身を公開してしまうリスクを考えると、 DocumentRoot の外に置いておいた方が無難だと思います。

それから、上記 test スクリプトは、外部から参照される可能性が生じたときには、 潔く削除しておいてください。
(知らせる必要のない情報は、極力公開しない方がよいと思いますので。)


次に、AddHandler ディレクティブを使う方法を、ご紹介します。

こちらは、DocumentRoot 内の特定の拡張子のファイルを CGI プログラムとみなして、 実行してもらえるようにします。

たとえば、cgi という拡張子のファイルを CGI プログラムだとみなしてほしい場合は、 httpd.conf に以下を追加します。

  AddHandler cgi-script .cgi

ただし、これだけでは不十分で、CGI プログラムが存在するディレクトリで、 CGI の実行を明示的に許可する必要があります。

たとえば、 /home/usu/httpd/html/cgitest にある CGI プログラムの実行を許可するには、 以下の設定を追加してください。

  <Directory "/home/usu/httpd/html/cgitest">
    Options +ExecCGI
  </Directory>

それでは、先ほどのスクリプトを置いて、試してみましょう。

  $ mkdir ~/httpd/html/cgitest
  $ cp -p ~/httpd/cgi-bin/test ~/httpd/html/cgitest/test.cgi

CGI プログラムを置いたら、設定を有効にするため、再起動を行います。

  $ /usr/sbin/httpd -f ~/httpd/conf/httpd.conf -k restart

そして、先ほどと同様に、アクセスしてみて、同様の結果が得られることを確認します。

  $ w3m -dump http://192.168.1.225:65080/cgitest/test.cgi
  SERVER_SIGNATURE=
  HTTP_KEEP_ALIVE=300
  HTTP_USER_AGENT=w3m/0.5.1+cvs-1.969
  ...後略...

 

ちなみに、SetHandler ディレクティブを使用して、 CGI を使えるようにすることもできます。
その場合、SetHandler を使用したディレクトリの下にあるファイルが、 みな CGI プログラムだとみなされ、実行されます。
(ScriptAlias との違いが、わたしにはよくわかりませんが…。)

  <Directory "/home/usu/httpd/html/cgitest2">
    SetHandler cgi-script
    Options +ExecCGI
  </Directory>

さて、お次はユーザ認証です。

HTTP 標準のユーザ認証には、Basic 認証と Digest 認証があります。

Basic 認証では、ユーザ名とパスワードを、ほぼ平文のまま送信します。
セキュリティ上はよろしくありませんが、たいていのブラウザが対応していますので、 お手軽に使える認証方式です。

Digest 認証では、ユーザ名とパスワードを、 ランダムな文字列とともにハッシュ化して送信します。ですので、 Basic 認証よりはパスワード等の漏洩を防ぐことができます。 (過信してはいけませんが…。)

 

それでは先に、Basic 認証を使うための手順を、ご紹介します。

まず、authtest ディレクトリを作成し、 確認用の適当な HTML ファイルを作っておきます。

  $ mkdir ~/httpd/html/authtest
  $ cat > ~/httpd/html/authtest/index.html << E-O-F
  <html><body><p>Hello Basic Authentication World!</p></body><html>
  E-O-F

次に、パスワードファイルを作成します。
これは、htpasswd(もしくは htpasswd2)というコマンドで作成できます。
たとえば、/home/usu/httpd/etc/htpasswd というパスワードファイルを作成する場合、 以下のように実行します。

  $ mkdir ~/httpd/etc
  $ htpasswd -c ~/httpd/etc/htpasswd authuser
  New password: (authuser さんのパスワードを入力)
  Re-type new password: (authuser さんのパスワードを再度入力)
  Adding password for user authuser

パスワードファイルが存在しない場合は、-c オプションが必要です。
すでにある場合は、不要です。

そして、以下の設定を httpd.conf に追加します。

  <Directory "/home/usu/httpd/html/authtest">
    AuthType Basic
    AuthName basic-auth-test
    AuthUserFile /home/usu/httpd/etc/htpasswd
    Require user authuser
  </Directory>

追加したら、上記設定を有効にするために、再起動を行います。

  $ /usr/sbin/httpd -f ~/httpd/conf/httpd.conf -k restart

実際にアクセスすると、ユーザ名とパスワードを聞かれますので、 正しいユーザ名(authuser)とパスワードを入力してください。
問題なければ、Hello Basic Authentication World! と出力されます。


次に、Digest 認証の設定手順を、ご紹介します。

先ほどと同様、例として、/home/usu/httpd/html/authtest2 を参照するために、 authuser さんのパスワードを入力すべし、 という Digest 認証を施してみたいと思います。

まず、authtest2 ディレクトリを作成し、確認用の HTML ファイルを作成しておきます。

  $ mkdir ~/httpd/html/authtest2
  $ cat > ~/httpd/html/authtest2/index.html << E-O-F
  <html><body><p>Hello Digest Authentication World!</p><body><html>
  E-O-F

次に、パスワードファイルを作成します。
Digest 認証の場合は、 htdigest(もしくは htdigest2)というコマンドで作成できます。
たとえば、/home/usu/httpd/etc/htdigest というパスワードファイルを作成する場合、 以下のように実行します。

  $ htdigest -c ~/httpd/etc/htdigest digest-auth-test authuser
  Adding password for authuser in realm digest-auth-test.
  New password: (authuser さんのパスワードを入力)
  Re-type new password: (authuser さんのパスワードを再度入力)

htpasswd のときとはやや違って、1つ引数が増えています。
ユーザ名の前に、 後述の AuthName で指定する realm と呼ばれる文字列を指定する必要があります。

そして、以下の設定を httpd.conf に追加します。

  <Directory "/home/usu/httpd/html/authtest2">
    AuthType Digest
    AuthName digest-auth-test
    AuthUserFile /home/usu/httpd/etc/htdigest
    Require user test
  </Directory>

追加したら、上記設定を有効にするために、再起動を行います。

  $ /usr/sbin/httpd -f ~/httpd/conf/httpd.conf -k restart

実際にアクセスすると、ユーザ名とパスワードを聞かれますので、 正しいユーザ名(authuser)とパスワードを入力してください。
問題なければ、Hello Digest Authentication World! と出力されます。

 

ちなみに、パスワードファイルには、複数のユーザを登録できます。
そして、複数のユーザを許可するには、以下のようにユーザ名を列挙する方法と、
(以下は authuser, authuser2, authuser3 さんを許可しています。)

  Require user authuser authuser2 authuser3

登録されているユーザすべてを対象とする、以下の方法があります。

  Require valid-user

以上、CGI を使えるようにする方法と、ユーザ認証を施す方法を、 長々とご紹介しました。

詳細な説明は、以下を参照すれば、事足りると思います。
(日本語なブラウザでアクセスすれば、日本語訳がばっちり読めます。)

Apache HTTP サーバ バージョン 2.2 ドキュメント
http://httpd.apache.org/docs/2.2/

上記を読んでいますと、ネタが次々発掘されて、 書くことが永遠に続いてしまいそうになります。
今回も十分長いですが、これでも、いくつかのネタをはしょってしまったということは、 明記しておきたいと思います。

もう少し詳しく知りたいなと思われた貴兄は、上記をなめるように読み、 いろいろ試してみてください。すごく勉強になりますよ。

宿題の答え

前回の宿題は、

  Listenディレクティブで、IPアドレスを指定した場合と指定しない場合
  の違いを、確認してみましょう。

でした。

それでは、以下のように、IPアドレスを明記した場合と、

  Listen 192.168.1.225:65080

ポート番号だけの場合とで、動作の違いを探ってみましょう。

  Listen 65080

 

前者の場合は、いま稼働中の httpd がまさにその通りのはずですので、 以下のように、netstat コマンドで様子を見てみます。
(-l オプションは listenしているひと限定、-t オプションは TCP限定、 -n オプションはアドレスやポート番号を数値で表示、です。)

  $ netstat -ltn
  Active Internet connections (only servers)
  Proto Recv-Q Send-Q Local Address        Foreign Address  State
  ...中略...
  tcp        0      0 192.168.1.225:65080  0.0.0.0:*        LISTEN
  ...後略...

Local Address のポート番号が 65080 の行を見ますと、上記のように、 192.168.1.225 で待っていることがわかります。
これは、192.168.1.225 宛の場合のみ、接続を許可します。
ですので、localhost への接続を試みても、以下のようにはじかれます。

  $ w3m -dump http://localhost:65080/
  w3m: Can't load http://localhost:65080/.

別のインターフェースのアドレス宛も、同様にはじかれます。
たとえば、192.168.1.226 というアドレスを使えるようにしても、 以下のようにはじかれます。

  # ifconfig eth0:0 192.168.1.226
  # w3m -dump http://192.168.1.226:65080/
  w3m: Can't load http://192.168.1.226:65080/.

 

さて、それでは、ポート番号だけの場合は、どうなるでしょうか。

  Listen 65080

と設定して、httpd を再起動します。
(restart 一発では Address already in use と言われますので、 stop と start に分けて実行しています。)

  $ httpd -f ~/httpd/conf/httpd.conf -k stop
  $ httpd -f ~/httpd/conf/httpd.conf -k start

すると、netstat コマンドでは、以下のように出力されます。

  $ netstat -ltn | grep 65080
  tcp        0      0 :::65080             :::*             LISTEN

Local Address にアドレスが出てきません。
そして、localhost や、先ほどの 192.168.1.226 宛でアクセスしてみると、 ちゃんと応答があります。

  $ w3m -dump http://localhost:65080/
  Hello World!

  $ w3m -dump http://192.168.1.226:65080/
  Hello World!

 

というわけで、IPアドレスを明記すると、そのアドレス宛のみ接続を許可しますが、 明記しなければ、来るものを拒まずみんな受け入れます。

インターフェース毎にサービス内容を分けるなら、IPアドレスを明記し、 どのインターフェース宛でも平等に同じサービスを提供するなら、 ポート番号だけを指定すればよいと思います。
(たとえば、社内LAN側は社内限定のサービスを提供する、とかですね。)

今回の宿題

今回の宿題は、

  Basic 認証と Digest 認証のやりとりを、生で見てみましょう。

です。

生で見るといえば、tcpdump でしょうか。見づらいかもしれませんが…。
(他にもっとわかりやすい方法があれば、それをご使用ください。)

何度かアクセスし、Basic 認証では毎回同じ文字列が、 Digest 認証では毎回異なる文字列が渡されていることを確認してみましょう。

あとがき

ご存じのかたはご存じだと思いますが、毎日、寝る間を惜しんで栗の絵を描くという、 よくわからない活動をしています。
さて、このたび、ものすごく遅ればせながら、携帯版を作ってみました。

モバイル栗日記(仮称)
http://usupi.org/k/

携帯の場合、3大キャリアそれぞれの方言(?)を調べるのが面倒で、 作ろうという気はあったものの、ずっと着手していませんでした。
ですが、ひょんなことから mod_chxj という Apache モジュールの存在を知り、 お試しから導入まで、一気につっ走ってみた次第です。

mod_chxj
http://sourceforge.jp/projects/modchxj/

携帯向け Apache モジュールといえば、DeNA の MobaSiF や、 ゆめみラボの mod_ktai などがあると思います。(すみません他は知りません。)
しかし、いずれも、インストールに必要となるものがたくさんあり、 最新のディストリビューションでない私の環境では、それらをそろえることが面倒で、 コンパイルの試行にすらたどり着けませんでした。
(もちろん、mod_chxj も、素でコンパイルできるわけではありません。 でも、必要なものは他より少ないと思います。)

MobaSiF (Moba/Mobile Simple Framework)
http://sourceforge.jp/projects/moba/
mod_ktai/YUMEMI Labs [ゆめみラボ]
http://labs.yumemi.co.jp/labs/mod/man_contents.html

で、動作確認はと言いますと、 FireMobileSimulator という Firefox のアドオンで済ませました。 (もちろん、最終的には携帯を使いました。)

FireMobileSimulator
https://addons.mozilla.org/ja/firefox/addon/8519

私の場合、見た目の確認だけに用いましたが、 いろいろエミュレートしてくれるようですので、そのうち他も試してみたいと思います。

というわけで、意外と簡単に、携帯サイトが作れました。
みなさんも、作りたいなあという気持ちが少しでもありましたら、是非、 やってみてください。上記の組合せなら、ローカルな環境で試せますよ。

 

それから、またしても私事で恐縮ですが、勢いあまって、 下記に出店することになりました。
ダメもとで応募してみたら、審査にうっかり通ってしまいました。
もう、後戻りはできません。覆水盆に返らず、です。

なごやデザインウィーク vol.19 - ライブマーケット
http://www.idcn.jp/week/08/pn/index.html#market

 

そんなわけですので、次回は、申し訳ありませんが、お休みします。

休むと1ヶ月あいてしまいますので、本当は休みたくないのです。 しかし現時点で、まだなにも準備できてないという有り様なため、 本腰を入れて準備をするため、苦汁の決断をしたいと思います。

せっかくですので、カードを印刷したりオブジェを作ったりなど、 準備に全力投球する所存でございます。
ですので、申し訳ございませんが、11月頭までお待ちいただけますと幸いです。 だれも待っていないかもしれませんが…。(-ε-;

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 11月2日(日) 頃に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−玉砕覚悟(?)でライブマーケットに挑みます!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本