カテゴリー別アーカイブ: 技術ネタ

Azure Web Site で CakePHPを使用していてBasic認証をかける方法

目的:開発時に全ページに認証をかけたい

CakePHPはコンポーネントやAction単位に認証を付けられる機能があります。

しかし、この機能は特定の管理ページだけに認証を付ける場合には便利ですが、

今回は全ページに認証を付けたかったので、少し目的が違います。

Azure Web SiteはApacheでないので、htaccessとか使えない

全ページに認証をつけるのだから、何も考えずにhtaccessで行うと思っていました。

ぐぐって調べてもCakePHPでもトップディレクトリのhttaccessをごにょごにょ書き換えれば良さそうでした。

しかし、うまくいかない。

….

すこしはまりましたが、原因はAzureはApacheではないのでhtaccess使えないってことでした。

まあ、確かにそうですね。気づかなかったのがお恥ずかしいです。

手順:HttpAuthModuleを使う

下記ページを参考にしました。

  • http://azure-recipe.kc-cloud.jp/2015/01/website-basic-auth/

手順は次のようになります

HttpAuthModuleを下記からダウンロードします。

  • https://github.com/nabehiro/HttpAuthModule

今回は全ページに認証を付けたいので、トップディレクトリに「bin」ディレクトリを作成し、

その中に「HttpAuthModules.dll」を配置します。

次に、「Web.config」の修正です。

AzureでのCakePHPのトップディレクリにはすでにWeb.configが存在するはずです。

修正前は次のような形だと思います。

<?xml version=”1.0″ encoding=”UTF-8″?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name=”Redirect static resources” stopProcessing=”true”>
<match url=”^(ico|img|css|files|js)(.*)$” />
<action type=”Rewrite” url=”app/webroot/{R:1}{R:2}” appendQueryString=”false” />
</rule>
<rule name=”Imported Rule 1″ stopProcessing=”true”>
<match url=”^(.*)$” ignoreCase=”false” />
<conditions logicalGrouping=”MatchAll”>
<add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
</conditions>
<action type=”Rewrite” url=”index.php?url={R:1}” appendQueryString=”true” />
</rule>
<rule name=”Imported Rule 2″ stopProcessing=”true”>
<match url=”^$” ignoreCase=”false” />
<action type=”Rewrite” url=”/” />
</rule>
<rule name=”Imported Rule 3″ stopProcessing=”true”>
<match url=”(.*)” ignoreCase=”false” />
<action type=”Rewrite” url=”/{R:1}” />
</rule>
<rule name=”Imported Rule 4″ stopProcessing=”true”>
<match url=”^(.*)$” ignoreCase=”false” />
<conditions logicalGrouping=”MatchAll”>
<add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
</conditions>
<action type=”Rewrite” url=”index.php?url={R:1}” appendQueryString=”true” />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

これを次のように修正します。下記例ではユーザ名「user」パスワード「passwd」を設定した例です。

<?xml version=”1.0″ encoding=”UTF-8″?>
<configuration>
<!– Modification START –>
<configSections>
<section name=”httpAuthModule” type=”System.Configuration.NameValueFileSectionHandler” />
</configSections>
<httpAuthModule>
<add key=”AuthMode” value=”Digest”/>
<add key=”Realm” value=”SecureZone”/>
<add key=”Credentials” value=”user:passwd;”/>
<add key=”DigestNonceValidDuration” value=”120″/>
<add key=”DigestNonceSalt” value=”uht9adfafewbSAX” />
</httpAuthModule>
<!– Modification END–>
<system.webServer>
<!– Modification START –>
<modules>
<add type=”HttpAuthModule.HttpAuthModule” name=”HttpAuthModule” />
</modules>
<!– Modification END–>
<rewrite>
<rules>
<rule name=”Redirect static resources” stopProcessing=”true”>
<match url=”^(ico|img|css|files|js)(.*)$” />
<action type=”Rewrite” url=”app/webroot/{R:1}{R:2}” appendQueryString=”false” />
</rule>
<rule name=”Imported Rule 1″ stopProcessing=”true”>
<match url=”^(.*)$” ignoreCase=”false” />
<conditions logicalGrouping=”MatchAll”>
<add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
</conditions>
<action type=”Rewrite” url=”index.php?url={R:1}” appendQueryString=”true” />
</rule>
<rule name=”Imported Rule 2″ stopProcessing=”true”>
<match url=”^$” ignoreCase=”false” />
<action type=”Rewrite” url=”/” />
</rule>
<rule name=”Imported Rule 3″ stopProcessing=”true”>
<match url=”(.*)” ignoreCase=”false” />
<action type=”Rewrite” url=”/{R:1}” />
</rule>
<rule name=”Imported Rule 4″ stopProcessing=”true”>
<match url=”^(.*)$” ignoreCase=”false” />
<conditions logicalGrouping=”MatchAll”>
<add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
</conditions>
<action type=”Rewrite” url=”index.php?url={R:1}” appendQueryString=”true” />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

