2014年6月22日日曜日

tshark(wiresharkのCUI)でBasic認証の安全性(危険性?)を検証

Basic認証が安全ではないと言われる所以をパケットキャプチャにより実証したい気分な方へ
tsharkをインストールしてパケットキャプチャする手順をお届けします。
Digest認証についてもどの程度安全性が確保されているのかも確認します。
Basic認証/Digest認証の設定方法は前回記事をどうぞ。

OS: CentOS 6.5 (64-bit)
TShark: 1.8.10


■tsharkインストール
CUIだけでいいので、wireshark-gnomeはインストールせず、tsharkだけインストールしたい。
[root@centos65 ~]# yum install tshark
(中略)
No package tshark available.
Error: Nothing to do
[root@cent63 ~]#
無いらしい。wiresharkでインストールすればGUIはインストールされないとのこと。


■wiresharkインストール
[root@centos65 ~]# yum install wireshark
==========================================================================
 Package            Arch          Version             Repository     Size
==========================================================================
Installing:
 wireshark          x86_64        1.8.10-7.el6_5      updates        11 M
Installing for dependencies:
 libsmi             x86_64        0.4.8-4.el6         base          2.4 M

Transaction Summary
==========================================================================
Install       2 Package(s)

## version確認
[root@centos65 ~]# tshark -v
TShark 1.8.10 (SVN Rev Unknown from unknown)

Copyright 1998-2013 Gerald Combs  and contributors.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Compiled (64-bit) with GLib 2.26.1, with libpcap, with libz 1.2.3, without POSIX
capabilities, with SMI 0.4.8, without c-ares, without ADNS, without Lua, without
Python, with GnuTLS 2.8.5, with Gcrypt 1.4.5, with MIT Kerberos, without GeoIP.

Running on Linux 2.6.32-431.el6.x86_64, with locale ja_JP.UTF-8, with libpcap
version 1.4.0, with libz 1.2.3.

Built using gcc 4.4.7 20120313 (Red Hat 4.4.7-4).
[root@centos65 ~]#


■192.168.77.149宛てのhttp通信だけをキャプチャ
[root@centos65 ~]# tshark -l host 192.168.77.149 and port http
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
  0.000000 192.168.77.1 -> 192.168.77.149 TCP 74 45248 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSval=587734266 TSecr=0 WS=4
  0.000055 192.168.77.149 -> 192.168.77.1 TCP 74 http > 45248 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=13298595 TSecr=587734266 WS=128
  0.000307 192.168.77.1 -> 192.168.77.149 TCP 66 45248 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 TSval=587734266 TSecr=13298595
  0.000338 192.168.77.1 -> 192.168.77.149 TCP 66 45248 > http [FIN, ACK] Seq=1 Ack=1 Win=5840 Len=0 TSval=587734266 TSecr=13298595
  0.000531 192.168.77.149 -> 192.168.77.1 TCP 66 http > 45248 [ACK] Seq=1 Ack=2 Win=14592 Len=0 TSval=13298596 TSecr=587734266
  0.000881 192.168.77.149 -> 192.168.77.1 TCP 66 http > 45248 [FIN, ACK] Seq=1 Ack=2 Win=14592 Len=0 TSval=13298596 TSecr=587734266
  0.001063 192.168.77.1 -> 192.168.77.149 TCP 66 45248 > http [ACK] Seq=2 Ack=2 Win=5840 Len=0 TSval=587734266 TSecr=13298596
  4.101061 192.168.77.1 -> 192.168.77.149 TCP 74 45252 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSval=587734676 TSecr=0 WS=4
  4.101095 192.168.77.149 -> 192.168.77.1 TCP 74 http > 45252 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=13302696 TSecr=587734676 WS=128
  4.101334 192.168.77.1 -> 192.168.77.149 TCP 66 45252 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 TSval=587734676 TSecr=13302696
  4.101372 192.168.77.1 -> 192.168.77.149 TCP 66 45252 > http [FIN, ACK] Seq=1 Ack=1 Win=5840 Len=0 TSval=587734676 TSecr=13302696
  4.101532 192.168.77.149 -> 192.168.77.1 TCP 66 http > 45252 [ACK] Seq=1 Ack=2 Win=14592 Len=0 TSval=13302697 TSecr=587734676
  4.101720 192.168.77.149 -> 192.168.77.1 TCP 66 http > 45252 [FIN, ACK] Seq=1 Ack=2 Win=14592 Len=0 TSval=13302697 TSecr=587734676
  4.101931 192.168.77.1 -> 192.168.77.149 TCP 66 45252 > http [ACK] Seq=2 Ack=2 Win=5840 Len=0 TSval=587734676 TSecr=13302697
