シンプルなLAMP環境構築手順
LAMP環境の構築手順
ソフトウェア開発をする上で最大の障壁は環境構築なのではないかと思うことがあります。
肝心のソフトウェア開発に専念するため、今回はよくあるLAMP環境をそれなりに簡単な方法で実装します。
OSはAWSのAmazon Linuxを想定していますが、CentOSであればおおよそ同じ手順で動くと思います。
Apache
設定
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を指定してインストールする
自動起動の設定
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 ...etc
経験上、実際のWebサイト運営においても、被害原因が古いバージョンのフレームワークを使っていたことであったり、SQLインジェクション、XSS脆弱性を放置していたことであったりする場合が多いです*2。
Webハッキングとマルウェア
Webをやっていればマルウェアと関係ないと思われるかもしれません。しかし、実際にはWebサーバーへのプライベートキーをマルウェアに感染した社内端末から盗まれたり、Webサーバーにマルウェアを仕込まれていたりする場合があります。
最近の例では、コインチェックさんでは社内端末がマルウェアに感染したことが原因でウォレットのプライベートキーが盗難される被害が発生しました*3。
マルウェア対策
普段から簡単にできるマルウェア対策をいくつかご紹介します。
すぐにWindowsアップデートを適用する
今更ですが、アップデートの力は偉大です。大抵のマルウェアは既存の脆弱性を利用しています。
Windows 7を利用している場合は、可能であればWindows 10にアップグレードすることをお勧めします。
近年話題になったEternalBlueの脆弱性*4もWindows 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近いマルウェア対策ソフトでファイルを検査し、マルウェアかどうかを判断してくれます。機密情報を含むファイルはアップロードしないように注意してください。
*2:本当は詳細に書きたいのですが、どの程度詳細に書いていいかよくわからない。マルウェア実行コードのサンプルを載せるのはちょっと怖い
*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のインストール・設定
前回はMySQLをUbuntuにインストールしましたが、
今回は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ヶ月くらい経つので、運用でカバーしてます。
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をインストールする際に気をつけるべきことが書いてあります。
Apache/MySQL/PHP
私自身まだインストールしていないので、これからインストールします。
まず最初に、パッケージをアップデートしておきます。
$ sudo apt-get update
そしてLAMPのインストール
$ sudo apt-get install lamp-server^
途中でMySQLのパスワードを設定するよう促されますので、適当に設定しておきましょう。
インストールが終わったあとにWebブラウザからlocalhostを参照すれば、Apacheのデフォルトページが見れるはずです。
簡単ですね。
詳しい内容や、Apache、PHPだけインストールしたい場合などは、
以下の記事が参考になると思います。
ApacheMySQLPHP - Community Help Wiki
以上で環境構築は完了です。