さくらVPSサーバーの初期設定とLAMP環境構築

# 書いてる人
プログラミング学習サービスやら、ペットサロン予約サービス、風俗検索サービスなど色々とやっている「かずきち」です。
■運営サービス一部
http://crazy-wp.com/
http://webukatu.com/
新宿のホストから不動産・保険の営業を経て、HTMLって何？という状態から３ヶ月独学でプログラミングやデザインを学び、IT業界で１年間実務経験を積んで年収は１本超え。現在は起業家としてサービス運営やら不動産運営をしています。
Qiita内にそれ系の記事も書いてます。
<a href="http://qiita.com/kazukichi/items/7379b75fba2f90d3cf45" target="_blank">エンジニアで稼ぐために大切な１３のコト</a>
<a href="http://qiita.com/kazukichi/items/aeba286c2a750081e5c0" target="_blank">WEBサービスで起業したい人に読んで欲しい１８のコト</a>

#さくらVPSに新しいユーザーを作成
サーバー契約したばかりだとユーザ名がrootのため、セキュリティ的によろしくないので新規作成する。

```
# useradd 好きなユーザ名
# passwd 好きなユーザ名
Changing password for user 好きなユーザ名.
New UNIX password:パスワード入力
Retype new UNIX password:パスワード再入力
passwd: all authentication tokens updated successfully.
```

#作ったユーザがrootになるようにwheelグループに設定
wheel は root 権限を得られるユーザー グループ

```
# usermod -G wheel 好きなユーザ名
```

#wheel グループに属するユーザへ、sudo を許可するよう設定
root になっている状態で visudo コマンドを実行する。

```
# visudo
```

vi が起動される。その中には、wheel の実行権限がコメントアウトされているので

```
## Allows people in group wheel to run all commands
# %wheel  ALL=(ALL)       ALL
```
２行目の「#」を削除して、コメントアウトを解除して保存。

#パスを通す
sudo を通して実行するプログラムは、/usr/sbin や /usr/local/sbin に置かれていることが多いが、初期状態の一般ユーザーではこれらのパスが通っていないためコマンドを呼び出すときにいちいちフルパスで指定しないといけないので面倒。
そこで、パスを通してあげる。

「/home/ユーザ名/」の中に「.bash_profile」というファイルがあるのでviで開く。

```
# User specific environment and startup programs
 
PATH=$PATH:$HOME/bin
```

となっているすぐ下に

```
PATH=$PATH:/sbin
PATH=$PATH:/usr/sbin
PATH=$PATH:/usr/local/sbin
```

を追加し保存し、再ログインする。


#ポート番号を変更
SSH の接続に使っていたポート 22 番は一般的なポートとして知られているので、そのままにしておくと攻撃対象になる。
攻撃者は 22 番が空いていることがわかると、ユーザーとパスワードを総当たりで侵入を試みるので、対処の１つとしてポート番号を変更しておく。

```
# vi /etc/ssh/sshd_config
#Port 22
Port 10022
```
※３行目のポート番号は適当で構わない


変更したら、sshを再起動

```
# /etc/init.d/sshd restart
2   Stopping sshd:                                  [  OK  ]
3   Starting sshd:
```

#CentOS の環境を日本語にする
デフォルトは英語表示になっているので、日本語表示モードに変更する。

```
$ sudo vi /etc/sysconfig/i18n
```

```
LANG="C"
```

になっているのを

```
LANG="ja_JP.UTF-8"
```

に変更する。

#iptablesを使ってファイアウォールを設定する
使うポート以外は閉じておく。

##iptablesがインストールされてるか確認

```
$ yum list installed | grep iptables
iptables.x86_64                           1.3.5-5.3.el5_4.1            installed
iptables-ipv6.x86_64                      1.3.5-5.3.el5_4.1            installed
```

##現在のiptables設定を確認

```
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

##フィルタリングする
今回はSSH、HTTP、FTP、MySQL だけをポート解放し、後は利用しないようにする。
HTTP は 80 番、FTP は 20 と 21 番、MySQL は3306 番を使う。

###iptablesファイルを作成する

```
$ sudo vi /etc/sysconfig/iptables
```

###ファイル内に以下を記述

```
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport XXXXX -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
 
