スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Apache中級者像
Apacheの設定で中級者向けだと思うものを初学者のビンゴ中西がピックアップ!
初学者なんで、よくわからん。

-----------------ビンゴ中西の考える中級者像----------------------
● .htaccess を使ってアクセス制御ができる
● ブラウザにキャッシュさせないようにする(CGI開発時などに極めて便利)
-----------------------------------------------------------------

.htaccess を使ってアクセス制御ができる


:一連の流れ:
1).htaccessを制御したいディレクトリに作成
2)アクセスできるユーザーとパスワードを登録
3)Apacheを再起動
:一連の流れ:

1)ファイル名:.htaccess
AuthUserFile /home/nakanishi/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

を制御したいディレクトリに置く。

2)nakanishiのホームディレクトリで、
$ htpasswd -c .htpasswd nakanishi
New password: nakanishidayo
Re-type new password: nakanishidayo


$ cat .htpasswd 
nakanishi:vCVbhzTIBes.g

となった。

3)
# /etc/init.d/httpd restart



わけわかんなかったこと:
httpd.confファイルのどこも AllowOverride None → AllowOverride All に変えていないのにちゃんとアクセス制御できた。パスワードの暗号化ってどうやるんだ?


キャッシュをさせないようにする(CGI開発時などに極めて便利)


:一連の流れ:
1)httpd.confにFilesディレクティブを追記する。
2)Apacheを再起動
:一連の流れ:

1)httpd.confに
<Files ~ "\.(cgi|html|php|jpe?g|gif|png)$">
Header set Pragma no-cache
Header set Cache-Control no-cache
</Files>
を追記。

えー それどこに書いたらいいのー
httpd.confって行数多すぎでしょー 絶対適当な場所におけるわけないやんか!!
と思ったので
403行目~406行目
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

とあった次の行に追記しました。

2)
# /etc/init.d/httpd restart

おお!!Firefoxの「Live HTTP headers」で
Cache-Control: max-age=0
と表示されたのを確認!!!!

ちなみに、CGIに限って言えばCGI.pm のheaderメソッドを使えばキャッシュを残さないようにしてくれてるみたいですね。
ビンゴ中西のほげほげの古い記事より:http://bingobingobingo.blog49.fc2.com/blog-entry-169.html

参考資料:
http://httpd.apache.org/docs/2.2/ja/howto/auth.html
http://ash.jp/env/srv/htaccess.htm
http://www.seo-equation.com/html/htaccess/cache_control
スポンサーサイト
Apacheの動作についての考察
<<前へ
ここでは、Apacheの動作について考察を行いました。
CGIはいったいどのユーザーにより実行されているんだろう?といった疑問から実験をし、確かめてみました。つまり、Apacheとアクセス権限についての考察です。

suEXECが大きく絡んできています。本記事は間違いを含んでいるかもしれません。ここはセキュリティ上大きな問題になりますので、正確なところはhttp://httpd.apache.org/docs/2.0/ja/suexec.htmlなどの資料にあたってください。
あくまでビンゴ中西の実験による考察(推測)をお届します。


さて、Apacheの設定を終えた現在、
3)230行目、231行目(デフォルトのまま)
User apache
Group apache

となっています。ひとつ疑問が浮かびました。 apacheなんていうユーザーを作った覚えがない。ユーザーは useradd というコマンドにより行いますが、apacheなんていうユーザーを作った記憶がありません。なのにこんな設定でよいのでしょうか? apacheというユーザーがいるのか確認してみる必要がありそうです。

# cat /etc/passwd | grep apache


とパスワードのファイルを見てみることにしました。すると、
apache:x:48:48:Apache:/var/www:/sbin/nologin

と表示されました。確かに apacheがユーザーとして存在するようです。

ここで、ルートになった状態で
# su apache
とapacheになってみようと試みましたが、
This account is currently not available.
と表示されてしまい。ユーザをスイッチ(変更)できませんでした。
su はスイッチユーザーの略です。スーパーユーザーの略ではありませんので注意してください!

あれー おかしいな変更できひんやん。

と思いましたが、もう一度パスワードファイルを覗いたときの結果を見てみますと
apache:x:48:48:Apache:/var/www:/sbin/nologin

となっています。 最後に nologin とありますから、シェルによるログインはできないようです。


ちょっとここで、話をLinuxのアクセス権限に移します。Linuxには

●所有者(オーナー)
●グループ
●その他

