2001.9.21

フリーUNIX 利用のサーバ上での Web,CGI,
 Samba 共有を利用した学習環境の構築

北海道滝川工業高等学校
三浦憲一
おことわり:
  1. ファイルパス名の区切りに¥文字の代わりにバックスラッシュで印刷されているところがあります。
  2. 特に断らない場合,Windows はMicrosoft Windows95 ,Windows98,WindowsNT 等を 示します。また単にWindowsNT とあるのはWindowsNT Workstation を表します。
  3. ここでfree-UNIX とはパソコン上で動作する使用権フリーのUNIX 仕様のOSを総称したものです。

目次
§1  はじめに
§2  UNIX
  2.1  UNIXへの偏見
  2.2  導入の動機
  2.3  free-UNIX OS の導入
  2.4  free-UNIXサーバーの導入
§3  Samba
  3.1   Sambaとはなにか
  3.2  特徴
§4  Sambaで実現した共有環境
  4.1  仕様
  4.2  実装
  4.3  CGI の利用
§5   Sambaでの課題
§6  参考ソースリスト


§ 1  はじめに

 以下の内容は,前任校での実施内容を元に述べたものである。情報処理の授業と,管理責任者になって(されて)しまったときの環境構築である。学校事情により前者の教科指導を優先はさせたが,どの教科・科目,あるいは教科指導以外の領域でも等しく利用可能なシステムとしての構築に努めた。ひとつのシステム環境設計例として見て頂ければありがたい。
 今回のレポートにまとめるにあたり,追試を行いたい部分もあったのだが生憎,現任校のパソコンの更新とぶつかり出来なかった。ネットワーク規模に依存しない一部については,自宅内のLAN上で再度確認したものもある。
 また,使用したのはSamba (1.9.18p10), apache(1.3.3)である。特にSamba は2.0 以降に大幅な機能拡張が行われている。詳しくはSamba 関連のサイト[注1]を参照されたい。

(注1) 日本 Samba ユーザー会 http://www.samba.gr.jp

§ 2  UNIX

§ 2.1  UNIX への偏見

 自分自身,個人ではUNIX に興味が無い訳ではなかった。実際,私の年代ではUNIX とは「大型機」で動かすものであり,お家で個人で動かすOSでは有り得なかったからである。
 同時に,ネットワークを支えているのもUNIX であり,今日の「趣味:インターネット」などという考えてみれば意味がよく分からない使い方に成る程に,ネットワークを社会のインフラとして普及させたシステムを支えているのはUNIX に他ならない。
 だから,その面影がいたるところで顔を覗かせる。パソコン通信やプロバイダに接続するときのログイン画面が然り。ただ,インフラだけに地味に影で支えているので気づかぬ人も多いのか,パソコンのエンドユーザーには然程人気が無かった。
 パソコンのOSとしてWindows が席捲すると世人にはパソコンはWindows で動くものといった妄想を巻き起こしてしまった。
 実際,「UNIXWindows より難しい。」とか「Windows は管理が易しい。」とよく言われるし自分自身もそう言われたことがある。管理が物的,技術的,さらに場合によっては人的要素によって難しいのはどちらでも同じである。ここで問題になるのは,仕様などの技術的情報の有無である。
 Windows は所詮1企業の製品であり,未公開の内容も多い。一方UNIX は仕様を共通化したOSであり,商業版でさえその仕様は同じである。それは様々な形で文書化され,書籍にもなっているので,情報を容易にそして安価に手に入れることが出来る。(なかなかこのあたりの予算が貰えない「学校」にあっては魅力だ。)
 統一された仕様の上には,開発のしやすさから様々なアプリケーションが実現されている。使用権フリーのものも多い。ひとつの社会が構築されている。「よく枯れた」確実な動作が保証されたものが多いのである。
 UNIX は使えるものだと思われるのだが。

§ 2.2  導入の動機

