name: orientation class: title, smokescreen, shelf, no-footer # クラウドコンピューティング<br><small>第04回 プロセスとファイルとユーザ権限</small> <div class=footnote> <small><small> 3年、秋学期、選択; 旧「オペレーティングシステム」; 脚注は試験に出ませんので飛ばしてOK </small></small> </div> --- class: compact # プロセスとファイルとユーザ権限 <div class=footnote> <small><small> (脚注1) 「総称」という表現が苦しいところですが、 メモリ上のイメージ、カーネル内のデータ構造などなど全部をまとめてと言いたいため、 こういう表現になります。 ソースコードのレベルで理解しないと何を言っているのか具体的には分からないでしょう </small></small> </div> - 実行中のプログラムイメージを(総称して)<B>プロセス</B>と呼んでいます - ユーザAが開始したプロセスXは「ユーザAのプロセスX」と認識されます <small> - 例:一般ユーザadminが起動したpython3には、ユーザadminの権限だけが関連づけられています - 例:管理者ユーザrootが起動したpython3は、rootで出来ることが何でも出来ます </small> - 当然、このプロセスXが操作できる対象もユーザAが操作可能な対象と同じ範囲です <small> - ファイル関係は、次ページ以降で説明しますが - ネットワーク関係の制限もあります(第5回へ続く) </small> --- class: compact # ファイルには属性がある <div class=footnote> <small><small> (脚注1) lsはファイルの情報を表示するコマンド(1年生の復習)です。 (脚注2) ふだん、いい加減なWindowsの運用をしているだけでWindowsのファイルにも内部的には似たような概念/区別があります。 たんに、ほぼ人類の誰も、その機能を使って無いだけ:-) </small></small> </div> <small> - プログラムの大元はUnix上のファイルです。典型例はsudoやwww.pyですね - ユーザの権限で「(自分が所有者)のファイルの属性」を変更できます - ところで、Unixでいう(権限関連の)「ファイルの属性」とは何でしょうか? - 「できること」という観点で考えると、大きく分けて3種類あります - だれが<B>「読み」「書き」</B>できるのか? - だれが、そのファイルを、プログラムとして<B>「実行」</B>できるのか? ``` [例] (おいおい復習していくけれど)一番下のls -lの出力例 rw-r--r-- 部分が権限の属性を意味しています $ curl -o www.py http://api.fml.org/dist/www.py $ ls -l www.py -rw-r--r-- 1 admin admin 6370 Oct 01 08:16 www.py ``` </small> --- class: compact, img-right # Unixセキュリティモデルとファイル属性 <div class=footnote> <small><small> (脚注1) 実際IBMのコンピュータでは、はるかに細かい設定が出来ます <br> (脚注2) オリジナルのUnixではスライドのとおりですが、 より細かな設定が出来る機能もあります </small></small> </div> ![](../../images/unix-security-model.png) <small> - ユーザ(個人)、(開発)グループ、全体の3とおりの区別だけあります - 各区分の中では一律の制限になります <small> - グループに対する属性を例に取ると、「グループメンバーの2人(ユーザBとC)にだけは読み書きの権限アリ、その他のユーザは読めるだけ(書きこめない=編集できない)」といった設定は出来ません。 基本は、メンバー全員が「読めるだけ」「読み書きできる」です </small> - この区分方法がベストというわけでも、OSの正解でもありません、というより正解はありません。 「<B>研究開発現場が自分たちの欲しいと考えた</B>」OSがUnixです。 この程度の区別で十分だとUnix開発者たちは考えていたということです </small> --- class: compact,img-right # Unixのファイル属性(ls -lの表示)の読み方 <div class=footnote> <small><small> (脚注) 各区分ごとに「読み(read)」「書き(write)」「実行(execution)」の3つの属性が関連づけられます。 それぞれの属性に1ビット分の情報(できる/できない)が必要です。 それを、単なる1 or 0 (yes or no)ではなく、 それぞれのyesの意味を"r","w","x"で表現しています。 つまり、それぞれの選択肢は"r"か-"、"w"か"-"、"x"か"-"です。 たとえば、111(yes yes yes)はrwx、110(yes yes no)はrw-、100はr-- </small></small> </div> ![](../../images/unix-file-mode-low9bits.png) <small> - Unixのファイル属性は合計9とおりあります <small> - だれ?という区分が3種類 - ユーザ(本人) - グループ(に所属しているユーザ) - 全員(だれでも) - それぞれに「読める」「書ける」「実行できる」属性が設定できます。つまり3x3=9とおり。できる or できないは1ビットで表現できるので合計9ビット分 </small> - `ls -l`の表示の左端にある rw-r--r-- 部分が、この9ビットを表現しています <small> - よくみると10文字分あって、左端は-かdとなっているはずです。 この1ビット分については、後日、ファイルシステムの回で取り上げます </small> </small> --- class: compact # <small>事例: vi /etc/passwdとvi /etc/shadow (第03回の演習の解説)</small> <div class=footnote> <small><small> </small></small> </div> <small> ``` $ ls -l /etc/passwd /etc/shadow -rw-r--r-- 1 root root 3272 Aug 30 21:13 /etc/passwd -rw-r----- 1 root shadow 2077 Aug 30 21:13 /etc/shadow ``` - /etc/passwd ファイルは誰でも読めます - /etc/shadow ファイルを読めるのは管理者ユーザrootとshadowグループのメンバーのみ、 <br> その他のユーザ(adminも、この枠のユーザ)はファイルを読めません(右端が"- - -"であることに注目) - より正確に言えば、 <B>ユーザadminが起動したviプロセスは/etc/shadowを読む権限がない</B>ので何も表示されないし、 下にpermission denied(権限がありません)と表示しているわけです </small> --- class: compact # <small>事例: 社内での(グループ)ファイル属性をどうするべきか?</small> <div class=footnote> <small><small> (脚注) そもそも商用インターネット時代ではPCを一人で占有しているので、 Unixのパーミッションで頑張るという発想は前時代的。 ふつうは、 githubなどのソースコード管理の仕組みを使って権限を管理するのが、いまどきの運用です </small></small> </div> <small> - デフォルトは、たいてい'rw-r--r--'です。全員が読めます。以下、2、3の設定変更事例: - 'rw-r----'の場合? - ユーザ(ファイルを作成した本人)とグループメンバーはファイルの中身が読めます - 中身を変更できるのはユーザ(ファイルを作成した本人)だけです - コミットするユーザは一人だけという運用ならOK(コミッター2人はダメ) - 'rw-rw----'の場合? - グループメンバー全員がファイルを読み書きできます - メンバーが同格の立場で一つのプロジェクトに取り組める開発現場ならOK (Unix開発陣の発想) - 現実には、もしくは巨大な現場では、そうはならない(-> Unixの機能では対応が難しい) - 例: 自社の開発担当者は読み書きできるが、 下請けの別会社の人には(参考のため)ソースコードを読むことだけを許可したい。 これは、なかなか難しい(オリジナルUnixでは、たぶん無理) </small> --- class: compact # <small>事例: 「x = 実行できる」属性(1)</small> <div class=footnote> <small><small> (脚注) ダウンロードしたファイルの属性は、たいてい(元のファイルとは異なる)rw-r--r--あたりになります。 この属性は(ファイルを新規作成する)openシステムコールがシェルの設定を見ながらセットした値です。 詳細はUnixマニュアルのopen(2)とumask(2)を参照 </small></small> </div> <small> - ダウンロードした/home/admin/www.pyファイルを実行しようとすると実行できません(怒られます) - <B>python3コマンドにwww.pyファイルを解釈させる</B>なら動きます。これがスクリプト言語というものです ``` $ curl -O http://api.fml.org/dist/www.py // ダウンロードしたファイルを、そのまま実行してみますと、あれ? $ sudo /home/admin/www.py sudo: /home/admin/www.py: コマンドが見つかりません // 春学期のテキストにならって実行してみると、うまくいきますね? $ sudo python3 /home/admin/www.py ... snip ... (debug) serving at port 80 ``` </small> --- class: compact # <small>事例: 「x = 実行できる」属性(2)</small> <div class=footnote> <small><small> </small></small> </div> <small> - Q: www.pyを普通のプログラムのように実行できますか? <br> A: 「x = 実行できる」属性を変更すれば実行可です - コマンド: chmod ... 属性(モード)を変更するコマンド(change modeの略) <small> - 引数は2つ。「属性の変更の仕方」と「対象のファイル(群)」 - "だれ+属性" ... 属性を追加したいとき - "だれ-属性" ... 属性を削除したいとき - 「だれ」部分はugoの組み合わせ(a = allでugoと同義)、 「属性」部分はrwxの組み合わせが可能です。 <br> 以下の"a+x"は全員(ugo)にx(実行許可)を追加する例です </small> ``` $ ls -l /home/admin/www.py -rw-r--r-- 1 admin admin 6370 Oct 18 16:02 /home/admin/www.py $ chmod a+x /home/admin/www.py $ ls -l /home/admin/www.py -rwxr-xr-x 1 admin admin 6370 Oct 18 16:02 /home/admin/www.py $ sudo /home/admin/www.py ... snip ... (debug) serving at port 80 ``` </small>