という3つの属性に対してファイルもしくはディレクトリの権限を決めます。
ls -ld /home/nakanishi/public_html/
で /home/nakanishi/public_html/ ディレクトリのアクセス権限を調べてみますと、
drwxr-xr-x nakanishi nakanishi
でした。

/home/nakanishiディレクトリの所有者はnakanishi で グループもnakanishiであることを示しています。
所有者への権限はrwx グループへの権限はr-x その他への権限はr-xですね。よってユーザーapacheがこのディレクトリにアクセスする場合は
その他の権限で見ることになりますから r-x で「読み込み」と「実行権限」の2つが与えられていることなります。ですから、ブラウザからこのディレクトリはアクセス可能です。ブラウザからのアクセスはすべてapacheユーザーが請け負っていると考えることができます(自分で簡単なHTTPサーバを書いてみると理解の助けになるでしょう)。多くの場合、apacheユーザーは「その他」に与えられた権限を持っていると考えることができます。

それではここで、http://bingobingobingo.blog49.fc2.com/blog-entry-362.htmlのアップローダを考えてみます。

これはファイルを任意のディレクトリに書き込め(アップロード)にいけますが、もしこのアップローダの所有者が nakanishi だったとしましょう。
すると、
drwxrwx--- some_user nakanishi
となっているディレクトリに対してファイルを書き込み(アップロード)できてしまいます。

えーぇ!ブラウザからの処理は apacheユーザー が請け負っているはずではぁああ!!! 

となりますが、CGIは実行ファイルです。Apacheは実行ファイルを実行するときに suEXEC を発動させます。たぶん「Switch User Execute」の略でしょう ユーザーをスイッチしてから実行ファイルを実行します。誰にスイッチするのでしょうか? 実行ファイルの所有者です。このアップローダの所有者がnakanishiだった場合、
nakanishiに与えられた権限はすべて行えてしまいます。ですから、
drwxrwx--- some_user nakanishi
となっているディレクトリは「グループ」であるnakanishiに「書き込み」「実行」を与えていますので、ここにブラウザを通してファイルを書き込むことが可能となります。このディレクトリは外部に見せたくないからと apache に対してなんの権限も与えなかったとしても、apache は ユーザーを変身できますので、このようなことになります。注意した方がよいでしょう。


まとめ:
Apacheはrootユーザーにより起動されるが、apacheユーザーが仕事を請け負っています。この apacheユーザーが実行ファイルを扱うとき、その実行ファイルの所有者に変身します。これによりapacheユーザーには与えられていない処理も可能になります。詳しいことはhttp://httpd.apache.org/docs/2.0/ja/suexec.htmlなどをあたってください。
CGIの動作確認
<<前へ
CGIのテスト用に以下のファイルを用意しました。コピペして使ってください。

ファイル名:test.cgi
#!/usr/bin/perl -w
use strict;
use CGI;

my $cgi = new CGI;

print $cgi->header(-charset=>'utf-8');
print $cgi->start_html(-lang=>'ja', -encoding=>'utf-8', -title=>'test.cgi');

print "CGI無事に成功しました!!!<br />";

print $cgi->end_html;
#end



CGIを動かせるディレクトリでこのファイルを作ったならばアクセス権を755にしなければなりません。
# chmod 755 test.cgi

としてください。

Perlで書かれていますので Perlの文法が正しいかチェックします。
# perl -wc test.cgi

syntax OK なら、問題ありません。

念のためコマンドプロンプトから実行しておく方がよいでしょう。
# ./test.cgi

以下のように表示されれば成功です。
Content-Type: text/html; charset=utf-8

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>test.cgi</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
CGI無事に成功しました!!!<br />
</body>
</html>


ではブラウザから見てみましょう。これだけチェックしてもエラーになることがあります。



もし、CGIを実行してみて Internal Server Error が出た場合はApacheのエラーログを参照するのが有効です。

# locate httpd | grep error

とコマンドプロンプトで実行すると、エラー用のログファイルを発見できますので、
# cat -n /var/log/httpd/error_log

とファイルを見てみると有益な情報が得られます。(今回それらしいファイルerror_logを発見できました)



なお、suexecというApacheの機能により
suexec policy violation: see suexec log for more details
というエラーをerror_logファイル内に見ることがあるかもしれません。そんなときは

# find / -name "*suexec*"

などすると /var/log/httpd/suexec.log が見つかりますので、これを見てみます。
すると、directory is writable by others: というエラーメッセージが見つかりました。 これは、ディレクトリが「others」より書き込まれます。と言っているようです。
見てみますと test.cgi を含んでいるディレクトリの権限が