COMMIT
```

###iptablesを再起動

```
$ sudo /etc/rc.d/init.d/iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
```

###設定されてるか確認

```
$ sudo iptables -L
```

#Apacheのインストール
インストールされてるか確認

```
$ rpm -qa httpd
```

入ってないので、インストールする。

```
$ sudo yum -y install httpd
```

インストールされたか以下のコマンドで確認

```
$ rpm -qa httpd
```

```
$ httpd -v
```

##Apacheの初期設定をする
yum でインストールした場合は自動的に apache というユーザーが作成されている。

```
$ cat /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
```

シェルに /sbin/nologin （稼働専用）となっているので、このユーザをそのまま使用する。

###httpd.confのバックアップをとる

```
$ sudo cp /etc/httpd/conf/httpd.conf $HOME
```

###viでhttpd.confを開き編集する

```
$ sudo vi /etc/httpd/conf/httpd.conf
```

#####1: 44行目のWeb サーバーにアクセスしたクライアントに返す情報を変更する
デフォルトだとhttpレスポンスヘッダにOSの情報が載ることになるので、ハッカーに余計な情報を与えないように
「OS」になっている部分を「Prod」に変える。
これでレスポンスヘッダには　Server: Apache　しか返らない。

```
ServerTokens OS
```



#####2: 251行目の障害発生時にユーザへ表示する連絡先メアドを適当なアドレスに変更する

```
ServerAdmin root@localhost
```

#####3: 265行目のサーバー名を変更
「#」を外してコメントアウト解除し、サーバーのホスト名を書く。
DNS に登録していないなら IP アドレスを指定。

```
#ServerName www.example.com:80
```

#####4: 320行目のオプション設定を変更
Indexsが設定されていると、もしユーザーがページを開いた時にindex.htmlがなければファイル一覧ページが自動生成されてしまい、ハッカーにファイル構成が知られてしまうので、無効にする。

「Indexes」の前に「-」を加える

```
Options Indexes FollowSymLinks
```

#####5: 524行目のエラーページなどに出力されるサーバー情報を変更
これも情報を与えすぎない様に「Off」にしておく。

```
ServerSignature On
```

以上変更したら保存し、設定に問題ないか確認。

```
$ sudo apachectl configtest
Syntax OK
```

##Apacheを起動する

```
$ sudo service httpd start
httpd を起動中:                                            [  OK  ]
```

サイトにアクセスしてテストページが表示されればOK。

最後にOS起動時にApacheも自動で起動されるようにする。

```
$ sudo chkconfig httpd on
$ chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

#MySQLをインストールする

```
$ sudo yum -y install mysql-server
```

インストールされたか確認する。

```
$ rpm -qa mysql-server
mysql-server-5.1.71-1.el6.x86_64
```

##文字コードを設定する
UTF-8にする。

my.cnfファイルをHOMEディレクトリにバックアップしてから、
元ファイルを開く。

```
$ cd $HOME
$ cp /etc/my.cnf .
$ sudo vi /etc/my.cnf
```

以下のように記述

```
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# character-set
default-character-set=utf8
skip-character-set-client-handshake

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8
"/etc/my.cnf" 23L, 446C
```

保存する。

##自動起動にする
Apacheと同じくOS起動時に自動起動するように設定する。