以上でアクセスするとBasic認証が現れるはずです。

外部ホストからMySQLへ接続する

これまで、開発用にはphpmyadminなどを利用していましたが、

本番環境へは、コマンドラインから直接管理を行っていました。

今回、外部ホストから直接MySQLに接続して管理できるツールが存在することを知ったので、方法をまとめます。

MySQL管理ソフトを導入

まず、MySQL管理ソフトをインストールします。

自分は、Macを利用しているので、「Sequel Pro」というツールを導入しました。

ツールのインストールは特に特筆すべき点はないので割愛します。

MySQLで外部ホストからの接続を許可する

上記ツールを導入して、MySQLへ接続しようとすると、

MySQLへの接続中にエラーが発生しました。

調べてみると、下記サイトに記載されているように、MySQLへデフォルトで外部ホストからの接続が許可されていないようです。

外部ホストからのMySQLへの接続許可設定を行います。

// MySQLへ接続
mysql -u root -p
// パスワード入力
Enter password: 
// 一覧表示
mysql> select user,host from mysql.user;
+--------+-------------------------+
| user | host |
+--------+-------------------------+
| root   | 127.0.0.1               |
| apache | localhost               |
| root   | localhost               |
| root   | hogehoge.jp             |
+--------+-------------------------+

// 上記はすべてローカル接続しか許可していないので、外部からの接続許可をする。
// ※データベースの一覧確認をし、外部接続を許可するDBをきめる。
mysql> show databases; 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
| hoge_db            |
+--------------------+
// ユーザ名”apache″、接続する外部ホストは”127.0.0.1”、利用するDBは”hoge_db”で設定する場合次のようになる。
mysql> grant all privileges on hoge_db.* to apache@"127.0.0.1" identified by 'your password' with grant option;

すべてのDBへの接続を許可する場合は[hoge_db.*]の箇所を[*.*]とする。

以上で、接続できるようになるので、MySQLの接続管理ツールで接続を試します。

MySQL-Connector/Mecab/feedparser/nstkのインストール

Python/MySQLは既にインストール済みであることを前提に,下記3つのインストールを行ないます.

  • MySQL-Connector
  • Mecab
  • Feedparser
  • nstk

まずは,Pythonのインストールされていることの確認です.

# python -V

次のように表示されれば,インストールされています.

Python 2.6.4

MySQLのインストールされているかの確認は次のコマンドで行ないます.

# mysql -V

次のように表示されます.

mysql  Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (x86_64) using readline 5.2

次に,PythonでMySQLを使用するためのMySQL Connector/Pythonをインストールします.(他にもいくつかPython用のMySQLコネクタが存在します.ライセンスや使い勝ってなど,都合のよいものを選んで使用しましょう) 基本的には下記サイトを参考にします.

http://dev.mysql.com/doc/refman/5.5/en/connector-python-info.html

まず,ダウンロードは下記で行ないます.

http://python.org/download/

インストールについては下記を参照します.

http://dev.mysql.com/doc/connector-python/en/connector-python-installation-source-unix.html

メインのコマンドは下記になります.

#gunzip mysql-connector-python-1.0.8.tar.gz

# tar xf mysql-connector-python-1.0.8.tar

# cd mysql-connector-python-1.0.8

# sudo python setup.py install

次にMecabのインストールです.

まずはDLできるバージョンを確認します.(メニューでDownloadを選択します.)

https://code.google.com/p/mecab/

今回は,Version0.996を使用します.

ダウンロードを行ないます.

wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz

辞書もあわせてダウンロードします.

wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz

これらを利用してインストールを行ないます.

# tar zxfv mecab-0.996.tar.gz

# cd mecab-0.996

# ./configure

# make

# make check

# make install

make checkでOKの場合は,次のように出力されます.

==================

All 3 tests passed

==================

次に辞書のインストールです.

# tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz

# cd mecab-ipadic-2.7.0-20070801

# ./configure –with-charset=utf8

# make

# make install

次に,mecab-pythonをインストールします.

# wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz

# tar zxvf mecab-python-0.996.tar.gz

# cd mecab-python-0.996

# python setup.py build

# sudo python setup.py install

