暗号、SSH、Webサーバ・アクセスログ、プロセス、電子メールの転送

					2013年05月21日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2013/2013-05-21
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■ネットワーク上の脅威

悪意を持つ人、プログラムによる脅威。
盗聴
本来の通信相手以外の人が 通信内容のコピーを入手する。例:クレジットカード番号をコピーする(後で使う)。
改ざん
通信内容を書き換える。例:買い物で1個買う所を10個に書き換える。
なりすまし
悪意のある人が、他の人に成り代わる。例: 電子メールの From: を書き換えて送る。
インターネットで流れるデータは、流れるデータを見れば簡単に内容を知るこ とができる。(1つひとつのデータグラムは、はがきと同じ。)

ネットワークには、次のものを含めて考える

■暗号

◆暗号に関する基本用語と安全性

暗号とは、情報の意味が当事者以外にはわからないように情報を変 換することである。

図? 暗号化、復号化、平文、暗号文、解読、鍵

図? 暗号の考え方

平文(ひらぶん(clear text))
元の情報
暗号文(cipher text)
変換された情報
平文、暗号文といっても、文字だけでなく、画像や音声などコンピュータが扱 えるあらゆるデータ(ビット列)が想定されている。

暗号化(encrypt)
平文を暗号文に変換すること。暗号化鍵が必要。
復号化(decrypt)
暗号文を平文にもどすこと。復号化鍵が必要。
鍵(key)
暗号化や復号化に必要な(短い)データ。
解読
当事者以外の第三者が、暗号文を元にもどすこと、あるいは、復号化鍵を得る こと。
暗号化や復号化の方法(アルゴリズム)は、何種類もある。

◆鍵を使うことの重要性

問: 答え:

暗号化の方法が秘密になっていると、一見、より強そうにみえる。しかし、そ の暗号が、強いのか弱いのか調べる方法がない。攻撃すると、簡単に落ちるか もしれない。暗号化の方法を提供している者が信頼できない時には使えない。

◆長い鍵を使うことの重要性

暗号の安全性は、鍵の安全性によっている。

◆暗号の経済学

暗号の安全は、解読にかかるコストを大きくすることで、解読され た平文から得られる利益を相対的に小さくすることに依存している。

鍵を長くするだけで、安全性が指数関数的に高くなる。 鍵を1ビット長くすると、解読時間が2倍になる。 (「鍵の長さを2倍にすると解読時間が2倍になる」は、誤り)。

図? 指数関数

図? 指数関数

図? 指数関数

図? 指数関数

パスワードは、コンピュータの中では、暗号化の鍵として使われる。 長いパスワードは、破られにくい。1文字(大文字小文字数字記号)増やすと、 総当たりで解読に要する時間が、50倍から100倍近くかかるようになる。

◆暗号の応用

◆共通鍵暗号系と公開鍵暗号系

暗号の方法は、大きく2つに分類される

共通鍵暗号系(対称暗号系)
暗号化鍵と復号化鍵が同じ(または片方から片方が簡単に計算できる)。 公開鍵暗号系と比較して軽い(処理が高速である)。
公開鍵暗号系(非対称暗号系)
暗号化鍵から復号化鍵を容易に類推できない。 共通鍵暗号系と比較して重たい(処理が低速である)。

両者を組み合わせて使う。

◆一方向関数

y=f(x) で、x から y を計算することは簡単だが、y から x 逆を計算するこ とは非常に難しい関数。

◆ハッシュ関数(メッセージ・ダイジェスト、メッセージ要約関数)

元データからデータの指紋と呼ぶべきような特徴的な数(普通は元データの長 さによらず固定長)を抽出するもの。

チェックサムや CRC (Cyclic Redundancy Check) にも似ているが、暗号やディ ジタル署名で使われるのは、Collision Proof 性が求められる。

ハッシュ関数の結果を、fingerprint というこがある。

よく使われるハッシュ関数

◆公開鍵暗号系

公開鍵暗号系(非対称暗号系)では2つの異なる鍵を用いる。 便宜上、この2つを公開鍵と秘密鍵と呼ぶ。

これらの鍵は、互いに相手の逆関数になっているものが広く使われている。

図? 公開鍵暗号を使った暗号通信の手順

図? 公開鍵暗号を使った暗号通信の手順

  1. 受手は、公開鍵と秘密鍵の組を作り、公開鍵を誰でも読めるようにする。
  2. 送手は、受手の公開鍵を暗号化鍵として用いて暗号文を作り、送る。
  3. 送手は、受け取った暗号文を、自分の秘密鍵を復号化鍵として用いて復号化し、 元の平文を得る。

ここで、公開鍵から秘密鍵を計算することは難しい。ある平文を公開鍵で暗号 化してみたところで、秘密鍵を得ることは難しい。

◆鍵の管理

公開鍵暗号の利点は、鍵を管理する手間が掛らないこと。
共通鍵暗号の場合
情報を交換する間で鍵を「事前に」安全に共有しなければならない。しか も、通信相手ごとに鍵を変える必要がある。
公開鍵暗号の場合
受手ごとに、1つの暗号化鍵を公開するだけでよい。今までに通信をしたこと がない人からでも、暗号化されたメッセージを受け取ることが可能である。
公開鍵暗号系は、暗号通信だけでなくディジタル署名や利用者認証、電子現金 にも応用される。

図? 秘密鍵、8人、各人7つの鍵を管理 図? 公開鍵、8人、各人1組の鍵を管理
共通鍵。各自7つの鍵を管理する。 公開鍵。各自、1組の鍵を管理する。

図? 鍵の管理の例。8人の場合。

◆認証

認証とは、情報の正当性や完全性を確保する技術である。

利用者認証
アクセスしてきた人が正当か否かを判定する。 しばしばパスワードや暗唱番号が用いられる。
ディジタル署名(メッセージ認証、電子署名)
通常の署名とおなじく、送られてきたメッセージが送信者本人のもので あることを識別、確認すること。

◆認証の例

◆man-in-the-middle攻撃

いくら暗号通信をしても、通信相手を認証しないと意味がない。 認証しない場合、man-in-the-middle攻撃に弱い。

A=攻撃者、攻撃者=Bで暗号通信

図? man-in-the-middle攻撃

◆ディジタル署名

ディジタル署名では、通常の署名と同様に、次のような性質が必要である。

ディジタル・データでは完全なコピーが簡単に作れるので、紙上の署名や捺印 よりも難しい。

◆公開鍵暗号計によるディジタル署名

公開鍵暗号系を使ってディジタル署名を行うことができる。

図? 公開鍵暗号を使ったディジタル署名の手順

図? 公開鍵暗号を使ったディジタル署名の手順

  1. (受手ではなく)送手は、公開鍵と秘密鍵の組を作り、公開鍵を誰でも 読めるようにする。
  2. 送手は、自分の秘密鍵を暗号化鍵として用いて暗号文を作り、送る。
  3. 送手は、受け取った暗号文を、送手の秘密鍵を復号化鍵として用いて復 号化し、元の平文を得る。この時、きちんと平文が得られた場合、その平文は、 その公開鍵の持ち主から送られてきたことがわかる。

メッセージ全体を暗号化する代わりに、メッセージを平文で送り、それにメッ セージを一方向関数(ハッシュ関数)と呼ばれる方法で計算した結果だけを、 秘密鍵で暗号化したものを送る方法もある。一方向関数では、計算結果から元 の値(メッセージ)を計算することが難しい。

ディジタル署名や利用者認証は、公開鍵暗号系ではなく、共通鍵暗号系を用い ても可能である。ただし、この場合、鍵を管理する信用できる管理センターが 必要となる。

◆公開鍵暗号を使った利用者認証

サーバへのログインを例に、これを説明する。

  1. ユーザは、サーバにログイン・アカウントを登録する時に、公開鍵と秘 密鍵を生成し、公開鍵をサーバに届け、秘密鍵を自分で保持する。
  2. ユーザは、通信回線を通じてサーバにアクセスしてきた時、サーバは乱 数を1つ生成し、その乱数をユーザの「公開鍵」で暗号化し、ユーザに送り返 す。
  3. ユーザは、送られてきた暗号化された乱数を、保持している秘密鍵で復 号化し、サーバに送り返す。
  4. サーバは、ユーザから返された乱数が正しければ、正当なユーザである と判定する。
次回の呼び出しでは、別の乱数を用いることで、通信を記録している傍受者に も対応することができる(challenge-response方式)。

