無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

リモートホスト操作が便利になるscreenコマンド

screenコマンドとは

1つの物理ターミナルから仮想ターミナルを切り分けて使えるコマンドラインツールです。 物理ターミナルをひとつ開くとその中に別の(仮想)ターミナルを開けるようなツールです。 次のようなことができます。

  • 1つのターミナル上で、仮想ターミナルをを同時に開いてそれぞれで別の作業ができる。
  • 仮想ターミナルが起動したまま、物理ターミナルを終了し、再度ターミナルでログインして、screen を呼び出すことで起動したままの仮想ターミナルの作業を続けられる。

例えば、リモートホストsshで接続していくつかの作業を並行してしたいときに、別の物理ターミナル立ち上げて、ssh接続する必要がなくなります。

インストール

Ubuntu 14.04LTSでは次のようにして、インストールできます。

$ sudo apt-get install screen

使い方

リモートホスト(10.0.0.1)にsshで接続し、そこでscreenコマンドを使う場合を例にします。 この場合、10.0.0.1のホストにscreenがインストール済みである必要があります。

$ ssh rname@10.0.0.1
rname@remotehost:~$

screenのセッションを生成する

rname@remotehost:~$ screen

次のようなCopyrightの画面が表示されるので、Enterを押します。

Screen version 4.01.00devel (GNU) 2-May-06

Copyright (c) 2010 Juergen Weigert, Sadrul Habib Chowdhury
Copyright (c) 2008, 2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury
...

セッション内で新しいウィンドウを作る

次の入力をすることで、セッション内に新しいウィンドウを作成することができます。

Ctrl-a c

試してみます。 まず現在のウィンドウで、echoでt1を表示しておきます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a c]

ウィンドウ2が作成されて画面が切り替わります。

rname@remotehost:~$ 

echoでt2を表示しておきます。

rname@remotehost:~$ echo t2
t2
rname@remotehost:~$ [Ctrl-a c]

ウィンドウ3が作成されて画面が切り替わります。

rname@remotehost:~$ 

echoでt3を表示しておきます。

rname@remotehost:~$ echo t3
t3

セッション内でウィンドウを移動する

次の入力で、次(next)のウィンドウを画面に表示することができます。

Ctrl-a n

ウィンドウを戻る(previous)場合は次のように入力します。

Ctrl-a p

先ほどの続きから、試してみましょう。

rname@remotehost:~$ echo t3
t3
rname@remotehost:~$ [Ctrl-a n]

t1のウィンドウが表示されます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a n]

さらに、t2に切り替わります。

rname@remotehost:~$ echo t2
t2

逆に戻ってみます。

rname@remotehost:~$ echo t2
t2
rname@remotehost:~$ [Ctrl-a p]

t1のウィンドウが表示されます。

rname@remotehost:~$ echo t1
t1

現在のウィンドウの一覧を見る

次のコマンドで、ウィンドウの一覧を見ることができます。

Ctrl-a "

次の内容が表示されます。カーソルをj, k キーで移動させて、一覧から表示するウィンドウを選択することができます。選択したらエンターキーを押すことで表示されられます。

 Num Name        Flags
   0 bash        $
   1 bash        $
   2 bash        $

ウィンドウに名前を付ける

ウィンドウ一覧を見ていると、それぞれのウィンドウは何をしているウィンドウだったかを記入したくなります。そこで次の入力して、現在のウィンドウに名前をつけることができます。

Ctrl-a A

t1のウィンドウで、echo-t1という名前をつけます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a A]
Set window's title to: echo-t1

一覧を表示すると、次のようになります。これでウィンドウと作業の内容を一致でき、一覧からウィンドウを選択しやすくなります。

 Num Name        Flags
   0 echo-t1     $
   1 bash        $
   2 bash        $

現在のウィンドウを閉じる

現在のウィンドウを閉じる場合、次のように入力します。

Ctrl-a k

t1のウィンドウを閉じてみます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a k]
Really kill this window [y/n] y

一覧を表示すると、echo-t1が閉じられていることがわかります。

 Num Name        Flags
   1 bash        $
   2 bash        $

現在のセッションをデタッチする

次の入力で現在のセッションをデタッチします。デタッチするとターミナルをログアウトできます。

Ctrl-a d

試してみます。

rname@remotehost:~$ [Ctrl-a d]

次の画面に切り替わります。下記の4946は、セッションのプロセス番号です。再度セッションにアタッチするときに使います。

[remote detached from 4946.pts-1.remotehost]
rname@remotehost:~$

この状態で、リモートホストからログアウトします。

rname@remotehost:~$ ログアウト
Connection to 10.0.0.1 closed.
lname@localhost:~$ 

これで、ターミナルを終了しても大丈夫です。

セッションにアタッチする

次の入力で、デタッチしたセッションに再びアタッチすることができます。

$ screen -r <pid>

先ほどの続きで、ターミナルを立ち上げ、リモートホストに接続します。

$ ssh rname@10.0.0.1
rname@remotehost:~$

先ほどデタッチしたセッション(4946)にアタッチします。

rname@remotehost:~$ screen -r 4946