drwxrwxr-x

となっていました。グループに w がありますのでグループに書き込み権限を与えてしまっています。えー「その他」には書き込み権限与えてないやん。と思いつつも、

# chmod 755 目的のディレクトリ


とすると動きました!!! いやー実はこのエラーで2時間以上苦しんだんです・・・

参考ページがなければ解決はなかったでしょう・・・

参考ページ:http://blog.hitokoto.org/2006/02/cgi_1.php

>>次へ
具体的な設定例 (目標 CGIを可能にするなど)
<<前へ
それでは具体的な設定例について書きます。環境はFedora5です。
ほぼデフォルトのままで変更点は4項目しかありません。

コマンドプロンプトでの
# rpm -qa | grep httpd

の結果、 httpd-2.2.0-5.1.2 となりましたのでバージョンは2.2.0-5.1.2でいいのかなぁ。。。

行番号はApacheのバージョンなどにより微妙に変化しますので参考までにどうぞ。
なお、デフォルトのまま記載しているものも多いです。

設定目標:----------------------------------------------
ユーザー毎のpublic_htmlディレクトリを公開ディレクトリとします。
ユーザーnakanishiを例にとった場合、
Linux環境下/home/nakanishi/public_html/を公開ディレクトリとします。
ブラウザからは、http://your_host.co.jp/~nakanishi/でアクセスできるものとします。
CGIは基本的にどのディレクトリでも動くようにします。
---------------------------------------------------------

1)44行目(デフォルトのまま)
ServerTokens OS

2)57行目(デフォルトのまま)
ServerRoot "/etc/httpd"

3)230行目、231行目(デフォルトのまま)
User apache
Group apache

4)250行目(デフォルトのまま)
ServerAdmin root@localhost

5)280行目(デフォルトのまま)
DocumentRoot "/var/www/html"

6)290行目~293行目と305行目~334行目(!!CGIを実行可能に!!)
長いので変更点のみ記載
    Options FollowSymLinks ExecCGI
 と
    Options Indexes FollowSymLinks ExecCGI

両者、Optionsディレクティブに ExecCGI を書き足しました。
(そこ以外はデフォルトのまま)
なお、
Options All
とする荒技(?)もあります。
余談ですが、-ExecCGI とマイナスをつけるとCGIを実行できなくなります。これに対して +ExecCGI とプラスを付ける場合がありますが、これは ExecCGI とプラスを付けなかった場合と同じ意味になります。

7)348行目~363行目(デフォルトのまま)
<IfModule mod_userdir.c>
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
#UserDir disable

#
# To enable requests to /~user/ to serve the user's public_html
# directory, remove the "UserDir disable" line above, and uncomment
# the following line instead:
#
UserDir public_html

</IfModule>

8)369行目~380行目(!!CGIを実行可能に!!)
やはり変更点のみ記載
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI

ExecCGIを書き加えました。同様に
Options All
の技もあり。

9)390行目(!!ちょっと変更!!)
DirectoryIndex index.html index.html.var index.cgi

index.cgiを加えました。

10)523行目(デフォルトのまま)
ServerSignature On

11)538行目や563行目などなど(デフォルトのまま)
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
他の行は略します

12)569行目~574行目(デフォルトのままで本当によいのか・・・)
デフォルトのままなので飛ばします
Options None
の部分がNoneでいいのか気がかりなのですが・・・

13)734行目(デフォルトのまま)
LanguagePriority en ca cs da de el eo es et fr he hr it ja 以下略

14)750行目(デフォルトのまま)
AddDefaultCharset UTF-8

15)781行目(!!CGIを実行可能に!!)
#AddHandler cgi-script .cgi → AddHandler cgi-script .cgi

コメントをはずしました。


最後に設定ファイルの文法が間違っていないかコマンドプロンプトから
# httpd -t
とチェックして OKがでれば、
# /etc/rc.d/init.d/httpd restart
でリスタートさせます。

次の記事は、CGIの動作確認、およびエラーの発見の仕方についてです。

>>次へ
Apacheにおいて知っておいたほうがよいであろう設定項目
つわー もう多くてわけがわからねー 初学者にとって知っておいたほうがよいだろうっていうApacheのディレクティブってなんなんだ~!
というわけで勝手に初学者である私、ビンゴ中西が必要そうなディレクティブをピックアップ!!!!

1)
ServerTokens

クライアントに返信するサーバ応答ヘッダに含める情報を指定します。
ServerTokens Full
だと全情報を返します。セキュリティが気になる方にはこのディレクティブ!!