なお,筆者の環境では,「python setup.py build」にて,gccで下記のようなエラーが発生しました.

> Python.h: そのようなファイルやディレクトリはありません

> …

> error: command ‘gcc’ failed with exit status 1

python-devパッケージがインストールされている必要があるようです.

この場合は,次のコマンドでインストールします

#yum -y install python-devel

また,mecab実行時に下記のエラーもでました.

ImportError: libmecab.so.2: cannot open shared object file: No such file or directory

この場合は,ライブラリにパスを通すことで解決できます.

# vim /etc/ld.so.conf.d/lib.conf

次を追記

/usr/local/lib/

更新を読み込みます.

# sudo ldconfig

確認は次のスクリプトで行なえます.

# python test.py

次に,feedparserのインストールを行ないます.

# wget http://peak.telecommunity.com/dist/ez_setup.py

# python ez_setup.py

# wget http wget http://feedparser.googlecode.com/files/feedparser-5.1.3.zip

# unzip feedparser-5.1.3.zip

# cd feedparser-5.1.3

# python setup.py install

なお,最新バージョンは下記で確認できます.

https://code.google.com/p/feedparser/

次にNLTKをインストールします.

# sudo easy_install pip

# pip install -U numpy

# pip install -U pyyaml nltk

次のように確認します.エラーがでなければ大丈夫だと思います.

# python

python > import nltk

バーチャルホスト設定

バーチャルホストの設定を行ないます.

httpdの設定ファイルを編集します.

# vi /etc/httpd/conf/httpd.conf

# 下記のコメントをはずす
NameVirtualHost *:80

Virtual Host用の設定ファイルを作成します.

# vi /etc/httpd/conf.d/virtual_host.conf

<VirtualHost *:80>
    ServerName vhoge.com
    ServerAdmin webmaster@vhoge.com
    DocumentRoot /var/www/html/vhoge
    ErrorLog logs/vhoge-error_log
    CustomLog logs/vhoge-access_log combined env=!no_log
</VirtualHost>

apacheの設定反映は下記で行なう

# /etc/rc.d/init.d/httpd restart

サーバのデータ移行

サーバを自宅サーバからさくらVPSに変更します.

基本的なサーバの設定は,「サーバの設定」で説明しています.

ここでは,サーバの移行(データの移行)に焦点に当てて記述します.

基本的には,下記2つです.

  1. ファイルコンテンツの移行
  2. DBの移行

(1)については難しくなく,単純にディレクトリ単位でファイルを移行すればよいので,問題ないと思います.

ただし,忘れ易いのが,htaccessなどの設定ファイルです.これらの不可視ファイルは移行もれがありえるので注意してください.

次に,(2)について説明します.DBはMySQLで,既にインストールされていることを前提にしています.

まず,移行元での作業です.

存在するデータベースを確認します.

#mysql> show databases;
+--------------------------+
| Database                 |
+--------------------------+
| information_schema       |
| test                     |
| hoge_db                  |
+--------------------------+

移行するDBを保存します.

保存するDB名をhoge_db,パスワードをhoge_password

# mysqldump -u root -phoge_password hoge_db > hoge_db.sql

hoge_db.sqlが保存されます.

-pとパスワードの間には空白はありませんので注意してください.

次に移行すべきユーザの確認します.

# mysql -u root mysql
mysql> use mysql;
mysql> SELECT user,host FROM mysql.user;
+------------+-----------+
| user       | host      |
+------------+-----------+
hoge_user    | localhost |

以上で,移行元の作業は完了です.

次に,移行先での作業です.

DBを作成します.

# mysql -u root mysql
mysql> CREATE DATABASE hoge_db CHARACTER SET utf8;

移行元で保存したhoge_db.sqlを使用します.

mysql -phoge_password hoge_db < hoge_db.sql

以上で,移行完了です.

ダイナミックDNSの設定

ダイナミックDNSの設定を行ないます.

DNSの仕組みなどは割とたくさん情報があるので,

ここでは,忘れがちなIPの通知設定をCronを使って行なう方法を記載します.

cronに登録するスクリプトの作成

# vi /usr/local/bin/mydns-update.sh

下記のように編集する

#!/bin/sh
USER="hoge_user"
PASS="your_password"
telnet mail.mydns.jp 110 > /dev/null 2>&1 <<EOF
USER $USER
PASS $PASS
QUIT
EOF

cronの登録は次のコマンド行なう.

# crontab -e

5分毎に通知するように,次のように修正する.

*/5 * * * * /usr/local/bin/mydns-update.sh

cronの登録されているスクリプトの確認は次のコマンドで行なう.

