ひとこと

― 今日のひとこと ―
気付けば前回更新してから2年以上経ってた
(2023.10.25)

2013年1月31日木曜日

Hackme攻略 Lv3

今回はHackme Lv3の攻略。



以下、Hackmeの攻略に関するネタバレを多大に含みます。自力で攻略したいなら見ちゃだめです。




[Lv3]




1.ヒントを探す

いつものようにページを眺める。今回もまたヒントになりそうなものは・・・あった。
ページのURLにファイルの階層が表示されている。妙に変だなぁ・・・



2.考える

「URL」「階層」「クラッキング」とくれば思いつくのはディレクトリトラバーサルである。
ディレクトリトラバーサルっていうのは、簡単に言えば他人に見られちゃまずいファイルを覗くことだ。
Hackmeはパスワードクラックの腕試しをするサイト。ということは・・・パスワードが書かれたファイルにアクセスしろということか!



3.検証する

パスワードが書かれたファイル。そういえば、SC対策の講義でshadowパスワードの話を聞いたことがあるな。
たしかLinuxでは「/etc/passwd」と「/etc/shadow」にパスワードを記録しているってやつだ。

普通はユーザが上位階層にアクセスできないようなパーミッションが割り当てられていると思うが・・・
試しに「/etc/passwd」にアクセスしてみよう。URLの「page=」以下を「../etc/passwd」に書き換えてみる。
結果は・・・

ファイルの内容が表示された!

次はshadowだ。しかしURLを「../etc/shadow」に書き換えてみたところ、そんなファイルは存在しないというメッセージが。
調べてみたところ、どうやらUNIX系システムの種類によってshadowファイルの位置や名前が違うらしい。

AIX  → /etc/security/passwd
BSD  → /etc/master.passwd
DG/UX → /etc/tcb/aa/user/
HP-UX → /.secure/etc/passwd

といった具合だ(*1)。
Hackmeの場合はBSDのようで、「/etc/master.passwd」にアクセスすることでshadowファイルを閲覧できた。


どうやら見立ては正しかったようだ。
しかし、パスワードは暗号化されている。復号しなくては。


2021年2月27日追記~~~
/etc/shadowでshadowにアクセス可とコメントにて情報提供いただき、
確かに/etc/shadowを閲覧できることを確認しました。
(/etc/master.passwordは消えているようです。)
どこかのタイミングで変更されてたんですね。
情報提供ありがとうございました!
~~~~~~~~~~~~

4.ツールを使う

passwdファイルとshadowファイルからパスワードを復号するのは人間には不可能なので、何らかのツールが必要になる。
一般的にはJohn the Ripperというフリーソフトが有名なようなので、これを使ってみる。


ここからJohn the Ripperをダウンロードし、解凍する。


・先ほどアクセスしたpasswdとmaster.passwdの内容をそれぞれテキストエディタにコピペし、
「passwd」「shadow」として保存する。


・ダウンロードしたフォルダ内にあるunshadow.exeをコマンドプロンプトで実行し、
passwdファイルとshadowファイルを結合して「passfile」として保存する。

  unshadow.exe passwdファイルのパス shadowファイルのパス > passfileファイルのパス
これで、指定したパスにpassfileファイルが生成される。

このファイルからパスワードを解析していくわけだ。


5.Hackyou!

John the Ripperには3つの解析モードがある。
・single  → ユーザ名と同じパスワードだとかの単純なパスワードを解析する
・wordlist → 既存の単語リストを使ってパスワードを解析する
・incremental → 文字のあらゆる組み合わせを試行して解析する。いわゆるブルートフォース

全て試したところ、singleではヒットせずincrementalでは1時間かけても解析が終わらなかったため、
wordlistを使った方法だけメモしておく。

コマンドプロンプトで↓のコマンドを実行する。
  john --wordlist=password.lst passfileファイルのパス

これだけ。↓のコマンドを実行すれば、解析したパスワードとユーザ名の対応がわかる。
  john -show passfileファイルのパス

そしてこのユーザ名とパスワードをHackme Lv3のフォームに入力すると・・・


Lv3クリア!




Hackmeやるよりこうやって説明書いてる方が時間かかるな。。