t2のウィンドウが表示されます。リモートホストからログアウトして、ターミナルを終了しても残っていることが確認できます。

rname@remotehost:~$ echo t2
t2
rname@remotehost:~$

リモートホストに存在するscreenコマンドのセッション番号を確認する

前回デタッチしたセッション番号が何だったかわからない場合は、次のコマンドでscreenセッションの一覧を表示することができます。

$ screen -ls

次のような一覧が得られます。このリストの 4946 部分がプロセス番号なので、このプロセスにアタッチすれば、セッションに復帰でき、前回のデタッチ状態から作業を開始できます。

rname@remotehost:~$ screen -ls
There is a screen on:
        4946.pts-1.removehost        (2016年01月01日 12時00分00秒)   (Attached)
1 Socket in /var/run/screen/S-remotehost.

最低限知っておく必要のあるscreenコマンドは以上です。 screenコマンドは、他にも複数の人間が同じターミナルを共有できるらしいですが、これについてはまた次の機会にしようと思います。

パケット生成が簡単にできるhpingコマンド

hpingとは

hpingはコマンドライン指向のTCP/IPパケットアセンブラ/アナライザです。インタフェースはpingコマンドから影響を受けていますが、pingコマンドのようにICMP echoリクエストが送信できるだけではなく、hpingはTCP, UDP, ICMP と IPプロトコルをサポートしている点が特徴的です。 ポイントしては、パケットのフィールドを自分が設定できる点です。

使い道

主にセキュリティツールとして使われてきましたが、セキュリティに限らず多くの用途で使われます。

インストール

Debian/Ubuntuであれば、apt-getでインストールできます。

$ sudo apt-get install hping3

CentOSなら、EPELリポジトリを追加して、yumでインストールできます。

$ sudo yum install -y http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install hping3

使い方

# hping3 host [options]

基本オプション

  -h  --help      ヘルプを表示します。
  -v  --version   バージョンを表示します。
  -c  --count     パケット数を指定します。
  -i  --interval  各送信パケット間の時間を指定します。単位はマイクロ秒です。 (uXで指定します。Xはマイクロ秒です。例: -i u1000)
      --fast      -i u10000 のエイリアスです。(1秒間に10パケットを送信します。)
      --faster    -i u1000 のエイリアスです。(1秒間に100パケットを送信します。)
      --flood     可能な限り速くパケットを送信します。返信を表示しません。 
  -n  --numeric   数値のみを出力します。
  -q  --quiet     開始した時と終了した時のサマリーを除いて、結果を出力しません。
  -I  --interface インターフェース名を指定します。指定しない場合はデフォルトルーティングインタフェースを使います。デフォルトルートがない場合は、ループバックアドレス以外の最初のインタフェースを使います。
  -V  --verbose   詳細情報の出力を有効にします。
  -D  --debug     デバッグモードを有効にします。インタフェースの検知、データリンク層のアクセス、インタフェースの設定、オプションのパース、フラグメンテーション、HCMPプロトコルなどの追加情報を取得できます。
  -z  --bind      Ctrl+zを1度(2度)押すことで、送信されるパケットのTTLを1増やす(減す)ことができます。
  -Z  --unbind    Ctrl+zでhping3を停止させることができます。
      --beep      beep for every matching packet received

プロトコル選択オプション

  default mode     TCPモード。ターゲットホストのport 0 へTCPフラグを設定せずwindsize 64のtcpヘッダを送信します。これは"hide ping"としては良い方法です。ターゲットがICMPを破棄するファイアウォールの後ろにある時に役に立ちます。
  -0  --rawip      RAW IP モード。--signatureおよび/もしくは --fileを付けたデータとIPヘッダを送信します。IPプロトコルフィールドを設定できる--ipprotoも参照してください。
  -1  --icmp       ICMP モード。デフォルトではICMPエコー応答を送信します。--icmptype、--icmpcodeオプションを使うことで別のICMP type/codeを設定できます。
  -2  --udp        UDP モード。デフォルトではターゲットホストのport 0へUDPを送信します。UDPヘッダを調整可能なオプションは--baseport、--destport、--keepがあります。
  -8  --scan       SCAN モード。スキャンするポートグループの引数を指定します。ポートはコンマで複数指定でき、ハイフン(-)で範囲を指定できます。allは0-65535のエイリアスで、knownで/etc/servicesのリストにあるポートを指定できます。-Sオプションを設定すれば、SYNスキャンを実行できます。また、TCPのウィンドウサイズや、TTLを変更でき、IPフラグメンテーションを制御できます。
                   例: hping3 --scan 1-30,70-90 -S www.target.host
  -9  --listen     listenモード。このオプションを使うと、パケット中の--listenの後に記述した文字列があると、その文字列以降部分を表示します。
                   例: hping3 --listen TESTの場合、パケットに"234-09sdflkjs45-TESThello_world"が含まれていた場合、"hello_world"を表示します。

