2013年4月26日金曜日

[CentOS] SSHを鍵認証で [セキュリティ]

VMWare上のサーバばかり使っているとセキュリティ意識が薄れてくるよね
だって自分のPCの中だけでやってるので、だれも使うことないし、常にrootでログインして作業してる有様(笑)

なので、実際の運用を想定して、ログイン認証をちょっとばかり硬くしてみようと思う

root ログインを禁止し、作業用ユーザでログインするように設定

・作業用ユーザを作る
# useradd hoge
# passwd hoge

・作成したユーザにwheel グループを設定
# usermod -G wheel hoge

・su できるユーザをwheel グループに制限する
 vi などで /etc/pam.d/su を編集する
この行のコメントをはずす
auth            required        pam_wheel.so use_uid
以下のtrust付き を有効にすると パスワードなしで su できるので注意
#auth sufficient pam_wheel.so trust use_uid

・root でのログインを禁止する
 vi などで /etc/ssh/sshd_config を編集する
この行を no にする
PermitRootLogin no

sshdを再起動して設定を有効にする(これでrootでログインできなくなります)
# service sshd restart

※これにより、ssh ログイン認証と su コマンドの認証で root になるためには2段階必要になるが、さらに、以下で鍵認証でログインするように設定する

パスワードログインを禁止し、鍵認証でログインするように設定

・鍵を作成する
作業用ユーザに変更
# su - hoge
鍵作成
$ ssh-keygen -t rsa
※鍵の保存場所、パスフレーズを尋ねられます

~/.ssh/id_rsa (秘密鍵)と ~/.ssh/id_rsa.pub(公開鍵) が作成される
秘密鍵(id_rsa)はクライアントにダウンロードし、サーバから削除しておく
公開鍵(id_rsa.pub)は以下のようにリネームしておく
$ cd .ssh
$ mv id_rsa.pub authorized_keys

・パスワードでのsshログインを禁止する
※再び root ユーザで作業
 vi などで /etc/ssh/sshd_config を編集する
公開鍵認証を有効にする(自分の環境はこの設定が無くてもデフォルトで公開鍵認証が有効である)
PubkeyAuthentication yes
パスワード認証を禁止する
PasswordAuthentication no


sshdを再起動して設定を有効にする
# service sshd restart


sshクライアントに秘密鍵を設定してログイン確認して終了





2013年4月19日金曜日

[CakePHP] テーマの切り替え [Theme]

CakePHPにテーマという見た目を切り替える機能があることがわかった

以前の投稿でスマホ用ページを切り替える方法として、
    $this->view = $this->view . "_sp";
こんなやり方すればいいと思っていたが、このようなスマホ用ページを切り替えるような使い方をするときは、 テーマを使ったほうがいいと思い始めた

テーマの切り替え方は以下のようにすればいい
    $this->theme = "SmartPhone";

Viewフォルダは以下のように配置する
app/
  └ View/
      └ Themed/
           └ SmartPhone/ (テーマ名)
                  └ Hoge/ (コントローラ名)
                      └ index.ctp
                  └ Layouts/ (このテーマのレイアウトファイル)

Viewフォルダの下にThemedフォルダを作成し、その下にテーマ名(ここではSmartPhone)のフォルダを作成する
SmartPhoneフォルダの下には、通常、Viewフォルダの下に配置していたコントローラ毎のフォルダを作成し、スマホ用のビューファイルを入れて置く。
このテーマでレイアウトも変更したければ、Layoutsフォルダを作成し default.ctp などを入れておけばよい

というわけで、こんな感じでテーマを切り替えるといいのかな・・・・
 public function beforeFilter() {
     parent::beforeFilter();
     if (スマホ) {
         $this->theme = "SmartPhone";
     }
 }



2013年4月17日水曜日

[CentOS] VMWarePlayerでCentOS6.4 簡単インストール [初心者]

だれでも簡単にLinux環境を構築するためのインストールメモ

手軽にLinuxの勉強をしたい、システム開発者がちょっと実験する環境がほしいなど、Linux環境が手元に必要だというときがある

Linux環境を構築するには通常 Linux がインストールされたマシンが必要になるが、PC上に仮想マシンを構築してLinux をインストールすれば誰にも迷惑をかけずにLinux環境が手に入る

