ホーム » スタッフ » 斉藤徹

斉藤徹」カテゴリーアーカイブ

2018年1月
« 12月    
 123456
78910111213
14151617181920
21222324252627
28293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

実験用Cudaサーバでsambaの設定

専攻科の実験でCudaを用いている物があり、プログラム編集や動作結果のパソコンとのやり取りが面倒で…といった相談を受ける。

処理としては、そのCudaサーバにsambaが動いていればいいだけなので、samba のインストールのお手伝い。Cuda環境が動かなるのが不安なので、既存環境は極力触らずに対応。

samba-client などは入っているし、samba サーバをインストールして、起動すればいいだけだった。

((samba-*.debを探してきて))
$ sudo dpkg -i samba-X.X.X.deb

((ユーザのファイル共有の許可))
$ sudo vi /etc/samba/smb.conf
[homes]                      # ファイル共有関連部分のコメントを外し
  comment = Home Directories # ユーザのファイル共有を有効にする
  browseable = no

((sambaの起動))
$ sudo service nmbd start    # Windowsのコンピュータ名管理の nmbd 起動
$ sudo service smbd start    # Windowsのファイル共有管理の smbd 起動

((起動時にsambaを起動する設定))
$ sudo update-rc.d nmbd defaults
$ sudo update-rc.d smbd defaults

((ファイル共有を使うユーザの登録))
$ sudo pdbedit -a ユーザ1    # 初回登録は pdbedit で行う
enter pasword: パスワード
Re-enter password: パスワード

((パスワードの変更))
$ smbpasswd                # 個人でパスワードを変更の場合
enter pasword: パスワード
Re-enter password: パスワード

$ sudo smbpasswd ユーザ    # 管理者がパスワードを変更の場合
enter pasword: パスワード
Re-enter password: パスワード

WordPress4.9.2が出た

WordPress 4.9.2 が出てきた。日本語版”-ja” 付きではないけど、早々に入れておく。

2018/01/18 追記
お、今回は、4.9.2-ja 翌日には公開されたな。はゃっ…

2段階認証の設定とセキュリティ

2段階認証

前回授業の暗号化の説明でも解説したように、パスワードはブルートフォース攻撃をうければ、いつかはパスワードが破られる危険性がある。こういった対策で最も重要な方法が、2段階認証(多要素認証)である。

この方式では、通常のパスワード入力の後に、以下の様な方式でワンタイムパスワードを入力することでログインが可能となる。

  • 携帯電話にテキストメッセージ(SMS)でワンタイムパスワードを送る。
  • 音声を用いると、電話がかかってくると機械音声でワンタイムパスワードを読み上げてくれる。
  • 認証システムアプリは、時間で変化するワンタイムパスワードが表示される。
  • バックアップコード(非常時用のパスワード)

以下の資料では、Google と Twitter で2段階認証を設定するための例を示す。

情報ネットワーク基礎後半のレポート課題

各自が利用しているインターネットサービスの中から1つを選び、2段階認証の設定を行うこと。
もし、インターネットサービスを一切利用していない人は、暫定で入会し課題終了後解約すればいい。

設定の資料として、Google, Twitter の例を上記に示す。他にも、Facebook , Amazon , Microsoft ID などがあるので、自分にとってセキュリティ上重要なサービスについて設定を行うこと。もし、2段階認証で問題がある場合は、このレポート課題終了後、2段階認証の設定を外せばよい。

レポートでは、2段階認証の設定中の画面、ログイン時の2段階認証が行われている画面、受信したワンタイムパスワードの例などを画面のキャプチャなどで取得し、その手順の流れを解説し、考察として2段階認証の利点と欠点について記載すること。

ただし、キャプチャ画面をレポートに貼り付ける際は、自分の個人情報が記載されないように注意をすること。

既に全てのサービスで2段階認証の設定を終えている人は、いくつかのサービスで2段階認証を用いてログインする手順を説明せよ。

学校の Office365 にて、2段階認証を使いたいと思うかもしれないけど、慣れない学生さんがログインできなくなる可能性があり、一部の教職員しか使えない。

セキュリティ

インターネットをクラッカーからの攻撃をうけないように守る場合、以下の3点の対策が重要となる。

  1. インターネットの経路での対策
  2. サーバ側での対策
  3. パソコン側での対策