単なる暗証番号の場合、通信を傍受されたら終り。 毎回違う数を使えば、傍受されていても平気。

◆鍵の確認

公開鍵による認証

公開鍵で自由に鍵が得られたとしても、鍵か偽物だと、意味はない。

鍵がが本物であるかをどうやって確認するか。

では、その第三者は、信頼できるのか。

■SSL(Secure Sockets Layer)

SSL は、Netscape 社によって開発された通信路を暗号化する仕組み。認証機能 もある。HTTP に広く使われている(他にも使える)。SSL をインターネットで使 えるさまざまな標準を策定する組織IETF (Internet Engineering Task Force) により標準化したものが、TLS(Transport Layer Security)。

◆SSL が使われる場所

◆3種類認証モデル

良く使われる(HTTPS, POPS, IMAPS, SMTP Over SSL)のは、2番目。

認証には、証明書が使われる。

◆SSLて使われる証明書

含まれている重要な情報

X.509 形式(バイナリ)を、テキストに変換したものの例:

$ openssl x509 -text -noout < coins-www.cert
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            23:99:a5:01:dd:82:d2:1a
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, O=SECOM Trust Systems CO.,LTD., CN=SECOM Passport for Web SR 2.0 CA
        Validity
            Not Before: Mar  4 08:20:34 2010 GMT
            Not After : Mar 31 14:59:59 2014 GMT
        Subject: C=JP, ST=Ibaraki, L=Tsukuba, O=University of Tsukuba, OU=Department of Computer Science, CN=www.coins.tsukuba.ac.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:bf:a8:d2:c6:ca:36:85:52:74:2d:ee:3c:23:f3:
                    71:94:88:85:c0:52:47:5f:50:dd:96:bf:07:b7:82:
                    04:ce:fa:38:b9:80:49:2e:9e:42:c7:d7:1b:2c:6b:
                    da:0b:71:20:61:73:31:92:27:c2:75:9a:13:92:ea:
                    00:0d:d8:77:13:f9:db:54:bf:fc:22:ef:cf:b8:c0:
                    d2:6c:1e:df:5e:30:0b:e4:1f:28:40:82:29:59:69:
                    5b:c1:84:88:a8:d1:bf:84:cf:4d:d5:d8:34:40:4b:
                    1f:98:ec:b0:ec:35:19:ad:ae:19:2b:d9:87:7b:21:
                    cf:d1:ca:53:70:09:88:c4:6d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Subject Key Identifier: 
                B0:C1:54:B3:02:01:7C:7C:9B:F8:BA:42:36:09:66:50:98:20:26:9E
            X509v3 Authority Key Identifier: 
                keyid:30:9A:00:57:99:44:63:6B:C9:B2:F2:3D:8D:83:6B:3B:D7:9D:EF:64

            X509v3 Certificate Policies: 
                Policy: 1.2.392.200091.100.741.1
                  CPS: https://repo1.secomtrust.net/spcpp/pfw/pfwsr2ca/

            X509v3 CRL Distribution Points: 
                URI:http://repo1.secomtrust.net/spcpp/pfw/pfwsr2ca/fullcrl.crl

            Netscape Cert Type: 
                SSL Server
    Signature Algorithm: sha1WithRSAEncryption
        a9:aa:27:a3:1f:66:db:25:44:a1:06:ab:a8:2a:95:b9:08:72:
        a5:b9:aa:b9:ac:6a:93:da:74:3f:59:a9:2a:f5:d5:08:ec:6f:
        60:e3:df:fd:79:a3:7c:23:b6:c4:0f:44:a0:46:7e:98:6f:e2:
        a8:4a:a8:38:c8:f0:3c:52:12:e3:f7:e4:7f:70:00:d9:39:cb:
        fe:a6:2e:a9:09:77:25:b1:a9:2b:0a:88:4a:44:c1:94:99:8b:
        0e:64:e1:2c:2a:b4:a2:ac:3b:8e:9c:bf:27:22:6f:df:2f:dd:
        0f:61:83:18:fc:d9:ba:fd:53:92:9e:8f:10:81:9c:46:e0:65:
        7a:99:1b:db:20:2f:8a:35:9f:44:00:23:ce:2a:5d:c5:38:ca:
        f3:77:71:ce:07:90:b3:0c:e2:4d:1f:c1:13:40:a6:95:f5:a1:
        22:24:0d:64:f6:27:07:bb:dc:d1:56:e5:9a:f3:b9:20:2e:a0:
        5c:65:de:40:ef:26:c3:ee:f4:06:e9:19:5d:c7:da:bb:63:da:
        a0:8d:a5:2b:65:77:8e:30:a9:3b:b6:06:21:86:9c:5e:bc:dc:
        e2:23:aa:1f:4d:ce:8d:70:38:7d:2b:0d:70:c1:3d:ba:2d:e9:
        7a:16:92:58:96:7e:3b:f2:a5:54:0c:bc:3d:35:bd:2c:18:46:
        e4:26:8b:26
$ 

◆認証局の階層/信頼の鎖

証明書がついていたとして、それが本物であるかをどうやって確認するか。

認証局(CA, Certificate Authority)に、証明書を発行してもらう。(認証局の 秘密鍵でディジタル署名をしてもらう)

その認証局は、信頼できるか?

WWWブラウザには、ルート認証局の証明書が予め含まれている。

末端のWWWサイトは、ルート認証局、または、中間認証局から発行された証 明書を提示する。

ブラウザ、ルート認証局、中間認証局、末端の証明書。ルートは自己署名。

図? ルート認証局から始まる証明書のチェーン

◆SSLでの暗号系の利用

■SSH

◆r系コマンド

rlogin
remote login。遠隔ログイン。 (文字端末を使っている状態で)別のコンピュータにネットワーク経由で接続し てログインし、別のコンピュータを(文字端末の状態で)利用可能にすること。
rsh
remote shell (sh)。別のコンピュータでプログラムを実行する。
rcp
remote copy (cp)。別のコンピュータとの間でファイルをコピーする。
ftp
file transfer program/protocol。別のコンピュータとの間でファイルをコピーする。
SSH (Secure Sell) とは、これらのプログラムを置き換えたプログラム群の総称/代表。 遠隔(remote)の対になる言葉は、ローカル(local)。

◆r系コマンドの弱点

◆SSHでの解決方法

◆クライアントとサーバ

[クライアントとサーバ再掲(5月10日の資料)]

インターネットで通信をプログラムを利用する時、 「クライアント」と「サーバ」という分けて考えることが多い。

例:

コンピュータが1台しかない場合、プログラムは1つでよい。通信をする場合 には、プログラム(コンピュータ)が2つになる。そのうちの1つのプログラ ム(またはコンピュータ)を、「クライアント」、もう1つを「サーバ」とい う。

◆sshにおけるクライアントとサーバ

◆SSHにおけるホストの認証

SSH (scp含む)では、クライアントが接続先のコンピュータ(ホスト)で動いてい るサーバが本物であるかどうかどうかを確認する(ホストを認証する)。ホス トの認証には、公開鍵暗号系を使う。

◆SSHにおけるホストの公開鍵のハッシュ値の確認

ssh (scp, WinSCP, PuTTY, Tera Term含む) で始めてあるホストに接続する時 には、警告が現れる。

ssh コマンド

$ ssh ホスト名 -l ユーザ名 [←]
The authenticity of host 'ホスト名 (IPアドレス)' can't
be established.
RSA key fingerprint is 16進数32桁.
Are you sure you want to continue connecting (yes/no)? yes[←]
Warning: Permanently added 'ホスト名 (IPアドレス)' (RSA)
to the list of known hosts.
Password: (パスワードを打つ。画面には表示されない。)[←]
ホスト名$ [←]

この 16進数32桁 の数は、接続先のホストの公開鍵を、ハッ シュ関数 MD5 にかけた結果である。この32桁の数を目で確認することにより、 接続先のホストが正しい( man-in-the-middle攻撃が 行われていない)ことがわかる。

◆主なホストの公開鍵のハッシュ値