*1 The Hack FAQ参照




AWSのS3とJavaで共有ギャラリーでも作ろうかと思い始めた。
暇があればやってみよう。


[2016/02/07 追記]
Lv4の攻略について書きました。


2013年1月28日月曜日

Hackme攻略 Lv2

今回はHackme Lv2の攻略。


以下、Hackmeの攻略に関するネタバレを多大に含みます。自力で攻略したいなら見ちゃだめです。





[Lv2]




1.ヒントを探す

今回もまた、ページを眺めてみてもこれといった発見はない。右クリックもできる。
ソースコードにもアカウント情報は記載されていない(当然といえば当然だが)
物は試しとLv1と同じ情報を入力してみると・・・

「ユーザ名またはパスワードが違います」というエラーメッセージが表示された。

そういえば、たまにパスワードだけが間違っているって表示しちゃうサイトがあるが、
それって結構危ないんだよな。IDはデータベース上に存在してるって自分で証明してるわけだから。
Lv2さんはそんなに甘くないってことだな。流石や!


2.考える

さて、どうやらユーザが見ることができる範囲にヒントになるような情報はなさそうだ。
仕方がないので少し専門的な知識を使おう。

Q.Webサイトのログインフォームを作る際に注意しなければならない攻撃は?
A.SQLインジェクションです。

Q.SQLインジェクション対策として有効なのは?
A.サニタイジング処理またはバインド機構です。

という具合に、データベースとWebセキュリティの基本を知ってれば誰もが考える。
では早速検証してみよう。


3.検証する

