&size(24){ウェブサーバー(1)(Ubuntu版)};
#contents
#hr
*通信用のサーバープログラム
2つのコンピューターの間で通信を行うためには、両側のコンピューターのそ
れぞれで通信のために必要な処理をするプログラムを動かす必要がある。通信
を送っても宛先のマシンでその通信を処理するプログラムが動いていなければ、
(留守番電話をセットしていない)留守の家に電話するようなもので通信はで
きない。
用途によっては通信の必要が生じたら、その度にネットワークの両側のマシン
でそれぞれ通信用のプログラムを起動する、という方法もありえるが、それで
は不便なことが多い。
これから見ていくネットワーク通信では、必要な時にいつでも通信を行えるよ
うにするために、「(少なくとも)片方の計算機上で相手からの通信を受け付け
ることができるプログラムを常時動かしておく」という方法がとられている。
この通信を待ち受けている側のプログラム(あるいはそのマシン)はサーバー、
通信が必要になった時点で通信開始を要求する側のプログラム(マシン)はク
ライアントとよばれている。
**色々なプロトコル
コンピューター間で通信を行うためには、どのようなデータをどのような形式
でやりとりするか、といった手順(プロトコル)をあらかじめ決めておく必要が
ある。特に不特定の相手と通信したいような場合には、通信のための手続きを
共通にしておく必要がある。
通信の目的によりやりとりすべき情報の内容は違ってくる。例えばネットワー
ク越しでコンピューターを制御できるようにする場合、命令を送っているのが
誰なのか(利用を許可されているユーザーなのかどうか)を何らかの手段で確
認する必要があるだろう。一方、不特定の相手に対して公開されているウェブ
ページをみたいという場合にはアカウント情報の確認は基本的には必要ない。
それぞれの場合に必要となる情報を効率よく伝達、処理することができるよう
に決められた色々なプロトコルがある。ウェブページの送信などに広く使われ
ている http や、メールをやりとりするための smtp, pop, imap ファイル転送
に使われる ftp など、名前は聞いたことがあるものもいろいろあるだろう。
この他にも、ネットワーク上でファイルを共有したり、時計を合わせたり、プ
リンターに印刷データを送ったり、など色々な情報がそれぞれ対応するプロト
コルに従ったやり方でネットワーク上でやりとりされている。これらのそれぞ
れに対して、サーバーマシン(印刷の場合には実際には「プリンター」という
ことになるかもしれないが)の上では、対応する通信を処理するためのサーバー
プログラムが動いている。
**ポート
通信をうまく行うためには、送信した情報はその種類の通信を担当するサーバー
プログラムに処理してもらわなければならない。一台の計算機上でいくつかの
種類の通信に対応するサーバーが動いている場合でも、通信すべきサーバープ
ログラムに通信内容が伝わるように、IPアドレスに加えて「ポート番号」と
いう整数を指定する仕組みになっている。
>
もし仮に一台の計算機上で通信を受
け付けているサーバープログラムが1つだけだったとしても、正しいポート番
号を指定して通信を行わない限り通信は成立しない。
<
広く一般的に使われている種類の通信に関しては、普通はそれぞれのプロトコ
ル毎に決まったポート番号があり、それを使う場合が多い。(通信の「仕組み」
自体としては他のポート番号を使っても同じように通信は可能だが、サーバー
が待ち受けているポート番号をクライアントが正しく指定しないと通信できな
い。サーバーのテストなどの特殊な状況では意図的に通常と違うポートを指定
してサーバーを動かすこともある。)
プロトコルの名前と番号の対応については /etc/services というファイルをみ
るとたくさん並んでいる。このファイルに並んでいるプロトコルはあくまで便
宜的な名前と番号の対応表なので、実際にそのマシン上でこれらのプロトコル
を使った通信を行うプログラムが使える状態になっていることを示しているわ
けではない。
実際に network からの通信を待ち受けているサーバーを調べるには、例えば
ss というコマンドを使って
$ ss -at
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.1:ipp 0.0.0.0:*
LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:*
LISTEN 0 4096 127.0.0.54:domain 0.0.0.0:*
LISTEN 0 4096 [::1]:ipp [::]:*
LISTEN 0 4096 *:ssh *:*
ESTAB 0 0 [::ffff:192.168.125.5]:ssh [::ffff:192.168.125.55]:49302
ESTAB 0 0 [::ffff:192.168.125.5]:ssh [::ffff:192.168.125.4]:60006
のような形で表示させることができる。
*telnet
ネットワーク経由で他のコンピューターから接続して操作するための方法とし
て、古くからあるコマンド。
通信内容の暗号化などは行わないので、ログインする際に入力するパスワード
の情報もそのままの形でネットワーク上を流れてしまうといった問題があるた
め、現在 telnet 経由でのログインを受け付けるように設定することはほとん
どないだろう。
実際にネットワーク経由の仮想端末からログインして作業するような場合には
暗号化した通信を行う ssh を利用するのが一般的になっている。
telnet コマンド自体は、通常のログインしての作業に限らず、端末を使ってネッ
トワーク経由で指定したポート上のサーバーと通信するために使うことができ
るので、ウェブやメールなど色々なサーバーの動作の確認をしたりときに利用
することがある。
$ telnet
と入力して
telnet>
のようなプロンプトに変化すれば telnet コマンドはインストールされている。
その場合、とりあえず
telnet> quit
として元のシェルのプロンプトに戻っておく。
>>
もし telnet がインストールされていない場合は
$ apt search telnet
のようにして、 telnet というコマンドを含むパッケージがリポジトリにあるかどうかを探してみる。
>>
この場合準備されたパッケージがあることがわかるので、実際にインストールするには
$ sudo apt install telnet
と入力すればよい。
>
実用的な意味はあまりないが、 telnet での通信(ログイン)を受け付けるサーバー (telnetd) も動かすことは可能ではある。
# apt install telnetd
...
# nano /etc/inetd.conf
このファイルの
#<off># telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd
という行を探して
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd
のように変更(頭の部分を削除)してから
# systemctl start inetutils-inetd
とすると telnet でのログインができる状態になる。
$ telnet localhost
のようにすると動作を確認することができる。
アカウント名とパスワードを入力することでログインすることができるはずだ。
>
このとき who コマンドを実行してみると、
myname tty2 2024-11-04 12:00 (tty2)
myname pts/2 2024-11-04 13:00 (localhost)
のようにコンソールの仮想端末(tty2)の他に、ネットワーク(localhost) からログインしているユーザーがいるという扱いになっていることがわかる。
>
$ who am i
myname pts/2 2024-11-04 13:00 (localhost)
のように入力すると、現在操作している端末がどれに該当するのかを確認することができる。
>
ここで
$ exit
としてログアウトすると
$ who
myname tty2 2024-11-04 12:00 (tty2)
のように localhost から telnet で接続した分がいなくなっているはずだ。
>
telnet のサーバーを有効にしてファイアーウォールの設定を適当に変更してお
けば、ネットワーク越しに telnet を使ったログインもできる。
しかし、telnet での通信はパスワードを含めて暗号化されない形で送受信されるので、ネットワーク上を流れている途中で盗聴される危険性がある。そのため現在は通信内容の暗号化をする上にもっと使い勝手が良い ssh 等での接続が使われるようになっていて、実際に telnet を使ったリモートでのログインを使うことはないだろう。
>>
telnet とよく似たコマンドに rsh, rlogin というものがある。これは現在のssh の前身にあたるもので、ネットワーク経由でログインしたりファイルのコピーをする際に rsh, rlogin, rcp といったコマンドがよく使われていた。現在は通信を暗号化する ssh,(scp)などにほぼ完全に置き換えられているので、おそらく使うことはないだろう。
*ウェブサーバー(httpd)
ブラウザを利用して様々な情報を入手する際、その送受信には http という画像などを含んだ文書を転送するために作られた通信プロトコルが主に使われている。
この通信をおこなうためのサーバープログラムとして幾つかのものがあるが、ここではかなり昔からあり、現在でもほぼ標準的に使われている apache httpd というものを使ってみる。
このサーバープログラム自体非常に多機能なので、機能の全貌を把握しようとすると大変だが、とりあえずインストールして動かしてみるのはそれほど難しくはない。
**インストール
この後計算機間の通信設定について試してみるのに、通信先のアカウントがなくても通信できるウェブサーバーを使えるようにしておくとなにかと便利なので、とりあえずこのサーバーを動く状態にしておこう。
このサーバーは簡単にインストールできるパッケージが提供されている。まずは準備として
$ sudo apt update
および
$ sudo apt upgrade
として、すでにインストールされているパッケージのうちアップデートが必要なものについてはアップデートしておく。
その後
$ sudo apt install apache2
とすると apache httpd がインストールされる。後は
$ sudo systemctl start apache2
のように入力すればとりあえず動くだけは動き出すはずだ。
この状態で(仮想マシン上で)ブラウザを立ち上げて http://localhost/ にアクセスすると、ブラウザからの問いあわせに対して、サーバーはインストール時に準備されたメッセージを返すのでそれが表示されるはずだ。
ubuntu の場合は、表示されているのは
/var/www/html/index.html
というファイルの内容となっている。
# sudo mv /var/www/html/index.html /var/www/html/ubuntu-default.html
のようにして、このファイルの名前を変えておくことにする。
# sudo nano /var/www/html/index.html
というファイルをつくって
<!DOCTYPE html>
<html>
<head>
<title>
TEST PAGE
</title>
</head>
<body>
<h1>
TEST PAGE. This httpd is running on linux**.in.b508.net.
</h1>
</body>
</html>
とでも書いておき、もう一度 firefox で http://localhost/ にアクセスしてみると、書き込んだ内容(が整形されたもの)が表示されるはずだ。
http の通信は、基本的には文字ベースでの通信なので、端末から直接サーバーと通信することもできる。telnet を使って、
$ telnet localhost 80
として、自機の 80 番ポートで接続を受け付けている http サーバーに話しかけてみる。
基本的に人間が直接しゃべることを想定した通信方法ではないのでプロンプトは出ないが
GET /
と入力すると、トップページを表示するためのデータ(入力したファイルの内容)が送られてくるのをみることができるはずだ。
**ファイアーウォールの設定変更
インストール時のデフォルトの状態で、ファイアーウォールが有効になっていたはずだ。そのため特に設定を変更していない場合、ウェブサーバーのプログラムは起動してあっても、外のマシンからの通信がこのサーバープログラムに取り次がれることはない。
現時点では自分のマシンから http://localhost/ にアクセスすると test 用に作成したメッセージが表示されるが、親機のウィンドウズを含め他のマシンから http://linuxXXX.in.b508.net/ のようにしてアクセスしようとするとアクセス自体を拒否されてしまう状態になっているはずだ。
ということで、他のマシンからのアクセスに対してもページを表示できるようにするためにはファイアーウォールの設定変更が必要になる。
最初にファイアーウォールの設定の状態を確認しておく。
おそらく
$ sudo -i
# ufw status
状態: 非アクティブ
のようになっていると思われる。
# ufw enable
とすることでファイアーウォールを有効化できる。
有効化した状態で
# ufw status
とすると
状態: アクティブ
となるが、何も設定していない場合は外からの接続は通さないので、他のコンピューターから ssh や http で通信することはできない状態になる。
# ufw allow ssh
# ufw allow http
とすることで
root@ubuntu2024:/etc/apache2# ufw status
状態: アクティブ
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
22/tcp ALLOW Anywhere
80/tcp (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
のように、 ssh と http での接続が許可される状態になるはずだ。
この設定の後で親機の windows 上のブラウザから http://linuxXXX.in.b508.net/ にアクセスしてみると自分のマシン上のサイトを表示させることができるはずだ。
**設定ファイル、ログファイルについて
ここで使うウェブのサーバープログラムは apache httpd とよばれているもので、実際に動作するプロセスの名前は httpd という名前になっている。
ubuntu の場合、パッケージ化された apache httpd をインストールすると設定ファイルは/etc/apache2/ というディレクトリ以下に配置される。またログは
デフォルトの設定では /var/log/apache2 以下に出力される。
このプログラムには色々な機能があり設定可能な項目もたくさんあるため、設定ファイルはいくつかに分割しておくことが多い。パッケージを使ってインストールした場合、設定ファイルの本体は /etc/apache2/apache2.conf となっているが、この設定ファイルには必要に応じて /etc/apache2/mods-enabled/, /etc/apache2/sites-enabled/ 及び/etc/httpd/conf-enabled/ におかれている .conf という拡張子つきのファイルを読み込む指示が書かれている。そのため設定ファイルの内容を確認する際には /etc/httpd のいくつかのサブディレクトリを見に行く必要がある。
設定ファイル等のようにあまり書き換えることはないファイルと、ログファイルのように頻繁に書き換えが発生するファイルは、分けておいた方がバックアップや記録媒体のトラブルへの対策を効率的に行いやすくなることが期待できる。
ということで、書き換えが頻繁に生じる可能性が高いファイルについては /var というディレクトリ以下にまとめ、ログファイルは /var/log というディレクトリの下に置く形で運用するのが一般的となっている。
***シンボリックリンクについて
ファイルやディレクトリに「別名」をつける方法の一つに「シンボリックリンク」というものがある。これはウィンドウズでは「ショートカット」と呼ばれているものと大体似たようなものだ。
シンボリックリンクを作成する場合には、
$ ln -s name1.data symlink.data
のようなコマンドを使う。(この場合 named1.data が本体で、symlink.data がこのコマンドに作成させる named1.data へのシンボリックリンク=別名ということになる)
シンボリックリンクは本体の「ファイル名」を指しているだけなので、その名前のファイルが読めなくなるとシンボリックリンクからも読めなくなる。
シンボリックリンクの動作について、試してみておく。
まずスーパーユーザー権限のシェルになっていないことを確認しておく(プロンプトが # になっていたら exit で抜けておく。)それから、自分のホームディレクトリ(あるいは適当な作業用ディレクトリ)に移動しておく
$ cd
テスト用に適当なファイルを作ってみる
$ echo HELLO > hello.txt
とすると現在の作業ディレクトリに hello.txt というファイル(中身は HELLO という文字列)ができるはずだ。
ファイルのコピーを作成してみる。
$ cp hello.txt CopyOfHello.txt
$ cat hello.txt
HELLO
$ cat CopyOfHello.txt
HELLO
どちらも同じ内容が表示されるはずだ。
また、シンボリックリンクも作成してみる。
$ ln -s hello.txt SymlinkOfHello.txt
シンボリックリンクをつくることにより SymlinkOfHello.txt という名前で先ほど作っ
たファイルを読むことができるようになる。
$ cat hello.txt
HELLO
$ cat SymlinkOfHello.txt
HELLO
これもどちらも同じ内容が表示されるはずだ。
$ ls -l *.txt
-rw-rw-r-- 1 chawanya chawanya 6 11月 5 16:33 CopyOfHello.txt
-rw-rw-r-- 1 chawanya chawanya 6 11月 5 16:33 hello.txt
lrwxrwxrwx 1 chawanya chawanya 9 11月 5 16:33 SymlinkOfHello.txt -> hello.txt
ls コマンドに -l をつけるとシンボリックリンクはこの様に表示される。
次にファイルの内容を変更してみる。
$ nano SymlinkOfHello.txt
として何か適当に変更してから,
$ cat hello.txt
としてみると、変更された内容が表示されるはずだ。
一方ファイル自体をコピーした方の CopyOfHello.txt は、
$ cat CopyOfHello.txt
としてみても、コピーした時点での内容のまま変化していないはずだ。
元ファイルを削除すると、シンボリックリンクが指しているファイルの本体
がなくなってしまうので、読めなくなる。
$ rm hello.txt
$ cat SymlinkOfHello.txt
cat: SymlinkOfHello.txt: そのようなファイルやディレクトリはありません
ここでは使わないが、 unix 系のOSでは、ファイルの別名をつけるのに「本
名」扱いの名前を2つ(以上)付けるということもできる(ハードリンク)。上
の ln コマンドで -s を付けない場合にはハードリンクによる別名、というかファ
イルが2つの名前を持つ状態になる。
ハードリンクの場合、2つ目の名前も元の名前と同様「本名」扱い(どちらが1つ目という区別がない状態)になるので、
$ echo HELLO > ./hello.txt
$ ln hello.txt HardlinkOfHello.txt
$ cat HardlinkOfHello.txt
HELLO
$ ls *txt
-rw-rw-r-- 2 cha cha 6 11月 5 16:40 hello.txt
-rw-rw-r-- 2 cha cha 6 11月 5 16:40 HardlinkOfHello.txt
のように見たところどちらも普通のファイルのように見える状態になる。
-l オプション付きの ls コマンドで、各ファイルの許可情報の次に表示されている数字がそのファイルがもつハードリンクの数を示している。あるファイルがハードリンクにより複数の名前をもつ場合にはこの数が 2 以上になっている。
ハードリンクが 2 つ以上あるファイルは、片方のリンク(名前)を削除してもデータは消去されるわけではなく、リンクが残っている限りはデータの読み書きが可能となっている。
$ rm hello.txt
$ cat HardlinkOfHello.txt
HELLO
のように元の名前を rm コマンドで削除しても新しく作成した名前で引き続き
元のファイルを読むことができる。
***ログのディレクトリを分離している理由について
サーバーのログファイルは頻繁に書き込みが発生する可能性があり、ファイルのサイズも大きくなる場合がある。ログファイルなどが大きくなりすぎてディスクに書き込めなったり、書き込み時のトラブルによってディスクの読み書きに支障が起きるといった危険性も比較的高くなると考えられる。また、書き換えが頻繁に起こるということは、状態の記録を保存するためにはそれだけこまめにバックアップが必要になるということでもある。
そこで特にサーバーとして利用する場合には、設定ファイルなどの、変更はあまり頻繁には行わないがトラブルが起こるとシステムの動作への影響が大きいものと、ログファイルの用に頻繁な変更が行われ、ファイルサイズも大きくなる可能性があるファイルは分けて、別々のディスクあるいはパーティションに記録するといった設定で運用することが多い。
/var/log 以下にログファイルをまとめておくことで、この様な記憶領域の切り分けがしやすくなるので、このシステムのデフォルトの設定でも /var/log/apache2 というディレクトリにおかれるようになっている。
**設定ファイルの内容確認
Ubuntu のパッケージでインストールされる apache の httpd では /etc/apache2 というディレクトリにおかれている apache2.conf というファイルがメインの設定ファイルとなっている。このファイルの中で、いくつかのファイルを読み込むようになっていて、本体の設定ファイルを直接編集する必要はあまりないと思われる。
ファイルが分割されているので、慣れるまではどこに何がかかれているのか分かりにくいが、内容について少しだけ確認して一部編集してみることにする。
>
編集時に間違って書き換えたり、削除してしまって元に戻せなくなっても大丈夫なように、あらかじめコピーをとってから作業するとよいだろう。
>
nano では Ctrl-C をおすと現在のカーソルの位置を教えてくれるので、
以下で表示している設定が何行目にあるかと見比べながら探すとよいだろう。
いくつかの設定については envvars というファイルで変数を設定して、その内容 apache2.conf などで使用している。
% sudo -i
# cd /etc/apache2
# cp envvars envvars.backup20241115
# nano envvars
....
-httpd のアカウント
16 export APACHE_RUN_USER=www-data
17 export APACHE_RUN_GROUP=www-data
--サーバープログラム (httpd) は apache というアカウント(擬似アカウント)と同じ名前の www-data というグループの権限で動作する
--(RockyLinux のほうでは apache というアカウントを使っている)
....
apache2.conf についてはとりあえずは眺めておくだけでよいだろう。
**追加の設定ファイル
ubuntu の apache2 のパッケージでは、サーバーの設定に関しては、機能毎などに分割した設定ファイルを /etc/apache2/mods-available, /etc/apache2/sites-available, /etc/apache2/conf-available といったディレクトリに準備しておき、そのうちで実際に読み込ませたいものについて、 /etc/apahe2/mods-enabled, /etc/apache2/sites-enabled, /etc/apache2/conf-enabled にシンボリックリンクを作成しておく。という方法で管理している。
***ユーザーアカウントのホームページ設定
追加の設定ファイルを操作してみる例として、とりあえずユーザーが自分のホームページ以下の public_html に置いたファイルをウェブで公開する機能を有効化してみる。
この機能を有効にすると、各ユーザーが自分の権限で編集可能な自分のホームディレクトリ内の公開用ディレクトリにファイルをおくことで、そのファイルを公開できるようになる。
http://linuxXXX.in.b508.net/~myname/...
のように "~"+ユーザー名(アカウント名)の形の URL を指定するとユーザーのホームディレクトリ内の public_html ディレクトリを読みに行くという設定がよく使われている。
デフォルトの状態ではこの機能は使わない設定になって設定自体は、既に /etc/mods-available/userdir.conf に準備されている。
このファイルを確認してみて、設定内容のままでよい場合は
$ sudo a2enmod userdir
のようにすればよい。特に問題が無ければ "systemctl restart apache2" を実行するようメッセージが出るので、
$ sudo systemctl restart apache2
を実行すればよいはずだ。
あと、ホームディレクトリの public_html 以下においてあるファイルを公開する場合、www-data というアカウントの権限で動いているサーバープログラムがそれらのファイルを読みとれるようにしておく必要がある。これについては後でまた触れる。
**設定ファイルの読み込みとサーバーの起動
設定ファイルを編集したら
$ sudo apachectl configtest
Syntax OK
のようにして文法的なエラーなどがないかどうかチェックしておく。間違いがある場合にはその場所を指摘してくれるはずだ。
特に問題がなければ
$ sudo systemctl restart apache2
とすると新しい設定内容に従って httpd が動くはずだ。
**httpd の自動起動の設定
httpd をその場で起動するためには
sudo systemctl start apache2
というコマンドを入力すればよいのだが、これだけではシステム全体を(再)起動した際にウェブサーバーが自動的に動くようにはならない。
実際にウェブサーバーとして運用する場合にはシステムが起動すると自動的に httpd が動き出すようにしておきたいことが多いだろう。その場合は
$ sudo systemctl enable apache2
としておく。
稼働状態について確認する際には
$ sudo systemctl status apache2
とすれば、現在動いているかどうか(active/ inactive)、また起動時に動く設
定になっているかどうか(enabled/disabled)を確認することができる。
**公開する内容の作成と管理
***一般ユーザーアカウントでのウェブページの作成と公開
上で示した設定の例では、各ユーザーが自分の権限で公開するページを作成できるようにしてみた。各自のホームディレクトリの下に public_html というディレクトリを作成してその中にファイルをおき apache というユーザーアカウントの権限で読み取れるようにしておくと、
http://HOSTNAME/~USERNAME/pagename.html
~のような形式でそれらのファイルにアクセスできるようになるはずだ。
一般ユーザーアカウントの利用者が、公開するファイルを www-data というユーザーアカウントの権限で読み取れるようにするためには、多くの場合「誰でも読み取り可」の指定をすることになる。
>
ホームディレクトリ直下に public_html というディレクトリがなければ作成しておく
<
$ cd ~
$ mkdir -p public_html
$ chmod 755 public_html
>www-data の権限で動いている httpd がホームディレクトリの中にあるpublic_html にアクセスするためには、自分以外のアカウントでもホームディレクトリへのアクセスを許可する必要がある。
<
$ cd ~
$ chmod o+x .
この場合、他人(他の人の権限で動作しているプログラム)には r の権限が付与されていないのでホームディレクトリの内容一覧を見ることはできないが、x の権限を与えておくことで 対象のファイル自体についての許可情報が許す範囲で、そのディレクトリの内部のファイルやサブディレクトリへのアクセスが可能になる。
ウェブサーバー経由のアクセスは、www-data というアカウントの権限で動いているサーバープログラム(httpd)がファイルを読み取り可能となるように、アクセス許可の設定が必要なことを確かめておく。
$ cd ~/public_html
$ echo yomeru > yomeru.txt
$ echo yomenai > yomenai.txt
$ chmod 644 yomeru.txt
$ chmod 640 yomenai.txt
とすると、
$ ls -la ./
合計 12
drwxr-xr-x. 2 username username 41 11月 11 12:16 .
drwx--x--x. 17 username username 4096 11月 11 12:15 ..
-rw-r-----. 1 username username 8 11月 11 12:16 yomenai.txt
-rw-r--r--. 1 username username 7 11月 11 12:16 yomeru.txt
のような状態になるはずだ。この状態でブラウザを使って
http://localhost/~username/yomeru.txt と
http://localhost/~username/yomenai.txt (username は自分のアカウント名に変更する)を見て確認してみること。
**パスワードによるアクセスの制御
ここで、ウェブ経由でのアクセスにパスワードを設定する方法をみておく。ユーザー名とパスワードを要求することで、あるディレクトリ(及びそのサブディレクトリ)全体、あるいは特定のファイルについてアクセス制限をかけることができる。
ここでの「ユーザー」というのは、linux にログインするするためのアカウント名とは別物で、linux システム上のアカウントとは独立に作成・管理する。
+
$ sudo a2enmod auth_digest
$ sudo systemctl restart apache2
として以下のパスワード認証で使う機能を有効化しておく。
+パスワード付きで公開する内容を置くためのディレクトリと、その内容を準備する
~(これはスーパーユーザではなく自分のユーザーアカウント権限で作業する)
$ cd ~
$ mkdir -p public_html/secret
$ echo Secret for guests > public_html/secret/secret.txt
$ echo Special secret for guest1 > public_html/secret/secret1.txt
$ echo Special secret for guest2 > public_html/secret/secret2.txt
+アクセス制限のためのユーザー名とパスワードを設定する。
$ htdigest -c ~/.htdigest 'ZONE01' guest1
このコマンドを入力すると、guest1 さんのためのパスワードを聞かれるのでそれも入れておく。
--この例で guest1 としている部分は、指定するページにウェブサーバー
(httpd)経由でアクセスするときにのみ使うユーザー名なので、サーバー上のア
カウント名とは関係なく適当に決めてよい。またこのユーザーアカウントを複
数作ることもできる。その場合、2つめからは
$ htdigest ~/.htdigest 'ZONE01' guest2
のように "-c" は不要になる。("-c" はパスワードファイルを作成するためのオプション。cf. "man hidigest")
---間違って -c をつけてしまうとそこまでに設定したパスワードが消えてしまう可能性があるので注意すること
---ZONE01の部分はどのページのためのユーザー名とパスワードなのかを識別するための文字列。この文字列も(他の設定と整合性がとれていれば)基本的にはなんでもよい。
+このディレクトリにアクセスする際にユーザー名とパスワードを要求するように、アクセス制御の設定ファイルを準備する。まず
$ cd ~/public_html/secret
$ nano .htaccess
のようにして .htaccess ファイルを作成する。内容は
AuthType Digest
AuthName "ZONE01"
AuthUserFile /home/*username*/.htdigest
Require all denied
Require valid-user
<Files ~ "^secret1.txt$">
Require user guest1
</Files>
<Files ~ "^secret2.txt$">
Require user guest2
</Files>
<Files ~ "^\.ht.*">
Require all denied
</Files>
のように書いておく。この場合、ウェブ経由で secret のディレクトリの中におかれたファイルをみようとするとパスワードを要求されるようになるはずだ。
特に
-"secret1.txt" というファイルについては guest1 さん以外のアクセスは拒否
-"secret2.txt" というファイルについては guest2 さん以外のアクセスは拒否
~することになる。
最後の3行の部分では .htaccess などのアクセス制限に関するファイルはウェブからは(パスワードを入れても)表示できないようにしてある。
>
上のファイル中の *username* の部分は、自分のシステムにログインする
ときに使うアカウント名におきかえること。
<
rocky99 の chawanya のアカウントで上の設定をしておいたので、ブラウザで
http://rocky99.in.b508.net/~chawanya/secret/
にアクセスするとどのような動作をするはずか試してみることができるはずだ。
(パスワードはアカウント名 (guest1, guest2) と同じになっている)
***ファイル一覧の表示
URLで指定されている対象が、
http://rocky99.in.b508.net/~chawanya/secret/
のようにファイルではなくディレクトリの場合、httpd はそのディレクトリにある index.html というファイルの内容を送信する。
この名前のファイルがない場合、そのディレクトリ内のファイルの一覧を返すという機能がある。この機能は使い方によっては便利だが、場合によっては公開するつもりではないファイルへのアクセスを招いてしまうこともあるので、注意する必要がある。
この機能を使いたくない場合、index.html というファイルを忘れずに置くようにするのがとりあえず簡単だろう。(ファイルの中身は空でも構わない)
サーバーの設定ファイルで、サイト全体あるいはディレクトリを指定して
Options -Indexes
のようにしてこの機能を無効化することもできる。
>
インデックスを無効化しても、URL で直接ファイル名を指定してアクセスすることは可能なので、公開するつもりのないファイルをウェブからアクセスできるディレクトリにおいてはいけない!
<
/etc/apache2 においてあるサーバーの設定ファイルのなかで、ディレクトリを指定して
AllowOverride FileInfo AuthConfig Limit Indexes Options
のように書いておくと、指定したディレクトリとそのサブディレクトリ内については各ディレクトリに置かれた .htaccess ファイルを使って
Options -Indexes
あるいは
Options +Indexes
のようにして設定を変更することができるようになる。
***アクセス制御についての注意
ここで設定してみたパスワードなどによるアクセス制御はあくまでもウェブ経由でのアクセスに対するもので、同じサーバー上にログインしている他のユーザーからのアクセスは chmod などで設定しているファイルやディレクトリの許可情報に基づいて行われる。
ウェブサーバーがアクセスする必要のあるファイルは誰でも読み取り可としておくことも多いので、その場合サーバーにログインできるユーザーは誰でも(先ほど設定したパスワードを知らなくても)それらのファイルを読むことができてしまうことになる。
実際 rocky99 に各自のアカウント(userXX)でログインすると、ウェブアクセス用のアカウントやパスワードは使わなくても ~chawanya/public_html/secret においてあるファイルは直接読むことができてしまう。
ウェブでのアクセスにはパスワードが必要な設定にしておいても、サーバーにログインできるユーザーからは読み取ることができてしまうという可能性があることは頭に入れておく方がいいだろう。
-----
*課題:
-apache httpd のインストール後設定ファイルの内容を編集して、ファイアーウォールの設定変更を行い
$ 親機の windows 上のブラウザから http://linuxXXX.in.b508.net/
のようにしてトップページにアクセスできることを確認せよ
-自分のマシン上の自分のアカウントについて、ホームディレクトリの下に public_html ディレクトリを作成し、ウェブで公開する設定をせよ
--ためしに適当なテキストファイルを作成してそのディレクトリに置いて、ブラウザで見ることができるかどうか試してみること
-さらに、自分の public_html の下に適当なディレクトリを作成してアクセス制限をかけよ。適当なファイルをおいてみて、実際にアクセスが制限されていることを確認せよ
--上で作成した「秘密」のファイルの URL (例えば http://linuxXXX.in.b508.net/~username/secret/secretreport.txt など)とそのアクセスに必要なユーザー名とパスワードをレポートに書いて提出すること。