2013年5月現在。変更される可能性もある。
www.coins.tsukuba.ac.jp
3d:78:df:9c:5e:55:88:5f:0c:b2:8e:71:4a:0c:47:13
acacia01-50, burnet00-50, cosmos01-50
44:08:af:d4:56:7d:b9:20:25:d2:dd:0c:03:27:a4:d4
viola01.coins.tsukuba.ac.jp
43:1a:7a:7f:f7:d6:3a:82:5c:10:98:b0:13:58:9e:c7
viola02.coins.tsukuba.ac.jp
c1:07:da:a1:f6:2f:1a:5e:8b:55:4e:e3:bb:1d:c1:df
viola03.coins.tsukuba.ac.jp
7a:bf:35:d6:b0:f3:c2:b9:ab:96:ec:a3:12:0c:95:b5
viola04.coins.tsukuba.ac.jp
0d:83:dc:63:47:1d:ce:de:59:91:77:77:35:e4:d1:90
viola05.coins.tsukuba.ac.jp
7f:29:f7:e7:87:65:c8:b9:02:f5:2a:22:41:ea:73:b9
viola06.coins.tsukuba.ac.jp
13:29:e6:ad:e0:3f:73:7b:f8:9b:b4:03:6e:fe:d3:9b
icho.u.tsukuba.ac.jp
de:18:ce:85:f0:a5:f3:b0:f7:cc:72:83:c8:1e:94:1b

◆SSHでのユーザの認証

暗号化された通信路が確立された後は、パスワードを流しても安全である。

個人ごとに公開鍵での認証機能を利用したほうがよい。

◆sshにおける公開鍵による認証

SSH では、公開鍵暗号を使った利用者認証 が使える。

■Webサーバ・アクセスログ

Web サーバでは、一般に、クライアントからページがアクセスされるごとに、 記録を残している。この記録を アクセスログ(access log) という。アクセスログには、次のような内容が記録される。 Webブラウザを利用する時には、サーバ側にアクセスログが残されていることを 意識する。

■プロセス

説明するのは、けっこう難しい。完全な理解には、次のような勉強が必要にな る。

◆プロセスとは

プログラムがメモリに読み込まれ、CPU (processor) により実行できる状態に なったもの。 ←→プログラムは、ディスクにあってもプログラム。

「端末」を複数開くと、「シェル」のプロセスが2つ。 プログラムとしては、同じ bash だが、プロセスとしては別物になる。

その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)

メモリにプロセスが3つ、UNIXカーネル、ハードディスク、CPU

プログラムとプロセス

◆プロセスの役割

保護の単位
(故意か過失かを問わず) 特に許可を出さない限りプロセスは他のプロセスの 影響(データ見る、データを破壊する、強制終了させる) を受けないようになっている。 あるプロセスの動作がおかしくなっても、 コンピュータ全体としては動作しつづける。
資源割当ての単位
メモリ、ディスク、プリンタ、ディスプレイ、キーボードなどコンピュータが 処理を進める上で利用価値のあるものを総称して 資源(resource) という。 複数のプロセスを動作させる時、資源が不足してきたら、ある基準で分配する。

プロセスの操作

「殺す」と「止める」は違う。 殺したプロセスは、再開できない。 止めたプロセスは、場合によっては、再開できる。

■プロセスを作る==プログラムを実行する

プログラムを実行すると、プロセスが作られる。 例:
$ ls [←]

■プロセスの観察

手引き 2.3.1 参照The Unix Super Text 第10章 参照

プロセスには、ID (identifier)と属性がある。 psコマンド は、プロセスの一覧と属性を表示するコマンドである。

$ ps [←]
  PID   TT  STAT      TIME COMMAND
  639 s000  S      0:00.01 -bash
  652 s000  S+     0:00.20 emacs
  646 s001  S      0:00.01 -bash
$ []
1行が1プロセスに対応。左から次のような意味を持つ。
PID プロセス識別子
プロセスを区別する番号。 最大5桁の番号。
TT 端末名
そのプロセスが結びつけられている端末の省略形。 たとえば、端末 /dev/ttys001s001になる。
STAT 状態
プロセスの 状態 (STATe)。 次のようなものがある。

R (runnable)
実行可能。CPU が空いていれば実行される。
U (uninterruptible), D (Disk),
ディスク入出力などの完了を待っている。割り込み不可。
S (Sleep)、I (Idle)
キーボードや他のプロセスからの入力を待っている。
Z (Zombie)
既に終了していて、終了処理の完了を待ってる。
T (Traced)
一時的に停止しているか、デバッグの対象になっている。
TIME
CPU時間。 CPUがそのプロセスを実行するために費やした時間。
COMMAND
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。

◆プロセスと端末

プロセスは、端末に関連して次のように分類される ps コマンドに x オプションを指定すると、端末と結びついていないプロセス も表示する。
$ ps x [←]
  PID   TT  STAT      TIME COMMAND
  526   ??  Ss     0:00.06 /sbin/launchd
  547   ??  S      0:00.26 /System/Library/CoreServices/Dock.app/Contents/MacOS
  548   ??  S      0:00.31 /System/Library/CoreServices/SystemUIServer.app/Cont
  549   ??  S      0:00.62 /System/Library/CoreServices/Finder.app/Contents/Mac
  553   ??  S      0:01.33 /System/Library/Frameworks/ApplicationServices.frame
  556   ??  S      0:00.00 /usr/sbin/pboard
  560   ??  S      0:00.01 /System/Library/Frameworks/InputMethodKit.framework/
  561   ??  S      0:00.35 /System/Library/Input Methods/Kotoeri.app/Contents/M
  564   ??  S      0:00.17 /usr/libexec/UserEventAgent -l Aqua
  578   ??  S      0:00.04 /System/Library/CoreServices/Menu Extras/TextInput.m
  580   ??  S      0:00.01 /System/Library/CoreServices/CCacheServer.app/Conten
  604   ??  S      0:00.09 /System/Library/Frameworks/OpenGL.framework/Versions
  606   ??  S      0:09.23 /Applications/iTerm.app/Contents/MacOS/iTerm -psn_0_
  616   ??  S      0:02.03 /Applications/Firefox.app/Contents/MacOS/firefox-bin
  638 s000  Ss     0:00.01 login -fp yas
  639 s000  S      0:00.01 -bash
  652 s000  S+     0:00.21 emacs
  645 s001  Ss     0:00.01 login -fp yas
  646 s001  S      0:00.01 -bash
  659 s001  R+     0:00.00 ps x
$ []

◆プロセスとユーザ

プロセスには、どのユーザの資格で実行しているかという情報( UID, User Identifier )が設定されている。この資格は、通常はそのプロセスを起動した ユーザになる。psコマンドを引数なしに実行すると、自分の資格で実行してい る(端末がある)プロセスだけを表示する。他人のプロセスも表示したい時は、 psコマンドを実行するときに「a」オプションをつける。
$ ps a [←]

◆プロセスと資源

psコマンドにuオプションを付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas    652   0.0  0.3  2451208  13168 s000  S+    5:58PM   0:00.21 emacs
yas    646   0.0  0.0  2435468   1008 s001  S     5:58PM   0:00.01 -bash
yas    639   0.0  0.0  2435468   1008 s000  S     5:58PM   0:00.01 -bash
$ []
%CPU
過去1分間に利用した CPU 時間の割合。
%MEM
実際に消費してるメイン・メモリの大きさの割合。
VSZ (Virtual Size)
仮想記憶上のプロセスの大きさ。KB 単位。
RSS (resident set size)
実際に消費してるメイン・メモリの大きさ。
STARTED
プロセスが生成された時刻。

◆プロセスの親子関係

プロセスがある命令(システム・コール)を実行すると新しくプロセスが 生成される。 プロセスにはそのプロセスの生みの親が1個ある。 もとのプロセスを「親プロセス」とう。

親子関係により、プロセスは全体として木構造を作る。

親プロセスのプロセス識別子は、psコマンドに「l」オプションをつけると PPIDのところに表示される。

$ ps l [←]
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT   TT       TIME COMMAND
 1013   639   638   0  31  0  2435468   1008 -      S    s000    0:00.01 -bash
 1013   652   639   0  31  0  2451208  13168 -      S+   s000    0:00.21 emacs
 1013   646   645   0  31  0  2435468   1008 -      S    s001    0:00.02 -bash
$ []
PID 652 の emacs の親プロセスは、PID 639 の bash。

■プロセスを殺す(kill)

手引き 2.3.2 参照The Unix Super Text 10.5節 参照

プロセスを殺すとは、プロセスが自主的に終了しない時に、強制的に終了させ ること。

Unix では、プロセスを殺す方法は、主に次の2つ。

どちらの方法でも、裏では シグナル (ソフトウェア割込み) という仕掛けが働く。

◆キーによるプロセスの強制終了