要は、SQLにおいて意味を持つ特殊文字がどう扱われているかを調べればいいわけだ。
代表的なのはアポストロフィ(')だな。

というわけでIDをてきとーに入力し、パスワードにただ1文字 ' と入力してみる。


結果は・・・


pg_queryとかいういかにもデータベース扱ってますよと云わんばかりに命名されたメソッドでエラーが!
アポストロフィ付近で文法エラーが起きてクエリが発行できなかったと書いてある。

さっきまでクラッカーにヒントを与えない完璧なエラーメッセージを発し続けていたLv2さんが
こんな明瞭なヒントを出すなんて・・・妙に変だなぁ・・・

プログラムでサニタイジングやプレースホルダが使われているなら、
はじめのように「ユーザ名またはパスワードが違います」と表示されるはず。
しかしSQL文法エラーが起きているという事は、入力された特殊文字がSQL文中で意味を持っているということ!
SQLインジェクションが有効だと考えられるね。


4.Hackyou!

SQLインジェクションというのは、簡単に言えばフォームにSQL文を打ち込んで実行させる手法だ。
ログインフォームでは、認証に用いられるクエリの実行結果が「true」になるようにSQL文を入力すればいい。

たとえば、↓のようなSQL文でパスワードの認証を行っているとする。
  SELECT user_password FROM user_info WHERE user_password = '<入力された値>';
この一文の内、WHERE句の条件に注目する。
素直に「password = ?」の形でクラッキングを試みたところで勝算はない。
このままでは本当に存在するパスワードを入力する以外ではクエリの結果を「true」にできないからだ。

上記クエリの実行結果を「true」にするには、SQL文を↓のように書き換えて実行させればいい。
  # xxxは任意の文字列
  SELECT user_password FROM user_info WHERE user_password = 'xxx' OR 絶対にtrueになる式 --';

条件式にある「A OR B」という形は、「最低限AかBのどちらかがtrueなら結果もtrue」っていう意味。
だからxxxが間違っていても、後に書いた<絶対にtrueになる式>によって実行結果はtrueになる。

そして、「--」は「それ以降をコメント化(無視)する」という意味。
これをつけないと末尾に残るアポストロフィによって文法エラーになってしまう。


説明が長くなったが、そんなこんなの理由から僕が入力したのは以下の通りだ。
ID :まろ最高
Pass:a' or 1=1 --


結果は・・・

Lv2クリア!



次回はLv3の攻略。

2013年1月27日日曜日

Hackme攻略 Lv1

クラッキングの腕を試すサイトとして有名なHackme

内容はシンプルで、Lv1からLv5までの5段階を順番にパスワードクラッキングしていくというもの。
Lvが上がる毎に難易度も高くなっていく。
これまでに約22万3000人が挑戦しているが、その中でもLv5をクリアした者はたったの3人しかいない・・・。

僕も先日挑戦してみたところ、Lv3まではなんとかクリアできた。

メモが必要なのはツールを使うLv3だけだと思うが・・・まぁとりあえずLv1からの攻略法をメモしておく。




以下、Hackmeの攻略に関するネタバレを多大に含みます。自力で攻略したいなら見ちゃだめです。


[Lv1]


1.ヒントを探す
ページを眺めてみても、特にヒントになりそうなものは無い。
が、しかしページで右クリックしてみると・・・


右クリックのメニューが開けない。妙に変だなぁ・・・
歌の歌詞を載せてるサイトなんかでは、歌詞のコピペを封じるために右クリックを禁止してたりするよね。
おそらくこのHackme Lv1にも、右クリックされたら困る理由があるに違いない。怪しい!
っていうか(笑)がそこはかとなくむかつく!


2.Hackyou!
まぁだいたい想像つくよね。ソースコードが怪しい。
右クリックが駄目なら別の方法でソースコードを見ればいい。
FireFox18.0.1の場合は↓のように操作する。


これでこのページのソースコードを閲覧できる。
試しにCtrl+Fで「pass」と検索してみると・・・

無用心すぎるだろ・・・。

このidとpassをログインフォームに打ち込んでみる。


結果は・・・

Lv1クリア!



とんでもなく簡単。プログラミングをかじった事があれば中学生でも解ける。
次回はLv2攻略。



------------2014/01/25 追記------------

Hackmeではブラウザのツールボタンからソースコードを確認する事が出来るが、
サイトによっては何のボタンも表示されないよう制御されている場合もある。

そんな時はどうやってソースコードを閲覧するのか?

実は、Windowsには「コンテキストメニューを表示するショートカットキー」が存在する。
ctrl + shift + F10
(または shift + F10)

ここからソースコードを表示するメニューを選択すればいいわけだ。こっちの方がハッカーぽいね

------------2019/12/31 追記------------
今更ながら追記。F12を押すというのが一番簡単ですね


2013年1月26日土曜日

Java ServletとAWS-SESでメール送信 No.3

フォームから送信された内容をチェックし、前回作ったプログラムを実行するサーブレットプログラムを作る。


チェックするのは2つ。
・本文の有無
何度か試してみたところ、本文が空だとメール送信できない様子(要検証)
なので本文が入力されているかどうかを調べる。
(このコードでは0か1かの簡単なチェックしかしていない)

・宛先アドレス
今回は個人的な事情で、宛先メールアドレスを指定できる機能が必要だった。
フォームの「宛先メールアドレス」にアドレスが入力されていればそのアドレスへ、
未入力なら本来の宛先である自分のGmailアドレスへメールを送信する。
(ここでも単純なチェックしかしていないが)


[プログラム]
package send;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SendMail extends HttpServlet{
 
 public void doPost(HttpServletRequest request,HttpServletResponse response)
  throws ServletException,IOException{
  
  // 文字コード指定
  request.setCharacterEncoding("UTF-8");
  response.setContentType("text/html; charset=UTF-8");
  PrintWriter out = response.getWriter();
  
  // メール内容設定
  String subject = request.getParameter("subject"); // 件名取得
  String body = request.getParameter("body");   // 本文取得
  String address = "";
   // 本文入力チェック
  if (body.equals("")) {
   out.print("本文が入力されていません。");
  }else {
   // 宛先アドレス設定
   address = request.getParameter("address");
    // 宛先アドレス入力チェック
   if (address.equals("")) {
    address = "xxxxxxx@gmail.com";
   }

   // メール発射用意!!
   SES ses = new SES();
   // 実行して結果メッセージ出力
   out.print(ses.send(subject,body,address));
  }
 }
}



またコード眺めてて思ったんだけど、メールの文字コードってISO-2022-JPじゃなかったっけ・・・
何も考えずUTF-8にしたが・・・まぁSESが直接メール送信するわけじゃないし、いいのかな(?)

いいか。メールの内容はちゃんと送れてるし。



プログラムをweb.xmlでマッピングする。





    
    
        SendMail
        send.SendMail
      
    
        SendMail
        /SendMail
     
    



Syntax Highlighter使うとDOCTYPEが表示されないのかしら
このページのソースの1143行目を見ればわかると思うがこのxmlコードにはDOCTYPEの指定があります。



とりあえず、ここまで出来たらEclipseでTomcatプラグインを使って動作テストをしてみましょう。

正常にメールが送信されているのを確認したら、
Amazon Web Serviceで仮想サーバ構築 No.5にメモした方法でFTP通信をして、
TomcatのWebappsフォルダ直下(/opt/tomcat7/webapps/)にプロジェクトを配置する。

その後Amazon Web Serviceで仮想サーバ構築 No.4にメモした方法でTomcatを再起動
またはブラウザでTomcatのManagerにアクセスしてプロジェクトを起動する。


これで問い合わせフォーム完成!
ちなみにフォームのURLは「http://xxx.xxx.xxx.xxx:8080/SendMail/html/form.html」である。

Tomcatをポート番号デフォルトで使用している場合、アクセスするポートは8080番となる。
AWS-EC2インスタンスにアクセスする場合はSecurity Groupで8080を許可する必要があるので注意。





そういえばこないだHackMeのLv3をクリアしたので
その攻略法も今度メモしておこうかな。

2013年1月25日金曜日

Java ServletとAWS-SESでメール送信 No.2 -サーバプログラム作成-

前回作ったHTMLフォームに入力された内容をメール通知するプログラムを作る。


まずはとりあえずプログラムのサンプルを動かしてみよう。

1.Eclipseを起動し、AWS Java Projectを新規作成



2.プロジェクト名を入力し、AWS SDK for Java SamplesからSES JavaMail Sampleを選択し「完了」をクリック



3.生成されたプロジェクトにサンプルコードが入ってることを確認



4.サンプルコード中、メールアドレスを指定する部分を自分のアドレスに書き換える。

これを


こうする

この場合は自身のGmailアドレスから同じGmailアドレスにメールを送信することになる。


5.コードの変更を保存し、プログラムを実行する。

6.送信元に指定したメールアドレス宛に、Amazonからメールが届く。
その本文中のリンクをクリックするとアドレスが認証され、以降からメールが送信できるようになる。

7.もう一度プログラムを実行すると、指定した宛先アドレスにメールが届く。




このサンプルコードを基に、問い合わせフォームのサーバプログラム SES.java を作成した。

[事前準備]
○AWSアカウントのキーの値を確認する
AWSにサインアップし、「Security Credentials」をクリックする

セキュリティ証明書ページ中ほどの「アクセス証明書」>「アクセスキー」にある英数字がキーの値。

○必要なjarファイルを用意する
下記のファイルをプロジェクトの「WEB-INF」>「lib」フォルダにコピペする。
・aws-java-sdk-1.3.28.jar
・commons-codec-1.3.jar
・commons-logging-1.1.1.jar
・httpclient-4.1.1.jar
・httpcore-4.1.jar
・mail-1.4.3.jar
ちなみに全てaws-java-sdkのフォルダ内にあります。
それぞれのバージョンは多少違ってもいいんじゃないかな確認してないけど
コピペしたらEcliplseでプロジェクトのビルドパスに追加しましょう。

[プログラム]
package send;

import java.io.IOException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleemail.AWSJavaMailTransport;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient;
import com.amazonaws.services.simpleemail.model.ListVerifiedEmailAddressesResult;
import com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest;

public class SES {

  // subject(件名),body(本文),to(宛先メールアドレス)を引数とするメール送信実行メソッド
    public static String send(String subject,String body,String to) {
     
     final String access_key= "AWSアカウントのACCESS_KEYの値";
     final String secret_key= "AWSアカウントのSECRET_KEYの値";
     
        final String SUBJECT = subject;      // 件名
        final String BODY = body;       // 本文
        final String TO = to;        // 宛先
        final String FROM = "xxxxxxx@gmail.com";     // 送信元

    // 実行結果メッセージ用の変数
     String message = "";
     
     AWSCredentials credentials = new BasicAWSCredentials(access_key,secret_key);
  AmazonSimpleEmailService ses = new AmazonSimpleEmailServiceClient(credentials);

        verifyEmailAddress(ses, FROM);  // 送信元認証
        //verifyEmailAddress(ses, TO);  // 宛先認証?

  Properties props = new Properties();
  props.setProperty("mail.transport.protocol", "aws");
        props.setProperty("mail.aws.user", access_key);
        props.setProperty("mail.aws.password", secret_key);

        Session session = Session.getInstance(props);
        try {
            Message msg = new MimeMessage(session);
             // 送信元設定
             msg.setFrom(new InternetAddress(FROM));
             // 宛先設定
             msg.addRecipient(Message.RecipientType.TO, new InternetAddress(TO));
             // メールタイトル設定
             msg.setSubject(SUBJECT);
             // メール本文設定
             msg.setText(BODY);
            msg.saveChanges();

            Transport t = new AWSJavaMailTransport(session, null);
            t.connect();
            t.sendMessage(msg, null);
            t.close();
            
            message = "送信が完了しました。";
            return message;
            
        }catch (AddressException ae) {
         message = "入力されたメールアドレスが正しくありません。";
         return message;
        }
         catch (Exception e) {
         message = "送信に失敗しました。";
         return message;
        }
    }

  // 以下は変更なし
    private static void verifyEmailAddress(AmazonSimpleEmailService ses, String address) {
        ListVerifiedEmailAddressesResult verifiedEmails = ses.listVerifiedEmailAddresses();
        if (verifiedEmails.getVerifiedEmailAddresses().contains(address)) return;

        ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(address));
        System.out.println("Please check the email address " + address + " to verify it");
        System.exit(0);
    }
}



