ターミナルからプライベートIPアドレスとMACアドレス、ルーティングテーブルを確認する

自分のlaptopのプライベートIPアドレスがどのように割り当てられているか、調べる。

ターミナルから$ ifconfig をうつ。複数のインターフェースが表示される。

f:id:bambinya:20150404134834p:plain

上記は「lo0」「gif0」「stf0」「en0」が表示されている。

他にも「en1」「en2」「p2p0」「awdl0」「bridge0」「utun0」が表示された。

 

各インターフェースの名前と役割

lo0(loopback)

ネットワークのテストに使えるよう用意された仮想インターフェース、NICがなくても、このloは表示される。inetの127.0.0.1IPアドレスとして自動で割り当てられる。

 

gif0(generic tunnel interface)

IPv6/IPv4トンネリングを行うときに使うインターフェース。IPv6/IPv4トンネリングとは、IPv4(またはIPv6)をサポートするネットワークに、IPv6(またはIPv4)のパケットをルーティング(送受信)する仕組み。例として、IPv4のみサポートしているネットワークにIPv6のパケットをルーティングする場合は、IPv6のパケットにIPv4パケットのヘッダを付加(カプセル化)して、IPv4のネットワークにパケットを送信することができる。2つのルーター間でトンネリングの設定を行う場合、このインターフェースに、自分と相手のIPv4アドレスと、それに対するIPv6アドレスを設定しておく。

規格の詳細(gif(4) - NetBSD Manual Pages)

 

stf0(6to4 tunnel interface)

gifIPv6パケットをIPv4パケットにカプセル化でき、その逆も可能であるのに対し、これはIPv6パケットをIPv4ネットワークにルーティングするためのインターフェース。

規格の詳細(stf(4) - NetBSD Manual Pages)

 

en0(Ethernet 0)

enの後に続く「0」「1」の番号は認識した順に割り振られる。イーサネットはLAN規格を指すので、自分のlaptopのIPアドレスMACアドレスはこのインターフェースに書かれている。上記のスクリーンショットでは

MACアドレスは「ether 80:e6:50:11:a5:6c」

IPアドレスは「inet 192.168.0.2」

であることがわかる。ブロードキャストアドレス(LAN内すべての端末に電気信号を送るアドレス)は「broadcast 192.168.0.255」。

 

ネットワークユーティリティからも各インターフェースの情報が見られる。

f:id:bambinya:20150404233255p:plain

 

MACアドレスのベンダーIDを調べる 

MACアドレスのベンダーID「80:e6:50」を IEEE-SA - Registration Authority MA-L Public Listing で検索する。コロンはダッシュに変換する。

f:id:bambinya:20150404232125p:plain

検索結果、端末のベンダーが表示される。

f:id:bambinya:20150404232230p:plain

 

IPアドレスの種類 

グローバルIPアドレス:インターネット上で使えるアドレス。

プライベートIPアドレス:LAN内で使えるアドレス。

  • 10.0.0.0 - 10.255.255.255 (Aクラスの最初の方)
  • 172.16.0.0 - 172.31.255.255 (Bクラスの最後の方)
  • 192.168.0.0 - 192.168.255.255 (Cクラスの最初の方)

ネットワークアドレス:ネットワーク全体を表すアドレス。

ブロードキャストアドレス:LAN内の端末に電気信号を送るためのアドレス。

ループバックアドレス:自分自身を表すアドレス。ローカルホスト。127.0.0.1

 

ルーティングテーブルを見る

ターミナルからルーティングテーブルを見るためには、$ netstat -rn を打つ。-rはルーティングテーブルの表示。-nはIPアドレスを数字で表示する。

f:id:bambinya:20150405205043p:plain

 

heroku cedar-10が2015年11月以降使えなくなるそうだ

heroku にpushしたら、実行環境(runtime environment)が古いので、バージョンアップしてくださいと言われた。

f:id:bambinya:20150323203239p:plain

最新のCedar-14は、Ubuntu OS のver 14.04 を採用している。プロジェクトで使用しているRubyは2.1.0なので、Cedar-14にするには、2.1系の最新版(2.1.5)にしないといけない。