IP関連のオプション

  -a  --spoof      送信元のIPアドレスを偽装することができます。このオプションでターゲットホストは実際の送信元IPアドレスを知ることができなくなります。そのため、返信を見ることはできません。
  --rand-dest      random destionation addressモード.ターゲットホストとして記載したアドレスへランダムにパケットを送信します。"10.0.0.x"のように指定します。xは0-255の範囲でランダムに選択されます。このモードを指定した場合、どのインタフェースからパケットが送信されるか検知できません。送信したいインタフェースを指定する場合は、--interfaceオプションを使う必要があります。
  --rand-source    random source addressモード。送信元IPアドレスをランダムに設定します。ファイアウォールのステートテーブルや他のTCP/IPスタックおよびファイアウォールソフトウェア内の各IPアドレスに基づく動的テーブルに負荷をかけることに使えます。
  -t  --ttl        このオプションでTTLを設定できます。デフォルトは 64です。--tracerouteもしくは--bindオプションをと一緒にこのオプションを使います。 "# hping3 some.host.com -t 1 --traceroute"のように使用します。
  -N  --id         idフィールドを設定します。デフォルトはランダムです。
  -W  --winid      Windows2000以前のWindowsシステムは別のバイト順序を持っています。これらのWindowsからの返信のidが適切に表示されます。
  -r  --rel        Display id increments instead of id. See the HPING3-HOWTO for more information. Increments aren't computed as id[N]-id[N-1] but using packet loss compensation. See relid.c for more information.
  -f  --frag       多くのフラグメントにパケットを分割します。これはIPスタックのフラグメンテーションの性能のテストやパケットフィルタに小さなフラグメントを通してしまう弱さがないかをテストするのに有用です。デフォルトの仮想MTUは16バイトです。--mtuオプションを参照してください。
  -x  --morefrag   IPパケットを分割しても良いフラグに設定します。もし、再構築中にICMP time-exceededメッセージをターゲットホストに送信シたい場合は、このオプションを使います。
  -y  --dontfrag   IPパケットを分割してないフラグに設定します。経路MTU探索に使います。パスしなかったルータでICMP到達不能メッセージが送信され、MTUの値がわかります。
  -g  --fragoff    フラグメントオフセットの値いを設定します。
  -m  --mtu        フラグメンテーションが有効な時16以外の仮想MTUの値を設定します。もし、パケットサイズが仮想MTUの値よりも大きい場合、フラグメンテーションが自動的にONになります。
  -o  --tos        Type Of Serviceを設定します。デフォルトは0x00です。16進数でせていします。--tos helpで詳細な情報を得られます。
  -G  --rroute     レコードルート(record route)を設定します。送信される各パケットにレコードルートオプションが含まれ、返信されたパケットの経路バッファを表示します。多くのホストでこのオプションは無視か破棄されます。IPオプションのため、TCPとUDPモードでも利用できます。
  --lsrr           ルーズ・ソース・ルーティング(loose source routing)とレコードルート(record route)を設定します。送信ホストが提供する情報に従ってIPパケットをルーティングするのに使われます。他の中間ルーターを経由するルートを、ルータが選択して使用することができます。
  --ssrr           ストリクト・ソース・ルーティング(strict source routing)とレコードルート(record route)を設定します。送信ホストが提供する情報に従ってIPパケットをルーティングするのに使われます。直接接続されたネットワークを使って指定された次のアドレスまで、直接パケットを送ります。直接送信できない場合はパケットは破棄されます。
  -H  --ipproto    IPプロトコルフィールドを設定します。RAW IPモードの場合のみ有効です。

ICMP関連のオプション

  -C  --icmptype   ICMPタイプを指定します。デフォルトではICMP echo requestです。
  -K  --icmpcode   ICMPコードを指定します。デフォルトでは0です。
      --force-icmp 全てのICMPタイプを送信します。全てのICMPタイプを送信します。
      --icmp-gw    ICMP redirectのゲートウェイアドレスを設定します。デフォルトは0.0.0.0です。
      --icmp-ts    --icmp --icmptype 13 のエイリアスです。ICMP timestamp requestです。
      --icmp-addr  --icmp --icmptype 17 のエイリアスです。 ICMP address mask requestです。
      --icmp-help  他のICMPオプションを表示します。
      --icmp-ipver  ICMPデータ内のIPヘッダのIPバージョンを指定します。デフォルトは4です。
      --icmp-iphlen  ICMPデータ内のIPヘッダのIPヘッダ長を指定します。デフォルトは5です。5は5ワードで32ビットです。
      --icmp-iplen  ICMPデータ内のIPヘッダのIPパケット長を指定します。デフォルトは実際の長さです。
      --icmp-ipid  ICMPデータ内のIPヘッダのIPのidを指定します。デフォルトはランダムです。
      --icmp-ipproto  ICMPデータ内のIPヘッダのプロトコルを指定します。でおフォルトはTCPです。
      --icmp-cksum  ICMPのチェックサムを指定します。デフォルトは有効なチェックサムです。