今コード眺めてて思ったけどmessageのあたりもっとスマートにできるよな・・・精進しよう

新しい送信元を設定する度にAmazonから認証用メールくるのが嫌!!って場合は、
AWSでプロダクションアクセス権を申請すると認証ステップをスキップできて良いそうです。
僕は面倒だから申請してないけど。今回の場合、送信元は固定だしね


長くなったので最後のプログラムは次回。




2013年1月24日木曜日

Java ServletとAWS-SESでメール送信 No.1 -準備とフォーム作成-

今回メモするのは、問い合わせフォームみたいなWebアプリケーションプログラム。
っていうか問い合わせフォーム。前回までに作った仮想サーバで動かす。


全体的な処理の流れはこんな感じ↓
1.HTMLフォームに内容を入力し、Java Servletプログラムに送信
2.Java Servletプログラムは内容を確認し、SESにリクエストを送信
3.SESでメール送信


使うもの
Eclipse
Eclipse用Tomcatプラグイン
AWS Toolkit for Eclipse
※Tomcatプラグインを使うには、PCにTomcatをインストールする必要があるよ。


プロジェクトの最終的な構造は↓の通り。


form.html   → 普通のHTMLフォーム
SendMail.java → 入力内容を簡単にチェックし、問題なければメールを送信するプログラム
SES.java   → SESでメールを送るためのメソッドを定義したクラスファイル