^C14 packets captured
[root@centos65 ~]#
Router(192.168.77.1)からのリクエストに対して応答しているパケットをキャプチャできている。
[root@centos65 ~]# tshark -l host 192.168.77.150 and port http
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
^C0 packets captured
[root@centos65 ~]#
自サーバ(192.168.77.149)へ来るアクセスまたは、自サーバから出るアクセスについてパケットキャプチャできるが、
同一セグメントでも他サーバから他サーバへのパケットはキャプチャできない。


■Basic認証とDigest認証のパケット確認
[root@centos65 ~]# tshark -i eth0 port http -V -w packet.log
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
(以下すごい量のログが出るので省略)
上記でキャプチャしている間にPC(192.168.77.2)のブラウザから下記URLにアクセス。
あえて、ID/Passを間違えたうえでログインしてみる。

http://192.168.77.149/basic/
1回目: test/password でログイン失敗。
2回目: basic/password でログイン失敗。
3回目: basic/secret でログイン成功。

http://192.168.77.149/digest/
1回目: test/password でログイン失敗。
2回目: basic/serect でログイン失敗。
3回目: digest/secret でログイン成功。

## ログの確認
[root@centos65 ~]# tshark -r packet.log | head
Running as user "root" and group "root". This could be dangerous.
  1 0.000000000 192.168.77.2 -> 192.168.77.149 TCP 66 51701 > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=4 SACK_PERM=1
  2 0.000083000 192.168.77.149 -> 192.168.77.2 TCP 66 http > 51701 [SYN, ACK] Seq=0 Ack=1 Win=14600 Len=0 MSS=1460 SACK_PERM=1 WS=128
  3 0.000397000 192.168.77.2 -> 192.168.77.149 TCP 60 51701 > http [ACK] Seq=1 Ack=1 Win=65700 Len=0
  4 0.000568000 192.168.77.2 -> 192.168.77.149 HTTP 317 GET /basic/ HTTP/1.1
  5 0.000621000 192.168.77.149 -> 192.168.77.2 TCP 54 http > 51701 [ACK] Seq=1 Ack=264 Win=15744 Len=0
  6 0.001667000 192.168.77.149 -> 192.168.77.2 HTTP 782 HTTP/1.1 401 Authorization Required  (text/html)
  7 0.001905000 192.168.77.2 -> 192.168.77.149 TCP 60 51701 > http [ACK] Seq=264 Ack=729 Win=64972 Len=0
  8 0.002000000 192.168.77.149 -> 192.168.77.2 TCP 54 http > 51701 [FIN, ACK] Seq=729 Ack=264 Win=15744 Len=0
  9 0.002114000 192.168.77.2 -> 192.168.77.149 TCP 60 51701 > http [FIN, ACK] Seq=264 Ack=729 Win=64972 Len=0
 10 0.002145000 192.168.77.149 -> 192.168.77.2 TCP 54 http > 51701 [ACK] Seq=730 Ack=265 Win=15744 Len=0
[root@centos65 ~]#
※packet.logファイルはバイナリ型のため、テキストエディタでは開けない。

## ログを詳細確認してパスワードを抽出
[root@centos65 ~]# tshark -r packet.log -V | grep -A 1 "Authorization:"
Running as user "root" and group "root". This could be dangerous.
    Authorization: Basic dGVzdDpwYXNzd29yZA==\r\n
        Credentials: test:password