「個人ではいいけど,学校へはどうもな。」
 そもそもの私の考えである。操作性や管理の容易さを含めた性能でUNIXWindowsNT Server に優ることはあっても劣ることは無いのだが[注2]いちいち,UNIX の長所を説明するのも時間がかかる。何より問題なのは,多くの使用者(=職員)にとっては目の前の自分の使うワープロソフトが動けばいいのであって,管理は他人の問題である。しかも,知っているブランド製品を使いたがる。
 しかし,その管理担当になった者はたまらない。情報処理の授業と,管理責任者の仕事が一度に回ってきたでのその他人が自分のことになってしまったのである。手間は二の次にして,先述の技術情報が乏しいことが大変な理由である。少なくとも近い未来においても,管理のための人と時間は手当てされないとのことなので,少しでも管理に手間と無駄な時間のかからないシステムを作りたいとの考えから導入した。
 

§ 2.3  free-UNIX OS の導入

目的
  1. 管理の容易さ(既述)

  2. 教材の提示提出に確実なファイル共有
     素材となる教材を与えるのに,直接ファイルを渡したい。あるいは受け取りたい。メールで送る方法もあるが,場合によっては2個所に同じ内容のファイルが存在することになる可能性もある。何よりイントラネット内にメールサーバを置きたくなかった。
     また,アプリケーションの大きなファイルをたくさん送り付けられてはこちらがパンクしてしまう。個人毎のホームディレクトリならば管理は自分でやらなければならなくなる。フィードバックループに人間を入れたのである。勿論,共有実現のソフトウェアにはディレクトリ容量制限の機能もあったことも実現を容易にした。
     ファイル共有が出来るだけなら既にあったOSでよかったのだが,他人のディレクトリが覗けてしまうなどの動作が 少なくないとの報告が複数からあり,この点を改善したかった。アクセス権の管理の厳格な実装は,セキュリティの面からも,次に述べるCGIも含めたプログラムを走らせるときの必須条件である。
     クライアントはWindowsNT なので,その橋渡しとしてSambaが必要になった。

  3.  
  4. CGIを含むWWWサーバ
     学習活動に利用する際に,コンテンツの動的生成機能の有無は学習者にフィードバック出来る内容の個別化を図れるか否かに関係し,利用範囲や効果を高めることが期待出来る。
     また,指導者が学習者の学習状況やシステム状態を把握するのにも即時的に動的な統計処理が行え,管理的活動の補助となる仕組みが必要であると考えた。
     この大きくふたつの目的から,WWWサーバにはCGIの処理機能を持たせることにした。
     CGIの処理は様々なOS,言語で可能でだが,先述のセキュリティや安定性が確保されていて初めて実用になる。
     またWindows 系のOSの,長いファイル名と短いファイル名の2通りのファイル名の変換が一意でないことも考慮した理由のひとつであった。
     結局,ごく普通に Perlを使用することにした。

§ 2.4  free-UNIX サーバーの導入

 基本システムはWindowsNT ServerWindowsNT(OS未対応のアプリケーション利用の計画もあったので一部にWindows98 も搭載)で納品されていたが,これにfree-UNIX マシンを1台追加した。
 実際には余裕があった生徒用マシンの1台にWindowsNT に加えfree-UNIX もインストールした。これら二つのOSは LILO と呼ばれる起動ユーティリティで選択も出来るようにした上で平常時は優先的にfree-UNIX サーバとして使用した。[注3]クライアント機といえ一昔前のサーバ機をしのぐ処理速度と2次記憶容量を持っている。CGIの処理もここで行う。ただし,熱特性を考えて24時間稼動はせず,授業とその準備中にのみ動作させた。
 この上で教材提示用のWWWサーバとSamba も走ることになる。[注4]

(注2)UNIX ではセキュリティにTCPポートの1023番以下が特に大きく関わる。 しかしWWWサーバーが標準で用いるTCPポートはその中の80番である。 Windows 上での実行が有利になる数少ない例である。

