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を指したら、そこからアクセスされてしまうこともあるため。

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

Include conf.d/*.conf

よりも前。

1.特定のURLへリダイレクトさせる

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

2.アクセス禁止にする

<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

http://www.server-memo.net/server-setting/ssh/ssh-denyhosts.html#i

インストール

# 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