CultusReport

Web, PHP, smarty, PEAR, e-commerce, or other internet technologies

シンプルなLAMP環境構築手順

LAMP環境の構築手順

ソフトウェア開発をする上で最大の障壁は環境構築なのではないかと思うことがあります。
肝心のソフトウェア開発に専念するため、今回はよくあるLAMP環境をそれなりに簡単な方法で実装します。
OSはAWSAmazon Linuxを想定していますが、CentOSであればおおよそ同じ手順で動くと思います。

ソフトウェアバージョン

Apache

インストール
sudo yum install -y httpd24

httpdとした場合は2.2系のApacheがインストールされてしまうことがあるため、httpd24でバージョン指定する

設定

Apacheのconfファイルを編集します。

sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.default
sudo vi /etc/httpd/conf/httpd.conf
 <Directory "/var/www/html">
     #
     # Possible values for the Options directive are "None", "All",
     # or any combination of:
     #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
     #
     # Note that "MultiViews" must be named *explicitly* --- "Options All"
     # doesn't give it to you.
     #
     # The Options directive is both complicated and important.  Please see
     # http://httpd.apache.org/docs/2.4/mod/core.html#options
     # for more information.
     #
-    Options Indexes FollowSymLinks
+    Options -FollowSymLinks
  # Customizable error responses come in three flavors:
  # 1) plain text 2) local redirects 3) external redirects
  #
  # Some examples:
  #ErrorDocument 500 "The server made a boo boo."