(注3) Windows クライアントとfree-UNIX サーバでは性格が全く異なるので, ネットワーク上での名前やIPアドレスなどは別個のものとし,トラブルを避けるようにした。

(注4) この時点のSamba はログインの認証の主(PDC)にはなれなかったので,認証はすでにあるWindowsNT Server を使用した。 このfree-UNIX サーバもその配下にあり,クライアントとして扱われる。ライセンス数に注意を要する。


§ 3  Samba

§ 3.1  Samba とはなにか

 Samba はファイルサーバやプリンタサーバとして動作させるためのソフトウェアである。
 いわゆるWindows マシンで構成したネットワークでファイルサーバやプリンタサーバ の機能を実現しているのは,主にネットワーク共有サービスとネットワーククライアントのふたつである。この2者間での"やりとり(SMB [注5])"と等価なやりとりが出来れば,サーバー機はどのOSでもよいことになる。
 Samba は共有サービスに相当する動作をUNIX 上で実行させるためのソフトウェア群である。
 また,Samba は他の系統のOSとのファイル共有のためのやりとりにも対応しており,最近ではOSを越えたシステム実現の中核として,商業ベースでも普及してきている。[注6]

§ 3.2  特徴

  1. プログラムが軽いこと。
     元々UNIX 自体が軽いこともあるが,正確な能力の比較は諸条件を加味して行わなければならず,簡単に論じられる問題ではない。 ただ「クライアント機が5台を超えるとSamba が有利」との報告もある。(前述のSamba のサイト参照。)

  2. 使用権フリーであること。
     予算不足に悩むことも無い。また,それを理由に,違法コピーが横行することも無い。

  3. UNIX(free-UNIX も含めて)上で動くこと。
     すでに記したようにfree-UNIX は少ないリソースで動くOSである。Windows マシンとしては古くなったマシンでも,十分に実用になる。また,UNIX は所有者権限やアクセス権などのファイル管理が厳しく,しかも実装されているので安定した動作が望める。 OSによってはこの実装が甘いものもあり注意を要する。
     また,UNIX 上の様々なソフトウェア群の使用が可能。

  4. アクセス権が細かく決められ,設定も容易にできる。

  5. UNIX の知識を必要とする。

(注5) Server Message Blockプロトコルの略。 システムがリモートシステム上のファイルに透過的にアクセスできるように設計されたファイル共有プロトコル

(注6) Apple 機を混在したネットワークなど


§ 4  Samba で実現した共有環境

§ 4.1  仕様

  1. 使用者の生徒にはIDとして "S"+"数字4桁"[注7]が指定されている。教職員には"T"で始まるものなど,カテゴリ分けがされている。
  2. 情報処理教室内のマシンのIPアドレスは固定しており,DHCPは用いていない。したがって,IPアドレスとマシン名は固定的に1対1に対応する。
  3. 同じ授業でも教室内のどのマシンを使うかは厳密には固定していない。すなわち,同一の生徒でも別のマシン(=別のIPアドレス)を使用する ことがある。
  4. 生徒も含め使用者にはfree-UNIX マシンに個人別のホームディレクトリを確保し割り当ててあるが,実際にはこれを homes の名称でこの個人に共有提供する。具体的には各生徒のWindowsNT マシン上で,これをディスクドライブH:として使用できるようにする。
  5.  つまりUNIX マシン上のディレクトリ
    /home/s1001 /→→ 生徒s1001が使用中のマシンのH:ドライブ
    /home/s1002 /→→ 生徒s1002が使用中のマシンのH:ドライブ
    /home/s1003 /→→ 生徒s1003が使用中のマシンのH:ドライブ

