Sakura VPS LAMP環境構築から基礎セキュリティ設定まで

個人開発環境を久々整えました。
折角なのでログを残します。


## 構築する環境

- sakura vps
- Cent OS 6.9
- PHP 5.6
- Logwatch&DenyHostsでの監視設定


## 起動して、初回のログイン

管理画面から起動。
起動したら、Terminalからsshでログイン。

```
ssh root@000.000.000.000
```

#### ！もしログイン出来ない場合
過去に、起動直後にログインできない場合があった。

```
port 22: Connection refused
```

ブラウザ管理画面からもコンソールを立ち上げてみたが、固まっている。

```
Updating RPMS on system:
```

これはRPMの更新をかけているとのこと。少しこのまま待ってみると、入れるはず。


## 仮パスワードの変更と、開発用ユーザの作成

メールで送られてきた仮のパスワードは変更して、開発用のユーザーを追加。

#### パスワード変更

```
# passwd
# Changing password for user root.
# New password:
# Retype new password:
# passwd: all authentication tokens updated successfully.
```

成功したら、別タブを立ち上げてログインチェック。

```
# ssh root@000.000.000.000
# root@000.000.000.000's password:
```

OK!


#### 開発用ユーザ追加

```
# useradd your_user_name
# passwd your_user_name
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
```

成功したら、別タブを立ち上げでログインしてみる。

```
# ssh your_user_name@000.000.000.000
your_user_name@000.000.000.000's password:
```

OK!

#### sudoの設定

追加したユーザーにroot権限を与える。
まずはyour_user_nameをwheelグループに追加する。

```
# usermod -G wheel your_user_name
```

sudo設定ファイルを編集する。

```
# visudo
```

%wheel ALL=(ALL) ALL	~ のコメントを外し、wheelグループのユーザに実行権限を付与。

```
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
```


保存したら別タブを立ち上げ、先程作ったユーザでログイン。
適当なコマンドを実行してみて、OKだったら成功。

```
# ssh your_user_name@000.000.000.000
# your_user_name@000.000.000.000's password:
# sudo hogehoge
```


## SSH接続設定

パスワード覚えたくないので、鍵認証でのみログイン可能にする。

#### クライアントで鍵を作成する。

クライアントPCで公開鍵設置用のディレクトリ作成

```
# mkdir ~/.ssh
# chomd 700 ~/.ssh
# cd ~/.ssh
```

鍵の作成

```
# ssh-keygen -t rsa -v
```

ここで秘密鍵のファイル名を入力。デフォルトはid_rsa。
パスフレーズも聞かれるのでメモしておく。

```
Enter file in which to save the key (/Users/yourpath/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
```

これで生成される。

```
Your identification has been saved in /Users/yourpath/.ssh/id_rsa.
Your public key has been saved in /Users/yourpath/.ssh/id_rsa.pub.
```

権限の変更をしておく。

```
# chmod 600 id_rsa.pub
```

#### scpで鍵をサーバへ転送する。
サーバ側でも.sshディレクトリを作成。

```
# mkdir ~/.ssh
# chomd 700 ~/.ssh
```

鍵を転送。

```
scp ~/.ssh/id_rsa.pub new_user_name@000.000.000.000:~/.ssh/authorized_keys
```

成功したら、ログインしてみる。ファイル名を変えた場合は-iオプションでクライアントの鍵を指定。

```
ssh username@000.00.000.000 -i /path/to/your/.ssh/id_rsa_hogehoge
```

### 鍵のセキュリティ強化
ポートの変更と、鍵認証のみでのログインとすることでセキュリティを高める。
それにルートのログインを不可にする。

ここからsuで。

```
# su
```

#### sshd_conf 編集
ssh設定ファイルの編集。バックアップをとってから

```
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
# vim /etc/ssh/sshd_config
```

Portをデフォルトから変更

```
# Port 22
↓
Port xxxx
```

パスワードログインを禁止

```
# PasswordAuthentication yes
↓
PasswordAuthentication no
```

ルートログインの禁止

```
# PermitRootLogin yes
↓
PermitRootLogin no
```

構文エラーが無いかテスト

```
/usr/sbin/sshd -t
```

何も表示されなければOK。

#### 接続テスト
テストの前に、iptableを無効化。
sakuraVPSではデフォルトで有効化されているため、ポートを変更するとログインできなくなる恐れがあるため。

```
# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
```

停止したら、再起動

```
service sshd restart
```

それぞれ別タブでテストしてみる。

##### 鍵認証+ポート

```
# ssh username@000.00.000.000 -i /path/to/your/.ssh/id_rsa_hogehoge
# これはログインできない
# ssh -p 2222 username@000.00.000.000 -i /path/to/your/.ssh/id_rsa_hogehoge
# ポート指定することでログイン可
```

##### ルートログインテスト

```
# ssh root@000.00.000.000 -i /path/to/your/.ssh/id_rsa_hogehoge
# 弾かれればOK
```