form.html を作成する。

テスト用に宛先メールアドレスの入力欄を作っているが別に無くても問題ない。コードは以下



testForm


件名と本文を入力してください。
管理者のメールアドレス以外の宛先にメールを送信する場合は、 その宛先メールアドレスも入力してください。
件名:

本文:

宛先メールアドレス:





ほんとは今日の内に全部書いてしまうつもりだったんだけど、コードや画像を載せると記事が激しく長くなり
可読性が著しく低下する事になるから2回か3回に分けて書くことにする。

2013年1月14日月曜日

Amazon Web Serviceで仮想サーバ構築 No.5 -vsFTPdインストール-

前回、仮想サーバがAPサーバとして動かせる状態になった。
しかし動くだけではだめ。開発したプログラムを配置できるようにしなければならない。

というわけで今回は、FTP通信でデータを仮想サーバと送受信できるようにする方法をメモする。
まぁインスタンスにvsFTPdをインストールして設定するだけなんだけど。

vsFTPd(very secure FTP daemon)というのは、その名の通りFTPサーバである。
設定内容は以下の通り。




1.No.2にメモした方法で、インスタンスに接続する。

2.インスタンスにvsftpdをインストールする。
sudo apt-get update
sudo apt-get install vsftpd
vsftpdが自動で起動してしまう↓ので、停止させる。