--
    Authorization: Basic YmFzaWM6cGFzc3dvcmQ=\r\n
        Credentials: basic:password
--
    Authorization: Basic YmFzaWM6c2VjcmV0\r\n
        Credentials: basic:secret
--
    [truncated] Authorization: Digest username="test",realm="DigestAuth",nonce="EAlztCj+BAA=758b7f794981c8331f415d6704fc2a8bb77d83e3",uri="/digest/",cnonce="4430d9ffdb985f4fabaadc433807e111",nc=00000001,algorithm=MD5,response="70f240bec66c111b
    Connection: Keep-Alive\r\n
--
    [truncated] Authorization: Digest username="basic",realm="DigestAuth",nonce="RCu8tCj+BAA=0b496b71af1ce10978af063796f7316a88b0599a",uri="/digest/",cnonce="8cdc61e16b1ed3e79e513fa766a39a14",nc=00000001,algorithm=MD5,response="60a69776af7efe3
    \r\n
--
    [truncated] Authorization: Digest username="digest",realm="DigestAuth",nonce="gkCEtSj+BAA=297f68d0b65f9c6a14eddd0898edd59f1b560a1b",uri="/digest/",cnonce="09fab2b8fd4aae62d30d94e868a5719c",nc=00000001,algorithm=MD5,response="fa704ad0f10213
    Connection: Keep-Alive\r\n
[root@centos65 ~]#
Basic認証は入力されたパスワードが丸見え…。
Digest認証はパスワードが暗号化されているため少しはマシかもしれません。
公開Webサーバに不正にtsharkが仕掛けられないことを祈ります…。


こちらの情報が何かのお役に立てましたら幸いです。サイト継続ご協力のほどお願い致します。m(_ _)m

2014年6月21日土曜日

Basic認証とDigest認証の比較

Basic認証とDigest認証を比較するために環境を作成する手順をまとめます。
パケットキャプチャによりパスワードが取得できるかできないかについては
こちらの記事でまとめたいと思います。


■安全性
Basic認証とは、ユーザ名とパスワードをBase64でエンコードしてAuthorizationヘッダを付加してサーバにリクエストする方式です。
base64エンコードは暗号化ではなくただの符号化ですので、簡単に復号できてしまいます。
一方、Digest認証はユーザ名と暗号化したパスワードを利用するため、ネットワーク上を生パスワードが流れることはありません。
サーバ側に生パスワードを保存する必要がないのもポイントです。盗聴に対してBasic認証よりかはマシと考えられます。
Digest認証はMD5などの脆弱なアルゴリズムを使用します。SSLを使用した通信の暗号化の方が、資格証明の傍受を防ぐには好ましい方法です。


■認証設定ディレクトリ準備
[root@centos65 ~]# mkdir /var/www/html/basic
[root@centos65 ~]# mkdir /var/www/html/digest
[root@centos65 ~]# echo "<h1>/var/www/html/basic/index.html</h1>" > /var/www/html/basic/index.html
[root@centos65 ~]# echo "<h1>/var/www/html/digest/index.html</h1>" > /var/www/html/digest/index.html
[root@centos65 ~]#


■htpasswdファイル準備
## Basic認証用
[root@centos65 ~]# mkdir /etc/httpd/htpasswd
[root@centos65 ~]# htpasswd -bc /etc/httpd/htpasswd/basic.htpasswd basic secret
Adding password for user basic
[root@centos65 ~]# cat /etc/httpd/htpasswd/basic.htpasswd
basic:TrttZUUoY6iEE
[root@centos65 ~]#
※"-b"はパスワードを指定するオプション。

## Digest認証用
[root@centos65 ~]# htdigest -c /etc/httpd/htpasswd/digest.htpasswd DigestAuth digest
Adding password for digest in realm DigestAuth.
New password: ←secret
Re-type new password:
[root@centos65 ~]# cat /etc/httpd/htpasswd/digest.htpasswd
digest:DigestAuth:9d5ce11731e1e06d88aaa030476b5447
[root@centos65 ~]#
realm(領域名)を指定する必要がある。今回は"DigestAuth"とした。