§ 4.2  実装

 Samba 側では次の動作を行う
  1. free-UNIX サーバはWindowsNT Server に対しては1クライアントとしてネットワークに参加する。
  2. Samba は serverモードと呼ばれる設定で動作させる。すなわちログイン認証はWindowsNT Server に任せ, 正規に認証されたユーザ名(=生徒ID)により,そのホームディレクトリを該当のマシンに対してhomesの共有名で提供する。

 なおこれらの設定については一例を後に示す。  ・・・・・・ [List3参照]
 一方,各マシンにおいては,WindowsNT はログイン時に
  systemroot/system32/Repl/Import/Scripts/netlogon.bat
等を実行する。[注8]
 したがって,その中に次のコマンドを含め実行させる。

@echo off
net use H: ¥¥free-UNIX-SERVER-NAME¥homes
echo こんにちわ
echo リターンキーを押してください
pause

 以上で各個人ごと別々のホームディレクトリが,ドライブH:として使用できる。
 なおこの場所は教材提示,課題提出の為の場所とし,指導者が自由に覗けるものとした。選択授業での使用であったが,教科指導者用のディレクトリから関係各生徒のディレクトリへリンクを張ることにより,自由に加除訂正が可能である。[注9]
 なお,他人のIDとパスワード使っても入れてしまうが,認証上のセキュリティの問題はパスワードの真偽にとどめている。IDやパスワードの教え合いはシステムで対処出来るものではなく,最終的には「ネチケット」といわれる問題であり,また後述の CGIで作成した出席状況報告画面と生徒の顔を確認すればよいとした。