バッファオーバーフロー

クラッカーがサーバを攻撃する場合、サーバ上のプログラムの脆弱性を利用する。
サーバプログラムの脆弱性で最も典型的な攻撃方法は、「バッファオーバーフロー」がある。

void foo() {              // foo 実行時のstackの内容
    char str[ 10 ] ;      //   str                  fooからの戻り番地
    scanf( "%s" , str ) ; //   [ | | | | | | | | | ][ret_label]
}                         //     入力時に、abcdefghijklmn\r と入力したら
                          //     [a|b|c|d|e|f|g|h|i|j][k|l|m|n|\n]
void main() {             //                          戻り番地が破壊される
    foo() ;               //     入力時に、abcdefghij][ウィルス番地][ウィルスプログラム]
ret_label:                //     といったデータを与えると、foo() の処理が終わると
    return 0 ;            //     ウィルスのプログラムを実行してしまう
}

こういったプログラムは危険なので、こういうミスが見つかったらプログラムの更新が重要。

ファイアウォール

サーバで動かしているプログラムにバッファオーバーフローのような不備が残っていて、全世界のどこからでもこういった不備があるプログラムに簡単に接続できたとしたら、極めて危険である。

サーバで動くプログラムは、接続するためのポート番号が決まっているので、相手のコンピュータのIPアドレスが分かったら攻撃を仕掛けてくるかもしれない。

FireWall は、これらの接続をできなくするための方法で、例えば学内のWebサーバへの攻撃を防ぎたいのなら、ルータで「宛先ポート番号が80のパケットは廃棄」といった設定をすればよい。また、危険な攻撃を加えてくるコンピュータのIPアドレスがわかっている場合は、「送信元IPアドレスXX.XX.XX.XXのパケットは廃棄」という設定をすればよい。こういった、ポート番号やIPアドレスを見てパケットを遮断するルータは、FireWall(防火壁)と呼ばれる。

よくある設定であれば、ポート番号23(telnet)、137,139(Windows ファイル共有)を禁止など(ブラックリスト型)、基本は全面禁止だけどポート番号22(ssh)は許可(ホワイトリスト型)など。

mallocとfreelist

C言語では、動的メモリ領域をどのように管理していくのか解説する。

動的メモリ領域とフリーリスト

動的なメモリ領域(ヒープ領域)は、malloc()関数で処理用のメモリを借り、free()関数で使わなくなったメモリを返却する。

この借りるタイミングと返却するタイミングが、「Last In First Out」最後に確保したメモリを最初に開放してくれるのであれば、スタックを使えばいいが malloc や free のタイミングは、LIFO の順番のようにはならない。

この返却されたメモリ領域は、改めて malloc() が呼び出されたときに再利用を行う。この再利用するメモリ領域は、簡単に扱えるようにリスト構造にして保存する。この free された再利用候補のリスト構造は、free_list と呼ばれる。

free_list の考え方を説明するために、malloc() でのメモリサイズが一定として説明を行う。

malloc() が呼び出される度に、free_list の先頭から貸し出すメモリを取り出し(a=malloc(),b=malloc(),c=malloc()まで)、free() が呼び出されると、返却されたメモリは、free_list の先頭につないでおく。

任意サイズのメモリ確保の場合

malloc() で、指定されたサイズのものが、free_list の中にあれば、それを使う。

丁度いいサイズが無い場合は、それより大きいメモリブロックの後半を切り分けて、貸し出す。

使用されていたメモリブロックが free() で返却された場合は、free_list につないでいく。ただし、単純にリストに繋ぐだけであれば、malloc(),free() を繰り返すと、小さなメモリブロックばかりになってしまい、malloc()ができなくなる。

そこで、free() で返却される際には、隣り合うメモリブロックと併合できるかを確認し、大きなメモリブロックになるような処理を行う。

ヒープメモリの断片化

ヒープメモリの malloc() , free() を繰り返すと、最悪、以下の図の様に、使用中領域(赤)とfreeされた未使用領域(黒)が交互に並ぶ状態が発生するかもしれない。この場合、全体の未使用領域の合計では十分なサイズでも、小さなメモリブロックばかりとなって、大きなメモリブロックを要求されても十分な大きさのメモリが見つからない状態が発生する場合がある。