■認証設定ファイル準備
[root@centos65 ~]# vi /etc/httpd/conf.d/auth.conf
[root@centos65 ~]# cat /etc/httpd/conf.d/auth.conf
## for Basic Authentication
<Directory "/var/www/html/basic">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd/basic.htpasswd
    Require valid-user
</Directory>

## for Digest Authentication
<Directory "/var/www/html/digest">
    AuthType Digest
    AuthName "DigestAuth"
    AuthUserFile /etc/httpd/htpasswd/digest.htpasswd
    Require valid-user
</Directory>
[root@centos65 ~]#
Digest認証はAuthNameにrealmで指定した値を設定する必要がある。


■httpd.confにモジュールがロードされているか確認
[root@centos65 ~]# grep -e auth_basic -e auth_digest /etc/httpd/conf/httpd.conf
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
[root@centos65 ~]#

## httpd再起動
[root@centos65 ~]# /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
[root@centos65 ~]#


■認証確認
## Basic認証
http://192.168.77.149/basic/


## Digest認証
http://192.168.77.149/digest/

Basic認証と同じような手順および使い勝手であるので、パスワードをとりあえず暗号化できるDigest認証の方がお勧めかも。


この情報が何かのお役にたてれば幸いです。m(_ _)m

2014年6月8日日曜日

VMwareのOVFファイルをAWSへインポートする手順

VMWareESXi上で動作している仮想マシン(VM)をAWS環境にインポートする手順をまとめます。
今回インポートするVMのOSはCentOS6.5を例としています。インポートできるOSには制限があります。

1) VMWareESXi上のVMをOVFテンプレートのエクスポートでローカルPC等に保存。
2) AWSにてAmazon LinuxのEC2を作成。(Amazon EC2 API Tools がインストール済みだから)
3) 1)のOVFファイル群の中のvmdkファイルを2)で作成したEC2にFTP等でアップロード。
4) 2)のEC2にてec2-import-instanceコマンドでvmdkファイルからEC2を生成。

※keyやIDの値は実際には存在しないものに変更しています。

作業OS: Amazon Linux AMI release 2014.03
インポート対象OS: CentOS 6.5 (64-bit)



■Amazon EC2 API Tools の確認
[ec2-user@amazon-lnx ~]$ ll /opt/aws/apitools/ec2/
total 88
drwxr-xr-x 2 root root 20480 Mar 25 14:59 bin
-rw-r--r-- 1 root root   134 Jan 28 05:48 environment.sh
drwxr-xr-x 2 root root  4096 Mar 25 14:59 lib
-rw-r--r-- 1 root root  4852 Jan 28 05:48 license.txt
-rw-r--r-- 1 root root   539 Jan 28 05:48 notice.txt
-rw-r--r-- 1 root root 46468 Jan 28 05:48 THIRDPARTYLICENSE.TXT
[ec2-user@amazon-lnx ~]$
## 動作確認
[ec2-user@amazon-lnx ~]$ ec2-describe-regions -O AKIAXXXXE2DB7AVDFRE4 -W yXXXXXSKGX0mKsn8oL805DzOlR+rt56Drewi85MEmg
REGION  eu-west-1       ec2.eu-west-1.amazonaws.com
REGION  sa-east-1       ec2.sa-east-1.amazonaws.com
REGION  us-east-1       ec2.us-east-1.amazonaws.com
REGION  ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
REGION  us-west-2       ec2.us-west-2.amazonaws.com
REGION  us-west-1       ec2.us-west-1.amazonaws.com
REGION  ap-southeast-1  ec2.ap-southeast-1.amazonaws.com
REGION  ap-southeast-2  ec2.ap-southeast-2.amazonaws.com
[ec2-user@amazon-lnx ~]$