UDP/TCP関連のオプション

  -s  --baseport   送信元ポートを指定します。シーケンス番号を推測するために送信元ポート番号を使用します。シーケンス番号は送信元ポート番号から開始され、各パケットを送信する毎に増加させます。デフォルトはランダムです。もし、送信元ポートを各パケット送信する毎に増加させたくなければ、--keepオプションを使う必要があります。
  -p  --destport   [+][+]<port> 宛先ポートを指定します。デフォルトは0です。"+1024"のように+が1つの場合は、返信を受ける度に1つ増加します。"++1024"のように+が2つの場合は、各パケットを送信する毎に1つ増加します。Ctrl+zを使うことで対話的に宛先ポート番号を変更できます。
  -k  --keep       送信元ポート維持します。
  -w  --win        TCP window sizeを指定します。デフォルトは64です。
  -O  --tcpoff     TCP data offsetを偽装します。デフォルトはtcphdrlen / 4(4オクテット単位)です。
  -Q  --seqnum     ターゲットホストが生成したシーケンス番号集めるために使用します。TCPシーケンス番号が予測可能かどうかを分析するために有用です。
                   例: # hping3 win98 --seqnum -p 139 -S -i u1 -I eth0
                   HPING uaz (eth0 192.168.4.41): S set, 40 headers + 0 data bytes
                   2361294848 +2361294848
                   2411626496 +50331648
                   2545844224 +134217728
                   2713616384 +167772160
                   2881388544 +167772160
                   3049160704 +167772160
                   3216932864 +167772160
                   3384705024 +167772160

                   初めの列はシーケンス番号で、2つめの列は現在とラストのシーケンス番号の差を表示しています。
  -b  --badcksum   間違ったチェックサムを送信パケットに設定します。
                   多くのシステムではIPチェックサムを修正してパケットを送信するので、修正されたチェックサムを手に入れることができます。
  -M  --setseq     TCPシーケンス番号を設定します。
  -L  --setack     TCP確認応答番号を設定します。
  -F  --fin        FIN flagを設定します。
  -S  --syn        SYN flagを設定します。
  -R  --rst        RST flagを設定します。
  -P  --push       PUSH flagを設定します。
  -A  --ack        ACK flagを設定します。
  -U  --urg        URG flagを設定します。
  -X  --xmas       X unused (ECN-echo)flagを設定します。 (0x40)
  -Y  --ymas       Y unused (CWR)flag を設定します。(0x80)
  --tcpexitcode    Exit with last received packet tcp->th_flag as exit code. Useful for scripts that need, for example, to known if the port 999 of some host reply with SYN/ACK or with RST in response to SYN, i.e. the service is up or down.
  --tcp-mss        指定した値でTCPの最大セグメント長オプションを有効にします。
  --tcp-timestamp  TCPタイムスタンプオプションを有効にします。

共通オプション

  -d  --data       パケットボディのサイズを指定します。デフォルトは0です。
  -E  --file       パケットのデータを満たすために使うファイル名を指定します。
  -e  --sign       Fill first signature length bytes of data with signature. If the signature length is bigger than data size an error message will be displayed. If you don't specify the data size hping will use the signature size as data size. This option can be used safely with --file filename option, remainder data space will be filled using filename.
  -j  --dump       受信したパケットを16進数でダンプします。
  -J  --print      順したパケットを印字可能な文字でダンプします。
  -B  --safe       'safe'プロトコルを有効にします。このオプションを使うとファイルの転送でパケットを紛失した場合再送します。例えば/etc/passwdファイルホストAからホストBへ送信する場合は次のようにします。
                   host_a例: # hping3 host_b --udp -p 53 -d 100 --sign signature --safe --file /etc/passwd
                   host_b例: # hping3 host_a --listen signature --safe --icmp
  -u  --end        --fileオプションを使っている場合、EOFが届くと再送を防ぎます。
  -T  --traceroute traceroute モード。--bind and --ttl 1と同じです。
  --tr-stop        ICMP time exceeded でない最初のパケットを受信した場合は終了します。
  --tr-keep-ttl    Keep the TTL fixed in traceroute mode, so you can monitor just one hop in the route. For example, to monitor how the 5th hop changes or how its RTT changes you can try hping3 host --traceroute --ttl 5 --tr-keep-ttl.
  --tr-no-rtt      tracerouteモードでRTT情報を表示/計算しません。
ARS packet description (new, unstable)
  --apd-send       Send the packet described with APD (see docs/APD.txt)

Wiresharkによるhping3の動作チェック

hping3でパケットを送信するホストや受信するホストでWiresharkを起動して、IPアドレスでフィルタしてパケットをキャプチャすることで、動作チェックできます。

送信元ホスト(送信ホスト)が10.0.1.1のパケットを見たい場合

ip.src_host==="10.0.1.1"

送信先ホスト(受信ホスト)が10.0.1.2のパケットを見たい場合

ip.dst_host==="10.0.1.2"

サンプルコマンド

TCPパケットを指定したIPアドレスに向けて送信します。ただし、0番ポートで各フラグは設定されていません。

# hping3 10.0.1.2

SYNフラグを設定して、80番ポートにTCPパケットを送信します。

# hping3 -S -p 80 10.0.1.2

送信元IPアドレスを10.0.1.3に偽装したパケットを10.0.1.2へ送信します。