各スタックと、対応している言語のバージョンは以下から見られる。

devcenter.heroku.com

 

 Rubyのバージョンを上げる

$ brew upgrade ruby-build すると、インストール可能なRubyのバージョンが更新される。今回は2.2.1にアップグレードした。Gemfileのバージョンも修正する。

f:id:bambinya:20150324220300p:plain

f:id:bambinya:20150324220307p:plain

 

まずはステージングで試そう

herokuのブログにCedar-14に変更する方法が書いてある。

(以下は引用。 Migrating to the Celadon Cedar-14 Stack | Heroku Dev Center より)

Before upgrading an existing application to Cedar-14, you should test the upgrade on a Cedar-14 staging app that is not getting production traffic. You can create a staging app to use for testing, let’s call the git remote heroku-cedar-14 and the app cedar-14-app:

 

既存のアプリケーションをCedar-14にアップグレードする前に、本番からのアクセスがないステージングアプリケーションを、Cedar-14にアップグレードして、テストしてみましょう。テストのためのステージングアプリケーションを作ることができます。gitのリモートブランチheroku-cedar-14を作って、heroku上のcedar-14-appというアプリケーションにデプロイできるようにしましょう。

 $ heroku create --remote heroku-cedar-14 --stack cedar-14 cedar-14-app-name

f:id:bambinya:20150323222140p:plain

本番と同じように

  • アドオン
  • 環境変数
  • config/secrets.yml
  • config/environments/staging.rb

等追加して、ステージングにデプロイしましょう。

 $ git push heroku-cedar-14 master
$ heroku run rake db:migrate --app cedar-14-app-name

デプロイ後、ステージングアプリケーションに問題がないか、確認しましょう。問題がなければ、本番もアップデートして良いそうです。

 

スタックの変更は非常に簡単

$ heroku stack で使用中のstackが表示

$ heroku stack:set cedar-14 で、cedar-14に変更

再び、$ heroku stack

f:id:bambinya:20150325215846p:plain

そして、$ git push してみる。変更がなくてもコミットできるんだ!

 $ git commit --allow-empty -m "Upgrading to Cedar-14"
 $ git push heroku master

以上で、Rubyのバージョンアップとstackのバージョンアップが完了でござるー!

 

 

デジタル証明書とデジタル署名について

SSLTLSでは、通信途中のデータの改ざんや、フィッシング詐欺(銀行や組織を装い、口座番号やクレジットカードを引き出す)を防ぐために、デジタル証明書とデジタル署名という技術を用いている。

 

デジタル証明書とは?

SSLサーバー証明書ともいう。配布されている公開鍵の、送り主(機関、銀行など)が信頼できることを証明するための仕組み。

デジタル証明書は認証局(CA:Certificate Authority)が発行するもので、通信相手が送ってきた証明書を、発行元の認証局に照会することで、通信相手の身元を確認することができる。証明書の内容は、通信相手の身元を表す情報と、照会した認証局の情報、通信相手が発行した公開鍵、暗号化されたデジタル署名、などである。

SSLの仕様上、悪意のある攻撃者が自ら認証局となって、証明書を発行することが可能である。これを防ぐために、最近では有力な商用CAが厳格な身元確認などの審査を要する「EV SSL証明書」の発行を行っている。

 

デジタル署名とは?

データが通信途中で改ざんされていないことを証明するための仕組み。一方向ハッシュ関数を用いる。一方向ハッシュ関数は、以下の特徴を持つ。

  1. 生成されるハッシュ値は、元の値が1ビットでも変わると異なる値になる。
  2. 生成されたハッシュ値から、元の値を逆算できない。これを一方向性という。
  3. 元のデータの長さに関係なく、生成されるハッシュ値の長さは一定である。

よく知られているハッシュ関数にはSHA-1MD5などがある。

 

クライアント(Webブラウザ)が通信相手(Webサーバー)を信頼するまでの流れ

