name: principle class: title, smokescreen, shelf, no-footer # 最小権限の原則<br><small>- Principle of Least Priviledge -</small> <div class=footnote> <small> ネットワークとサーバ構築のベストプラクティス。 なおUnix前提の話をしています </small> </div class=footnote> --- class: compact # 最小権限の原則 <div class=footnote> <small> Saltzer, Jerome H. "Protection and the control of information sharing in multics", Communications of the ACM, 17 (7), pp. 388–402 (1974). </small> </div class=footnote> >すべてのプログラムやシステムは、作業をするために必要な最小の権限(特権)だけを与えられるべきです この趣旨の方針や原則を**最小権限の原則**と呼んでいます。以下、このフレーズが最初に定式化された論文より引用: > 4. The principle of least privilege. Every program and every privileged user of the system should operate using the least amount of privilege necessary to complete the job. > > – J. Saltzer, “Protection and the control of information sharing in multics”, pp.2 --- class: col-2,compact # 侵入や攻撃は日常茶飯事(イメージ) ![](images/ihan_saku_norikoeru.png) ![](images/internet_ddos_attack.png) --- class: compact # OSの例: リモートアクセスを制限する <div class=footnote> <small> (脚注) AWSなら、 セキュリティグループという設定が、 ネットワーク機器によるフィルタリングに相当 </small> </div class=footnote> - PC/サーバにネットワーク経由でログイン=リモートアクセスできてはいけません - 「**ログインできる**〜(ほにゃらら)**は少数限定**」であるべきです <small> - **ログインできるPC(ソースIPアドレス)を限定(フィルタリング)** - 例: AWSへは会社からしかログインできない(自宅からはログイン禁止) - ふつうサーバに到達する前のスイッチやルータで(IP層で)ブロックします - **ログインできるユーザを限定** 1. そもそも**無関係なユーザをログインさせてはいけません**。 1. まずデフォルトで全ユーザを(管理者も一般ユーザも区別なく)禁止します。 一般ユーザで入られた後、 穴(セキュリティホール)をつかれて、 ユーザrootになりすまされる可能性は常にあります 1. どうしても**ログインの必要があるユーザのみを許可** - **パスワード認証は許さない(OSの設定で無効化)** - **非対称鍵(公開鍵)暗号認証のみを許可**(生体認証なども可) </small> - 注意: **個人向けPCとは異なります** - Windowsなどの個人向けPCは、たいてい物理的に目の前にありますよね? - 前提条件が、まったく異なります --- class: compact # 用語: ユーザ <div class=footnote> <small> (脚注) わざわざ「ふつう本人確認をします」と書いているのは 「確認をしない文化もあるのか?」と突っ込んでほしいから? はい、ありますよ。 昔のMIT(マサチューセッツ工科大学)です:-) -> Free Softwareの話へ続く </small> </div class=footnote> - コンピュータは(従来とても高価だったので)多くの人が使う想定でした - 利用者(ユーザ)には、**識別するためのID(ユーザ名)**を割り当てます <small> - OSの**管理用ユーザ(特権ユーザ)**: **root** - **ソフトウエアが利用するユーザ**: nginx, postfix, samba - 一般ユーザ: b2902929 </small> - ふつう**パスワード**で**本人確認**をします(**認証(Authentication)**) <small> - パスワードは、あまりよくありません。あつかいが適当なユーザも多いため - システムによっては非対称鍵暗号や生体認証(<-現在の旬は生体認証FIDO2)の利用も考慮 </small> - 注意: **個人向けPCとは異なります** <small> - **パソコンの常識は世界の非常識** - Windowsは個人利用が前提なのでユーザや権限という考えが希薄です (いちおうOSの仕組みにはユーザや権限という考えがありますけど、 ユーザが意識していないし、真面目に使っていない) </small> --- class: compact # OSの例: 特権ユーザを限定する <div class=footnote> <small> (脚注) 実のところAWS EC2のデフォルトは、いろいろとダメな設定です。 きちんとやれ!というと心が折れますと言われそうなので、 我々はツッコマナイようにしています、とほほ </small> </div class=footnote> - **特権操作が出来るユーザは少数限定**です - ふつう**管理者**(**ユーザ名はrootが慣例**)という特別なユーザを用意しています。 ユーザrootは設定変更やソフトウエアのインストールができる特権をもちます - **ユーザrootに昇格するには管理者のIDとパスワードが必要**です - 誰でも管理者になれるわけではなく、**管理者に昇格できるユーザも限定**しています - 注意: **個人向けPCとは異なります** - **Windowsの常識は世界の非常識** - Windowsがおかしいことに注意してください - Windowsは個人利用が前提なので権限という考えがありません(いちおうOSの仕組みには権限という考えがあるにはあるのですが、何か変更したい時はOKを連打すれば何でもできるので意味なし) --- class: compact # OSの例: プログラムごとに専用ユーザを使う <div class=footnote> <small> (脚注) 一つのプログラムでも、 役割ごとに分けるべきという設計思想もあるのですが、 作るのも運用も難しすぎるとか、オーバースペックなのでは?とか思うところがあって、 たいてい各プログラムで一つの専用ユーザを使うあたりに落ち着きます。 複数のユーザを使う例はqmailなどD.J.Bernsteinのソフトウエアくらいでは? </small> </div class=footnote> - つねに走り続けている(メモリに常駐している)プロセスがあります - デーモン(daemon)と呼ばれるサーバプロセス - daemonの中でも、 **インターネットと通信する必要のあるdaemon**には、 **プログラムごとに専用のユーザを割り当てます** - こうしておけば、 **まんがいちアタックされて突破されたとしても、 その専用ユーザが読み書きできる部分だけが汚染されただけのはず** - いくつかの例 <small> - メールサーバpostfixではユーザpostfix - WWWサーバのnginxではユーザnginx - 注意: ユーザ名はソフトウエア名であることが多いですが、 OSごとに少しずつ流儀が異なるので、 設定ファイルを見て確認が必要です。 例えばapacheで使うユーザはOSごとにマチマチのようです </small> --- class: compact # <small>[余談] OSの例:そもそも物理的な接触は不許可(オマケ情報)</small> <div class=footnote> <small> (脚注1) 大学での演習はAWSかBWSつまりリモートアクセス前提なので、 この項目はオマケです。 でも就職したら関係ありますよ? (脚注2) データセンターの場所は機密情報です。 誓約書にサインすることもあります。 「データセンターNOW」とかつぶやくとかもってのほか(まれにそういうやつがいる)。 日本人は危機意識がなさすぎなので、ガツンと言っておくと、 侵攻時、通信と電力は最初に(たぶん巡航ミサイルorテロで)狙う標的です </small> </div class=footnote> - 通常、サーバはデータセンターや特別な鍵が必要なサーバ室に設置されています - もちろん一般ユーザは立ち入れません - 事前の入館申請あり - 入館時には本人確認の書類必須(免許証かパスポートでok) - 物理的に接触できたら、その時点で敗けは確定です - 通常、目の前のPCにログインできる状況なら、 管理者のIDとパスワードを知っていればログインできます(管理者になりすませます) - 知らなくてもゴニョゴニョ出来る方法は... - ログインできなくても、ストレージ(HDDやSSD)を盗まれたら終わりです - データ流出(セキュリティ事故)