Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

構築する環境

  • 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

インストール

# 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

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away