端末で動作しているプロセスが、キーボードからキーを読み込んでいる状態の 時には、^C (Control + C) を押すと、終了できる。以下は、 cat コマンドのプロセスを^Cで強制終了している。
$ cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^C
$ []
^C と同様に ^\ (「^\」または「^¥」) もプロセスを強制終了させるキーで ある。^\ は、^Cが利かないときでも利くことがある。

^\ の場合、デバッグ用にcore という名前のファイル ができる。普段は、core ファイルは不要なので、^C を使うべ きである。

coins の環境では、core ファイルが作られないように設定されている。 core ファイルの利用方法は、デバッガ gdb のマニュアル、 man core (core ファイルの man ページ(man コマンドで表示されるページ))、 Unix Super Text 下巻 「第60章 デバッグの方法」を参照。

stty コマンドを使うと、^C^\ を変更でき る。

$ stty -a [←]
speed 38400 baud; 35 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
        -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
        -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
cchars: discard = ; dsusp = ^Y; eof = ^D; eol = ;
        eol2 = ; erase = ^?; intr = ^C; kill = ^U;
        lnext = ; min = 1; quit = ^\; reprint = ^R; start = ^Q;
        status = ; stop = ^S; susp = ^Z; time = 0; werase = ^W;
$ []
「intr」のところに表示されるものが「^C」, 「quit」のところに表示されるものが「^\」に相当するキー。 「kill」は、1行削除の意味。

◆kill コマンドによるプロセスの強制終了

^C^\ で死なないプロセス (lv, emacs など) を殺すには、kill コマンドを使う。
$ kill pid [←]
これは、プロセス識別子pidのプロセスを殺す。 他人のプロセスは、権限がないので殺せない。

注意:pid には、プロセス識別子となる番号を入れる。「p」、 「i」「d」と3文字打つのではない。

◆kill -KILL

単純な kill コマンドでは死なないプロセスの場合、 -KILLをつけてkillコマンドを実行する。
$ kill -KILL pid [←]

■プロセス関連のコマンドのまとめ

ps			プロセスの一覧の表示
ps ux			プロセスの一覧の表示(BSD,Linux)
ps aux			プロセスの一覧の表示(BSD,Linux)
stty all		端末の状態の表示(BSD)
stty -a			端末の状態の表示(System V,Linux)
kill PID		プロセスを殺す
kill -KILL PID		プロセスを殺す(必殺)
PID はプロセス識別子。 ;

■coins当ての電子メール

who@coins.tsukuba.ac.jp に届いた電子メールは、毎日、読むこと。特に、コ ンピュータ・リテラシの授業の最中は必ず読むこと。

TAや教官からメールが来て、必要な返事は、次の実習時間/講義時間までに 出すこと。

coins 以外のメール・サーバを主に使うときには、~/.forward による転送の設 定を行うこと。

■~/.forwardによる電子メールの転送

The Unix Super Text 25.9.1 参照メール・リーダの操作には、 受け取ったメールを他のユーザへ 転送(forward) する操作がある。 それとは別に、届いたメールをユーザの操作を介さずに自動的に他のアドレス (普通は他のホストにある別の自分の電子メール・アドレス)に転送する機能 がある。この機能を使うには、ホーム・ディレクトリの下の ~/.forward というファイルに、転送先のアドレスを書く。 たとえば、 shiro@himalaya.is.tsukuba.ac.jp に届いたメールを全て shiro@alps.is.tsukuba.ac.jp に転送したいとする。この時、 himalaya の方のホーム・ディレクトリの下の ~/.forward に次のように書く。
shiro@alps.is.tsukuba.ac.jp
単純に転送先のアドレスを書く方法では、~/.forwardが あるホストには、何も残らないが、コピーを残しながら、転送する方法もある。 それには、次のように自分のログイン名に\を付けたア ドレスを含める。
\shiro, shiro@alps.is.tsukuba.ac.jp
注意:「\」は、ASCII 「5c(16進数)」である。 「\」と表示されたり「¥」と表示されることがある。 「/」ではない。

この例では、himalaya に届いた電子メールは、himalaya と いうホストの \shiroというユーザの 配送プログラム用メール・ボックスに入り、 さらに、shiro@alps.is.tsukuba.ac.jp にも送られる。

~/.forwardにおけるループの危険性

複数のメール・アドレスがある人は、どのホストにログインした時にも、全部 のホストに届いた電子メールが読める状態にしたいと思うかもしれない。 上の例では、 alps にログインした時にも、 alpshimalaya の両方のメールが読め、 また、himalaya にログインしてもやはり alpshimalaya の両方のメールが読める と便利に思えるかもしれない。しかし、こうすることは技術的に難しいので、 しばらくはあきらめて欲しい。

\loginnameの機能をつかっても、なかなかうまくいかない。 たとえば、次のよう な ~/.forward を作成したと考える。(実際に実行すると危険なので、 考えるだけする。)