通信前にサーバー側がしておくこと

  1. Webサーバー側が秘密鍵と公開鍵を生成する。
  2. 認証局に、公開鍵と各種証明書を含むCSR(certificate signing request:証明書署名要求)を送る。
  3. 認証局は審査を行った上で、デジタル証明書を発行する。デジタル証明書は次の情報を含む。公開鍵所有者情報秘密鍵で暗号化したデジタル署名(公開鍵と所有者情報を一方向ハッシュ関数ハッシュ値にし、認証局が発行した秘密鍵で暗号化したもの)
  4. Webサーバーは、認証局からデジタル証明書が送られてくるので、大切に保管する。

 

通信前にクライアント側がしておくこと(は何もない)

  1. サーバーから送られてくる証明書には、認証局秘密鍵で暗号化されたデジタル署名が含まれており、これを復号化するためには、認証局の公開鍵が必要である。主要な認証局の公開鍵は、認証局の証明書という形で、Webブラウザにプリインストールされている。証明書は以下の手順でブラウザから確認することができる。(写真みてちょ)

f:id:bambinya:20150320110512p:plain

f:id:bambinya:20150320110639p:plain

 

さっそく通信を開始しよう

  1. クライアントは、サーバーへ通信要求を送る。
  2. サーバーは、サーバー証明書をクライアントへ送る。
  3. クライアントは、デジタル署名の技術を用いて、デジタル証明書が認証局で発行されたものかどうかを確認する。サーバーのデジタル証明書には、サーバーが生成した公開鍵所有者情報デジタル署名(サーバーが生成した公開鍵と所有者情報をハッシュ値にして認証局秘密鍵で暗号化したもの)などが含まれている。一方、Webブラウザが事前に持っている認証局の証明書には、認証局が生成した公開鍵認証局情報認証局がデジタル署名に使用したハッシュ関数などが含まれている。
  4. クライアントは、認証局の証明書に含まれる公開鍵を用いて、サーバー証明書に含まれる、暗号化されたデジタル署名(ハッシュ値)を復号する。
  5. クライアントは、認証局の証明書に含まれるハッシュ関数を用いて、サーバー証明書に含まれる公開鍵と所有者情報のハッシュ値を生成する。
  6. クライアントは、復号したハッシュ値と、生成したハッシュ値を比較する。
  7. ハッシュ値が一致すれば、サーバー証明書認証局で発行されたことと公開鍵が改ざんされていないことが分かる。クライアントは、サーバー証明書に含まれる公開鍵を使って、データを暗号化し、サーバーに送ることができる。

この図がわかりやすいよ!

f:id:bambinya:20150320094531g:plain

 

SSLのハイブリッド方式

SSLNetscape Communication社で開発された。webブラウザとwebサーバーの間でやり取りするデータを暗号化して通信するためのプロトコル。暗号化とデジタル署名の技術を使い、セキュアな通信を実現する。

SSLでは「共通鍵暗号化方式」と「公開鍵暗号化方式」を組み合わせたハイブリット方式を利用するのが一般的である。

 

共通鍵暗号化方式とは?

平文の暗号化と、暗号文の復号化は同じ鍵で行う。データを送る側と、データを受け取る側が同じ鍵を持つ。データのやり取りに関係のない第三者には鍵を盗まれてはならない。共通鍵暗号化のアルゴリズムにはDES(Data Encryption Standard),3DES(トリプルDES)などがある。

 

公開鍵暗号化方式とは?

データを送る側が平文の暗号化を公開鍵で行い、受け取り側が暗号文の復号化を秘密鍵で行う。データのやり取りを行う前に、データを受け取る側が、公開鍵と秘密鍵のペアを作成しておく。公開鍵は他人に配ることができるが、秘密鍵は鍵の作成者以外に盗まれてはならない。公開鍵暗号化方式のアルゴリズムにはRSA(Rivest Shamir Adleman), EPOC(Efficient Probabilistic Public-Key Encription)などがある。

 

ハイブリット方式とは?

SSLで利用されている暗号化方式。共通鍵暗号化方式と公開鍵暗号化方式を組み合わせることで、セキュアな通信を行う。