2)
ServerRoot

Apacheの設定ファイルなどが入っている根っことなるディレクトリを示します。
デフォルトで
ServerRoot "/etc/httpd"
となっていましたが、確かに /etc/httpd/conf/httpd.conf に設定ファイルがありました。


3)
User と Group

HTTPデーモンが誰によって動かされているかを示す。
User nakanishi
Group nakanishi

だと、ユーザーnakanishiでグループもnakanishiであることを示している(はず)。


4)
ServerAdmin

Webサーバとして世界に公開するなら気にしたほうがよいディレクティブ。僕は公開するつもりはないので、そのままにします。


5)
DocumentRoot

あれ、さっき載ってなかったけ!?ってそれは2)ServerRootだ!!!!
このディレクティブはかなり重要です。
DocumentRoot "/var/www/html"
となってたとしましょう。するとLinux環境下での /var/www/html があなたのWebサーバでのルートと見なされます。
つまり例えば、
http://your_host.co.jp/
とあなたのサーバがアクセスされた場合には、
Linux環境下の/var/www/html がアクセスされたことになります。


6)
<Directory />
Options
AllowOverride
</Directory>
 と
<Directory "/var/www/html">
Options
AllowOverride
Order
Allow
</Directory>

そのディレクトリに対しての細かい設定ができます。パスはLinux環境下でのパスです。
ルートディレクトリとDocumentRootで指定したディレクトリについては設定しておいた方がよさそうです。


7)
<IfModule mod_userdir.c>
UserDir
</IfModule>

UserDir public_html
としておくと、ユーザ毎にあるpublic_htmlディレクトリを公開できるようになるようです。
つまり、あなたのLinuxマシーンにユーザーnakanishiがいたとすると、
http://your_host.co.jp/~nakanishi/ で、
Linux環境下の /home/nakanishi/public_html にアクセスできます。


8)
<Directory /home/*/public_html>
AllowOverride
Options
<Limit GET POST OPTIONS>
Order
Allow
</Limit>
<LimitExcept GET POST OPTIONS>
Order
Deny
</LimitExcept>
</Directory>

ユーザ毎の公開ディレクトリの細かい設定ができます。7)の項目でUserDir public_htmlとしているなら、重要になってくるでしょう。


9)
DirectoryIndex

普通、ファイル名を指定しないとアクセスできませんが、index.htmlなどのファイルは指定しなくても見れます。それはデフォルトでこのディレクティブにより設定されているからです。
え、どういうこと?? ってなりますから具体例をしまします。
5)の項目で
DocumentRoot "/var/www/html"
とし、
DirectoryIndex index.html
としたとしましょう。
そして、/var/www/htmlディレクトリに index.html というファイルを作ります。 
ここでhttp://your_host.co.jp/とあなたのサーバにアクセスするとファイル名を指定していないはずなのに先ほど作ったindex.htmlがアクセスされます。
つまり、ファイル名を指定しなかった場合に参照(アクセス)されるファイル名を示します。


10)
ServerSignature

セキュリティに気を払う人は知っておいた方がよいような気がする・・・・


11)
Alias
 と 
ScriptAlias

DocumentRootと同じ発想で考えればよいと思う。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
だと、
http://your_host.co.jp/cgi-bin/ でアクセスされた場合
Linux環境下の /var/www/cgi-bin/ がアクセスされたことになる。


12)
<Directory "/var/www/cgi-bin">
AllowOverride
Options
Order
Allow
</Directory>

11)のScriptAliasで指定した先のディレクトリの設定をしておきたいのが人情というものだろう。


13)
LanguagePriority

あなたのWebサーバのファイルの言語を設定する場所。日本人的には
LanguagePriority ja
となってさえいればよいような気がするが、初期状態のままにしておこう。jaを設定の先頭に持ってくる管理者もいる。


14)
AddDefaultCharset

文字コードの設定だ。CGIスクリプト作成時に文字コードが違ったりして泣いちゃいそうになるかもしれないのでCGI作成者は知っておいた方がよいかも。


15)
AddHandler

うーむ。よくわからないのだが、CGIを使いたいのなら、
AddHandler cgi-script .cgi
とすべきであるようである。たいてい始めはコメントアウトされてあるので注意が必要である。
これを書かない場合、拡張子.cgiのファイルも text/plain と見なされて実行されないようである。このディレクティブでちゃんと指定してあげれば拡張子.cgiが実行されるようだ。

>>次へ
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

ブロとも申請フォーム

この人とブロともになる

| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。