##### パスワードログインテスト

```
# ssh -p 2222 username@000.00.000.000 PreferredAuthentications=password
# 弾かれればおK
```

## システムアップデート

#### yumアップデート
コマンド一発。

```
# yum update
```

#### 日本語化
文字化けとWarning消したいので、日本語化しておく。

```
# vim /etc/sysconfig/i18n
```

以下のように編集。

```
LANG=ja_JP.utf8
LC_CTYPE=ja_JP.utf8
```

LC_CTYPE＝=~の記述は、以下の警告を避けるため。

```
warning: setlocale: LC_CTYPE: cannot change locale (UTF-8):
```

再起動で、反映。

```
service sshd restart
```


## ファイアウォール設定

先程オフったiptablesをオンにする。
※もしインストールされてなければ、インストール。

```
# yum install iptables
```

#### 設定の確認

```
# iptables -L
```

#### 設定ファイルを見る

```
# cat /etc/sysconfig/iptables
```

#### 編集

```
vim /etc/sysconfig/iptables
```

```
# (1) ポリシーの設定 OUTPUTのみACCEPTにする
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# (2) ループバック(自分自身からの通信)を許可する
-A INPUT -i lo -j ACCEPT

# (3) データを持たないパケットの接続を破棄する
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# (4) SYNflood攻撃と思われる接続を破棄する
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# (5) ステルススキャンと思われる接続を破棄する
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# (6) icmp(ping)の設定
# hashlimitを使う
# -m hashlimit hashlimitモジュールを使用する
# —hashlimit-name t_icmp 記録するファイル名
# —hashlimit 1/m リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10 規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000 リミットの有効期間。単位はms
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (7) 確立済みの通信は、ポート番号に関係なく許可する
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# (8) 任意へのDNSアクセスの戻りパケットを受け付ける
-A INPUT -p udp --sport 53 -j ACCEPT

# (9) SSHを許可する設定
# hashlimitを使う
# -m hashlimit hashlimitモジュールを使用する
# —hashlimit-name t_sshd 記録するファイル名
# —hashlimit 1/m リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10 規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000 リミットの有効期間。単位はms
-A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (10) 個別に許可するプロトコルとポートをここに書き込む。
# この例では、HTTP(TCP 80)とHTTPS(TCP 443)を許可している。
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

COMMIT
```

参考：https://knowledge.sakura.ad.jp/4048/

#### tptables更新
設定を更新する。

```
# service iptables restart
```

ちなみにiptablesの編集直後にrestartしなければ、以前の設定に戻ってしまうので注意。

#### MEMO　開放ポート番号の例

HTTP	80
HTTP(SSL)	443
SMTP	25
SMTP(SSL)	465
POP3	110
POP3(SSL)	995
IMAP	143
IMAP(SSL)	993



#### 再度設定の確認

```
# iptables -L
```

#### ログインポートの確認
ポートでログインできれば、ok!

```
# ssh -p xxxxx username@000.00.000.000 -i /path/to/your/.ssh/id_rsa
```



## WEBサーバ設定

httpdサーバインストール。

```
# yum install httpd
```

再起動時の自動設定

```
# chkconfig httpd on
```

#### confファイル編集

```
# vim /etc/httpd/conf/httpd.conf
```

*編集内容*

```
ServerTokens OS
↓
ServerTokens Prod

ServerSignature ON
↓
ServerSignature Off

# Options Indexes FollowSymLinks
↓
Options -Indexes FollowSymLinks

# NameVirtualHost *:80
↓
NameVirtualHost *:80
```

#### 構文チェックと、起動

```
# service httpd configtest
# service httpd start
```

これでブラウザからIPでアクセス可能になる。


## Virtual Host設定

#### ディレクトリ作成
予めDNSのポインティングを行った上で、
サーバ側にドメイン用ディレクトリを作成。

```
# mkdir -p /var/www/yourdomain/public_html/
# chown -R new_user_name:new_user_name /var/www/yourdomain/public_html/
```


#### httpd.conf 編集

バーチャルホスト未定義でのアクセス拒否

```
# vim /etc/httpd/conf/httpd.conf
```



#### confファイル作成
/etc/httpd/conf.d　配下に設定ファイルを作成。
この階層においた.confは、起動時に読み込まれる。

```
# vim /etc/httpd/conf.d/yourdomain.conf
```

*内容*

```
<VirtualHost *:80>
    ServerName yourdomain.com
    DocumentRoot "/var/www/yourdomain/public_html"
    DirectoryIndex index.html index.php
    ErrorLog /var/log/httpd/yourdomain.com_error_log
    CustomLog /var/log/httpd/yourdomain.com_access_log combined
    AddDefaultCharset UTF-8
</VirtualHost>
```


#### IPでのアクセスの制御

IPや、バーチャルホスト未定義ホストからのアクセスの制御。
仮に誰かのドメインが自分のIPを指したら、そこからアクセスされてしまうこともあるため。

