個人開発環境を久々整えました。
折角なのでログを残します。
構築する環境
- 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 インストール
下準備
# 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
インストール
# 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
最後に
書きそびれてしまったものも多々ありますが、様々な記事を参考にさせて頂きました。
ありがとうございます!