処理の流れは以下のとおり。

  1. クライアントは共通鍵暗号化方式の共通鍵を作っておく。
  2. webサーバーは公開鍵暗号化方式の公開鍵と秘密鍵を作っておく。
  3. クライアントがサーバーに接続要求を出す。
  4. webサーバーは公開鍵を含むsslサーバー証明書(デジタル証明書)をクライアントに送る。
  5. クライアントはsslサーバー証明書認証局で発行されたかどうか確認をする。
  6. クライアントは共通鍵で送信データを暗号化し、sslサーバー証明書に含まれる公開鍵で共通鍵を暗号化する。
  7. クライアントは暗号化した送信データと共通鍵をwebサーバーに送る。
  8. webサーバーは暗号化された共通鍵を秘密鍵で復号し、復号した共通鍵で送信データを復号する。

f:id:bambinya:20150316233811g:plain

 

 

 

Linuxについて調べたことまとめ

1991年にフィンランドLinus Benedict Torvaldsによって開発された。当時、商用のUnixは高価であり、Unixの学習目的で作られたMinixは機能に大幅な制限があったため、Linus独自で開発を始めることとなった。ライセンスはGPL(GNU Public License)である。

 

Linuxの本体はLinuxカーネルである。カーネルC言語で書かれており、GCC(GNU Compiler Collection)でのコンパイルが可能である。Linuxカーネルに、UIを提供するShellと、その他ソフトウェアを同梱したものがdistributionとして提供されている。distributionとは配布パッケージのことである。

Shell上で使用するコマンドはShell組み込みコマンドと同梱されたソフトウェアに分類される。「type コマンド」でコマンドの種類を調べることができる。

例としてpwdはShellコマンド、lessはソフトウェアである。

Shellの機能でコマンドにエイリアスを作ることができるので、実際はtypeコマンドで調べないと、そのコマンドがどこに属しているかは分からない。

コマンドの種類は以下のように調べる。Shell builtinはシェルコマンド、lessはソフトウェア。

(MacOSXでタイプコマンドを実行)

f:id:bambinya:20150314164538p:plain

Linuxのディレクトリ構造は、ディストリビューションによって異なるが、基本的にはFHS(Filesystem Hierarchy Standard)に準拠している。FHSとは、LinuxUnix系OSの主なディレクトリ構造と内容を定めたもの。

FHS | The Linux Foundation からFHS 3.0 Draft 1のコピペ。暇なときによむ。

Directory Description
bin       Essential command binaries
boot      Static files of the boot loader
dev       Device files
etc       Host-specific system configuration
lib       Essential shared libraries and kernel modules
media     Mount point for removable media
mnt       Mount point for mounting a filesystem temporarily
opt       Add-on application software packages
run       Data relevant to running processes
sbin      Essential system binaries
srv       Data for services provided by this system
tmp       Temporary files
usr       Secondary hierarchy
var       Variable data

 

コンピューターの電源が入ってから、Linuxが起動するまで

  1. 電源ON
  2. 補助記憶装置に格納されているBIOS(Basic Input/Output System)が起動される
  3. BIOSがPOST(Power On Self Test)処理を実行、コンピューター周辺機器(ハードウェア)の動作確認を行う
  4. BIOSがbootstrap loaderを格納している起動デバイスを選択する
  5. BIOSが起動デバイスのMBR(Master Boot Record)と呼ばれる記憶領域から、GRUB(GRand Unified Bootloader)またはLILO(LInux Loader)を読み込む。この二つはLinuxが採用しているbootstrap loaderで、ディストリビューションによって異なる。起動するOSやカーネルを、設定から選ぶことができる
  6. GRUBまたはLILOが、Linuxカーネルを補助記憶装置から主記憶装置に読み込む
  7. カーネルの起動に必要な、カーネルモジュール(デバイスドライバ)を読み込むための一時的なルートファイルシステムが作られる
  8. /sbin/initを実行、initコマンドはLinuxシステムで最初に起動されるプロセス。プロセスIDは0である。SysVinitとUpstartの2種類が用意されている。ディストリビューションによって違う。動作は主に、プロセス制御スクリプトの実行、ランレベルの指定、デーモンプロセスの起動及び制御スクリプトの実行、基本設定、などがある

 

 ランレベルってなんですか?