# hping3 10.0.1.2 --spoof 10.0.1.3

ACKフラグによるプローブスキャニングの実行します。 下の例では、ACKフラグを設定し、20番ポートから順番にポート番号を増加させ、RSTパケットを受信します。RSTパケットのTTL値やWIN値を見ることで、どのポートがオープンになっているか推測するデータを取得できます。

# hping3 -A -p ++20 10.0.1.2

送信元ポートとしてTCP53番(DNS用ポート)を使用し、10.0.1.1のTCP139番ポートに対して、3つのTCP SYNパケットを送信します。

#  hping3 -c 3 -s 53 -p 139 -S 10.0.1.1

ロードバランサの負荷分散方式

リクエストの負荷分散方式

ロードバランサの最も基本的な機能に、クライアントからのリクエストをサーバに割り振る機能があります。システム全体の資源を効率的に使うためには、リクエストを何を基準にしてどのサーバに割り振るか(分散方式)が重要です。

分散方式の分類

分散方式には大きく分けて静的分散方式と動的分散方式に分けられます。

静的分散方式

静的分散方式はあらかじめ決められた割り当てで、サーバにリクエストを割り振る方式です。 分散先のサーバの処理能力が同じ場合やリクエストの処理時間が一定である場合に用いられます。 また、静的分散方式は仕組みが単純なため、設計が簡単になります。

静的分散方式には次のようなものがあります。

(1)ラウンドロビン

各サーバに、均等にリクエストを割り振ります。

(2)重み付きラウンドロビン

各サーバに、あらかじめ設定された重み付けでリクエストを割り振ります。

動的分散方式

動的分散方式はサーバやネットワークの状況を考慮して、最適なサーバにリクエストを割り振る方式です。 静的分散方式とは逆に、分散先のサーバの処理能力が異なっている場合やリクエスト毎に処理時間が異なっている場合に利用されます。

動的分散方式には次のようなものがあります。

(3)最小コネクション数

処理中のコネクションが最も少ないサーバにリクエストを割り振ります。 サーバの処理能力に応じてリクエストを割り振ることができます。

(4)重み付き最小コネクション数

あらかじめ設定された重み付けを考慮した上で、処理中のコネクションが最も少ないサーバにリクエストを割り振ります。

(5)最小クライアント数

接続中のクライアントが最も少ないサーバにリクエストを割り振ります。 リクエストのIPアドレスなどに基づいてクライアントを識別します。 クライアント単位で、分散先サーバを選択することができます。

(6)最小データ通信量

処理中のデータ通信量が最も少ないサーバにリクエストを割り振ります。 各サーバが転送したデータ量を計測し、転送したデータ量が少ないサーバにリクエストを割り振ります。 コネクションあたりのデータ転送量が多いアプリケーションに有効です。

(7)最小応答時間

応答時間が最も短いサーバにリクエストを割り振ります。 サーバの処理能力に応じてリクエストを割り振ることができます。

(8)最小サーバ負荷

CPU、メモリ、I/Oの利用率が最も低いサーバにリクエストを割り振ります。 サーバの処理能力やリクエスト以外にサーバで処理をすることがある場合に、それを考慮してリクエストを割り振ることができます。

その他分散方式

その他の分散方式として、次のものがあります。

(9)ランダム

ランダムに選択した分散先サーバにリクエストを割り振ります。 真にランダムであれば、統計的にはサーバへの割り振りは均等になります。

opensslコマンドで認証局(CA)を構築してサーバ証明書を発行する

opensslコマンドとは

OpenSSLはSecure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) のプロトコルとそれに関係する標準的暗号を実装したツールキットです。 OpenSSLの暗号ライブラリの様々な暗号機能をシェルから使うためのコマンドラインです。 次のような機能があります。

  • プライベート鍵と公開鍵とそのパラメータの作成と管理
  • 公開鍵の暗号化操作
  • X.509証明書、認証局(CA)に提出する証明書発行要求ファイル(CSR)、無効となった証明書のリスト(CRL)の作成
  • メッセージダイジェストの計算
  • 暗号化と暗号文の復号
  • SSL/TLSクライアントとサーバのテスト
  • S/MIMEサインと暗号化メールの取り扱い
  • タイムスタンプの要求、生成と検証

今回は認証局(CA)を構築して、サーバ証明書を発行してみます。

準備

opensslをインストールします。

$ sudo apt-get install openssl

apacheをインストールします。

$ sudo apt-get install apache2

SSL設定の有効化します。

$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo /etc/init.d/apache2 restart

認証局(CA)の事前設定

認証局(CA)用のディレクトリを作成して、そのディレクトリを設定ファイルに記述します。 認証局に必要な情報をここに配置します。

$ sudo mkdir /etc/ssl/myCA
$ vi /etc/ssl/openssl.conf
dir = /etc/ssl/myCA

作成したmyCA配下に次のディレクトリを作成します。

$ sudo mkdir -p /etc/ssl/myCA/certs
$ sudo mkdir -p /etc/ssl/myCA/private
$ sudo mkdir -p /etc/ssl/myCA/crl
$ sudo mkdir -p /etc/ssl/myCA/newcerts