# crontab -l

サーバ設定(各種インストールから設定まで)

まずはhttpdのインストール

# yum -y install httpd

常にサーバが自動で起動するように設定する.

# chkconfig httpd on

いくつか設定を行ないます.

# vi /etc/httpd/conf/httpd.conf

//下記で管理者のアドレスを設定します.
ServerAdmin you@example.com

//レスポンスヘッダにあまり情報を出力しないように修正
ServerTokens Prod

phpのインストールを行ないます.

# yum -y install php php-mbstring php-mysql php-gd

//下記でインストールを確認
# php -version
PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

つづいて,phpの設定をいじります.

# vi /etc/php.ini

//言語設定など,次のように修正する.
//コメントアウトされているものは,コメントアウトをはずす
//タグの短縮を可能にする
short_open_tag = On

//ヘッダーにphpのバージョンなどを含めない
expose_php = Off

//最大実行時間の変更
max_execution_time = 600
//文字コード 
default_charset = "UTF-8"

//最大POSTサイズ
post_max_size = 25M
//アップロードサイズ
upload_max_filesize = 25M

//時間設定
date.timezone = Asia/Tokyo

//エンコード文字コードなど
mbstring.internal_encoding = UTF-8
mbstring.detect_order = auto
mbstring.substitute_character = none;

restartして反映させます.

# /etc/rc.d/init.d/httpd restart

phpinfoなどを表示して確認が行なえます.

次に,apacheサーバのセキュリティ対策を行ないます.

まず,公開ディレクトリがデフォルトだとroot権限のディレクトリになっており,あまりよくないため変更します,

公開用ディレクトリを作成します.

# mkdir -p /home/apache

CentOSではデフォルトでapacheユーザがhttpdで設定されています.それにあわせてディレクトリの所有者をapacheにします.

# chown -R apache:apache /home/apache

公開ディレクトリを編集するユーザはapacheグループに所属するようにします.

# usemod -G apache hoge_user

同じグループのユーザが公開ディレクトリを編集できるようにパーミッションを変更します.

#chmod 770 /home/apache -R

次に,MySQLをインストールします.

# yum -y install mysql-server

設定を変更します.文字コードをutf-8に変更します

# vi /etc/my.cnf
character-set-server = utf8

MYSQLを起動します

# /etc/rc.d/init.d/mysqld start

自動起動するように修正する.

# chkconfig mysqld on

確認を下記で行ないます.

# chkconfig --list mysqld
mysqld         0:off 1:off 2:on 3:on 4:on 5:on 6:off

MySQLにrootユーザのパスワードを設定する

# sudo mysqladmin -u root password 'hoge_password'

下記でログインできるか確認できます

# mysql -u root -p

Linux バージョンの確認方法

Linuxでは,大半のOSでは,etc以下のディレクトリにVersionやreleaseファイルが存在する.

例えば,

/etc/XXX_release

または

/etc/XXX_version

というファイルをみればよい.

CentOSの場合次のようになる.

cat /etc/redhat-release

また,あまり確認することはすくないと思うが,

カーネルのバージョンは次のコマンドで確認することができる.

uname -a

 

iptableの設定

iptableはファイアーウォールの設定を行なう.

下記サイト等を参考にiptableの設定を行なう.

http://qiita.com/shimohiko/items/ec672655edb84578a82e

上記での設定に加えて,MySQLやFTPのポートも使用するのであけた.

# FTP

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 20 yy-j ACCEPT

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 21 yy-j ACCEPT

# MySQL

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 3306 yy-j ACCEPT

 

編集後は,下記で反映

$ sudo /etc/rc.d/init.d/iptables restart

 

ログイン接続のセキュリティ対策

ポート番号の変更
セキュリティ対策でポート番号を変更する.
sudo vi /etc/ssh/sshd_config

下記を編集
コメントアウトをはずしてポート編集
#Port 22
port 10020

再起動して変更を反映させます.
$ /etc/init.d/sshd restart

次に,公開鍵でログイン可能にする

ローカルで公開鍵を作成する.
ssh-keygen

下記に公開鍵が生成される.
~/.ssh/id_rsa.pub

公開鍵をサーバに送る
scp -P ポート番号 ~/.ssh/id_rsa.pub ユーザー名@IPアドレス:~/.ssh/authorized_keys

バーミッションを変更します.
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

以上で,公開鍵でログイン可能になりました.

次に,公開鍵以外でのログインを禁止します.
$vi /etc/ssh/sshd_config

以下の項目を修正して,リスタート
PasswordAuthentication no