```
$ sudo chkconfig mysqld on
$ chkconfig --list mysqld
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

##MySQLを起動する

```
$ sudo /etc/rc.d/init.d/mysqld start
```

##rootユーザにパスワードを設定する
データベース操作の全権限を持っているrootユーザにパスワードを設定する

```
$ sudo mysqladmin -u root password パスワード
```

rootユーザでログインする

```
$ mysql -u root -p
```

パスワード求められるのでさっき設定したパスワードを入れればOK。
「quit」と入力し、ログアウトする。

※実際に運用する時にはrootユーザーのままにせず、新規でユーザー作って権限を制限しないとハッキングされてユーザ権限を奪われた時に被害が大きくなるので注意

#PHPをインストールする

画像合成などに使えるgdやpearなどのライブラリもインストールしておく。

```
sudo yum -y install php php-mbstring php-mcrypt php-mysql php-pear php-gd
```

php.iniを編集

##タイムゾーンを日本時間にする

下記に変える
```
date.timezone = “Asia/Tokyo”
```

#Subversion（SVN）をインストールする

```
$ sudo yum -y install subversion
```

バージョン確認する

```
$ svn --version --quiet
```

##リポジトリを作成する

####全てのリポジトリのルートになるディレクトリを作成

```
$ sudo mkdir /var/lib/svn
```

####リポジトリを作成する

リポジトリ名は適当に。（今回の場合は、「sample」というリポジトリを作成）

```
$ sudo svnadmin create /var/lib/svn/sample
```

####所有者を変更する
作成されたレポジトリ内のファイルやフォルダは、初期状態では root 所有となっている。
Apache 経由でリポジトリにアクセスしたい場合、Apache の実行ユーザーから読み書きできるように所有者を変更しておく。
 
```
$ sudo chown -R apache:apache /var/lib/svn/owl
```

確認する。

```
$ sudo chown -R apache:apache /var/lib/svn/owl
$ ls -l /var/lib/svn/owl
```

#mod_dav_svn のインストールと設定
Apache 経由で Subversion のリポジトリを操作でき、Subversion 専用のポートを開放する必要もない。WebDAV を利用して公開することになるので、ブラウザからもリポジトリを表示できるので便利。

##インストール

```
$ sudo yum -y install mod_dav_svn
```

##専用のconfファイルを追加

```
$ sudo vi /etc/httpd/conf.d/svn.conf
```

以下のように編集

```
<Location /svn>
    DAV           svn
    SVNParentPath /var/lib/svn
    AuthType      Basic
    AuthName      "Subversion Repository"
    AuthUserFile  /etc/httpd/conf.d/svn_auth
    Require       valid-user
</Location>
```

Location ディレクティブにはリポジトリのルートを指定し、3 行目のリポジトリ指定もルートとしている。この指定の場合、すべてのリポジトリに同じ設定が適用される。リポジトリを追加した場合でも conf ファイルの変更や Apache の再起動が不要なので便利である。

リポジトリごとに設定を分ける場合は、ディレクティブの指定を /svn/リポジトリ名として、SVNParentPath の代りに SVNPath、内容はリポジトリへのパスとする。

4 行目以降は BASIC 認証に関する設定となる。これをおこなっておくことで、ブラウザなどからリポジトリにアクセスしたとき、ユーザーとパスワードによる保護をおこなえる。

##パスワードファイルを作成

svn.conf の 6 行目に指定したパスに touch コマンドでファイルを用意し、パスワード設定をおこなう。USERNAME の部分は SVN のリポジトリにアクセスするユーザー。

```
$ sudo touch /etc/httpd/conf.d/svn_auth
$ sudo htpasswd /etc/httpd/conf.d/svn_auth USERNAME
New password: XXXXXX
Re-type new password: XXXXXX
Adding password for user USERNAME
```
 
##Apacheの設定確認と再起動

```
$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
```

http://XXX.XXX.XXX.XXX/svn/リポジトリ名 で入れるか確認。


#phpMyAdminをインストールする
MySQLをブラウザ上から簡単に管理できるので便利。

```
$ wget http://www.phpmyadmin.net/home_page/downloads.php/phpMyAdmin-4.1.4-all-languages.tar.gz
```


　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　続く






#WEBプログラミングから起業までを一貫して学べるオンライン動画総合学習サービス『ウェブカツ！！』
様々なプログラミング学習サイトやサービスでは正直な所、自分でWEBサービスを作れるようにはならないため、「自分でWEBサービスを作れるようになる！」をゴールとしたオンライン動画総合学習サービス『ウェブカツ！！』を立ち上げました。興味ある方は登録よろしくお願いいたします。
http://webukatu.com/