この状態をヒープメモリの断片化といい、使用しづらい小さなメモリブロックはヒープホールと呼ばれる。

ガベージコレクタと演習(ハッシュ法)

ハッシュ法について演習ができていなかったので、前半座学(ガベージコレクタ)と後半演習(ハッシュ法)

ガベージコレクタ

前回、malloc などで使用を終えたデータを free で開放する際に発生する問題について説明し、その問題の解決法として参照カウンタ法を説明した。しかし、参照カウンタ法は循環リストなどが含まれる場合、free で開放できない状態が発生する場合があることを説明した。

このため、malloc で確保したデータ領域を、free で開放する処理は、複雑なデータ構造の場合かなり処理の記述が大変になる。

そこで最近のプログラム言語では、ガベージコレクタがある。この方法では、プログラムが malloc で確保した動的データ領域は、データが不要となっても開放処理 free は行わない。

しかし、このままでは、不要となったデータ領域がメモリに溢れ、メモリ不足が発生してしまう。そこで、一定量のメモリを使い切ったら、不要なメモリ(ゴミ=ガベージ)を回収(コレクタ)する。

マーク&スイープ法

ガベージコレクタの方法には、色々あるが、マーク&スイープ法では、

  1. 処理を一旦停止し、
  2. 動的メモリの領域すべてに「未使用マーク」をつける。
  3. 実際に使用している変数や、その変数が指している領域には「使用中マーク」をつける。
  4. マーク処理が終わったら「未使用マーク」の付いているデータは誰も使っていないので回収する。


他にも、コピー法といった方法もあるが説明は割愛する。

上で述べた様に、ガベージコレクタはプログラムを一旦停止し、全動的メモリ領域を検査するという手間のかかる作業を行うため、通常は「一時的にプログラムが止まる」ことからリアルタイムに処理を行うような場合には、極めて不都合が多い。

このため、最近では参照カウンタ法の技術なども取り入れ、局所変数は参照カウンタ法の技法を中心に回収し、大域変数はガベージコレクタの技法で回収する。

CやC++言語では、ガベージコレクタは基本的には利用できず、ガベージコレクタが取り入れられた言語としては、Java が有名。Java では、ガベージコレクタが実装されているため、通常のプログラミングでは、free や delete といった処理は不要である。しかし、処理速度や突発的な一時停止を避ける場合には、適切なタイミングで変数に null を代入するといった処理を明記するなどのテクニックが重要となる。

局所変数とスタック

局所変数は、関数に入った時に作られるメモリ領域であり、関数の処理を抜けると自動的に開放されるデータ領域である。

関数の中で関数が呼び出されると、スタックには戻り番地情報を保存し、関数に移動する。最初の処理で局所変数領域が確保され、関数を終えると局所変数は開放される。
この局所変数の確保と開放は、最後に確保された領域を最初に開放されることから、スタック上に保存される。

演習(ハッシュ法)

ハッシュ法のプログラム(オープンアドレス法もしくはチェイン法)を用いて、
(1)名前と電話番号,(2)名前と住所,(3)名前と誕生日について、名前をキーとして検索するプログラムを作成せよ。

「出席番号 % 3 + 1」の番号のテーマに取り組むこと。

レポートを作成する際には、ハッシュ関数を変更してどういった変化があるか確認せよ。
ハッシュサイズは、10〜20件程度で良い。

2段階認証のGoogle設定例

Googleでの2段階認証の設定方法は、以下の通り。(2018年1月での画面)

2段階認証の設定

Google の右上の「アカウント」のを選択すると、ログインとセキュリティの設定画面となる。

パスワードの設定画面の中の、2段階認証プロセスをクリックして設定を行う。

2段階認証の設定を行うと以下のような画面となり、現在のパスワード・携帯電話の番号などを入力する。

テキストメッセージを選ぶと、携帯電話のSMS(ショートメッセージ)で6桁の数字によるワンタイムパスワードが送られてくるので、それを入力することで設定が完了する。

認証アプリの設定

Google の2段階認証には、いくつかの方法があるが、最も簡単な方法は、”Google アプリ”をスマートフォンにインストールしておく方法。

Googleアプリ

この場合、2段階認証が必要になると、”Google アプリ“から「ログインしようとしていますか?(はい/いいえ)」と表示されるので、スマホ画面で「はい」を入力すれば良い。