sudo /etc/init.d/vsftpd stop

3.vsftpd.confの内容を変更する。
sudo nano /etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable=YES
use_localtime=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list
local_root=

4.vsftpd.chroot_listに、chrootを許可するユーザのユーザ名を記述する。(この記事の最後を要確認)
sudo nano /etc/vsftpd.chroot_list

5.vsftpd.user_listに、アクセスを許可するユーザのユーザ名を記述する。
sudo nano /etc/vsftpd.user_list

6.vsftpdを起動する。
sudo service vsftpd start


これで、開発のための仮想サーバ側の基本的な準備はおしまい。たぶん。
では、ここからは仮想サーバと実際にデータをやり取りする方法。


7.FFFTPをPCにダウンロード&インストールする。

8.FFFTP.exeを実行してFFFTPを起動する。


9.メニューの「接続(F)」>「接続(C)」をクリック


10.「ホスト一覧」ウィンドウの「新規ホスト」をクリック


11.「基本」タブを編集する。
接続先ホストの名前(任意)とIPアドレス、
chroot_listとuser_listに記述したユーザ名とそのユーザのパスワードを書き込む。

12.「拡張」タブを↓のように編集する。


13.「文字コード」タブを編集する。ホスト・ファイル名共にUTF-8を指定。

14.「高度」タブを↓のように編集し、「OK」をクリックして設定完了。


15.「ホスト一覧」ウィンドウに、設定した接続先が表示される。


16.「接続」をクリックし、↓の画面のようになれば成功。




これで、自宅PCで書いたコードを仮想サーバに送って実行させる事ができるようになった。
うん。万々歳!!


・・・ただ、ひとつ訂正しなければならない点があったんだ。
ここまで普通に流してきた風に書いたけど、これを読んでる未来の自分はもう気づいてるはずだ。

「前回Tomcat用に作ったユーザにはパスワードなんか設定してなかった。いつの間に設定したんだ?」
そう訝しんでる事だろう未来の自分。むしろ訝しめ。

実は、前回のやり方で作成したユーザmaroはそのままではvsFTPdで使えないんだ。
だから同名ユーザを作り直して、そのついでにパスワードを設定していたんだ。すまない。

そこらへんの手順は次の通りだ。

1./opt/tomcat7以下の所有者をubuntuに変更
sudo chown -R ubuntu /opt/tomcat7

2.maroを削除
sudo userdel -r maro

3.maroを作成しパスワードを設定
sudo adduser maro

4.maroをsudoersに追加
sudo visudo
# User privilege specification
root    ALL=(ALL) ALL
maro    ALL=(ALL) ALL

5./opt/tomcat7以下の所有者をmaroに変更
sudo chown -R maro /opt/tomcat7

もしこの時点で/home直下にmaroディレクトリが無ければ、以下の手順も追加する。
6./home直下にmaroディレクトリを作成
sudo mkdir /home/maro

7./home/maro以下の所有者をmaroに設定
sudo chown -R maro /home/maro


以上の5つないし7つの手順を、vsFTPdを起動する前にやっておけばいい。
そんなん面倒くせぇよと思うならもうubuntuアカウントのpasswd設定してvsFTPdに使う事をお勧めします

2013年1月12日土曜日

Amazon Web Serviceで仮想サーバ構築 No.4 -Tomcatインストール-

仮想サーバはJava Servletが動作するAPサーバとして使用するので、
Apache Tomcatを仮想サーバにインストールする。

LinuxやCUIに不慣れだと小難しくて面倒に思えるが、やってみると案外簡単だった。



1.No.2にメモした方法で、インスタンスに接続する。