■VMDKファイルを準備
※.ovfおよび.mfファイルはAWSには取込めないので不要。
[ec2-user@amazon-lnx ~]$ ll /home/ec2-user/cent65-web-disk1.vmdk
-rw-r--r-- 1 ec2-user ec2-user 1644029440 May 23 15:19 /home/ec2-user/cent65-web-disk1.vmdk
[ec2-user@amazon-lnx ~]$


■インポート用シェルスクリプト作成
[ec2-user@amazon-lnx ~]$ cat vmdk_import.sh
#!/bin/bash

ec2-import-instance \
    --region ap-northeast-1 \
    --aws-access-key AKIAXXXXE2DB7AVDFRE4 \
    --aws-secret-key yXXXXXSKGX0mKsn8oL805DzOlR+rt56Drewi85MEmg \
    --instance-type c3.large \
    --group forpublic-sg03 \
    --format VMDK \
    --architecture x86_64 \
    --platform Linux \
    --bucket cloud-bucket05 \
    --owner-akid AKIAXXXXE2DB7AVDFRE4 \
    --owner-sak yXXXXXSKGX0mKsn8oL805DzOlR+rt56Drewi85MEmg \
    --availability-zone ap-northeast-1a \
    --subnet subnet-62ac600b \
    /home/ec2-user/cent65-web-disk1.vmdk

exit 0
[ec2-user@amazon-lnx ~]$
keyはあらかじめ環境変数に設定しておけば指定する必要はありません。
セキュリティーグループを指定しても、なぜかデフォルトグループが設定されます。
インポートできるインスタンスタイプに制限があります。こちらを参考にしてください。
availability-zoneを指定しないと下記のようなエラーに陥る場合があります。
[ec2-user@amazon-lnx ~]$ ./vmdk_import.sh
Requesting volume size: 100 GB
Client.InvalidParameter: Subnet 'subnet-62ac600b' is in the availability zone 'ap-northeast-1a'.
[ec2-user@amazon-lnx ~]$


■インポート実行
[ec2-user@amazon-lnx ~]$ ./vmdk_import.sh
Requesting volume size: 100 GB
TaskType        IMPORTINSTANCE  TaskId  import-i-fg5bb5f2       ExpirationTime  2014-05-30T07:51:01Z    Status  active  StatusMessage  Pending InstanceID      i-cdee1cd4
DISKIMAGE       DiskImageFormat VMDK    DiskImageSize   1644029440      VolumeSize      100       AvailabilityZone        ap-northeast-1c        ApproximateBytesConverted       0       Status  active  StatusMessage   Pending : Downloaded 0
Creating new manifest at cloud-bucket05/106dee24-5fff-4b4d-ac72-96b759e81450/cent65-web-disk1.vmdkmanifest.xml
Uploading the manifest file
Uploading 1644029440 bytes across 157 parts
0% |--------------------------------------------------| 100%
   |==================================================|
Done
Average speed was 7.145 MBps
The disk image for import-i-fg5bb5f2 has been uploaded to Amazon S3
where it is being converted into an EC2 instance.  You may monitor the
progress of this task by running ec2-describe-conversion-tasks.  When
the task is completed, you may use ec2-delete-disk-image to remove the
image from S3.
[ec2-user@amazon-lnxw ~]$
インポート作業中にS3を確認すると、指定したバケットに10MBのファイルがVMDKファイルサイズ分作成されていく。
インポートは成功。マネージメントコンソール上に新たなEC2が表示された。


■インポートしたVMの起動
マネージメントコンソールからstartしたが、下記エラー。
Are you sure you want to start this instance?
i-cdee1cd4 (cent65-web)
Error starting instances
Invalid value 'i-cdee1cd4' for instanceId. Instance does not have a volume attached at root (/dev/sda1)
原因はEBSを準備中に起動しようとしたため。しばらく待てば起動できた。
EC2正常起動完了後は、不要となったS3上のファイルは削除しました。


この情報が何かのお役にたてれば幸いです。m(_ _)m