(alps:~/.forward)
\shiro, shiro@himalaya.is.tsukuba.ac.jp
(himalaya:~/.forward)
\shiro, shiro@alps.is.tsukuba.ac.jp
この状態で、shiro@alps.is.tsukuba.ac.jp にメールが届いた 場合、次のようなことが起る。
  1. alps にコピーが残され、かつ、 shiro@himalaya.is.tsukuba.ac.jp に送らる。
  2. himalaya では、やはり、コピーが残され(ここまでは順調)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる(!)。
  3. alps では、コピーが残され(2回目)、himalaya に送られる。
  4. himalaya では、コピーが残され(2回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  5. alps では、コピーが残され(3回目)、himalaya に送られる。
  6. himalaya では、コピーが残され(3回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  7. alps では、コピーが残され(4回目)、himalaya に送られる。
  8. himalaya では、コピーが残され(4回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  9. ...
このような電子メールのピンポンが、永遠に続く。実際には、電子メールの転 送には上限が設定されているので、その上限に達した段階でエラーになって止 る。

3ヵ所以上でこの設定をしたとすると、中継される度にメールが増殖する。

\loginname の機能を使っていなかったとすると、コピーは 残らないが、メールが行き来するだけで、どこにも届けられずにエラーになる。

~/.forward の設定をしたら、必ず自分で自分あてに電子メールを出 して届くかテストすること。~/.forward の設定を間違えると、エラー のメールも届かなくなるので、エラーが起こっていることさえわからなくなる。

~/.forward の機能は、もともとは、sendmail という種類のMTA の機 能である。他の MTA (qmail, postfix)でも使えるように設定していることが多い。

◆電子メールをプログラムに転送する

The Unix Super Text 25.9.2 参照~/.forward の応用として、他のアドレスに電子メールを転送するの ではなく、(サーバ上で実行される)プログラムに転送する機能がある。すな わち、(サーバ上で)プログラムを実行して標準入力に電子メールの内容を与 えるという機能がある。これには、次のように~/.forwardに書く。
"| /program/path/name arg1 arg2 arg3 ... argn" 
このように、| に続いて、プログラムのパス名と引数を書き、 全体を "" で括る。

この機能を使って、受け取った電子メールを自動的に分類したり、 spamメール を排除したりすることができる。たとえば、MH の slocalやprocmail と呼ば れているプログラムがこの機能を使っている。

■Emacs

◆Emacsのモード

Emacs は、編集するテキスト・ファイルの種類に応じて細かい動作を変更する。 この時、Emacs では「モード(mode)」を変更すると言う。

Emacs は、モードを編集するファイルの拡張子を見て自動的に変更する。 Emacs がよく使うモードと拡張子は、次のようになっている。
Emacs のモードと拡張子
モード 拡張子
text-mode .txt, .text
html-mode .html
c-mode .c, .h
lisp-interaction-mode .el
fundamental-mode なし

各モードによりどのような機能(キー操作)があるかは、次の方法でわかる。

◆Emacs HTML モード

HTML を編集するのに適したモード。

◆*scratch*

次のような画面が表示されたら、それを編集してはならない。
;; This buffer is for notes you don't want to save, and for Lisp evaluation.
;; If you want to create a file, visit that file with C-x C-f,
;; then enter the text in that file's own buffer.



-EEE:---F1  *scratch*      All L5     (Lisp Interaction)-------------

日本語訳:
;; このバッファは、保存する必要がない注意事項表示とLisp 評価のためのバッファです。
;; もしファイルを作成したいなら、C-x C-f を使ってファイルを開きなさい。
;; そして、ファイルのバッファへテキストを打ち込みなさい。



-EEE:---F1  *scratch*      All L5     (Lisp Interaction)-------------

このような表示がなされたら、画面の指示に従い、C-x C-f でファイル を開くこと。

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

★練習問題(1001) ことえりのバックスラッシュ入力

次のようにして、「ことえり」の設定を確認しなさい。そして、キーボードの 「¥」でバックスラッシュが入力されるように設定しなさい。

★練習問題(1002) .forwardの設定と確認

この練習問題をする前に、必ず ~/.forwardによる電子メールの転送 を読み、働きと危険性を理解しなさい。失敗すると、電子メールが失われたり、 メールサーバに過大の負荷をかけることになる。

coins 以外に日常的に読み書きするメール・アカウントがある人は、毎日 coins に届いたメールを確認する方法として~/.forward を設定して、転送する 方法が考えられる。そのようにしたい人は、そうしなさい。

~/.forward は、emacs でテキスト・ファイルとして作成するとよい。

$ emacs ~/.forward [←]
設定が完了したら、必ず who@coins.tsukuba.ac.jp にメールを書き、 ~/.forward の機能がうまくうまく動いていることを確認しなさい。 (whos + 学籍番号下7桁)のログイン名) メールがループしないことを確かめなさい。

★練習問題(1003) psコマンド

手引き 2.3.1 参照The Unix Super Text 第10章 参照

ps コマンドを使って、プロセスの一覧を表示しなさい。

$ ps [←]

★練習問題(1004) psコマンドのオプション

ps コマンドには、様々なオプションを与えることができる。 以下は、-l オプションをを与えたものである。
$ ps -l [←]
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
a
all。他人のプロセスも含めて全てのプロセス。
l
long。長い表示。
u
長い表示。
U user (大文字)
ユーザ名 user のプロセスだけ
x
端末無しのプロセスの表示
ux
u と x の組み合わせ
BSD 系の ps (MacOSX, Linux含む) では、オプションの「-」を省略できる。た とえば、次の2つは、同じ意味である。このことを確かめなさい。
$ ps l [←]
$ ps -l [←]

他のオプションについて、man ps を見て見なさい。

★練習問題(1005) psコマンドとlvコマンド

ps コマンドに a オプションを付ける等して、プロセス数が多くなると画面に 入り切らなくなる。この時には、lv コマンドと組み合わせるとよい。
$ ps aux | lv [←]
この方法を、確かめなさい。lv コマンドについては、 手引き 2.3.14 参照lv コマンド を参照しなさい。q(終了)、次のページへの移動(スペースキー)、 ページを戻る(b)は、必ず覚えなさい。

★練習問題(1006) psコマンドで横長の表示

ps ux や ps aux では、MacOSX 関連のプロセスの表示が切れてしまう。 w コマンドを使ってより多くの情報を表示さててみなさい。
$ ps aux [←]
$ ps auxw [←]
あるいは、iTerm の画面を横幅を広げて ps コマンドを打ちなさい。 横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。

★練習問題(1007) topコマンド

top コマンドで、「重たい」プロセスを表示しなさい。 「重たい」プロセスとは、CPU時間を大量に消費しているプロセスや メモリを大量に消費しているプロセスのことである。 終了するには、小文字の q を打つ。^C でもよい。
$ top [←]
$ top -o cpu [←]
(CPU を消費している順)
MacOSX では、top コマンド自分自身が「重たい」と認識される。 その場合は、top コマンドが表示を変更する頻度を下げる。
$ top -s 4 -o cpu [←]
man top でマニュアルを表示して、-o オプションと -U の使い方を 調べなさい。そして、メモリの利用順 (rsize) で表示しなさい。 -U オプションで自分自身のプロセスだけを表示しなさい。
$ top -U $USER [←]

★練習問題(1008) pstreeコマンド

pstreeコマンドを実行しなさい。それでプロセスの親子関係により木構造が作 られていることを確認しなさい。
$ pstree [←]
$ pstree | lv [←]
iTerm の画面の横幅を広げると見やすい。

★練習問題(1009) 「アクティビティモニタ.app」の利用

「ユーティリティ(/Applications/Utilities/)」にある 「アクティビティモニタ.app(Activity Monitor.app)」 を動作させ、プロセスの一覧を表示させなさい。
$ open "/Applications/Utilities/Activity Monitor.app" [←]
または、Finder で、「移動」メニューから「ユーティリティ」を 選択。「アクティビティモニタ.app」のアイコンをダブルクリック。

アクティビティモニタの表示

アクティビティモニタの表示

表示されるプロセスの範囲を変えてみなさい。

top コマンドの表示と比較しなさい。

★練習問題(1010) ^Cによる強制終了

^C (Control+C) によるプロセスの強制終了を行いなさい。
$ cat [←]
aaa[←]
aaa
bbb[←]
bbb
^C
$ []
なお、^C と 入力の終わりを意味する ^D は働きが異な る。どちらでもプロセスが終了することがあるが、強制終了したい場合には、 ^C を使いなさい。

★練習問題(1011) ^Cによる強制終了(2)

次のような終了するのに時間がかかるプログラムを実行してしまって、途中で やめたくなった時に ^C で終了するように練習しなさい。
$ ls -R ~/Library [←]
(大量の表示、省略)
^C
$ []

★練習問題(1012) ^Cが効かないプログラム

端末 (iTerm) の中で実行されるプログラムのうち、次のようなプログラムは、 ^C でも終了しない。このことを確認しなさい。 注意: C-c は、C-x と同じように、2ストローク以上で1つの意 味をなすことが多い。何もない状態でC-c を打った場合には、 C-g によりキャンセルしなさい。

★練習問題(1013) killコマンド

手引き 2.3.2 参照The Unix Super Text 10.5節 参照

kill コマンドを使って、プロセスを殺してみなさい。

  1. iTerm 等で、端末を2個つ表示し、それぞれシェルを実行する。
  2. 片方の端末で、lv コマンドでファイルを表示する。
  3. もう片方の端末で、ps コマンドで lv コマンドから実行された プロセスの PID を調べる。
  4. kill コマンドで lv コマンドから実行されたプロセスを殺す。

lv コマンドの代わりに、bash からなるプロセスを殺すとどうなるか調べなさい。

★練習問題(1014) killコマンドで他人のプロセスを殺そうとしてみる

ps コマンドで調べたプロセスのうち、他人のプロセス(root、その他) を kill コマンドで殺そうとしてみなさい。何がおきるかを観察しなさい。どのよ うなエラーが生じるか。

★練習問題(1015) grep

grep は、引数で指定されたファイル、または、標準入力を検索 し、引数で指定された文字列が存在する行だけを表示するプログラムである。 以下の例は、ファイル「/etc/passwd」の中にある「root」とい う文字を含む行を表示している。
$ grep root /etc/passwd  [←]
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ []
同じことを、パイプを使っても実行することができる。
$ cat /etc/passwd  | grep root [←]
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ []
grep コマンドを使って次のようなことを行ってみなさい。

grep コマンドには次のようなオプションを指定することができる。

-v
その行が含まれないものを表示する
-i
大文字小文字を無視する
この動きを確認しなさい。

★練習問題(1016) ps コマンドと grep コマンド

ps コマンドで大量の表示の中から特定のプログラムを見つけたい時には、 grep コマンドと組み合わせて用いると便利である。次の例は、cat コマンドか らなるプロセスを探している。
$ ps ux | grep cat [←]
$ ps uxw | grep cat [←]
この機能を利用して見なさい。 次のようにして、Finder や Dock のプロセスの PID を調べなさい。
$ ps uxw | grep Finder [←]
$ ps uxw | grep -i finder [←]
$ ps uxw | grep Dock [←]
$ ps uxw | grep -i dock [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。

★練習問題(1017) ps | grep、kill

次の一連の操作を行いなさい。
$ ps uxw | grep cat [←]
$ kill  [←]

★練習問題(1018) MacOSX Command+Option+Esc

MacOSX で、Command+Option+Esc キーを押すと 「アプリケーションの強制終了」のウインドウを表示できる。

(まず、Commandキー(Command) と Option キーを左手で押し、 押しっぱなしの状態で、右手で Esc キーを一度押して離す。)

Command+Option+Escキー

「アプリケーションの強制終了」のウインドウ

この機能を確認しなさい。なお、この機能では、ウインドウを開くプロセスし か強制終了できない。iTerm の中で実行されるプロセスや端末とは結びついて いないプロセスを強制終了するには、kill コマンドを使うしかない。

★練習問題(1019) sshコマンドによる遠隔ログイン

手引き 9.1節 参照手引き 2.6節 参照The Unix Super Text 29.3.1項 参照。 ssh コマンドを利用して、別のコンピュータに遠隔ログインしてみなさい。
host1$ ssh hostname[←]
Password: (パスワードを打つ。画面には表示されない。)[←]
hostname$ []
hostname は、 cosmos10 など、接続したいコンピュータの名前を入れる。

実習では、別のコンピュータとしては、次のものを利用しなさい。

これらのホスト名には、正確には、coins.tsukuba.ac.jp を付ける。
$ ssh cosmos10.coins.tsukuba.ac.jp [←]
$ ssh www.coins.tsukuba.ac.jp [←]
実習室内では、coins.tsukuba.ac.jp を省略できる。
$ ssh cosmos10 [←]
$ ssh www [←]

一番最初に接続する時には、次のような警告(Warning:)が表示される。

cosmos09:~ yas$ ssh cosmos10[←]
The authenticity of host 'cosmos10 (130.158.86.150)' can't be established.
RSA key fingerprint is 44:08:af:d4:56:7d:b9:20:25:d2:dd:0c:03:27:a4:d4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'cosmos10,130.158.86.150' (RSA) to the list of known hosts.
Password: パスワード [←]
Last login: Thu May 20 15:02:38 2010 from sharon.hlla.is.tsukuba.ac.jp
cosmos10:~ yas$ []
この fingerprint は、接続先のホストの公開鍵のハッシュ値である。これが 主なホストの公開鍵のハッシュ値 と同じことを確認してから yes と打ち込みなさい。

遠隔ログインが成功すると、ログイン先でシェルが実行される。シェルのプロ ンプトには、(多くの場合)ホスト名が含まれているので、遠隔ログイン後に は、プロンプトが変化する。シェルを終了(exitコマンド)すると、遠隔ログイ ン自身も終了する(ログアウトする)。

ssh で遠隔ログインした後に、シェルのプロンプトが変わることを確認しなさ い。また、exit コマンドを実行すると、ログアウトできることを確認しなさい。

  1. iTerm で端末を開く。シェルが実行される。
  2. プロンプトを観察する
  3. ssh で遠隔ログインする
  4. プロンプトを観察する
  5. exit コマンドで、遠隔ログインのログインシェルを終了する(ログアウトする)
  6. プロンプトを観察する
  7. exit コマンドで、iTerm で最初のシェルを終了する。

★練習問題(1020) ~/.ssh/known_hostsの観察

一度遠隔ログインしたホストについては、~/.ssh/known_hosts にそのホストの 公開鍵が保存される。そのことを確認しなさい。
$ cat ~/.ssh/known_hosts [←]
cosmos10,130.158.86.150 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAspu6phmu41bhJX6s6pY6
+OgH+D0wY52m68NsfM+6prj64yhbW3I9s2MJT/gmBt6+dzY/jFYMQUMPtgESveYlgj72gJ0OrKAkhfWF
POWfeyXoULDy+1qroPLBxpWs4VMuohkXinmegcaUFnwedx1nE8i3dCKsgKQDsIHZb8K+oZkDzbWpHLpc
iY+9aNwIgo9YB9+jnB/azTpLx+DwT0yw/0xezAN4rQiJi3CyHN/Dn7zMX7E8xslVnQEjAfsTIz784/tH
+ffqrEMpm6i62teW1Q7p8zhq2dN2P1w1PBVtEBUd2GpnbpukB6FmLthVU7natkNWSMWC2F2Y8sP8T2+N
iQ==
$ []

★練習問題(1021) ssh -l オプションや user@remotehost の形式によるログイン

ログイン先とログインもとでユーザ名が異なる時には、次のように、-l オプショ ンに続きログイン先のユーザ名を使う。

host1$ ssh remotehost -l user[←]
Password: (パスワードを打つ)[←]
remotehost$ []
または、「@」の前にログイン先のユーザ名を指定する。
host1$ ssh user@remotehost[←]
Password: (パスワードを打つ)[←]
remotehost$ []
この -l オプションを利用する方法や @ を利用する方法で遠隔ログインを行っ てみなさい。(注意:同じ場合でも、あえて指定することもできる。)

★練習問題(1022) 遠隔ログインによるコマンドの実行

遠隔ログインを行い、次のコマンドを実行しなさい。そして、遠隔ログインを 行っていない時(ローカルでの実行結果)と比較しなさい。 この実習では、端末を2枚開き、片方の端末で遠隔ログインを行い、もう片方 ではそのまま実行し、2つの結果を比較する。

★練習問題(1023) 遠隔ログインによるifconfigコマンドの実行

ifconfig コマンドを利用すると、コンピュータの IP アドレスを調べることができる。 ssh による遠隔ログインの前後で ifconfig コマンドの結果を比較しなさい。
(sshを実行する、iTtermを実行した直後。)
$ ifconfig en0 [←]
(inet の次に iMac の IP アドレスが表示される。)
$ ssh www [←]
$ ifconfig bond0 [←]
(inet の次に www サーバの IP アドレスが表示される。)
$ exit [←]
$ []

★練習問題(1024) ssh+ps+kill

★練習問題(1025) 学類 Web サーバのアクセス・ログの観察

次の手順で、学類 Web サーバに保存されている アクセス・ログを観察しなさい。 ログは、次のような形式をしている。
130.158.83.140 - - [17/May/2013:18:39:29 +0900] "GET /~yas/coins/l
iteracy-2013/ HTTP/1.1" 200 5454 "-" "Mozilla/5.0 (Macintosh; Inte
l Mac OS X 10.7; rv:20.0) Gecko/20100101 Firefox/20.0"
この例では、一番左に表示されているものは、クライアントの IP アドレスで ある。その他に、日付やどの URL をアクセスしたか、転送したバイト数、 ブラウザの種類も表示されている。

自分自身で、情報科学類の Web ページをアクセスした時に、自分が使っている iMac の IP アドレスが表示されることを確認しなさい。

次のようにして、 grep コマンド で IP アドレスを検索する方法もある。

$ grep 130.158.83.140 access上のlsの結果で置き換える [←]
注意: IP アドレスとしては、「130.158.83.140」ではなく、 練習問題(1023) を参考にして自分自身が使っている iMac のものを使いなさい。

★練習問題(1026) ssh、ホストの公開鍵の確認

次のようなコマンドで、そのコンピュータのホストの公開鍵を表示してみなさ い。
$ cat /etc/ssh_host_rsa_key.pub [←]
また、次のようにしてハッシュ値を表示しなさい。
$ ssh-keygen -l -f /etc/ssh_host_rsa_key.pub [←]

★練習問題(1027) ssh、known_hosts

ssh コマンドで遠隔ログインをし、ログアウトしなさい。次のようなファイル やディレクトリが作られたこと(存在すること)を確認しなさい。
$ ls -ld ~/.ssh [←]
<結果省略>
$ ls -l ~/.ssh/known_hosts [←]
<結果省略>
$ []
この ~/.ssh/known_hosts には、接続先のホストの公開鍵が 含まれている。これを表示しなさい。
$ cat ~/.ssh/known_hosts [←]
<結果省略>
$ []
また、公開鍵のハッシュ値を表示しなさい。
$ ssh-keygen -l -f ~/.ssh/known_hosts [←]
<結果省略>
$ []

★練習問題(1028) IPアドレスによる ssh コマンドの利用

dig コマンド で接続するホストの IP アドレスを調べなさい。 ssh コマンドの引数としてホスト名の代わりに IP アドレスを指定しなさい。

★練習問題(1029) SSLの証明書の表示

Firefox を使って、Web サーバが提示している証明書を表示してみなさい。
  1. SSL のページを開く。https://www.coins.tsukuba.ac.jp/ce/ 等。
  2. ロケーション・バー(ウィンドウの上部のURL が表示されている部分)の 「https」の左側に表示されている錠のアイコンをクリックする。
    Firefox、ロケーション・バー、錠、このWebサイトは認証されています、認証局、この Web サイトとの通信は第三者に盗み見られないように暗号化されています。詳細を表示。
  3. 開かれたウインドで、「詳細を表示」ボタンを押す。
  4. 開かれたウインドで、「セキュリティ」タブを選ぶ。
  5. 「証明書を表示」ボタンを押す。 「証明書ビューア」のウィンドウが開く。
  6. 「詳細」を開く。
次の項目を調べなさい。

★練習問題(1030) Firefoxのルート認証局

Firefoxが保持しているルート認証局のリストを表示しなさい。
  1. 「Firefox」メニューの「環境設定」を選ぶ
  2. 「詳細」ボタンを表示する。
  3. 「暗号化」タブを開く
  4. 「証明書を表示」ボタンを押す
  5. 「認証局証明書」タブを選ぶ
このリストの中に 練習問題(1029) SSLの証明書の表示 で表示したルート認証局が含まれているか確認しなさい。

★練習問題(1031) Emacs C-k

Emacs で C-k は、カーソル以降、行末まで削除する。行末で C-k を打つと、 改行コードを削除する。この機能を確認しなさい。

★練習問題(1032) Emacs *scratch* バッファでの計算

次のような方法で、「*scratch*」 バッファを表示しなさい。

方法(1)

方法(2) 下から2行目の白黒反転した行(モードライン)に次のような表示があることを 確認しなさい。
*scratch*      All L行番号     (Lisp Interaction) ----

「*scratch*」 バッファで、次のようなキー操作を行ってみなさい。

;; This buffer is for notes you don't want to save, and for Lisp evaluation.
;; If you want to create a file, visit that file with C-x C-f,
;; then enter the text in that file's own buffer.

(+ 1 2 3)^J
(- 100 10)^J
(* 100 10)^J
(/ 5 2)^J
(/ 5.0 2)^J
emacs-major-version^J
(getenv "HOME")
注意: 行末の括弧の右の^Jは、Control + J の意味。

★練習問題(1033) Emacs 拡張子によるモードの変化

Emacs C-x C-f で、次のような拡張子を持つファイルを作成してみなさい(内容 は空でもよい)。 モードラインの表示がどうなるか確かめなさい。M-x describe-mode で、 モードの説明を表示しなさい。M-x describe-bindings で、どのような キー操作があるか調べなさい。

★練習問題(1034) ssh、ポート番号の指定

ssh コマンドでは、標準的にはサーバ側(接続を受ける方、遠隔側)では、ポー ト番号 22 が利用される。22 以外のポート番号を利用している時には、-p オ プションによりその番号を指定することができる。-p オプションの動作を確認 しなさい。

★練習問題(1035) sshにおける公開鍵による認証

ssh-keygen コマンドを使って、公開鍵と秘密鍵の組を生成しなさい。鍵の種類 としては、rsa 、または、dsa を使うとよい。生成に成功すると、標準では、 ~/.ssh というディレクトリの下に、2つのファイルが作られる。

前者に、秘密鍵、後者に公開鍵が保存される。秘密鍵の方は、パスフレーズを 鍵とした「対称暗合系」で暗号化されて保護される。パスフレーズは、長く (10-30文字)にする。(この課題で、うまく動作していることを確認するために は、通常のログインのパスワードとは必ず違うものにしなさい。)

ssh でログインする時に、生成した鍵の組を使って認証を行いなさい。 それには、クライアント側に秘密鍵を置き、サーバ側の ~/.ssh/authorized_keys (OpenSSHの場合)に、公開鍵を設定すればよい。 接続時には、秘密鍵を暗号化するために使ったパス レーズを打つ込む。(通常の通常のログインのパスワードを打つことはない。)

coins 内で実験する時には、クライアントもサーバも同じ ~/.ssh を参照する。 したがって、authorized_keys を作成するには、次のようにする (RSAかDSAのどちらか一方を選んで実施する。 両方行った場合、後から行った設定が有効になる。)。

rsaの場合:

$ cd ~/.ssh [←]
$ ls id_rsa* [←]
id_rsa          id_rsa.pub
$ cp id_rsa.pub authorized_keys [←]
dsaの場合:
$ cd ~/.ssh [←]
$ ls id_dsa* [←]
id_dsa          id_dsa.pub
$ cp id_dsa.pub authorized_keys [←]
$ []

authorized_keys を作成する前には、ssh で接続する時に次のように 「パスワード Password 」が聞かれる。

$ ssh cosmos10 [←]
Password:
authorized_keys を作成した後には、ssh で接続する時に次のように 「パスフレーズ passphrase」が聞かれる。
$ ssh cosmos10 [←]
Enter passphrase for key '/home/prof/yas/.ssh/id_rsa': 
これに対して、ssh-keygen でパスフレーズを打ち込む。(公開鍵による認証に 失敗すると、通常のパスワードによる認証に落ちるのが一般的である。システ ムによっては、認証方式に制限を加えていることがある。)

★練習問題(1036) ssh-agentの利用

以下のようにして、ssh-agent を利用してなさい。
$ ssh-agent tcsh [←]
$ printenv SSH_AUTH_SOCK [←]
$ ssh-add -l [←]
		ssh-agentが有効なこと確認
$ ssh-add [←]
                鍵の登録
$ ssh-add -l [←]
	        鍵が登録されたことの確認
$ ssh remote1 [←]
$ ssh remote2 [←]
$ ssh remote3 [←]
                利用
$ exit [←]
                ssh-agentが有効な tcsh の終了
$ []
ssh-agent にコマンド(上の例ではtcsh)を与える代りに、csh の環境変数を設 定させるコマンドを出力させ、eval で実行する方法もある。
$ eval `ssh-agent` [←]
$ printenv SSH_AUTH_SOCK [←]
<以下同じ>
ただし、この方法ではログアウトした時に ssh-agent のプロセスが残ること がある。そうならないように ログアウト時に実行させるプログ ラムで殺す(ssh-agent -k)ようにする。

★練習問題(1037) MacOSX キーチェーンアクセス(Keychain Access.app)

キーチェーンアクセスは、MacOSX に付属している、パスワード等の機密情報を 暗号化して保存するプログラムである。 暗号化には、利用者が指定したパスワードを鍵として使う。 標準では、次のファイルに、暗号化された機密情報を保存している。 このファイルが存在することを ls -l や Finder で確認しなさい。

「キーチェーンアクセス.app」のパスワードとログインの時に打つパスワード を同じにしていると、自動的に機密データの暗号を解いてアプリケーションに 渡す機能がある。注意すべきことは、ログイン・パスワードを変更しても、 「キーチェーンアクセス.app」のパスワードは変更されないことである。 活用するには、ログイン・パスワードを変更したら、 「キーチェーンアクセス.app」のパスワードも変更するとよい。

何も使っていなければ、「キーチェーンアクセス.app」のパスワードは、初期 パスワードのままになっている。重要な情報を保存していなければ、上記のファ イルを削除し、ログインしなおすことで、リセットするとよい。

次のような MacOSX のアプリケーションが、「キーチェーンアクセス.app」を 使って機密情報を暗号化して保存することができる。

「キーチェーンアクセス.app」を実行して、どのような機密データが保持され てるかを見てみなさい。

次の手順でパスワードを暗号化して保存しなさい。

  1. 保存前に最終更新時刻を調べる。
    $ ls -l ~/Library/Keychains/login.keychain [←]
    
  2. キーチェーンアクセスを実行する。
    $ open "/Applications/Utilities/Keychain Access.app" [←]
    
  3. 「ファイル」メニューから「新規パスワード項目」を選ぶ。
  4. 開かれたウィンドウで、次の項目を埋める。
  5. 項目を埋めたら、「追加」ボタンを押す。
  6. 先ほど追加した項目が、表示される。
  7. ダブルクリックすると、ウィンドウが開かれ、「キーチェーン項目」と 「アカウント名」が表示される。
  8. さらに、「パスワードを表示」のチェックボックスを押すと、パスワード が表示される。この時、必要ならばログインのパスワードを打ち、「常に許 可」、「拒否」、「許可」から選ぶ。
  9. 保存後に最終更新時刻を調べる。
    $ ls -l ~/Library/Keychains/login.keychain [←]
    

★練習問題(1038) ディスクユーティリティ.appによるディスクイメージの作成

MacOSX の「ディスクユーティリティ.app (Disk Utility.app) 」は、ハードディス クを管理するためのアプリケーションである。通常は、実際に対して「フォー マット」という作業を行い、ハードディスクを分割して「ファイル」や「ディ レクトリ」を通じてアクセス可能にする。

急に電源が落ちた時などには、ハードディスクの状態が「ファイル」や「ディ レクトリ」としては正常にアクセスできなくなることがある。「ディスクユー ティリティ.app」は、このような時に不整合を修復する 機能がある。コンピュータの電源を入れた時に自動的に実行されることもある。

「ディスクユーティリティ.app」を使うと、1つの大きなファイルを、1個の ハードディスクのように扱うことができる。このように、ディスクに見立てる ことができるデータのことを「ディスク・イメージ」という。「ディスクユー ティリティ.app」を使うと、ディスク・イメージをファイルに保存することが でき、また、ファイルに保存されたディスク・イメージを、「マウント」とい う操作を行い、通常のアプリケーションからファイルとディレクトリの集合と してアクセス可能にする。

MacOSX では、ディスク・イメージを含むファイルの拡張子は、「.dmg」である。

自分で CD-R や DVD-R にファイルを保存する時には、まず、 「ディスクユーティリティ.app」を使って ディスク・イメージをファイルに保存する方法が一般的である。

次のような操作を行い、ディスクイメージを作成し、利用してみなさい。

★練習問題(1039) ディスクユーティリティ.appによる暗号化されたディスクイメージの作成

MacOSX の「ディスクユーティリティ.app (Disk Utility.app) 」を 使って、暗号化されたディスク・イメージを作成しなさい。 暗号化の方式としては、AES が使われることを確認しなさい。

★練習問題(1040) openssl コマンド

openssl コマンドには、次のような機能が含まれている。 man コマンドを用いてこれらの機能を調べなさい。 また、これらの機能を実行してみなさい。

★練習問題(1041) gpg2 コマンド

gpg2 コマンドを使ってみなさい。

★練習問題(1042) openssl sha1コマンド

次の手順で、SHA-1 によりハッシュ値を計算してみなさい。 引数として、sha1 の代わり md5 と指定して、MD5 によるハッシュ値を計算し なさい。

★練習問題(1043) PuTTY、その他のプログラムの利用

手引き 9.1節 参照。 PuTTYやTera Termは、Windows で動作するssh のクライアントである。これら のプログラム、または、類似のプログラムを用いて、coins の外部からcoins 内のコンピュータに接続しなさい。

★練習問題(1044) VPNの利用

VPN (Virtual Private Network) とは、 インターネットという誰もがアクセス可能なネットワークを利用しながら、 事実上専用線(private network) を使っているように安全な通信路を 提供する事実である。VPN を実現するためには、暗号化の技術が使われている。

coins でも、VPN 機能を提供している。 手引き 9.3節 参照。 この機能を利用しなさい。

★練習問題(1045) Thunderbird のディジタル署名と暗号化機能

Thunderbird では、ディジタル署名の機能と暗号化機能を利用することが出来る。 これを動作させてみなさい。

■課題10 暗号、SSH、Webサーバ・アクセスログ、プロセス、電子メールの転送

以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

(1) ssh コマンドを使って www (www.coins.tsukuba.ac.jp) にログインしなさ い。次のコマンドを www で実行するとで、ssh にログインできたことを示しな さい。レポートには、www での次のコマンドの実行結果を含めなさい。

(2) 練習問題(1025) を行いなさい。 Web サーバが生成しているアクセスログから、自分自身がアクセスした記録を 抜き出しなさい。それには、まず自分が利用しているコンピュータの IP アド レスを調べ、アクセスログからその IP アドレスが含まれている行を抜き出す とよい。アクセスログのうち、数行をレポートに含めなさい。grep コマンドを 使っても使わなくてもよい。

(3) ssh で最初にあるホストに接続する時に、次のような表示がなされることがある。

RSA key fingerprint is 44:08:af:d4:56:7d:b9:20:25:d2:dd:0c:03:27:a4:d4.
この表示の意味を、今日の授業内容の用語を用いて簡単に説明しなさい。 2回目以降は、この表示がなされない。その理由を簡単に説明しなさい。

(4) 以下の方法で、ps コマンドと kill コマンドを実行し、その結果をまとめ なさい。

  1. iTerm で端末を2つ開く。
  2. 片方の端末で強制終了させてもよいプロセスを作成しなさい。プロセスの 作成方法としては、たとえば、lv コマンドでテキスト・ファイルを表示する方 法が考えられる。
    $ lv ~/.bashrc [←]
    
  3. もう一方の端末で、そのコンピュータで動作している自分自身のプロセス だけを ps コマンドで表示しなさい。端末と結びついていないプロセスも含め なさい。
  4. もう一方の端末で、2. で作成したプロセスを表示しなさい。 grep コマンドと組み合わせることが望ましい。
  5. kill コマンドを使って、2. で作成したプロセスを殺しなさい。
  6. ps コマンドの結果を示し、4. でプロセスがきちんと死んだこと(表示さ れないこと)を示しなさい。

(5) 電子メールの転送について、当てはまる行の先頭に yes, 当てはまらない 行の先頭に no と記述しなさい。

(a) coins 以外に電子メールのアカウントがある。
(b) coins のメールを毎日読む。
(c) ~/.forward の機能を理解した。
(d) ~/.forward を設定した。

(6) 情報科学類の学生は、coinsに届いたメールを毎日確認する必要がある。あ なた自身がどのようにして毎日確認するかを書きなさい。

(7) 手引きの次の部分を読みなさい。

そして次の次の項目について簡単に説明しなさい。

(8) [加点] 練習問題(1025) では、coins の通常の Web サーバのアクセスログを調べている。coins には、通常の Web サーバの他 に、SSL 対応の Web サーバがある。SSL 対応の Web サーバについて、 練習問題(1025) と同じことを行いなさい。SSL 対応の Web サーバのアクセスログは、次のディレクトリの下にある。

(9) [加点] 選択課題。次の課題を1つ以上行いなさい。

(9a) [加点] sshコマンド、PuTTY、Tera Term、その他の ssh クライアントを 用いて、「自宅」からcoins のコンピュータに接続しなさい。そのことを示す ために、レポートには、どのようなプログラムを使ったのか、ログイン後のコ マンドの実行結果等を含めなさい。

(9b) [加点] sshコマンド、PuTTY、Tera Term、その他の ssh クライアントを 用いて「公開鍵を用いた認証」により、coins のコンピュータに接続しなさい。 そのことを示すために、レポートには、どのようなプログラムを使ったのか、 公開鍵の生成手順、クライアント側の設定、サーバ側の設定を含めなさい。

(9c) [加点] ssh-agent を利用して、パスワード入力なしにリモート・ログイ ンできるようにしなさい。そのことを示すために、レポートには、次のコマン ドの実行結果を含めなさい。

(9d) [加点] 自宅から VPN 機能を使って coins のコンピュータに接続しなさ い。そのことを示すために、レポートには、どのような設定を行ったか、ログ インしたコンピュータの名前、who am i コマンドの結果(VPNを使った時と使わ なかった時の比較)等を含めなさい。

(9e) [加点] openssl コマンド、または、gpg2 コマンドを用いて、ファイルの 暗号化と復号化を行いなさい。ディジタル署名の付加、および、検証を行いな さい。それらが実現されていることがわかるように、シェルとの対話をレポー トに含めなさい。

(9f) [加点] 「ディスクユーティリティ.app」を用いて暗号化されていないディ スク・イメージと暗号化されてたディスク・イメージの2つを作成し、次のよ うにして暗号化の効果を確認しなさい。

  1. それぞれに、同じ内容を含むテキスト・ファイルをコピーする。
  2. ディスク・イメージをアンマウントする。
  3. ディスク・イメージを含むファイルに対して、
     $ strings ディスクイメージを含むファイル | grep 文字列
    
    ここで「文字列」には、1 でコピーしたテキスト・ファイル の内容を指定する。コマンドラインからは漢字を打つことが難しいので、 「文字列」には、ASCIIによる簡単なものを指定しなさい。

    この結果、暗号化されていないものにはその文字列が表示され、暗号化されて いるものには表示されないことを示しなさい。

strings コマンドは、文字列データと文字列以外のデータが混在したファイル から文字列だけを抜き出すコマンドである。ただし、文字列としては、ASCII 文字列しか扱えず、また、完全でもない。strings コマンドで表示されなかった からといって、文字列が暗号化されているとは厳密には言えない。

(9g) [加点] 練習問題(1037) を行いなさい。 保存前の ~/Library/Keychains/login.keychain の最終更新時刻と大きさ、 保存後の ~/Library/Keychains/login.keychain の最終更新時刻と大きさ、 保存した項目のキーチェーン項目を含めなさい。


Last updated: 2013/05/27 12:07:04
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>