OS起動時に選ぶことができる、実行レベルのこと。動作モードともいう。UNIX系のOSは複数ランレベル(動作モード)を提供することによって、システムの保守性を高めている。Linuxでは動作モードを7段階の実行レベル(ランレベル)に分けている。モードによって、OSは異なる機能を提供する。

 

ランレベルの確認と変更

現在のランレベルを確認するには$ runlevel

(MacOSXでは$ who -r で確認できる)

f:id:bambinya:20150315124530p:plain

ランレベルの変更は$telinit 数字 または $init 数字  で変更できる。

 

プロセス管理

システムリソースの使用状況を確認するコマンド

top...CPUやメモリの使用率、システムの平均負荷などを確認できる。Uptimeでも同じ結果が見られる。

free...メモリとスワップに関する情報を表示、一瞬のスナップショットなので、使用量を把握したい場合には正確ではないと思った方がよい。

vmstat...メモリやスワップに関する情報を継続的に表示、引数に表示間隔(秒)、表示回数を指定できる。

 

Linux系の有名なディストリビューションは以下のとおり。

RedHatRHEL(RedHat Enterprise Linux)として販売されている。RedHat Linux, Fedora, CentOS etc.

Debian...Debian GNU/Linux, Ubuntu etc.

Slackware...Slackware, Plamo Linux etc.

 

OSは大きく分けて、UNIX系とWindows系に分けられる。

UNIX系とは、1969年に開発されたUnixと似た振る舞いをするOSのこと。

Windows系とは、Microsoftが開発したOSシリーズのこと。

 

UNIX系OS...Solaris, MacOSX, Linux, FreeBSD, AIX, HP-UX

Windows系OS...Windows XP, Vista, 7, 8, 8.1

 

RSAの暗号方式を調べた

公開鍵暗号方式に使われるRSA暗号方式は、Rivest(ライベスト),Shamir(シャミール),Adleman(エイドルマン)の3人によって1977年に考案された。3人の頭文字を取り、RSAと名付けられた。Rivestはハッシュ関数MD5の作者でもある。

 

RSAの暗号方式を理解すると、

公開鍵で暗号化したデータは秘密鍵で復号でき、

秘密鍵で暗号化したデータが公開鍵で復号できる、

ということが分かる。

 

RSA暗号化には、2つの素数p,qと、2つの1以上の任意の整数e,nを用いる

復号化に使う整数dは以下の式で求められる。

d = ( n(p-1)(q-1) + 1 ) / e

暗号化と復号化は以下の式で求められる。

暗号化: 平文^e       mod   p*q   =   暗号文

復号化: 暗号文^d   mod   p*q   =   平文

実際にはpとqは、それぞれ100桁以上の2つの素数を用いて暗号化と復号化を行うが、

例として、以下の数字で暗号化と復号化を行ってみる

p = 3

q = 11

e = 7

n = 1

d = 3 dは( 1(3-1)(11-1) + 1) / 7より求められる

平文を9とすると、

暗号化: 9^7       mod   3*11   =   15

復号化: 15^3   mod   3*11   =   9

となる。

 

他の暗号方式も調べてみた。

AES(Advanced Encryption Standard):アメリカの暗号規格。共通鍵暗号方式に使われる。1997年に、一般公募の中から、ベルギーの研究者が開発したラインダール暗号方式が採用された。実際にはAESの公募ルールに合わせて、機能の制限をされたものが、AESとして使われている。暗号化の方法はDESのやり方と似ているっぽいけど、よくわからなかった。

旧規格 DES (FIPS 46) の安全性が低下したため、1997年9月にNIST(アメリカ国立標準技術研究所)が後継の暗号標準AES (Advanced Encryption Standard) とすべく共通鍵ブロック暗号を公募した。

*1

 

DES(Data Encryption Standard):1977年に正式に発表されてから、ラインダール(Rijndael) がAESに採用される2000年まで使われていた旧暗号方式。56 bit の鍵を使う。暗号化は以下の通り。

f:id:bambinya:20150311232732g:plain