Google認証システム

もう一つの方法が、Google 認証システムを使う方法。この方法は、時間(分単位)で変化するワンタイムパスワードを入力する方式。

最初に、Google 認証システムを使うためのQRコードが表示されるので、Google認証システムアプリで読み取ると、ワンタイムパスワードが表示されるようになる。

2段階認証のTwitter設定例

Twitterの2段階認証の設定は、以下の通り。(2018年1月時点)

最初に、パソコンのTwitterの画面右上のプロフィールと設定より、「設定とプライバシー」を選択。

このなかのセキュリティの欄の「ログイン認証を設定」をクリック。

2段階認証で、ワンタイムパスワードが送られてくる携帯電話の番号を登録する。

電話番号を記入し「コードを送信」を選ぶとショートメッセージで6桁のワンタイムパスワードが送られてくるので、それを入力する。

携帯電話を紛失すると、ログインができなくなるので、その非常事態用に、最終手段のバックアップコードが表示される。このログイン時のパスワードで、バックアップコードを入力すればログインできる。

このバックアップコードは重要なので、必ずどこかに保存しておくこと。

リモート接続と暗号化

リモート接続と暗号化について説明

リモート接続

サーバなどの管理をしていると、インターネットの先にあるコンピュータを操作したい場合が多い。こういった場合には、リモート接続機能を用いる。

リモート接続による相手側のコンピュータを操作する場合、相手側のコンピュータには リモート接続 用のサーバプログラムを起動しておく。こういったリモート接続を利用するのは、”unix” の利用者が多いが、”unix” では、サーバ のプログラムは、一般的にデーモン(daemon/守護神)と呼ばれる。

telnet と rlogin

telnet は、最も基本的なリモート接続の方法であり、TCP の 23 番ポートを使う。telnetのサーバ(telnetd)は、送られてくるタイプされた文字を unix の shell (キーボードでの命令を実行するプログラム) に渡し、shell の実行結果の文字を接続元に送り返す。

rlogin は、TCP の 513 番ポートを使うリモート接続用のソフトで、サーバで rlogind を起動しておく。unix で rlogin クライアントを使うと、リモート側で命令を実行したりファイルをコピーすることができる。

こういったリモート接続ができると、ネットワークの向こう側のコンピュータを自由に操作できる一方で、login のパスワードが破られるとコンピュータを悪用されたり情報を盗まれる可能性がある。
特に、telnet , rlogin では、通信の内容が暗号化されないため、パケット盗聴(後述)されると、サーバを悪用されてしまう。

このため、ルータや firewall では、ポート番号 23 , 513 などは、遮断するのが一般的である。

ssh

暗号化されない rlogin の通信を暗号化により安全に実行できるようにしたものが、ssh (secure shell) である。
ssh は、通常では TCP の 22 番ポートを使う。しかし、暗号化されていたとしてもパスワード破りなどの危険性があるため、ポート番号を変更したり、特定のコンピュータに対してのみ接続許可を与え、安全対策を行う。

リモートデスクトップ

Windows では、コンピュータの操作では、マウス操作が中心(GUI: Graphical User Interface)となる。これに比べ、telnet,rlogin,ssh などの方法では、キーボードによる操作が中心(CUI: Character User Interface)であり、初心者には難しい。こういう場合はリモートデスクトップ(remote desktop)が用いられる。

remote desktop では、サーバのディスプレイ画面の情報をクライアントに送り、クライアントの操作(キーボード入力やマウス操作)がサーバに送られ、サーバのコンピュータを自由に操作ができる。

暗号化

Ethernet では1本の通信線を共有したり、WiFiのような無線通信では、通信データの盗聴が簡単にできてしまう。クラッカーは、通信データの中から”login, password” といった文字を検索し、その近辺の文字を探すことでパスワードを盗み出す。

このようなことを防ぐために通信データの暗号化は重要な方法である。

暗号化アルゴリズム

暗号化の最も原始的な方法が、置換式 と呼ばれる方法で、特定の文字を別な文字に変更する。rot13は、A→N,B→Oに置き換える暗号。コナン・ドイル原作のシャーロック・ホームズに出てくる踊る人形などもこれに相当する。これらの方法では、アルファベットの文字の出現頻度から元の文を想像することで解読されてしまう。

