リモートホスト操作が便利になる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プロトコルをサポートしている点が特徴的です。 ポイントしては、パケットのフィールドを自分が設定できる点です。
使い道
主にセキュリティツールとして使われてきましたが、セキュリティに限らず多くの用途で使われます。
- ファイアウォールテスト
- 高度なポートスキャン
- TOSやフラグメンテーション、異なるプロトコルを使ったネットワークテスト
- 手動の経路MTU探索
- サポートしているプロトコルでの高度なtraceroute
- リモートからのOS特定(OS fingerprinting)
- リモートからのuptimeの推測
- TCP/IP スタックの監査
- TCP/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のチェックサムを指定します。デフォルトは有効なチェックサムです。
-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を作成する
一般的にはこの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 LinuxをThinkpad 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
ロープロファイル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)