ここでは、仮想マシンにVMWarePlayer5.0.2、Linux に CentOS6.4 を使用する
※いずれもこの時点での最新バージョンを使用

1.VMWarePlayer のインストール

まず、VMWarePlayerをダウンロードする
  (http://www.vmware.com/jp/products/desktop_virtualization/player/overview.html
このページのダウンロードボタンをクリックし、VMware Player for Windows 32-bit and 64-bit をダウンロードする
ダウンロードした VMware-player-5.0.2-1031769.exe をダブルクリックし、インストールする
インストールは画面の支持に従って完了させればよい

2.CentOS のダウンロード

CentOS をダウンロードする
 (http://isoredirect.centos.org/centos/6/isos/i386/

  

このページから適当なミラーサイトをクリックし、CentOS-6.4-i386-bin-DVD1.iso をダウンロードする
※ファイルサイズが大きいので回線によってはかなり時間がかかるので注意


3.仮想マシンの作成

先ほどインストールしたVMWarePlayer を起動して、新規仮想マシンの作成をクリック

ウィザード画面で「後でOSをインストール」を選択して次へをクリック
※ここでイメージファイルを選択すると簡易インストールというものが実行され、インストール中の設定を自動でやってくれるという便利機能だが、あとで足りないものを設定し直したりと二度手間になるので、ここでは使用しない



 ゲストOSにLinux 、バージョンに CentOSを選択して次へ




仮想マシン名を入力し、仮想マシンの保存場所を選択して次へ
※仮想マシン名は好きな名前をつければよい。保存場所は、空き容量に余裕がある場所を選択しよう


ディスク容量は必要に応じて設定し、ファイルの分割方法を選択して次へ
※ここでは、推奨サイズの20GB、単一ファイルを選択
(お試し環境なのであまりこだわらなくてよい)


ここまでで特に問題なければ完了をクリックして終了


4.CentOS のインストール

作成した仮想マシンを選択し、「仮想マシン設定の編集」をクリック

CD/DVD の 「ISOイメージファイルを使用する」を選択し、ダウンロードしたCentOS のisoファイルを設定する
※この操作で、仮想マシン上のCD/DVDドライブにインストールディスクを挿入した状態なる

ネットワークアダプタのネットワーク接続で「ブリッジ」を選択する
OKをクリックして仮想マシン設定を終了する
※自分の使っているネットワーク環境で新たに仮想マシン用にIPアドレスが割り当てできない場合は「NAT」を選択しておこう


「仮想マシンの再生」をクリックすると、この仮想マシンが起動し、先ほど設定したCentOSのisoファイルが読み込まれインストールが開始されます


しばらくすると、この画面が表示される
画面上をクリックすると仮想マシンに操作が移るので、矢印キーで「Skip」を選択しEnterキー
※PCに操作を戻したければ、Ctrl+Alt キーを押す
※VMWareTools に関するメッセージが表示されるが、とりあえずスルーしておく

Next


日本語を選択してNext

日本語を選択して次へ

基本ストレージデバイスを選択して次へ


左側を選択して次へ
※画面が見切れているが気にしない


ホスト名を設定して次へ


「アジア/東京」次へ

root のパスワードを入力して次へ
※このパスワードは忘れないように


「すべての領域を使用する」を選択して次へ
※ここでいう「すべての領域」というのは、仮想マシンを作成したときに設定した20GBの領域であって、PC(ホストOS)上のすべての領域ではないので勘違いしないように

「変更をディスクに書き込む」をクリック





あらかじめ追加するパッケージ(Apache、MySQL等)が決まっている場合は、「今すぐカスタマイズ」を選択して次へ、特に決まっていない場合は「後でカスタマイズ」を選択して次へ
※ここでは「Web Server」「今すぐカスタマイズ」を選択し、さらに追加パッケージをインストール
「Web Server」を選択することで、Apache、MySQL等はインストールされる 

追加パッケージを選択する
ここでは後々必要になりそうな以下のパッケージを追加しておく
・「サーバー」→「FTPサーバー」
 
・「デスクトップ」→「KDE デスクトップ」「X Window System」「グラフィカル管理ツール」

さらに追加パッケージが必要であればここで追加して次へ
※インストール後でも追加できる


インストールが開始されるのでしばらく待つ




インストールが完了し、「再起動」をクリックすると、CentOSが起動されます


再起動が完了すると次のような画面が表示されるが、深く考えず、画面の指示にしたがって次へ次へ進めて完了させる

完了したらログイン画面が表示される



2013年4月15日月曜日

[CakePHP] URL/コントローラのディレクトリ階層

CakePHP を触り始めてまだ間もないが、URLやコントローラのディレクトリ階層がすべて同じ階層で扱っているのことにモヤモヤ感を感じてくる
いまのとろこ実験的にいじっているだけなので、URLがどうだとか、同一ディレクトリにファイルが増えていくとかは、それほど気にすることでもないが、実際のサイト構築を視野にいれると、やはり、URLの階層構造やファイルたちのディレクトリ構造は当然気になるわけである

個人的には以下のような感じで構成できるといいと思っているが・・・

URL:
http://domain/hogehoge/posts/
コントローラの置き場:
・・・/コントローラPath/hogehoge/PostsController.php
要するに、URL階層とコントローラのディレクトリ階層が同じ構成にできると分かりやすいと思うわけ

これを実現しようとすると以下のような設定が必要

まず、コントローラの置き場所はデフォルトでは、 app/Controller に置かなければならない
これを app/Controller/hogehoge に設定する必要がある
bootstrap.php に以下を追加
App::build(array(
'Controller' => array(ROOT.DS.APP_DIR.DS.'Controller'.DS.'hogehoge'.DS),
));
これだけでは、単にコントローラの置き場所を変えただけにすぎず、さらにURLのルーティングを設定する必要がある
routes.php に以下を追加
Router::connect('/hogehoge/posts/', array('controller' => 'posts', 'action' => 'index'));
Router::connect('/hogehoge/posts/:action', array('controller' => 'posts'));

ここまで設定すれば、上記のようにURLとコントローラの階層を合わせることができるわけだ
Viewファイルも同様に階層分けしたければ、bootstrap.phpに同じような設定が必要になる

しかし、階層増やすたびにこんなことやってられないし、そもそもサイトマップ(URL階層)とソースの管理を分かりやすいようにしたかったのに、これでは余計、煩雑になってしまい本末転倒である


そもそも、CakePHP でこのようなことをやること自体がナンセンスで、CakePHPはCakePHPのお作法に従うのが無難だという結論に達したわけである(笑)



2013年4月12日金曜日

[CakePHP] ビューを変える

CakePHP の規約でビューファイル名はコントローラ名、アクション名に対応した名称を使用しなければならない
しかし、条件により異なる画面を表示したいことって多々ある

リダイレクトで解決できる場合もあるが、データの受け渡しがあるとリダイレクトだとめんどくさかったりする(いや、めんどくさくてもリダイレクトしなけばならないこともあるんだが)

そんなときは、Controller の render() を呼び出せばいい
 if ($condition) {
    $this->render("hoge");
 }

これで、 hoge.ctp が表示できる
パスは、このアクションの元のビューファイルと同じになるので、別のパスをしていするには

    $this->render("/hoge/hoge");

こうすれば、app/View/hoge/hoge.ctp となる

では、まとめて変えたい場合はどうしたらいいのだろう
たとえば、PC用ページとスマートフォン用ページ分けたいとき、処理は一緒でビューだけスマホ用にしたいなーとか・・・

Controller クラスを見ていたら $view というプロパティがあった
試しにこのプロパティを変えてみたら、ビューを変更できた
※このプロパティを変更していいものなのか、他に影響がないか等はきちんと調べてないので、自己責任でお願いします

たとえば、breforeFilter() とかでスマホかどうか判定して、スマホだったらView名を変更するとかってどうだろう?

 public function beforeFilter() {
     parent::beforeFilter();
     if (スマホ) {
         $this->view = $this->view . "_sp";
     }
 }

PC用とスマホ用のビューファイルを用意しておいて、こんな感じでスマホ対応できたらいいな・・・

追記
この記事を書いた後に、テーマの切り替えという機能を知ったので、こちらも参照してください

2013年4月11日木曜日

[CakePHP] $this->fetch('css') $this->fetch('script')

全ページ共通のCSSやスクリプトは、レイアウトファイル(app/View/Layouts/default.ctp)に書けばいい
じゃあ、特定のページのみ適応したいCSSやスクリプトはどうやってせっていするか

default.ctp を見てみたらこんな記述がある

  echo $this->fetch('css');
  echo $this->fetch('script'); 

ここに渡せばできるはず

どうやって渡すか
HtmlHelper で設定できる

個別Viewファイルにこんな感じで書けばいい
$this->Html->css('hoge', null, array('inline' => false));
$this->Html->script('hoge', array('inline' => false));

結果は
<link rel="stylesheet" type="text/css" href="/cakephp/css/hoge.css" />
<script type="text/javascript" src="/cakephp/js/hoge.js"></script>
※パスの先頭が /cakephp となっているのは、cakephp というディレクトリをドキュメントルート下に置いているため

'inline' => false を設定することでビューブロックとして扱われるみたい

また、
$this->Html->css('hoge.css', null, array('inline' => false));
のように拡張子があってもなくてもいいみたい

PATHを指定したい場合は
$this->Html->css('/hoge/hoge', null, array('inline' => false));
とやれば
<link rel="stylesheet" type="text/css" href="/cakephp/hoge/hoge.css" />
となる



2013年4月10日水曜日

CakePHP ブログチュートリアルをやってみる(3)

前回までで環境的な部分は整ったはずなので、ここからはコードを書いていくことになるのだが、チュートリアルなのでそのまま進めれば普通に動くのだろう

Postモデルの作成

app/Model/Post.php ファイルを作成する
<? php
class Post extends AppModel {
}
?>

Postsコントローラの作成

app/Controller/PostsController.php ファイルを作成する
<?php
class PostsController extends AppController {
    public $helpers = array('Html', 'Form');

    public function index() {
        $this->set('posts', $this->Post->find('all'));
    }
}

?>

Postビューの作成

app/View/Posts/index.ctp ファイルを作成する
<h1>Blog posts</h1>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Created</th>
    </tr>

    <!-- ここから、$posts配列をループして、投稿記事の情報を表示 -->

    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>
    <?php unset($post); ?>
</table>


この時点でブラウザで表示してみる
http://localhost/cakephp/posts/




こんな感じのページが表示される
ヘッダーとフッターになにやら表示されているが、これはどこかにテンプレートがあるのだろう
※デフォルトのテンプレートはこれ app/View/Layouts/default.ctp
 この部分に個別Viewが展開される
<?php echo $this->fetch('content'); ?>

チュートリアルはまだまだ続くが、ここまでで基本的なCakePHPの開発の流れはわかったのでチュートリアルはここで一旦終了する
PHP自体も初心者だしCakePHPの理解もまだまだなので、使いこなすには相当時間がかかりそうだ


まとめ

・命名規約が大事
クラス名、ファイル名だけではなく、データベーステーブル名も規約に従う必要がある
いや、規約に従わなくてもできる方法はあるはずだが、どこまで従ったら一番幸せになれるのか

・MVCのMって本当に必要?
他のMVCフレームワークもそうだが、どうもM(モデル)に馴染めない
このブログチュートリアル程度ならモデルを使ったほうが便利かもしれないが、自分の経験上、大抵のシステムでは、もっと複雑なリレーションが必要になるし、サブクエリも多用することが多い
モデルで実装できるのだろうが、SQL書いたほうが楽だし早い
モデルを使ったほうが良いという決定的な理由がほしい・・・
なので、個人的にはVCだけで作りたい(笑)

2013年4月9日火曜日

CakePHP ブログチュートリアルをやってみる(2)

前回の続き

データベース

mysql 文字コード設定

まだmysqlになにも設定していなければ、とりあえず文字コードだけ設定しておく
/etc/my.conf に以下を追加
[mysqld]
character-set-server=utf8 (mysql5.5の場合。以前のバージョンは default-character-set)
[mysql]
default-character-set=utf8
/etc/my.conf を書き換えたら再起動
# service mysqld restart

mysql ユーザ設定

mysql> grant all privileges on *.* to db_user@localhost identified by 'db_pass';
※ここではユーザ名「db_user」、パスワード「db_pass」とする
mysql> flush privileges;

チュートリアル用のデータベース作成

mysql> create database cake_blog_tutorial;

チュートリアル用テーブル作成

※ここはチュートリアルページのまま
/* まず、postsテーブルを作成します: */
CREATE TABLE posts (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

/* それから、テスト用に記事をいくつか入れておきます: */
INSERT INTO posts (title,body,created)
    VALUES ('タイトル', 'これは、記事の本文です。', NOW());
INSERT INTO posts (title,body,created)
    VALUES ('またタイトル', 'そこに本文が続きます。', NOW());
INSERT INTO posts (title,body,created)
    VALUES ('タイトルの逆襲', 'こりゃ本当にわくわくする!うそ。', NOW());

Cakeのデータベース設定

チュートリアルページの通り、app/Config/database.php.default をコピーして編集
# cp  database.php.default database.php
設定内容は
public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'port' => '',
    'login' => 'db_user',
    'password' => 'db_pass',
    'database' => 'cake_blog_tutorial',
    'schema' => '',
    'prefix' => '',
    'encoding' => 'utf8' 
); 

追加の設定

セキュリティ関連の設定を2つほど。。。チュートリアルで必須ではないようだがとりあえず設定
これはチュートリアルページの通り app/Config/core.php を修正する
内容は割愛

ここで再び確認してみる
ブラウザで http://localhost/cakephp/ にアクセスする
こんな感じにエラー、ワーニングがなくなるはず。
DebugKit plugin はスルーしていい。

ここまでで環境づくりは終わりかな・・・
今回はここまで
 


2013年4月8日月曜日

CakePHP ブログチュートリアルをやってみる(1)

少しPHPの勉強をしようと思い、ネットでいろいろ調べていたら、CakePHPというものにたどり着いた
以前 perl の Catalyst を使っていたので、なんとなくMVCが使えるこれがいいかなと思いCakePHPを触ってみようと思う

ここに(http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog/blog.html)ブログチュートリアルというものがあるので、まずは、これに沿って勉強してみよう

自分の環境は以下
・CentOS 5.4(VMWare Player)
・Apache 2.2.3
・PHP 5.4.13
・MySQL 5.5.30
※CakePHPはPHP 5.2.8以上が必要ということで、CentOS5.4のデフォルトからPHPをバージョンアップした。ついでに、MySQLもバージョンアップした

CakePHPダウンロード 

チュートリアルページに書かれている通り、githubからダウンロード
直接ドキュメントルート配下に展開してもよいが、ひとまず適当なディレクトリにダウンロードすることにする
# git clone git://github.com/cakephp/cakephp.git
※zip形式等でダウンロードしてもよい(試してないが)

※git のインストール
RPMforge リポジトリを追加して、yumでgitをインストール
# rpm -Uvh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
# yum install git

ダウンロードしたファイルをドキュメントルートの下に配置する
/var/www/html/cakephp
    /app
    /lib
    /plugins
    /vendors
    index.php
    ・・・・・
※チュートリアルページでは、ドキュメントルート配下においているが、
自分は、ダウンロードしたcakephp というディレクトリごと配置した

ここで一度確認してみる
app/tmpに書き込み権限を与える
※チュートリアルページでは、後に出てくるが心配なので先に確認してみたかったりする
# chmod -R 777 app/tmp
※めんどくさいので、777
ブラウザで http://localhost/cakephp/ にアクセスすると以下のようなページが表示される
エラーやらワーニングやら表示されているが、いろいろ設定すれば消えるはずなのでスルーします

URLリライティング

httpd.conf を編集

 1..htaccess のオーバーライドを許可する

  AllowOverride ALL

2.mod_rewrite を読み込む

  LoadModule rewrite_module modules/mod_rewrite.so

今回はここまで
次回はデータベースの作成から

2013年4月4日木曜日

VMWare PlayerのデフォってNATなの?

体がなまってきたので、久々にLinuxを触っておこうと思い、VMWareのサイトへ
以前は、VMwareServerとかってやつを使っていたと思うんだが、なんか変わったみたい・・・
とりあえず、Linuxが動けばいいのでVMWarePlayer をゲット

CentOS 5.4 の iso ファイルがあったので、「新規仮想マシンの作成」でなんなくインストール完了
仮想マシンの設定とか最初にやらなくてもいいのね
なんか簡単になった気がする

あれ、ホストOSからssh接続できない・・・

Cent側のネットワーク設定とか間違ってないし・・・・

ぐぐってみたら、 VMWare Player がデフォルト NAT になってたみたい
VMwareServer ってデフォルト ブリッジじゃなかったけ?っと思いつつ
ブリッジ接続に変えたらつながったよ

やっぱりなまってるな(笑)