privaeteディレクトリには秘密鍵が置かれるのでアクセス制限をかけます。

$ sudo chmod 700 /etc/ssl/myCA/private

認証局が発行する証明書にシリアル番号が付与されますが、それに使われる番号が保存されます。最初に01で初期化します。

# sudo echo “01” > /etc/ssl/myCA/serial

証明書のデータベースを初期化します。newcertsディレクトリ内に保管される証明書の番号(nn)と識別名DN(Distinguished Name)との対応表らしいです。

$ sudo tocuh /etc/ssl/myCA/index.txt

自己署名証明書/秘密鍵生成

認証局自己署名証明書秘密鍵を生成します。-daysは有効期限です。365日を設定しています。

$ cd /etc/ssl/myCA
$ sudo openssl req -new -x509 -newkey rsa:2048 -out cacert.pem -keyout private/cakey.pem -days 365

パスフレーズを2度聞かれます。

Enter PEM pass phrase: stacktrace

その後に証明書情報を聞かれます。

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) []:City1
Organization Name (eg, company) []:Company1
Organizational Unit Name (eg, section) []:Section1
Common Name (eg, YOUR name) []:myCA
Email Address []: (Enter)

証明書情報の入力が終わると以下のファイルがされます。

念の為、自己署名証明書秘密鍵のアクセスを次のように制限しておきます。

$ chown root:root /etc/ssl/myCA/private/cakey.pem
$ chmod 600 /etc/ssl/myCA/private/cakey.pem

証明書が正しくできたかを確かめるには次のコマンドを実行することで、証明書情報で入力した値を確認することができます。

$ openssl x509 -in /etc/ssl/myCA/cacert.pem -text

認証局のポリシー[ policy_match ]のorganizationNameをmatchからoptionalに変更します。 これで証明書情報の"Organization Name"が認証局と一致していなくても署名できるようになります。

$ sudo vi /etc/ssl/openssl.cnf
organizationName        = match
↓
organizationName        = optional

サーバ認証とサーバ証明書

サーバ証明書とは

サーバを識別するための証明書です。サーバが証明書の所有者になります。 サーバ証明書は、Webサイトの所有者の情報やSSL/TLS通信における暗号化に必要な公開鍵などを含みます。 これらの情報は、先ほど作成した認証局によって署名をします。 一般的にはWebサーバとWebブラウザとのHTTPS通信において、Webサーバは証明書に記された所有者の公開鍵であることを保証します。 つまり、サーバを認証していることになります。

  • WebサーバでCSR(Certificate Signing Request)証明書署名要求を作成する
  • 認証局で署名する
  • Webサーバに秘密鍵を組み込む

WebサーバでCSRを作成する

一般的にはこのWebサーバは認証局を構築したサーバとは別です。 準備と同じ手順で別のマシンにapache2のWebサーバを用意して試します。

まず、Webアプリケーション用のディレクトリを作成して、そこに鍵などを作成します。

$ sudo mkdir /etc/ssl/www.app.com

次のコマンドで鍵ペアとCSRファイルを作成します。

$ cd /etc/ssl/www.app.com
$ sudo openssl req -x509 -new -keyout appkey.pem -out appcsr.pem

パスフレーズを聞かれるので入力します。

Enter PEM pass phrase: application

次は、証明書情報を入力します。 Common Nameはサーバ証明書を導入してHTTPS通信を行うサイトのURLのことです。 Common NameはWebブラウザにアドレスとして指定するURLと一致している必要があります。 実験なので、ここではマシンのIPアドレスを指定します。

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) []:City2
Organization Name (eg, company) []:Company2
Organizational Unit Name (eg, section) []:Section2
Common Name (eg, YOUR name) []:192.168.0.1
Email Address []: (Enter)
A challenge password: appcsr
An optional company name []:  (Enter)

作成が終わると以下のファイルができあがります。

  • /etc/ssl/www.app.com/appcsr.pem : 証明書署名要求(CSR)です。認証局で使います。
  • /etc/ssl/www.app.com/appkey.pem : サーバ秘密鍵です。大切に保管します。

認証局での署名

ここのでの操作はWebサーバのマシンではなく、認証局を構築したマシンで行います。 上記で作成した証明書署名要求(CSR)を認証局のマシンにコピーして、認証局で次のコマンドを実施し署名します。

$sudo openssl ca -in appcsr.pem -out appcert.pem 

認証局パスフレーズが聞かれるので入力します。

Enter PEM pass phrase: stacktrace

署名するかどうか聞かれるので、"y"を入力します。

Certificate is to be certified until Dec 11 00:38:12 2016 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Update

次のファイルができます。

証明書が正しく出来たかを確認するには、以下のコマンドで確認できます。 入力した証明書情報が表示されれば正しくサーバ証明書ができています。

$ openssl x509 -in appcert.pem -text

サーバ証明書秘密鍵をWebサーバに組み込む

認証局で署名したサーバ証明書(appcert.pem)をWebサーバに組み込みます。 認証局で作成した証明書(appcert.pem)をWebサーバの/etc/ssl/www.app.com/コピーします。 そして、apache2のsslの設定ファイルで、証明書ファイルと秘密鍵をこれまでで作成したファイルに変更します。