方法は２つある。
どちらも、httpd.confを書き換える。
挿入場所は他のVirtudal Host設定ファイルを読み込む前、つまり

```
Include conf.d/*.conf
```

よりも前。


１．特定のURLへリダイレクトさせる

```
<VirtualHost *:80>
    ServerName any
    Redirect / http://hogehoge.com/
</VirtualHost>
```

２．アクセス禁止にする

```
<VirtualHost *:80>
    ServerName any
    <Location />
        Order Deny,Allow
        Deny from all
    </Location>
</VirtualHost>
```

デフォルトのテストページの編集も可能。

```
# vim /error/noindex.html
```

又は、無効にする

```
<LocationMatch "^/+$">
#    Options -Indexes
#    ErrorDocument 403 /error/noindex.html
</LocationMatch>
```


#### 再起動して反映完了。

```
service httpd restart
```


## PHP インストール
参考：https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e#yum%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E8%BF%BD%E5%8A%A0

下準備

```
# yum --enablerepo=epel install libmcrypt
```

リポジトリ追加

```
# yum install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

もし古いPHPがあれば消す
※消さなくても良いみたいだけど

```
yum remove php-*
```

#### 7.1をインストール。

```
# yum install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt
```

#### php.iniの編集

```
# cp /etc/php.ini /etc/php.ini.ori
# vim /etc/php.ini
```

*設定内容*

```
# レスポンスヘッダにPHPのバージョンを表示しない
expose_php = Off
# 全てのログを出力
error_reporting = E_ALL
# ブラウザでエラーを表示しない
display_errors = Off
# エラーをログに残す
log_errors = On
# エラーログの長さを設定
log_errors_max_len = 4096
# エラーログ出力先
error_log = "/var/log/php_errors.log"
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_charset = none
```

#### Composerインストール

```
curl -sS https://getcomposer.org/installer | php
```

パスを通す

```
mv composer.phar /usr/local/bin/composer
```




## Mysql インストール

参考：http://qiita.com/tiwu_official/items/5ff3fa38611de058704a

#### 既にあるかチェック

```
# rpm -qa | grep mysql
```

あったら消しておく

```
# sudo yum remove mysql*
```

#### インストール

```
# yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
# yum install mysql-client mysql-server
```

#### mysqlを起動

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

ログイン

```
sudo mysql -uroot -p
```

PWはブランクでOK

パスワードの設定

```
mysql> set password = password('password');
```

#### 自動起動設定
一旦exitして、自動起動設定を行う。

```
sudo chkconfig mysqld on
```

### phpmyadmin インストール

一応入れておくが、かなり攻撃を受けやすいので
・IP制限
・URL変更
・SSL制限
を必須にしておく。

参考：
https://knowledge.sakura.ad.jp/9701/
https://qiita.com/inaka_phper/items/ea59b71dc5b3f155496d

#### インストール

```
# yum --enablerepo=remi,remi-php71 --disablerepo=epel install phpMyAdmin
```

#### 自分のIPを追加し、アクセス可能にする

```
# vim /etc/httpd/conf.d/phpMyAdmin.con
```

バーチャルホストでアクセスさせるためには、以下を追加しておく。

```
<VirtualHost *:80>
    ServerName phpmyadmin.example.com
    DocumentRoot /usr/share/phpMyAdmin/
    ErrorLog logs/phpmyadmin-error_log
    CustomLog logs/phpmyadmin-access_log combined
</VirtualHost>
```

ちなみにIPでアクセスする場合で、URLを変更する場合はこう。
※今回はIPでのアクセスを許可していない

```
Alias /phpMyAdminxxxxxxxxxxxxxx /usr/share/phpMyAdmin
```


#### 再起動

```
apachectl restart
```



## 監視設定
logwatch と、denyhostsを入れる。

### logwatch
http://landisk.kororo.jp/diary/29_logwatch.php

インストール

```
# yum install logwatch
```

確認

```
# /usr/sbin/logwatch --print
```

設定

```
# vim /etc/logwatch/conf/logwatch.conf
```

*内容*

```
# メール送信先
MailTo = hoge@example.com
#ログの詳細レベル。1～10の整数での指定も可（Low0 High10）
Detail = Med　
```

テスト送信

```
logwatch --service sshd
```

※VPSお試し期間中は送信が制限されるので届かない


### denyhosts

インストール

```
# yum --enablerepo=epel install denyhosts
```

設定

```
# vim /etc/denyhosts.conf
```

*内容*

```
ADMIN_EMAIL = hoge@fuga.comannd
PURGE_THRESHOLD = 2
BLOCK_SERVICE = sshd
DENY_THRESHOLD_INVALID = 5
DENY_THRESHOLD_VALID = 5
```

#### denyhosts

```
# /etc/init.d/denyhosts start
```

#### 自動起動

```
chkconfig denyhosts on
```

## 最後に

書きそびれてしまったものも多々ありますが、様々な記事を参考にさせて頂きました。
ありがとうございます！