2.インスタンスにTomcatをダウンロードする。
sudo wget http://ftp.riken.jp/net/apache/tomcat/tomcat-7/v7.0.34/bin/apache-tomcat-7.0.34.tar.gz

ちなみに、ここでは現在の最新版であるver7.0.34をダウンロードしている。
最新のバージョン情報を確かめるにはここを確認する。

3.ダウンロードしたファイルをtar形式のアーカイブに解凍する。
sudo tar -xzf apache-tomcat-7.0.34.tar.gz

4.Tomcatを/opt直下へ移動する
sudo mv apache-tomcat-7.0.34 /opt/tomcat7

5.Tomcat操作用のユーザを設定しておく。maroと命名
sudo useradd -d /opt/tomcat7 -s /bin/false maro

6./opt/tomcat7以下の所有者を、5で設定したユーザに設定
sudo chown -R maro. /opt/tomcat7

7.Tomcatを起動
sudo /opt/tomcat7/bin/startup.sh

8.ブラウザで「http://xxx.xxx.xxx.xxx:8080/」にアクセス。xxx...の部分は仮想サーバのIPアドレスに置き換える

9.こんな画面が表示されたらインストール成功!

※インスタンスのTomcatのWebページにアクセスできない場合はAWSのSecurity Groupを確認


よし!これで終わり!と思うかも知れないがまだやる事がある。
7でTomcatを起動した時に表示された内容に、おかしな点があるはずだ。


JRE_HOMEの位置が違うよね。
No.1から書いてきた通りにやってきたなら、jreは「/usr/lib/jvm/java-7-oracle」の直下にあるはず。

というわけで、この機会にJREの位置をTomにしっかり教えてあげよう。


10.catalina.shを編集し、JAVA_HOMEとJRE_HOMEを設定する。
sudo nano /opt/tomcat7/bin/catalina.sh
  JAVA_HOME="/usr/lib/jvm/java-7-oracle"
  JRE_HOME="/usr/lib/jvm/java-7-oracle/jre"

11.Tomcatを終了→起動し、JRE_HOMEが設定した通りに変更されているのを確認する。
sudo /opt/tomcat7/bin/shutdown.sh
sudo /opt/tomcat7/bin/startup.sh



ここまでやればAPサーバとして最低限の動作はするんだけど
せっかくなのでmanagerを使えるようにする。


12.tomcat-users.xmlを編集し、managerのアカウントを設定する。
sudo nano /opt/tomcat7/conf/tomcat-users.xml

tomcat-usersタグ内に以下の2行を追加(xxx..の部分は任意の文字列)
  <role rolename="manager-gui" />
  <user username="xxxxx" password="xxxxxxxxxx" roles="manager-gui" />



13.Tomcatを再び再起動し、ブラウザで「http://xxx.xxx.xxx.xxx:8080/manager」にアクセスし、
IDとパスワードの欄に12で設定したusernameとpasswordをそれぞれ入力する。

14.この画面が表示されたらok




今回使ったコマンドの意味は↓のサイトに詳しく載っている。
Unix入門 - Linuxコマンド一覧
Unix入門 - Linuxコマンド一覧 - tar
Unix入門 - Linuxコマンド一覧 - useradd
Unix入門 - Linuxコマンド一覧 - chown


2013年1月8日火曜日

Amazon Web Serviceで仮想サーバ構築 No.3 -Javaインストール-

APサーバとしてJava Servletを使う予定があるので、
前回までに作成した仮想サーバにjava7をインストールする。

手順は激しく簡単である。



1.前回紹介した方法で、インスタンスに接続する

2.「sudo add-apt-repository ppa:webupd8team/java」と入力し、実行する


3.「sudo apt-get update」と入力し、実行する

4.「sudo apt-get install oracle-jdk7-installer」と入力し、実行する


ここまでの作業の途中で何度か質問されるが、その全て肯定すること。
また、以下のような画面が表示された場合は全てYesを選択する。


以上でインストールは終了。

5.「java -version」と入力・実行し、バージョンを確認してみる。




次に、環境変数を設定する。これも簡単。

1.「sudo nano /etc/bash.bashrc」と入力して実行。テキストファイルの編集モードになる。