$ sudo vi /etc/apache2/sites-available/default-ssl.conf

SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
↓
SSLCertificateFile /etc/ssl/www.app.com/appcert.pem

SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
↓
SSLCertificateKeyFile /etc/ssl/www.app.com/appkey.pem

設定ファイルの変更が終わったら、apache2を再起動します。

$ sudo /etc/init.d/apache2 restart

これでWebサーバに証明書の設定ができました。

Webブラウザに証明書を組み込む

Webブラウザの方に証明書をインストールします。 このとき、サーバ証明書をインストールすることもできたはずですが、証明書チェーンの意味がないので認証局の証明書をインストールします。 認証局の証明書をインストールすることで、インストールした認証局が署名したサーバ証明書を設定しているサーバであることを確認でき、サーバとの通信が暗号化されます。 その前に、Webブラウザ用に証明書をpem形式から、der形式に変換します。 pem形式はテキストでder形式はバイナリです。 認証局サーバで次のコマンドを実行してcacert.derを生成します。

$ sudo openssl x509 -inform PEM -outform DER -in /etc/ssl/myCA/cacert.pem -out /etc/ssl/myCA/cacert.der

WebブラウザとWebサーバの接続

cacert.derをWebブザウザにインストールする前は、httpsでWebサーバに接続すると下記のメッセージが表示されます。

"この接続ではプライバシーが保護されません"

cacert.derをWebブラウザにインストールした後は、httpsでアクセスできるようになります。 また、Webブラウザでサーバ証明書の情報を表示できると思います。 Chromeで証明書情報を確認した場合、次のような内容が表示されます。 証明書を作成した時に入力した値が表示されています。

発行先
一般名(CN)   192.168.0.1
組織(O)   Company2
組織単位(OU)    Section2
シリアル番号  01

発行元
一般名(CN)   myCA
組織(O)   Company1
組織単位(OU)    Section1

例えば、Wireshakのようなパケットキャプチャーのツールでパケットを見るとTLSプロトコルで通信していることがわかります。

Kali Linux ペネトレーションテストのためのLinuxディストリビューション

Kali Linux

Kali Linuxとは、Debianをベースにした、デジタルフォレンジクスとペネトレーションテストのためツールを標準搭載したLinuxディストリビューションの1つで、Offensive Securityという会社が開発しています。

2015年8月11日ににKali Linux 2.0がリリースされました。Kali Linuxという名前になる前は、BackTrack Linuxという名前のディストリビューションです。

攻撃は最大の防御的な?

それにしても「Offensive Security」とはなかなか物騒な名前の会社ですね。その意味するところはわかりませんが、なんだか「攻性防壁」をイメージさせるような会社名です。「攻性防壁」というのは攻殻機動隊というアニメに登場する機器の名前で、不正アクセスをしてきた者の通信をトレースし、侵入者に対してネットワーク経由で致死的な攻撃を行う機器です。余談ですが、この攻性防壁に似たようなソフトが実際にあるらしく、攻撃してきているサーバへの報復行為するみたいです。しかし、報復行為先が単に踏み台にされているサーバである可能性があるため、報復行為が攻撃者に対して抑止力として有効かどうか疑問だという指摘もあるようです。

デジタルフォレンジクス

「デジタルフォレンジクス」というのは、コンピュータデジタルフォレンジクスとも呼ばれ、電子機器に残る記録から、コンピュータセキュリティインシデントの原因究明や証拠発見などを行うための情報の保存、収集、分析をすることを言います。もともとフォレンジクス(forensic)は「犯罪科学の」、「法医学の」、「法廷の」といった形容詞で、一般に犯罪捜査や法的紛争に科学を応用し、科学的証拠を収集、保全、分析することを指します。そのコンピュータ版が、デジタルフォレンジクスです。簡単な説明としてよく「デジタル鑑識」と説明されることが多いです。サイバー攻撃されたパソコンやサーバ、ネットワーク機器から攻撃の証拠となるデータや犯人特定するための手がかりになるデータを抽出・復元するような活動をします。

ペネトレーションテスト

ペネトレーションテスト」は「ペンテスト」や「侵入テスト」として表現されることもあります。ペネトレーション(penetration)は、「貫通」、「浸透」、「侵入」などの名詞で、セキュリティ上の脆弱性やコンピュータの機能やデータにアクセスされる可能性を調査するテストです。実際の攻撃手法に対してネットワークやシステムがどれだけ耐えられるか、脆弱性がないかを検証するテストのことです。

気になる搭載ツール

Kali Linuxのドキュメントによると、600以上ものペネトレーション用のツールが含まれているようです。Kali Linux Tools Listingに一覧があります。Kali Linuxをインストールして、アプリケーションの項目に表示される主要っぽいツールを見てみたいと思います。暇なときに調べて、適当に更新します。