§ 4.3  CGI の利用

 授業時間の開始時にはブラウザを起動する。スタートのページにはfree-UNIX マシンのWWWサーバのドキュメントルート ( http://free-UNIX server/ )が指定されている。このとき補完するファイル名は index.htm なので動作は  
  1. サーバ上の index.htm [注10]・・・・・・ [List1参照] を表示する。
  2. index.htm 中に埋め込まれたmeta ヘッダのrefresh オプションにより, /cgi-bin/lessonnow.cgi に飛ばせて実行。 ・・・・・・ [List2参照]
     このCGIにより,ブラウザには時刻等を表示させ確認させるとともに,WWWサーバ側ではどこからアクセスしたかマシンのIPアドレスと 時刻とを記録する。
  3. さらに,同じくrefreshの使用で,生徒用の学習開始時のページ /html/lesson/lesson.htm へジャンプする。 ここには,各教科等への入り口があり,必要な内容のところを選択させる。標準的なヘルプ集などの入り口もここに設けた。
 さて,UNIX のシステム設定や履歴のためのファイルは基本的にテキストファイルなので,中身を見れば直ちにわかる。またそれらを処理し書式を整えることは易しい。Samba も動作状況を履歴ファイルに吐き出している。書式や吐き出す詳細の程度は設定により変更が可能である。この履歴ファイルを走査し,この日のこの時間のログオンの状況を整理し報告用に書式化すると出席やマシンの使用状況に関する内容が得られる。これらもCGIにより実現した。ブラウザ上で確認出来るので,離れていても出来るしどこからでも可能に出来る。[注11]
 Samba の履歴を利用すればIPアドレスから生徒IDがわかり,個人が特定出来る。CGIはIPアドレスを捕まえられるから,それを元に個人毎の内容を送り返すことが出来ることになる。

(注7) 学年2クラスの学校だったことによる。(例)3年A組出席番号1番=S3101

(注8) MicrosoftWindowsNT Workstation Resource Kit P.26。ただしProfileでの指定に依存する。

(注9) ホームディレクトリの中に提出用と秘密用(?)のサブディレクトリを作りそれぞれ共有提供することも可能である。例えば一人の生徒(ID=S1001)について

/home/s1001/TEISYUTSU/ →→ドライブH:
/home/s1001/HIMITSU/ →→ドライブJ:
など

(注10)Windows やMS-DOSでのファイル作成も有り得たので拡張子は3文字としていた

(注11) 可能に出来るが,可能にはしておかない。勿論,セキュリティの問題である


§ 5  Samba での課題

  1. フリーウェアであること。
     最近はfree-UNIX についても有償サポートがビジネスとして成立しつつある。
  2.  
  3. 漢字コードの問題
     ファイル名,あるいは共有名に漢字を使った場合の諸問題である。コードが絡むだけに元来複雑な問題である。最近,著しく改善されている。
  4.  
  5. 認証時のパスワード
     Windows95 OSR1まで,WindowsNT4.0 SP2まではログイン時のパスワードが平文であり,このあとのWindows は暗号化されている。混在したときの問題であり,平文が直ちに危ないということではない。
  6.  
  7. プリンタの共有
     これについては貧弱である。
  8.  
  9. (Samba に限らず)ネットワーク設計運用思想
     どのOSを選択しても,管理が難しい。
     また,学校でも著作権などの意識は高くない。「先生はマニュアルをよく読まない。」これは製品について来るものばかりでなく,校内で作成されたものについても同様。
  10.  

おしまいに
 最後になりましたが,今回の発表の機会を作ってくださった事務局はじめ運営担当の皆さん,また特に「これをきっかけに書きまとめるものだよ。」と諭して下さった札幌藻岩高校の菅原満先生に深く感謝申し上げます。ありがとうございました。

【(主な)参考文献】


§ 6  参考ソースリスト

 何が必要かは学校毎に異なると考えられますので,むしろ万が一,ソースや設定ファイルのイメージがつかみ難い場合の参考程度です。

List 1 index.htm


 1 : <html>
 2 : <!-- 1999.10.13 (C)K.Miura 1999 -->
 3 : <head>
 4 : <!-- force greeting-cgi(lessonow.cgi) -->
 5 : <meta http-equiv="refresh" content="1;url=/cgi-bin/lessonow.cgi">
 6 : <title>
 7 :  /lesson/index.htm(EUC)
 8 : </title>
 9 : </head>
10 : <body>
11 : hereis /lesson/index.htm(EUC)<b>&copy;K.Miura 1999</b>
12 : </body>
13 : </html>

(HTML化の注)List 1 中の 11 行目の最後のタグは</b>が正しく,過日,釧路大会で配布分には誤りがありましたので訂正いたします。

List 2 lessonow.cgi

 1 : #!/usr/bin/perl
 2 : #
 3 : # lessonow.cgi
 4 : #   授業開始のはじまりページ用の日付時刻表示
 5 : #   (C) K.Miura 1999
 6 : #
 7 : # 1999.10.13. 
 8 : # 1999.10.14. add display IP,bugfix wday
 9 : #
10 : ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime;
11 : $mon++;
12 : @week=('Mon','Tue','Wed','Thr','Fri','Sat','Sun');
13 : #@jweek('月','火','水','木','金','土','日');
14 : $wday=@week[$wday-1];
15 : #$jwday=@jweek[$wday];
16 : #
17 : $sec = sprintf( "%.2d" ,$sec );
18 : $min = sprintf( "%.2d" ,$min );
19 : $hour = sprintf( "%.2d",$hour );
20 : $mday = sprintf( "%.2d" ,$mday );
21 : $mon = sprintf( "%.2d" ,$mon );
22 : $year = sprintf( "%.4d", $year + 1900 );
23 : #
24 : $remote_host_addr=$ENV{"REMOTE_ADDR"};
25 : #
26 : print "Content-type: text/html\n\n";
27 : print "<HTML>\n";
28 : print "<HEAD>\n";
29 : print "<META charset=\"euc\" http-equiv=\"refresh\"
                          content=\"5;url=/lesson/lesson.htm\">";
30 : print "<TITLE>\n";
31 : print " lessonow.cgi\n";
32 : print "</TITLE>\n";
33 : print "</HEAD>\n";
34 : print "<BODY>\n";
35 : print "generated by lessonow.cgi <b>&copy;K.Miura 1999</b><br><hr>\n";
36 : print "<center><br>\n";
37 : print "<FONT color=blue size=+4>ようこそ</FONT><br>\n";
38 : print "<FONT  size=+4>情報処理教室へ</FONT><br><br><br><hr>\n";
39 : 
40 : print "<BR>\n";
41 : 
42 : print "今日は<FONT size=+2> $year 年 $mon 月 $mday 日 ($wday) </FONT><BR>\n";
43 : print "只今の時刻は<FONT size=+2> $hour:$min:$sec </FONT><BR>\n";
44 : 
45 : print "<br><br> \n";
46 : print "あなたのコンピュータのIPアドレスは <b>$remote_host_addr</b><br> \n";
47 : print "<font color=\"red\">しばらくお待ち下さい</font><br><br><br> \n";
48 : print "server3.intra.somewhere-h.ed.jp\n";
49 : print "</center>\n";
50 : print "</BODY>\n";
51 : print "</HTML>\n";

List 3 Samba 設定ファイル smb.conf の内容(抜粋)
 #およびセミコロンで始まる行はコメントの扱いとなる。

 1 : #======================= Global Settings =====================================
 2 : [global]
 3 : # workgroup = NT-Domain-Name or Workgroup-Name
 4 :    workgroup = intra.somewhere-h.ed.jp
 5 : 
 6 : # server string is the equivalent of the NT Description field
 7 :    server string = server3
 8 : 
 9 : # this tells Samba to use a separate log file for each machine
10 : # that connects %Uはユーザー名,%mはマシン名に置き換えられる
11 : #   log file = /var/log/samba/log.%m (履歴ファイル)
12 :     log file = /var/log/samba/%U.log
13 : 
14 : # Put a capping on the size of the log files (in Kb).
15 :    max log size = 50
16 : 
17 : # Security mode. Most people will want user level security. See
18 : # security_level.txt for details.(認証方式)
19 :    security = server
20 : # Use password server option only with security = server
21 :    password server = <NT-Server-Name>
22 : 
23 : # You may wish to use password encryption. Please read
24 : # ENCRYPTION.txt, Win95.txt and WinNT.txt in the Samba documentation.
25 : # Do not enable this option unless you have read those documents
26 :   encrypt passwords = yes   (暗号化パスワード)
27 : ;  smb passwd file = /etc/smbpasswd
28 : 
29 : # Using the following line enables you to customise your configuration
30 : # on a per machine basis. The %m gets replaced with the netbios name
31 : # of the machine that is connecting(マシン毎の設定ファイル)
32 : ;   include = /etc/smb.conf.%m
33 : 
34 : # if you want to automatically load your printer list rather
35 : # than setting them up individually then you'll need this
36 :    printcap name = /etc/printcap
37 :    load printers = yes
38 : 
39 : #============================ Share Definitions ==============================
40 : [homes]
41 :    comment = Home Directories
42 :    browseable = no
43 :    writable = yes
44 : 
45 : [printers]
46 :    comment = All Printers
47 :    path = /var/spool/samba
48 :    browseable = no
49 : # Set public = yes to allow user 'guest account' to print
50 :    guest ok = no
51 :    writable = no
52 :    printable = yes
53 : 
54 : # a service which has a different directory for each machine that connects
55 : # this allows you to tailor configurations to incoming machines. You could
56 : # also use the %u option to tailor it by user name.
57 : # The %m gets replaced with the machine name that is connecting.
58 : ;[pchome]
59 : ;  comment = PC Directories
60 : ;  path = /usr/pc/%m
61 : ;  public = no
62 : ;  writable = yes
63 : 
64 : [web_base]    (作業時の残骸)
65 :     comment = Web document base
66 :     path = /home/httpd/
67 :     public = yes
68 :     writable = yes
69 :     create mode = 777