2.以下の3行を追加する。

  JAVA_HOME="/usr/lib/jvm/java-7-oracle"
  CLASSPATH=".:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar"
  export JAVA_HOME CLASSPATH

おわり。



そういえば、ひとつ重要なことが・・・
原因はわからないがPC環境によってはputtyを数分間放置するとputtyがフリーズする
この構ってちゃんめ!
もし自分のputtyがそんな寂しがり屋さんだったなら、puttyにはこまめにキー入力をしてあげましょう。



---2013/08/02 追記---
puttyのフリーズと同様の現象はTeraTermでも起きます。
しかしTeraTermでは、ハートビートをこまめに送るよう設定すれば現象が改善されることがあります
(改善されないこともあります。なのでやっぱり原因不明)
puttyが止まりすぎて苛々しているあなたは、とりあえずTeraTermを使ってみましょう。

2013年1月7日月曜日

Amazon Web Serviceで仮想サーバ構築 No.2 -インスタンスへの接続-

七草粥がおいしい。さつま揚げとたくあんも最高。
というわけで今回は、前回作成したインスタンスに自宅PCから接続する方法をメモしておく。

AWSで作った仮想サーバは当然Amazonのデータセンタに存在する。
前回はインスタンスを東京から15000km離れたウェストバージニア州に設置したので、
自宅から直接操作するなんてことはできない。なのでSSH通信を使って遠隔操作する。そのために使用するのがputtyだ。

puttyフリーのtelnet/SSHクライアントソフトであり、仮想サーバを構築する上で(僕にとっては)必要不可欠な存在である。


まず、puttyを使う準備をしよう。

1.puttyのダウンロードページで「putty.zip」をクリックし、zipファイルをダウンロードする。


2.ダウンロードしたファイルを解凍すると、↓のような内容である事が確認できる。


3.アプリケーションがいくつか入っているが、利用するのは「putty.exe」「puttygen.exe」だけだ。


4.安全なSSH通信を行うには鍵が必要だ。ここで前回ダウンロードした鍵ファイルを使用する。
前回ダウンロードした鍵ファイルをputtyで使えるように加工する。「puttygen.exe」を起動。


5.「Load」をクリックし、前回ダウンロードした鍵ファイル(~.pem)を選択


6.読み込み成功メッセージが表示される。「OK」をクリック


7.何も入力せず「Save private key」をクリック。
パスワード設定しなくていいの?と訊かれるが「はい」をクリックする


8.新たに作成したputty用鍵ファイル(~.ppk)を保存。ファイル名は何でもok


以上でSSH通信の準備は整った。早速インスタンスに接続してみる。


1.AWS EC2のページへ行き、前回作成したインスタンスを起動する。

2.インスタンスをクリックして選択すると、画面下部にインスタンスの情報が表示される。
↓の画像の下線部を見てほしい。


一部ぼかしてある↑の画像では「107-xxx-19-1x1」となっている部分。
これがインスタンスのIPアドレスの値を表している。

3.先ほどダウンロードしたフォルダ内の「putty.exe」をクリックして起動

4.画面左側の「Category」から「Session」を選択し、
「Host Name (or IP address)」に先ほど確認したインスタンスのIPアドレスを入力する。
(今回の自分の場合、 107.xxx.19.1x1 がIPアドレスとなる)


5.次に、「Category」から「Window」>「Translaiton」を選択し、
「Remote character set」を「UTF-8」にする。


6.「Category」から「SSH」>「Auth」を選択し、
「Browse」をクリックして先ほど作成したputty用鍵ファイルを選択


7.画面右下の「Open」をクリック

8.この画面が表示されたら接続成功。


9.ユーザ名を入力してログイン!


初回ログイン時に使用するユーザ名はデフォルトで決められている。
インスタンス作成時に指定したOSがLinuxなら「ec2-user」、Ubuntuなら「ubuntu」など。

※もし「server refused our key」と表示されてログインできないようなら、
インスタンスを作り直してみる事をお勧めする。その際はKey Pairも新たに作成すること。



これでインスタンスをいじる準備は全て整った。
次回からはこの仮想サーバをカスタマイズして、アプリケーションサーバを構築していく。