エニグマ(Enigma)は、第2次世界大戦でナチス・ドイツが用いたロータ式暗号機であり、置換式の解読方法が不可能であった。しかし、イギリスのアラン・チューリングが電気式の解読器を開発することで暗号解読が可能となった。この解読器が現在のコンピュータの原型となっている。

チューリングによる暗号解読は、映画「イミテーションゲーム」を参照。

最近では、様々な暗号化アルゴリズムが開発されており、古くは “DES, AES“といったアルゴリズムが使われていたが、コンピュータの性能の向上と共に、解読に必要な時間が短くなったことから、RSA といった新しい暗号化方式が考えられ、さらに暗号化の鍵を長くすることで解読に要する時間を長くするようになっている。

パスワード解読方法

ログインなどで使われるパスワードは、どのように破られるのだろうか?

  • ブルートフォース攻撃:単純に全ての文字を試す方式。文字の組み合わせ問題なので、パスワード文字列長をNとした場合、数字だけ(10N)とか英字だけ(26N)といった組み合わせでは、短時間に解読されてしまう。数字,大文字,小文字,記号などを交えたパスワードが理想。
  • 英単語辞書を用いた辞書攻撃:パスワードが長い場合、文字列の全ての組み合わせを試すには長い時間が必要となる。しかし、パスワードはユーザが記憶して使うことから覚えやすい単語が使われる。このため英単語辞書の文字を組み合わせることで、解読時間を短くできる場合がある。
  • 漏えいパスワードによる辞書攻撃:サーバへのリモート接続などができてしまった場合、パスワード情報が盗まれる場合がある。この時、別なサイトに同じパスワードを使っていると、その漏えいしたパスワードで別のサイトも接続ができてしまう。これらのことから、同じパスワードを使いまわすことは避けるべきである。
  • ソーシャル攻撃:パスワードには、簡単に覚えられるように自宅の電話番号、誕生日、家族の名前といったものを使う人が多い。このため、SNS で相手に友達登録をしてもうことで、こういった情報を手に入れ、パスワードを破る方法。最近の有名人の個人情報漏洩はこの手の攻撃が多い。

    ソーシャル攻撃は、元クラッカーケビン・ミトニックが有名

攻撃が難しい暗号化へ

先に述べたような、login に使うパスワードなどは、ブルートフォース攻撃をうけると解読は時間の問題となる。これらの対策として毎回違う鍵(パスワード)を使えばいい。

  • 暗号表:置換式で読み取られるのを防ぐために、置換する文字の表を沢山作っておき、別の方法でその度毎に置換表を変更する
  • ワンタイムパスワード:使い捨てのパスワードをあらかじめ沢山作っておき、接続の度に次のパスワードを用いる方式。あるいは、時間から特殊な計算方法で生成されるパスワード。時間と共に変化するのでその度毎に違うパスワードとなる。毎回違うパスワードを入力するため、パスワード表を常に持ち歩いたり、入力が面倒なので数字だけを使うことが多く、この方法だけでは使いにくい。

公開鍵暗号方式

以前に使われていた暗号化の方式は、暗号化の鍵と復号化の鍵に同じものを用いる共通鍵方式であった。
しかし、この鍵をどうやって相手に渡すか…が問題となっていた。(鍵を相手に渡す瞬間のデータを盗聴されると危険)

このため、最近では公開鍵暗号方式が中心となっている。この方式は「暗号化するため専用公開鍵」と、「暗号化を復号するための秘密鍵」をペアにして用いる。公開鍵は、暗号化するため専用なので、この鍵が他の人に見られても、暗号を復号することはできない。

公開鍵暗号方式では、RSA などが最も有名で現在広く利用されている。

macOS High Sierra で telnet が消えた

情報ネットワーク基礎の授業で、メールサーバやWebサーバに直接接続するのをデモしようとしたけど、”telnet command not found” の表示。

macOS High Sierra から telnet とか ftp が消されたらしい。

$ sudo port install inetutils

最多パスワード

恒例になりつつあるけど、クラッキングして 実際に使われていた安易なパスワードのランキング。
上位は、123456とかpasswordとか、破られて当たり前の パスワード。昨年度のランキングでも3位までは同じだ。
理由は分からんけど、”password”が、8位から4位に 急上昇。(^_^;