01 - Information Gathering

  • dmitry : DMitry (Deepmagic Information Gathering Tool)は、ホストの情報を集めるコマンドです。subdomains, email addresses, uptime information, tcp port scan, whois lookupsなどの情報を収集します。
  • dnmap : dnmapはいくつかのクライアントで分散してnmapスキャンをするためのフレームワークです。dnmapはすでに作成されたnmapコマンドが記載されたファイルを読み込み、これらのコマンドを接続された各クライアントに送信します。大きなホストのグループをスキャンする場合に役立ちます。
  • ike-scan : ike-scanはIPsec-VPNシステムのテストをするためのコマンドラインツールです。これはIKEフェーズパケット1を特定のホストに送信し、受信したレスポンスを表示します。
  • maltego : Maltegoは、組織が所有していると動作環境に明確な脅威の映像を配信するために開発されたユニークなプラットフォームということで、どういうものなのか、全然がわかっていません。
  • netdiscover : Netdiscoverはactive/passiveアドレスの偵察ツールです。主に、ウォードライビングしているときに、DHCPサーバなしで無線ネットワークのために開発されました。ハブ/スイッチを使ったネットワークでも使うことができます。
  • nmap : ネットワーク調査およびセキュリティ監査を行うためのオープンソースのツールです。
  • p0f : 通信相手のOSを受動的に特定するツールです。
  • recon-ng
  • sparta
  • zenmap

02 - Vulnerability Analysis

  • golismero
  • lynis
  • nikto
  • nmap
  • openvas
  • unix-privesc-check

03 - Web Application Anakysis

  • burpsuite
  • httrack
  • owasp-zap
  • paros
  • skipfish
  • sqlmap
  • vega
  • w3af
  • webscarab

04 - Database Assessment

  • bbqsql
  • hexorbase
  • jsql
  • mdb-sql
  • oscanner
  • sidguesser
  • sqldict
  • SQLite database browser
  • sqlmap
  • sqlninja
  • sqlsus
  • tnscmd10g

05 - Password Attacks

  • cewl
  • crunch
  • hashcat
  • john
  • johny
  • medusa
  • ncrack
  • ophcrack
  • pyrit
  • rainbowcrack
  • rcracki_mt
  • wordlists

06 - Wirelsss Attacks

  • aircrack-ng
  • chirp
  • cowpatty
  • fern wifi cracker
  • giskismet
  • gqrx
  • kismet
  • mdk3
  • mfoc
  • mfterm
  • pixiewps
  • reaver
  • wifite

07 - Reverse Engineering

  • apktool
  • clang
  • clang++
  • dex2jar
  • edb-debugger
  • flasm
  • jad
  • javasnoop
  • NASM shell
  • ollydbg
  • radare2

08 - Exploitation Tools

  • armitage
  • beef xss framework
  • ginguma
  • inguma
  • metasploit framework
  • serachsploit
  • social enginnering tookit
  • sqlmap
  • termineter

09 - Sniffing & Spoofing

  • bdfproxy
  • driftnet
  • ettercap-graphical
  • hamster
  • macchanger
  • mitmproxy
  • netsniff-ng
  • responder
  • wireshark

10 - Post Exploitaion

  • backdoor-factory
  • bdfproxy
  • intersect
  • nishang
  • powersploit
  • proxychains
  • weevely

11 - Forensics

  • autopsy
  • binwalk
  • bulk_extractor
  • chkrootkit
  • diff
  • diff gui
  • foremost
  • galleta
  • md5deep
  • volafox
  • volatility

12 - Reporting Tools

  • casefile
  • cutycapt
  • dradis
  • keepnote
  • magictree
  • pipal
  • recordmydesktop

13 - System Services

  • beef start
  • beef stop
  • dradis start
  • dradis stop
  • openvas start
  • openvas stop

DebianでThinkpadのスクロールを使えるようにする設定

Kali LinuxThinkpad x200sにインストールしたのですが、Webブラウザでスクロールができなかったので調べました。

1 . xipnutをインストールする。 $ sudo apt-get install xinput

xinput は、Xinput デバイスの設定およびテスト用ユーティリティということらしいです。X Window Systemの設定ができるという解釈をした。

2 . 次のコマンドを~/.bashrcに追記する。

# capslock to ctrl
setxkbmap -option ctrl:nocaps

# To enable vertical scrolling
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation" 1
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Button" 2
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Timeout" 200

3 . sourceで適用する $ source ~/.bashrc

参考URL: InstallingDebianOn/Thinkpad/Trackpoint - Debian Wiki

ロープロファイルPCIとは

概要

1999年にPCI規格を定めるPCI SIGが策定した小スペースPCなどに搭載できるようにした小型のPCIカードの規格。 PCI規格のカードのスロット形状やサイズについて規程されている。

従来のPCIカードは大きいため、ライザーカードを使って、ボードを差し込む方向を変更する必要があったが、ロープロファイルPCIの規格によってその必要がなくなり省スペースになった。

ロープロファイルPCIのカードの標準規格

MD1とMD2の2つの規格がある

MD1

ボードの長さが120mm(119.91mm) ボードの高さ64mm(64.41mm)

MD2

ボードの長さが168mm(167.64mm) ボードの高さ64mm(64.41mm)