- #ErrorDocument 404 /missing.html
+ ErrorDocument 404 /index.html
  #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
  #ErrorDocument 402 http://www.example.com/subscription_info.html
  #
  # Supplemental configuration
  #
  # Load config files in the "/etc/httpd/conf.d" directory, if any.
  IncludeOptional conf.d/*.conf
+ 
+ ServerTokens Prod
+ ServerSignature Off


設定後、Apacheを再起動

sudo service httpd restart

・ServerTokensは2.4.27ではデフォルトFull
core - Apache HTTP サーバ バージョン 2.4


・ServerSignatureは2.4.27ではデフォルトOff
core - Apache HTTP Server Version 2.4

・Directoryディレクティブの設定についても2.2系と異なるので、下記を参照して設定する必要有
Upgrading to 2.4 from 2.2 - Apache HTTP Server Version 2.4

・設定するとHTTPヘッダにApacheバージョンが表示されなくなる(設定前はApacheの代わりにApache 2.4.27が表示される)

PHP

インストール
 sudo yum install php70 php70-mbstring php70-mysqlnd 

・無印のphpを指定してインストールすると、PHP5.3.29がインストールされてしまうことがあるのでphp70を指定してインストールする

docs.aws.amazon.com

自動起動の設定
sudo chkconfig httpd on
設定

php.iniを編集します。

sudo cp /etc/php.ini /etc/php.ini.default
sudo vi /etc/php.ini
   ; Default timeout for socket based streams (seconds)
   ; http://php.net/default-socket-timeout
-  default_socket_timeout = 60
+  default_socket_timeout = 5
  ; Decides whether PHP may expose the fact that it is installed on the server
  ; (e.g. by adding its signature to the Web server header).  It is no security
  ; threat in any way, but it makes it possible to determine whether you use PHP
  ; on your server or not.
  ; http://www.php.net/manual/en/ini.core.php#ini.expose-php
- expose_php = On
+ expose_php = Off
  ; Log errors to specified file. PHP's default behavior is to leave this value
  ; empty.
  ; http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-log
  ; Example:
- ;error_log = php_errors.log
+ error_log = /var/log/php_errors.log
  [Date]
  ; Defines the default timezone used by the date functions
  ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
- ;date.timezone = 
+ date.timezone = Asia/Tokyo

MySQL

インストール
sudo yum install mysql-server
sudo chkconfig mysqld on
設定

my.cnfを編集し、デフォルト文字コードをutf8に設定します。

sudo cp /etc/my.cnf /et/my.cnf.default
sudo vi /etc/my.cnf
      1 [mysqld]
      2 datadir=/var/lib/mysql
      3 socket=/var/lib/mysql/mysql.sock
      4 # Disabling symbolic-links is recommended to prevent assorted security risks
      5 symbolic-links=0
      6 # Settings user and group are ignored when systemd is used.
      7 # If you need to run mysqld under a different user or group,
      8 # customize your systemd unit file for mysqld according to the
      9 # instructions in http://fedoraproject.org/wiki/Systemd
+    10 character-set-server = utf8
+    11 skip-character-set-client-handshake
+    12
+    13 [mysqld]
+    14 character-set-server = utf8
+    15 skip-character-set-client-handshake
+    16
+    17 [mysqldump]
+    18 default-character-set=utf8
+    19
+    20 [mysql]
+    21 default-character-set=utf8
     22
     23 [mysqld_safe]
     24 log-error=/var/log/mysqld.log
     25 pid-file=/var/run/mysqld/mysqld.pid

再起動して設定変更を反映します。

sudo service mysqld restart
rootパスワードの設定

デフォルトではMySQLのrootユーザーにパスワードが設定されていないので、以下の手順でパスワードを設定します。

mysql -u root -p
UPDATE mysql.user SET Password=PASSWORD('NewPassword') WHERE User='root';
FLUSH PRIVILEGES;
自動起動の設定
sudo chkconfig mysqld on

Linux

OS時刻の設定

OS時刻がデフォルトでJSTではない場合があります。デフォルト時刻がUTCである場合には以下の手順でJSTに変更します。

sudo vi /etc/sysconfig/clock
-ZONE="UTC"
+ZONE="Asia/Tokyo"
 UTC=true
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
sudo reboot
ファイルパーミッションの設定

カレントユーザーでログインした際に、サーバーモジュールを上書きできるように設定する。
カレントユーザー(ec2-user)をグループapacheに追加する。

[ec2-user ~]$ sudo usermod -a -G apache ec2-user
[ec2-user ~]$ exit
[ec2-user ~]$ groups
ec2-user wheel apache

ディレクトリのデフォルトパーミッションを755、ファイルパーミッションを644に設定する。

[ec2-user ~]$ sudo chown -R ec2-user:apache /var/www
[ec2-user ~]$ sudo chmod 2775 /var/www
[ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} \;
[ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;

マルウェア対策の基本

Webハッキング

Web技術に触れていると、以下のようなハッキング手法*1が思い浮かぶと思います。


経験上、実際のWebサイト運営においても、被害原因が古いバージョンのフレームワークを使っていたことであったり、SQLインジェクションXSS脆弱性を放置していたことであったりする場合が多いです*2

Webハッキングとマルウェア

Webをやっていればマルウェアと関係ないと思われるかもしれません。しかし、実際にはWebサーバーへのプライベートキーをマルウェアに感染した社内端末から盗まれたり、Webサーバーにマルウェアを仕込まれていたりする場合があります。
最近の例では、コインチェックさんでは社内端末がマルウェアに感染したことが原因でウォレットのプライベートキーが盗難される被害が発生しました*3

マルウェア対策

普段から簡単にできるマルウェア対策をいくつかご紹介します。

すぐにWindowsアップデートを適用する

今更ですが、アップデートの力は偉大です。大抵のマルウェアは既存の脆弱性を利用しています。
Windows 7を利用している場合は、可能であればWindows 10にアップグレードすることをお勧めします。
近年話題になったEternalBlueの脆弱性*4Windows 10には存在しませんし、Petya、Locky Ransom、CerberといったランサムウェアにもWindows 7と比較して15%以上抵抗力があるとの報告もあります*5

Windows Defender を利用する

Windows 10で標準搭載されているWindows Defenderのマルウェア検出率は有料のマルウェア対策ソフトよりも高い検出率を示すことがあります。
正直、個人レベルであればWindows Defenderで十分です。*6

監査ポリシーでPowershellを禁止する

業務でPowershellを利用することがなければ、監査ポリシーでPowershellを無効にしておくことはしばしば有効です。
Word、Excelファイルのマクロや、lnk形式のファイルなどはPowershellを実行することが可能です。悪意のあるWord、Excel、lnkファイルを実行すると、Powershellが意図せず実行されてしまいます。ファイルレスマルウェアとなるため、マルウェア対策ソフトウェアでは一部検出が難しいです。

Metasploit*7やEmpire*8といったツールを使ってみるとどのような攻撃被害が想定されるか理解しやすいと思います。

VirusTotalによるファイルの検査

機密情報を含むファイルでなければ、Webから拾ってきたファイルをVirusTotalで検査することは有用です。
VirusTotal

60近いマルウェア対策ソフトでファイルを検査し、マルウェアかどうかを判断してくれます。機密情報を含むファイルはアップロードしないように注意してください。

*1:www.greycampus.com

*2:本当は詳細に書きたいのですが、どの程度詳細に書いていいかよくわからない。マルウェア実行コードのサンプルを載せるのはちょっと怖い

*3:corporate.coincheck.com

*4:EternalBlue - Wikipedia

*5:cloudblogs.microsoft.com

*6:個人で調べた結果、それなりに有名なソフトよりも20%程度高かったことがありました。今はわかりません。

*7:ペネトレーションフレームワーク www.metasploit.com

*8:Powershell post-exploitation フレームワーク  www.powershellempire.com

smartyのインストール方法

Ubuntu14.04環境へsmartyをインストールする方法です。

smartyのダウンロード

smartyのサイトへアクセスします。www.smarty.net

いろいろバージョンがありますが、今回は最新版をインストールすることとします。

中央に書かれている各エントリーに
"change log here.
download it here."
と書かれています。

最新版(一番上のエントリ)にかかれている
"download it here"をクリックすると、GitHubサイトにリンクされるので、
"Source code(zip)"をクリックし、zipファイルを落とします。

smartyのインストール

インストールと書いてしまってますが、実際にはsmartyを適切なディレクトリに置くだけで完了です。
落としてきたzipファイルを展開すると下のディレクトリ構成になっています。

smarty-+-plugins
       |
       --sysplugins


今回はドキュメントルート直下に"libs"というフォルダを作成し、そこにsmartyフォルダごと配置しておきましょう。

ドキュメントルートを/var/www/としている場合、以下のようなディレクトリ構成となります。

/---var---www---libs---smarty-+-plugins
                              |
                              --sysplugins

以上でsmartyの設定は完了です

Apache2のvhost設定@Ubuntu14.04

Ubuntuでのvhost設定メモ

今回は、以下2サイトを1サーバーに構築します
example.com
test.com

なお、今回の投稿は以下のサイトを参考にしてます。
(圧倒的に下記サイトのほうが詳しいです。)
How To Set Up Apache Virtual Hosts on Ubuntu 14.04 LTS | DigitalOcean

バーチャルホスト用のディレクトリを作成

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html

ディレクトリ権限を変更

sudo chown -R $USER:$USER /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/test.com/public_html


インストール時点でアクセス可能になっているかもしれませんが、
念のため/var/wwwのアクセス権も追加しておきます。

sudo chmod -R 755 /var/www

テストサイトの作成

sudo vim /var/www/example.com/public_html/index.html
<html>
  <head>
    <title>Welcome to Example.com!</title>
  </head>
  <body>
    <h1>Success!  The example.com virtual host is working!</h1>
  </body>
</html>
sudo vim /var/www/test.com/public_html/index.html
<html>
  <head>
    <title>Welcome to Test.com!</title>
  </head>
  <body>
    <h1>Success!  The test.com virtual host is working!</h1>
  </body>
</html>

バーチャルホストの設定

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/test.com.conf
<VirtualHost *:80>
    ServerAdmin admin@test.com
    ServerName test.com
    ServerAlias www.test.com
    DocumentRoot /var/www/test.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

confファイルに文法ミスがないかを確認するためには、以下のコマンドを利用します

/usr/sbin/apache2ctl configtest

新バーチャルホストの実行

先ほど設定したファイルを有効にします

sudo a2ensite example.com.conf
sudo a2ensite test.com.conf

confファイルを変更したので、Apacheを再起動します

sudo service apache2 restart

hostsファイルの編集

hostsファイルを編集し、名前解決ができるようにします

sudo vim /etc/hosts

hostsファイルに以下の設定を追記します

127.0.0.1   example.com
127.0.0.1   test.com

バーチャルホストの確認

ドメインによって参照先ファイルが異なることを確認します
下記サイトにブラウザからアクセスしてみて、サイトごとにメッセージが異なることを確認します

http://example.com/index.html
http://test.com/index.html

その他Apacheの設定

セキュリティリスクを低減するため、実行ユーザをapacheにしておきます

ユーザーグループ"apache"とユーザー"apache"を作成します。

groupadd apache
useradd -g apache apache

実行ユーザーの設定ファイルを編集します

sudo vim /etc/apache2/envvars


変更前

# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

変更後

# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=apache
export APACHE_RUN_GROUP=apache

その他confファイルの設定

セキュリティリスクを低減するため、confファイルを変更しておきます

sudo vim /etc/apache2/conf-enabled/security.conf 

変更前

#ServerTokens Minimal
ServerTokens OS
#ServerTokens Full
...
#ServerSignature Off
ServerSignature On

変更後

#ServerTokens Minimal
ServerTokens Prod
#ServerTokens Full
...
#ServerSignature Off
ServerSignature Off

変更後は、改めてApacheを再起動しましょう

sudo service apache2 restart

UbuntuへのPostgreSQLのインストール・設定

前回はMySQLUbuntuにインストールしましたが、
今回はPostgreSQLをインストールしてみます。

PostgreSQLのインストール・接続

Ubuntuでは以下のコマンドを実行すると、PostgreSQLをインストールできます。
インストールできるバージョンはPostgreSQL9.3です。

sudo apt-get update
sudo apt-get install postgresql

インストール後は、以下のコマンドでデータベースに接続します。
以下の例では、ユーザー"postgres"として、データベース"postgres"に接続します。

sudo su postgres
psql -d postgres -U postgres

ユーザーの作成

以下のSQLでユーザーを作成します。
ユーザー"app_user"を作成し、パスワードを"myPassword"に設定します。

CREATE USER app_user WITH PASSWORD 'myPassword';

作ったユーザーのパスワードを変更する場合はALTERを使います。

ALTER USER app_user WITH PASSWORD 'myNewPassword';

データベース・テーブルの作成

最初に、データベース"test"をつくってみます。

CREATE DATABASE test;

コマンドはとてもシンプルですね。
つくったデータベース"test"に以下のコマンドで接続してみます。

\c test

データベースにテーブルを作成します。
今回は、2カラムで構成されている、シンプルなテーブルを作成します。
カラム名はid、nameです。

CREATE TABLE test_table(id serial, name varchar(30));

接続しているデータベースのテーブル一覧を表示して確認してみましょう。

\z

データベース"test"の初期化

新規に作成したデータベースの権限を明示的に初期化します。

REVOKE ALL ON DATABASE test FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM PUBLIC;

これで、スーパーユーザーpostgres以外のユーザーがデータベース"test"に接続
できなくなります。

権限の追加

データベースの権限を初期化したあと、他のユーザーに接続権限を与えていきます。

GRANT CONNECT ON DATABASE test TO app_user;

接続権限を与えた前後で、以下のコマンドを実行すると、権限変更の差分が見て取れます。
以下はデータベースユーザの一覧を表示するコマンドです。

\du

接続権限に加えて、SELECT、UPDATE、INSERT、DELETEの権限も与えてみます。

GRANT SELECT, UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO app_user;

とりあえず、今日はここまで。

PHPでHello World!

プログラミングといえば、何事も最初は"Hello World!"からです。

PHPでシンプルにやる場合はこんな感じ。

<?php
  echo "Hello World!"
?>

無理やり長めに作って、HTMLファイル内で実行させる場合は下のような感じ。
前回構築した環境で動かしてみたい場合は、
下のコードをphpファイルとして/var/www/html/に保存し、
WebブラウザからアクセスしてみるとHello Worldが表示されるはずです。

  • HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="author" content="Cultus" />
<meta name="robots" content="index, follow" />
<meta name="keywords" content="Web, PHP, smarty, PEAR, e-commerce, or other internet technologies, Cultusイケメン" />
<meta name="description" content="行き詰まったとき、「カルタス・レポート」を読んで人生という名のゲームを再開しましょう。プログラミング・生き方に関する攻略情報をお届けします" />
<meta name="copyright" content="Copyright Cultus Report" lang="en" xml:lang="en" />
<title>Hello World!</title>
</head>
<body>
<?php
  echo "Hello World!"
?>
</body>
</html>

コマンドラインから実行する場合はこんな感じでしょうか。

  • Terminal
php -r 'echo "Hello World!" . PHP_EOL;'

環境構築

PHPの動作環境を構築します

ハードウェア

私は秋葉原のPC中古屋さんで、"ZENBOOK UX21E UX21E-KX128"を購入しました。
価格はおおよそ55,000円くらいです。
見た目はかっこいいですが、正直かなりキーボードが打ちづらいです。(中古品であるからかもしれません)
体感では、今まで使ってきたキーボードと比べると4〜5倍タイプミスします(;^ω^)
とはいえ、もう購入してから3ヶ月くらい経つので、運用でカバーしてます。

kakaku.com

OS

購入した時点ではWindows7がインストール済みでしたが、
上書きするかたちでUbuntuをインストールしました。
OSのバージョンはUbuntu 14.04です。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.2 LTS
Release:	14.04
Codename:	trusty

Linux Command: Show Linux Version

AsusZenbookにUbuntuをインストールしている人は結構いるらしく、
インストールについてまとめている記事がありました。
Ubuntuでない場合であっても、SSDにOSをインストールする際に気をつけるべきことが書いてあります。

AsusZenbook - Community Help Wiki

Apache/MySQL/PHP

私自身まだインストールしていないので、これからインストールします。

まず最初に、パッケージをアップデートしておきます。

$ sudo apt-get update

そしてLAMPのインストール

$ sudo apt-get install lamp-server^

途中でMySQLのパスワードを設定するよう促されますので、適当に設定しておきましょう。
インストールが終わったあとにWebブラウザからlocalhostを参照すれば、Apacheのデフォルトページが見れるはずです。
簡単ですね。

詳しい内容や、ApachePHPだけインストールしたい場合などは、
以下の記事が参考になると思います。

ApacheMySQLPHP - Community Help Wiki

以上で環境構築は完了です。