class: title, smokescreen, shelf, no-footer # 色づかないWorld Wide Webの昨日から<br><small>- WWWサーバの管理 -</small> <div class=footnote> <small><small> <div class="white"> "Night cityscape in Nagasaki - view from near the mouth of Urakami River (2016-04-09 by Eiji Kikuta @Pixabay 1342591).jpg" by Eiji Kikuta (AG2016) from Sendai, Japan is marked with CC0 1.0. </div> </small></small> </div> <img src="/images/background/Night_cityscape_in_Nagasaki.jpg"> --- class: compact # 目次 <div class=footnote> <small><small> (脚注1) ガチで管理/運用について話しはじめると科目ひとつ作れると思うので、 ばっさり省略(4年生以降でやっていただければと:-) <br> (脚注2) 第2のテーマ(裏テーマ?)は、物事に取り組む際のエンジニアとしての正しい姿勢の養成だ </small></small> </div> <small> - [システムの設計思想](#server-security-design) - `deny all, permit A, B, C ...` - デフォルトではインターネットから見えない空間にサーバを生成(AWSすごく正しい!) - サーバの管理・運用 <small> - 自分のPCからEC2に[SSHでログイン](#ssh-login-to-ec2)して、 設定やコンテンツを編集できればOK </small> - [コンテンツの作成と編集](#www-server-content-maintenance) - [WWWサーバの設定と運用(起動,終了,再起動) - www.py編 -](#www-server-www.py-maintenance) <small> - 詳細は[www.pyソースコード注解](../www.py/#www.py-config)の設定のページを参照 </small> </small> --- name: server-security-design class: compact, center # 設定思想 deny all, permit ... (全体構成図) ![height480px](../images/aws-vpc.png) --- class: compact # 設定思想 deny all, permit ... <div class=footnote> <small><small> 参考文献: J. Friedlの<A HREF="https://www.oreilly.co.jp/books/9784873113593/"> 「詳説 正規表現 第3版」 </A> はガチすぎるから、 <A HREF="https://www.oreilly.co.jp/books/9784873118246/"> 「初めてのPerl 第7版」 </A> あたりを薦めろ?(いずれにしてもO'reilly:-) </small></small> </div> <small> - システムすべてに共通する設計思想 ``` deny all, permit A, B, C ... ``` - **すべてを禁止**したうえで、**明示的に許可**していく - ネットワーク、サーバ、プログラミングすべて共通 - プログラミングの場合、基本は入力値のチェック(**input validation**)。 - ただ、この入力チェックのコードを書くことが難しいので、 プログラミングの授業では、 そのへんがナァナァなだけ (一般には**正規表現**とか読み書きできないと書けない) ``` 例: input validation (プログラミング言語はPerl) my $buf = keyboard_input(); # こんな関数はない:-) 本当は<>でOK; if ($buf =~ /^入力値に許される正規表現$/) { # たとえば [\d\s]+ とか [-a-zA-Z0-9\s]+ なにか処理をしてよい } ``` </small> --- name: ssh-login-to-ec2 class: img-right,compact # 設定思想 deny all, permit ... (サーバの場合) <div class=footnote> <small><small> (脚注) <B> SSHは 「ITベーシック 第3回」で「サーバの遠隔操作をするにはSSHを使います」 </B> でやっています <br> HTTPは物心ついた時からずっと見ているでしょ?もちろんWWWのことです。 WWWサーバを作る課題だから許可しないと </small></small> </div> ![height400px](http://sysbuild-entrance.fml.org/ja/200_aws-ec2/210_aws-ec2-intro/images/aws-ec2-202303-02c.png) <small> - すべての通信(traffic;トラフィック)を禁止し、 明示的に許可していきます <small> <B> - サーバに遠隔ログインするためにSSHが必要 - WWWサーバとしてサービスするためにHTTPが必要 </B> </small> - AWSのサービスの初期設定は当然「すべて禁止」です(とても正しい)。 EC2の画面(右図)のとおりです。 「〜のトラフィックを許可する」にチェックをいれ明示的に許可していきます <small> - そのまま**文章どおりの意味**です - 定番のサーバなら、3つのチェックを入れる/はずすだけです。 ひと昔前と異なり、ポート番号とか入れないのだから悩まない - この設定は色々な言い回しがありますが、 AWS用語ではfirewall/security groupです。 気にしなくてOK </small> </small> --- name: ssh-login-to-ec2 class: compact # サーバの管理: EC2へSSHでログインしてサーバを管理 <div class=footnote> <small><small> (脚注1) <B> 公開鍵暗号理論 </B>は分かっているという前提です。 自分で勉強してください <br> (脚注2) 正確には、認証と暗号鍵交換に公開鍵暗号を使っています。 データ転送時の暗号化は共通鍵暗号(秘密鍵暗号)です </small></small> </div> <small> - SSHはインターネット業界のデファクトスタンダードです。 サーバ操作のための必需品。 **公開鍵暗号による認証と暗号化**をおこなう所謂ターミナルソフトウエア(脚注2) - **AWS Academyの場合**EC2へのSSHで使う公開鍵はAWS Academyが用意しています - **この鍵(秘密鍵,ファイル名はlabsuser.pem)をダウンロードして使う必要**があります <small> - このファイルを**どこに置いたか分からなくなる人が続出**するので、 必ずメモるか、毎回ダウンロードしなおすかしてください。 ダウンロード方法は [こちら](http://sysbuild-entrance.fml.org/ja/200_aws-ec2/250_ssh-to-ec2/) - Unixの作法としては、 ホームに`.ssh`というフォルダを作り、そこに置くことが普通です。 ``` 例: labsuser.pem のあるフォルダで実行 $ ssh -i labsuser.pem admin@10.20.30.40 例: ホームでSSHを実行。鍵は .ssh/labsuser.pem にあるという想定 $ ssh -i .ssh/labsuser.pem admin@10.20.30.40 例: どこにいても、フルパスで指定すれば動きます(MacOSX, Linux) $ ssh -i ~/.ssh/labsuser.pem admin@10.20.30.40 ``` </small> </small> --- name: www-server-content-maintenance class: compact # WWWサーバの管理: コンテンツの作成と編集 <div class=footnote> <small><small> (脚注) ちなみに、このサイトは hugo で生成しています。 優秀なJSがたくさんある今かなりのものがstaticに作成できますぜ </small></small> </div> - EC2に[SSHでログイン](#ssh-login-to-ec2)してコンテンツの作成と編集を行います - WWWサーバ設計者は、コンテンツ担当者と相談し、 コンテンツの置き場所と管理方針を考える必要があります。 - **誰が、どこから、どうやってコンテンツを作成・変更できるのか?** <small><small> [コラム] 以下、一般論 (ここはSKIP = 講義しない) - サーバ屋さんはSSHしか許可したくありません。 コンテンツ屋さんもSSHして編集してくれるのが理想 - ところが、コンテンツ屋さんはGUIしか使えないのでSSHなんて使ってくれません - GUIで操作させろというので所謂コンテンツ管理システムを導入します - もっとも有名なコンテンツ管理システムが Wordpress (言語はPHP)ですが、 穴だらけなので、 年中アップデートが必要です (が、それを忘れてサーバがやられます。だから、やりたくないって言ってるんだよ) - 解決策 - プロバイダがwordpressをメンテしてくるサービスを買えばいいんですよ。 さくらインターネットなら月額300円くらいからありますよって:-)。 つまり金で解決ですな:-(札束ビンタではないので気軽に提案できます) - 個人なら0円解決案でGO! [hugo](https://gohugo.io/) のようなstatic site generatorでHTML(素敵な画面)を生成し sshごしにサーバへ転送 </small></small> --- class: compact # WWWサーバの管理: コンテンツの作成と編集 <small> 本科目のwww.pyでは次の方針にしています(ワークシートがそうなっています) - EC2つまりWWWサーバ上で、コンテンツの作成と編集を行う - 個人としてコンテンツを管理: ホームにhtdocsディレクトリを作成し、 そこにコンテンツを置く 1. 好きなエディタをインストールする (Unix上のエディタですがviは難しいのでnanoとかおすすめ) 1. ホームディレクトリに移動し、htdocsを作成 1. index.htmlを作成 or 編集 1. `www.py`にコンテンツの置き場所の設定があるので、 [そこを変更](../www.py/#www.py-config)すること <br> 具体的には`HTDOCS_DIR`の値を/home/admin/htdocsとする ``` 実行例: $ mkdir htdocs $ nano htdocs/index.html $ nano www.py ``` [マニュアル](http://sysbuild-entrance.fml.org/ja/200_aws-ec2/270_www.py/) の`[実行例2 (htdocsに移動して作業)]`(を、さらに短くした例) </small> --- name: www-server-www.py-maintenance class: compact # WWWサーバの管理: サーバの起動 (www.py特有) <div class=footnote> <small><small> (脚注) ところでsudoって何さ? suってコマンドもあるけど、何が違うのさ? <br> Google先生とかChatほげさんに聞いてみるといいね (ただし奴等はまことしやかに嘘を混ぜてくるから、口頭試問、知らんけど) </small></small> </div> <small> - ソフトウエアの設計思想も`deny all, permit ...`に従うべきだし、 **ユーザは必ずヘマをするので、 それを想定したデフォルト設定を考えるべき**です (fail safe;ただし異論は認める) - 少なくとも[`fml.org`のフリーソフトウエア](https://github.com/fmlorg/)は、 この方針です - `www.py`のリリースエンジニアリング - [`www.py`の設定](../www.py/#www.py-config)の3変数のうち、 `HTTP_HOST`と`HTDOCS_DIR`はLinuxでよくある値にしてありますが、 **ポート番号`HTTP_PORT`は、わざと8080 (8080/tcp)**にしてあります - **確信を持ってサーバがHTTP(80/tcpのトラフィックを許す)を待つ**設定に変更してください - `www.py`を編集します。 具体的には`HTTP_PORT = 80`に変更します - ただし、 **この`www.py`を起動**しようとすると **`PermissionError: [Errno 13] Permission denied`** が出ます。 きちんと [マニュアルの該当ページの一番下](http://sysbuild-entrance.fml.org/ja/200_aws-ec2/270_www.py/) に解説とヒントが書いてあるので、 次のヒントに従いグーグル先生に相談してください。 『Linuxで「ユーザrootでコマンドを実行する」には、どうすればよいか?』 - この`www.py`を起動する際、(少なくともUnixでは)管理者権限が必要です ``` $ nano www.py $ sudo ./www.py ``` </small> --- name: www-server-www.py-maintenance class: compact # WWWサーバの管理: www.pyの編集 (www.py特有) <div class=footnote> <small><small> (脚注1) <B>殺す</B>と物騒なことを言っていますが、 実行中のプログラムを停止させる際にはkillシステムコールを使うUnixでは通常営業 <br> (脚注2) sudo ./www.py & している人は殺し方が違いますが、 マニュアルに書いてない操作をしてるくらいだから自分で探せるよね? </small></small> </div> <small> - このあと`www.py`のプログラミングが始まりますが、注意があります - たぶん、確実な操作法は次の手順でしょう - (1) 実行中の`www.py`を殺します。 Ctrl-C (ターミナルで、ControlキーとCのキーを同時に押す)を入力 - (2) `www.py`を編集(プログラミング)します `nano www.py` - (3) ふたたび`www.py`を起動します `sudo ./www.py` - `OSError: [Errno 98] Address already in use`というエラーが出たら? - すでに`www.py`が実行されているのに、2つ目を起動しようとすると出ます - `www.py`が死にかけている場合も出ます。この場合の解決策は「少し待つ」です ``` 実行例 (長いので、デバッグメッセージやエラーメッセージは省略しています) $ sudo ./www.py ... Ctrl-C でwww.pyを殺す ... $ nano www.py $ sudo ./www.py ``` </small>