読者です 読者をやめる 読者になる 読者になる

vpsでサーバー構築するときに必ずやってる設定などまとめ

前にも同じようなこと書いた気がしますが、時間が経つとちょっとずつやってる内容が変わってくるのでメモしておきます。
ちなみにさくらのvpsです

sshの設定

なにはともあれまずはsshの設定をします。
パスワードでのログインを許容しておくとプログラムで総当たりでやられるとあっさりログインされてしまう可能性があるので基本的に禁止するのが良いと思います。

また、知らない人にrootでログインされるのはさらにまずいので自分も含めてログインできないようにするのが良いと思います。

必要な場合は、一般ユーザでログインしてから都度、sudoなりsuでrootユーザにログインしてから作業するのが良いと思います。

作業ユーザーの作成
> useradd username
> passwd username
> パスワードの入力
sudo許可

visudo(以下の行の#コメントを外す)

# %wheel  ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL 
// wheelグループに追加
usermod -G wheel username
// 確認
groups username
鍵認証設定

サーバでの作業
※下で作る(PCで)公開鍵の転送先のディレクトリの作成

> mkdir ~/.ssh
> chmod 700 ~/.ssh

PCでの作業

// 鍵を作成
> ssh-keygen -t rsa -f ~/.ssh/id_rsa_***
> chmod 600 ~/.ssh/id_rsa_***.pub

// 公開鍵をサーバへ転送
> scp ~/.ssh/id_rsa_***.pub username@hostname:~/.ssh/authorized_keys

// 作成・設定した鍵でログインできることを確認する(PC)
> ssh -i ~/.ssh/id_rsa_*** username@hostname
パスワードでのログイン禁止と外部からrootでのログイン禁止
> vi /etc/ssh/sshd_config

# 以下を設定する
PermitRootLogin no
PasswordAuthentication no

# 特定のIPでのみ許可したい場合は、以下を設定
# Match Address www.xxx.yyy.zzz
# PermitRootLogin yes
# PasswordAuthentication yes

文字コード設定

> vi /etc/sysconfig/i18n

LANG="ja_JP.UTF-8"
source /etc/sysconfig/i18n     # 変更を反映

apacheの設定

インストール
# インストール
> yum install httpd

# os起動時にapacheも起動するように設定
> chkconfig httpd on
httpd.confの基本設定
> vi /etc/httpd/conf/httpd.conf

#ServerTokens OS //これだとサーバ情報やapacheのモジュール情報等もhttpレスポンスヘッダ返すのでセキュリティ的によくない
ServerTokens Prod // 最低限の情報だけレスポンスヘッダでかえす設定

#ServerSignature On // NotFoundページなどを表示する際にサーバの情報も表示してしまうのでセキュリティ上よくない
ServerSignature Off

#Options Indexes FollowSymLinks // ディレクトリにアクセスした際にファイルの一覧を表示してしまうのでセキュリティ上よくない
Options -Indexes FollowSymLinks

apache起動

> service httpd configtest
Syntax OK

> service httpd start
Starting httpd: [OK]

ドキュメントルートのディレクトリの所有者を作業ユーザに変更する

chown -R user:group /var/www/html
バーチャルドメインの設定

僕の場合に1サーバー1ドメインということがあまりなくて、たいてい複数ドメイン共存させることが多いので以下の形で設定しています。

vhosts以下にドメインごとの設定ファイルを用意する形です。
また、アクセスログの出力に処理時間も追記してチューニングしやすくすることも毎回しています。

> vi /etc/httpd/conf/httpd.conf

# デフォルトのアクセスログとエラーログの出力設定をOFFに
# CustomLog logs/access_log combined
・・・
# ErrorLog logs/error_log

# vhost読み込み ★追加
Include conf/vhost/*.conf

# アクセスログの書式にに処理時間を追加したものを準備 ★追加
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %D" custom
# ドメインごとにアクセスログの出力先ディレクトリを変える
> mkdir /var/logs/example.com

> mkdir /etc/httpd/conf/vhost

> vi /etc/httpd/conf/vhost/example.conf
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/html/example.com

    # ログ出力とローテーション設定
    CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/example.com/access_log.%Y%m%d 86400 540" custom
    ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/example.com/error_log.%Y%m%d 86400 540"
</VirtualHost>
ログの圧縮

crontab -e

# httpdログ圧縮
0 5 * * * find /var/log/httpd -type f ! -name "*`date +%Y%m%d`*" ! -name "*.gz" -exec gzip {} \;

# httpdログ削除
0 5 * * * find /var/log/httpd -name "*.gz" -mtime +30 -exec rm {} \;

phpの設定

php5.6のインストール
sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

yum install -y --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof
設定
vi /etc/php.ini

;expose_php On
expose_php Off

;date.timezone =
date.timezone = Asia/Tokyo

;mbstring.language = Japanese
mbstring.language = Japanese

;mbstring.internal_encoding = EUC-JP
mbstring.internal_encoding = UTF-8

;mbstring.http_input = auto
mbstring.http_input = auto

mysqlの設定

mysql5.6のインストール
yum install -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum install -y mysql-community-server

mysql_install_db --datadir=/var/lib/mysql --user=mysql
service mysqld start
chkconfig mysqld on
mysql_secure_installation
一般ユーザ作成
grant all on *.* to username@localhost identified by '********';

iptablesの設定

外部からの接続は全て拒否して、その後は都度必要なポートを開けていく形になるかと思います。
自分の場合はsshとhttpが主になります。

立ち上げ直後のiptablesを設定する。 - Qiita
※こちらのまんまです

vi /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
COMMIT

メールサーバの設定

僕の場合は大抵、メールは構築したWebサービスドメインでのメール送受信ができればokで、ちょっと長いので以下にまとめました

【postfix】独自ドメインでメール送受信する手順メモ〜バーチャルドメインで複数ドメイン扱う - とりあえずphpとか

また、iptablesも許可しておきます
vi /etc/sysconfig/iptables

# postfix
-A INPUT -p tcp --dport 25 -j ACCEPT

ずらずら書いてみたけどこれくらいだろうか

SMTP-AUTHメーラー独自ドメインのメール送信する場合)
SSL対応
あと、サービスによっては上記も必要になるかもしれないのであとで追記できれば

以上です