CentOS7をインストールした直後に行う初期設定


インフラ初心者が纏めているため、信用しないでください。この記事を参考にセットアップしたことによって被った損害・損失に対し、いかなる場合でも一切の責任を負いませんのでご了承ください。あくまでも自己責任でお願いします。CentOS は VPS のコンソール画面から最小限インストールをしています。

ここでは、ウェブサーバーや PHP などのプラグラムをインストールする前に必要なCentOSの初期設定をまとめています。

## root アカウントのパスワードの変更

root でログインします。

```bash
$ passwd
```

`passwd` は現在のユーザーのパスワードを変更するコマンドです。

## CentOS のアップデートとアップグレード

```bash
$ yum clean all && \
yum -y update && \
yum clean all && \
yum -y upgrade && \
yum clean all && \
cat /etc/redhat-release
```

### 開発ツールなどを、グループインストールする

`wget` や `git` をはじめ、開発などで使用するパッケージをグループインストールする。
CentOS7 では不要な、net-tool などもインストールされてしまうが、気になるようであれば、個別に remove する。

```bash
$ yum -y groupinstall "base" && \
yum -y groupinstall "Development tools"
```

## 言語確認

CentOS7 では、ロケールの設定内容の確認や変更は `localectl` コマンドを使用します。
また、CentOS6 までは `yum -y groupinstall "Japanese Support"` のコマンドで日本語環境を整えていましたが、これらは不要です。

現在のロケール設定を確認する例を、以下に示します。

```bash
$ localectl status
```

すると、以下のように表示されます。

```
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp
```

### 利用可能なロケール一覧を確認する

```bash
$ localectl list-locales
```

### 利用可能な日本語ロケールの一覧を確認する

```bash
$ localectl list-locales | grep -i ja
```

### 使用ロケールを変更する

以下に、`ja_JP.eucjp` へ変更する例。

```bash
$ localectl set-locale LANG=ja_JP.eucjp
```

設定を反映させる。

```bash
$ source /etc/locale.conf
```

### キーボードマッピングの変更

```bash
$ localectl set-keymap jp && \
sudo vi /etc/default/grub
```

`GRUB_CMDLINE_LINUX` 定数の `vconsole.keymap` を書き換える。

```
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto vconsole.keymap=ja rhgb quiet"
```

X11 Layout を変更する。

```bash
$ vi /etc/X11/xorg.conf.d/00-keyboard.conf
```

`Option "XkbLayout" "**"` の `**` の部分を書き換える。

再起動させる。

```bash
$ reboot
```

## リポジトリを追加する

1つのリポジトリで全てのソフトウェアが提供されていれば面倒はないのですが、現状はそうではありません（きっと何か理由があるのでしょう。）。そのため、いくつかのサードパーティのリポジトリを追加していきます。

### Epel と Remi と okay のリポジトリを追加する

```bash
$ rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7 && \
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \
rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi && \
rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-7.rpm && \
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt && \
rpm -ivh http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-5.el7.noarch.rpm && \
rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB && \
vi /etc/yum.repos.d/mariadb.repo
```

一部のリポジトリを初期で無効化します。無効化したリポジトリから何かをインストールしたい場合は、yum コマンドに `--enablerepo` オプションを追加して yum コマンドを実行します。

```bash
$ sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo && \
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/remi.repo && \
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/remi-safe.repo
```

Epel から clam を対象外にします。

```bash
$ vi /etc/yum.repos.d/epel.repo
```

下記を追加します。

```
[epel]
exclude=clam*
```

[CentOS 7 パッケージ管理(yum)](http://yokensaka.com/centos/?p=277)

### H2O のリポジトリを追加する

2022/04 にリポジトリが消滅しました
詳細: https://github.com/tatsushid/h2o-rpm/issues/10

### Nginx のリポジトリを追加する

```bash
$ vi /etc/yum.repos.d/nginx.repo
```

下記をペーストします。

```
[nginx]
name=nginx
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=0
```

### MariaDB のリポジトリを追加する

この作業は、MariaDB のバージョンが古い場合だけにします。

```bash
rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB && \
vi /etc/yum.repos.d/mariadb.repo
```

下記をペーストします。

```
[mariadb]
name=mariadb
baseurl=http://yum.mariadb.org/10.2.1/centos$releasever-$basearch
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=0
```

## 最初にインストールするソフトウェア

```bash
$ yum -y install vim-enhanced logwatch denyhosts yum-cron && \
yum --enablerepo=epel -y install rkhunter clamav clamav-update
```

### Clam AntiVirus の設定（ウィルス対策ソフト）

オープンソースで開発・運用されているウィルス対策ソフト。

#### インストール
```bash
$ yum -y install --enablerepo=epel clamav clamav-update
```

#### 設定ファイルを編集

```bash
$ mv /etc/freshclam.conf /etc/freshclam.conf.old && \
/etc/freshclam.conf
```

以下をペースト。

```
##
## Example config file for freshclam
## Please read the freshclam.conf(5) manual before editing this file.
##

UpdateLogFile /var/log/freshclam.log
LogTime yes
LogSyslog yes
LogRotate yes
PidFile /var/run/freshclam.pid
DatabaseOwner root
DatabaseMirror database.clamav.net
NotifyClamd /etc/clamd.d/scan.conf
```

#### 設定ファイルを編集 2

```bash
$ mv /etc/clamd.d/scan.conf /etc/clamd.d/scan.conf.old && \
vi /etc/clamd.d/scan.conf
```

以下をペースト。

```
##
## Example config file for the Clam AV daemon
## Please read the clamd.conf(5) manual before editing this file.
##

LogFile /var/log/clamd.scan
LogTime yes
LogSyslog yes
LogRotate yes
PidFile /var/run/clamd.scan/clamd.pid
LocalSocket /var/run/clamd.scan/clamd.sock
FixStaleSocket yes
User root
ExcludePath ^/proc/
ExcludePath ^/sys/
```

#### スケジュール設定

1 時間に 1 回スキャンされる。

```bash
$ vi /etc/cron.hourly/clamd
```

下記をペースト。

```
#!/bin/bash

PATH=/usr/bin:/bin

# ClamAV update process
freshclam --quiet

# Virus scan
CLAMSCANTMP=`mktemp`
clamscan --recursive --remove / > ${CLAMSCANTMP} /dev/null 2>&1
[ ! -z "$(grep FOUND$ ${CLAMSCANTMP})" ] && \

# When detect virus, send mail
grep FOUND$ $CLAMSCANTMP | /bin/mail -s "Virus Found in `hostname`" root
rm -f ${CLAMSCANTMP}
```

実行権限を付与。

```bash
$ chmod +x /etc/cron.hourly/clamd
```

#### CPU 使用率 / メモリー使用率の上限を設定

```bash
$ /usr/lib/systemd/system/clamd@.service
```

Service ディレクティブの末尾に以下を追加。

```ini
MemoryLimit=512M
CPUQuota=30%
```

デーモンを再読み込みする。

```bash
$ systemctl daemon-reload
$ systemctl restart clamd@scan
```


### RKHunter の設定（Rootkit 検出ツール）

設定ファイルを変更します。

```bash
$ vi /etc/sysconfig/rkhunter
```

変更が必要であれば変更します。保存後、データベースをアップデートします。

```bash
$ rkhunter --update
```

次にシステムのファイル情報をアップデートします。

```bash
$ rkhunter --propupd
```

スキャンを実行します。

```bash
$ rkhunter -c -sk
```

#### スケジュール設定

1 日に 1 回スキャンされる。

```bash
$ mv vi /etc/cron.daily/rkhunter vi /etc/cron.daily/rkhunter.old && \
vi /etc/cron.daily/rkhunter
```

下記をペースト。

```bash
#!/bin/bash

MAIL_TO=root
MAIL_SUBJECT="`hostname -s` `date +%Y%m%d_%H-%M-%S` Rootkit Hunter"
LOG_FILE=`mktemp /tmp/rkhunter.temp.XXXXXX`
/bin/rkhunter --update > /dev/null 2>&1
/bin/rkhunter --check --skip-keypress --cronjob --report-warnings-only 2>&1 > ${LOG_FILE}
if [ -s ${LOG_FILE} ]; then
    grep Warning ${LOG_FILE} | mail -s "$MAIL_SUBJECT NG" $MAIL_TO
else
    echo "$MAIL_SUBJECT OK" |  mail -s "$MAIL_SUBJECT OK" $MAIL_TO
fi
rm -f ${LOG_FILE}
```

実行権限を付与。

```bash
$ chmod +x /etc/cron.daily/rkhunter
```

### Logwatch の設定（ログ監視ツール）

設定ファイルを作成します。


```bash
$ cat /usr/share/logwatch/default.conf/logwatch.conf >> /etc/logwatch/conf/logwatch.conf && \
vi /etc/logwatch/conf/logwatch.conf
```

変更が必要であれば変更します。

#### ログを確認する

|Command                         |Logfile         |Description               |
|--------------------------------|----------------|--------------------------|
|last                            |/var/log/wtmp   |ログイン／ログアウトの履歴|
|lastb                           |/var/log/btmp   |不正ログインの試行履歴    |
|lastlog                         |/var/log/lastlog|最新のログイン            |
|cat /var/log/secure \| grep sshd|/var/log/secure |SSHの履歴                 |

### Denyhosts の設定（SSH のブルートフォース攻撃対策）

設定ファイルを変更します。

```bash
$ vi /etc/denyhosts.conf
```

変更が必要であれば変更します。以下にいくつかピックアップしておきます。

```bash
PURGE_DENY=4w            # 拒否を解除するまで期間
DENY_THRESHOLD_INVALID=1 # 存在しないユーザでのログイン試行回数
DENY_THRESHOLD_VALID=3   # 存在するユーザでのログイン試行回数
DENY_THRESHOLD_ROOT=1    # rootのログイン試行回数
```

次にホワイトリストを設定します。

```bash
$ vi /var/lib/denyhosts/allowed-hosts
```

ブロックされた IP アドレスを削除したい場合は

```bash
$ vi /etc/hosts.deny
```

を編集します。設定が完了したら、サービス登録し起動させます。

```bash
$ systemctl enable denyhosts && \
systemctl start denyhosts
```

### yum-cron の設定（yum update 自動化）

yum-updateonboot がインストールされている場合は、停止させます。

```bash
$ systemctl stop yum-updateonboot.service && \
systemctl disable yum-updateonboot.service
```

設定ファイルを変更します。

```bash
$ vi /etc/yum/yum-cron.conf
```

ダウンロードとインストールを自動化するため、`apply_updates` を `yes` にします。

```
apply_updates = yes
```

次に自動でアップデートさせたくないをソフトウェアを指定します。

```bash
$ vi /etc/yum.conf
````

下記をペーストします(任意に追加・削除)。

```bash
[main]
exclude=gcc* kde* openssh* kernel* php* mysql*
```

yum-cron のバグ対策のために、プログラムの一部を改変します。

```bash
$ vi /usr/sbin/yum-cron
```

以下のように変更します。


```bash
# Build up the email to be sent
msg = MIMEText(''.join(self.output))
```

↓

```bash
# Build up the email to be sent
# msg = MIMEText(''.join(self.output))
msg = MIMEText(''.join(self.output),_charser='utf-8')
```

保存後、サービス登録し起動させます。

```bash
$ systemctl enable yum-cron && \
systemctl start yum-cron
```

### Vim の設定

```bash
$ mv /bin/vi /bin/vim-tiny && \
ln -s /usr/bin/vim /bin/vi
```

#### エイリアスを追加

```bash
$ vi /etc/bashrc
# alias
alias vi="vim"

$ source /etc/bashrc
```

#### 行番号を表示

```bash
$ vi /etc/vimrc
```

下記を追加。

```
set number
```

`/etc/vimrc` はシステム設定なので、行番号を表示を追加くらいに留めておくのがよいと思います。設定ファイルの場所は以下の通り。

```
   システム vimrc: "/etc/vimrc"
　   ユーザ vimrc: "$HOME/.vimrc"
第 2 ユーザ vimrc: "~/.vim/vimrc"
　    ユーザ exrc: "$HOME/.exrc"
```

## SELinux を無効化

```bash
$ setenforce 0 && \
sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/config
```

## ユーザーとグループを作成する

作業用ユーザーに加えて、H2O、Nginx のユーザーを追加しています。

```bash
$ groupadd h2o && \
useradd -g h2o -s /sbin/nologin -d /opt/h2o h2o && \
groupadd nginx && \
useradd -g nginx -s /sbin/nologin -d /opt/nginx nginx && \
useradd exampleuser && \
passwd exampleuser && \
gpasswd -a exampleuser wheel && \
gpasswd -a exampleuser h2o && \
gpasswd -a exampleuser nginx
```

### グループ一覧を確認する

```bash
$ getent group
```

### ユーザーが所属しているグループを確認する

```bash
$ groups exampleuser
```

### ユーザー一覧を確認する

```bash
$ cat /etc/passwd|sed -e 's/:.*//g'
```

### 作業用ユーザーの公開鍵と秘密鍵を作成する

ローカル PC で、秘密鍵と公開鍵のペアキーを作成します。以下の例は Mac を使用して作成した例です。
※ conoha の部分は適当に読み替えてください。

```bash
# 秘密鍵を生成
$ openssl genrsa -des3 -out ~/.ssh/conoha_rsa 2048

# パーミッションの変更
$ chmod 600 ~/.ssh/conoha_rsa

# 公開鍵を生成
$ ssh-keygen -y -f ~/.ssh/conoha_rsa > ~/.ssh/conoha_rsa.pub

# 鍵を登録する
$ ssh-add -K ~/.ssh/conoha_rsa

# 公開鍵をクリップボードにコピー
$ pbcopy < ~/.ssh/conoha_rsa.pub
```

リモートサーバーに公開鍵を設置します。

```bash
$ mkdir -p /home/exampleuser/.ssh/ && \
vi /home/exampleuser/.ssh/authorized_keys
```

ここで、先ほどクリップボードにコピーした公開鍵をペーストし保存します。保存後、.ssh ディレクトリ、authorized_keys の所有権やアクセス権を変更します。

```bash
$ chown exampleuser:exampleuser /home/exampleuser/.ssh/ && \
chmod 700 /home/exampleuser/.ssh/ && \
chown exampleuser:exampleuser /home/exampleuser/.ssh/authorized_keys && \
chmod 400 /home/exampleuser/.ssh/authorized_keys
```

## SSHの設定

ログイン認証方法の変更、ポート番号の変更を行います。

```bash
$ vi /etc/ssh/sshd_config
Port 12200                              # SSH のポート番号を任意に変更（ufw で指定したポート番号）
Protocol 2                              # SSH のプロトコルを SSH2 のみにする
SyslogFacility AUTHPRIV                 # /var/log/secure に sshd のログを出力
LogLevel VERBOSE                        # 出力するログの出力レベル
PermitRootLogin no                      # root でのログインを拒否
MaxAuthTries 2                          # 認証の試行回数を制限
PubkeyAuthentication yes                # 公開鍵での認証を許可
AuthorizedKeysFile .ssh/authorized_keys # 公開鍵の設置場所をユーザディレクトリ配下の .ssh/authorized_keys に変更
PasswordAuthentication no               # パスワード認証の可否
PermitEmptyPasswords no                 # パスワードが設定されていないアカウントの可否
ChallengeResponseAuthentication no      # チャレンジ/レスポンス認証を無効化
ClientAliveInterval 300                 # 5分間応答がなければ生存確認パケットを送信
ClientAliveCountMax 2                   # 2回連続で応答がなければセッションを切断
AllowTcpForwarding no                   # SSHポートフォワーディングの禁止
AllowStreamLocalForwarding no           # Unixドメインソケットフォワーディングを禁止
GatewayPorts no                         # リモートホストからフォワードされたポートへの接続をループバックアドレスのみに制限
PermitTunnel no                         # レイヤー2/3トンネリングを禁止
```

変更内容は、sshdの再起動を行うと反映されますが、再起動はFirewallの設定後に行います。

## Firewall の設定

CentOS7 では、iptables が非推奨となり代わりに firewall-cmd を使うように変更されました。iptables は非推奨でですが、利用することは可能です。

### HTTP、HTTPS、MySQL のポートを開放する

```bash
$ firewall-cmd --add-service=http && \
firewall-cmd --permanent --add-service=http && \
firewall-cmd --add-service=https && \
firewall-cmd --permanent --add-service=https && \
firewall-cmd --add-service=mysql && \
firewall-cmd --permanent --add-service=mysql
```

### ssh のポート番号を 10022 に変更する

定義ファイルをコピーして編集します。

```bash
$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml && \
vi /etc/firewalld/services/ssh-alt.xml
```

port="22" の 22 を 10022 に変更します。

```xml
<port protocol="tcp" port="10022"/>
```

変更した内容を Firewall に設定します。

```bash
$ firewall-cmd --reload && \
firewall-cmd --add-service=ssh-alt && \
firewall-cmd --permanent --add-service=ssh-alt && \
firewall-cmd --remove-service=ssh && \
firewall-cmd --permanent --remove-service=ssh && \
firewall-cmd --reload && \
firewall-cmd --list-all
```

sshd を再起動させます。

```bash
$ systemctl restart sshd
```

## root になれるユーザーを制限する

誰でも root に成れてしまうのは危険だとなので、root に成れるユーザーとグループの制限と、sudo コマンド使用時のパスワード認証の有無を設定します。

### wheelグループのみ root になれるようにする

```bash
$ vi /etc/pam.d/su
auth required pam_wheel.so use_uid # コメントアウトを外す
```

末尾に group=wheel を追記します（不要な気がする…）。

```
auth required pam_wheel.so use_uid group=wheel
```

su コマンドは wheel グループのみ使用できるようにします。

```
$ vi /etc/login.defs
SU_WHEEL_ONLY yes # 最後の行に追加
```

### root になれるユーザーを制限する

以下の例は、rootとexampleuserのみsuコマンドでrootになれる例です。

```bash
$ vi /etc/group
wheel:x:10:root,exampleuser
```

### sudo コマンドの設定をする

```bash
$ visudo
# %wheel ALL=(ALL) ALL            # sudo コマンドにパスワードを必要とする場合
# %wheel ALL=(ALL) NOPASSWD: ALL  # sudo コマンドにパスワードを必要としない場合
```

### 不要なデーモンを停止させる

下記コマンドで起動中のデーモンを確認し不要なサービスを個別に停止させます。

```bash
$ ls /etc/systemd/system/multi-user.target.wants|grep \.service
```

[acpid](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-2)
ホスト側からシャットダウンできなくなるのでonのままにしておきます。また、カスタムOSをインストールした場合は acpid がインストールされているか確認します。

acpid がインストールされていない場合、以下のコマンドでインストールできます。

```bash
$ yum -y install acpid && \
systemctl enable acpid.service && \
systemctl start acpid.service
```

avahi-daemon

```bash
$ systemctl stop avahi-daemon.service && \
systemctl disable avahi-daemon.service
```

[blk-availability](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-5)

```bash
$ systemctl stop blk-availability.service && \
systemctl disable blk-availability.service
```

[cpuspeed](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-6)

```bash
$ systemctl stop cpuspeed.service && \
systemctl disable cpuspeed.service
```

[haldaemon](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-8)

```bash
$ systemctl stop haldaemon.service && \
systemctl disable haldaemon.service
```

[mdmonitor](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-14)

```bash
$ systemctl stop mdmonitor.service && \
systemctl disable mdmonitor.service
```

[messagebus](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-15)

```bash
$ systemctl stop messagebus.service && \
systemctl disable messagebus.service
```

kdump

```bash
$ systemctl stop kdump.service && \
systemctl disable kdump.service
```

[netfs](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-17)

```bash
$ systemctl stop netfs.service && \
systemctl disable netfs.service
```

[quota_nld](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-23)

```bash
$ systemctl stop quota_nld.service && \
systemctl disable quota_nld.service
```

[rdisc](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-24)

```bash
$ systemctl stop rdisc.service && \
systemctl disable rdisc.service
```

[svnserve](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-31)

```bash
$ systemctl stop svnserve.service && \
systemctl disable svnserve.service
```

[udev-post](http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52#2-33)

```bash
$ systemctl stop udev-post.service && \
systemctl disable udev-post.service
```

yum-updatesd

```bash
$ systemctl stop yum-updatesd.service && \
systemctl disable yum-updatesd.service
```

## ログイン時のメッセージを変更する

```bash
$ vi /etc/motd
```

適当にブランド名などを記載。以下は一例です。

```
  
  ██╗   ██╗██╗███████╗██╗   ██╗ █████╗ ██╗     ██╗██╗   ██╗███████╗
  ██║   ██║██║██╔════╝██║   ██║██╔══██╗██║     ██║██║   ██║██╔════╝
  ██║   ██║██║███████╗██║   ██║███████║██║     ██║██║   ██║█████╗  
  ╚██╗ ██╔╝██║╚════██║██║   ██║██╔══██║██║     ██║╚██╗ ██╔╝██╔══╝  
   ╚████╔╝ ██║███████║╚██████╔╝██║  ██║███████╗██║ ╚████╔╝ ███████╗
    ╚═══╝  ╚═╝╚══════╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝  ╚═══╝  ╚══════╝

  H2O + HHVM + MariaDB

  VisuAlive https://www.visualive.jp
  KUCKLU    https://www.kuck1u.me
  
```

テキストバナーは下記サイトで簡単に作成できます。

[Text to ASCII Art Generator (TAAG)](http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=Qiita)

## ホスト名を変更する

```bash
$ vi /etc/hostname
```

## root宛のメールを転送する

```bash
$ sed -i '/^root:/d' /etc/aliases && \
vi /etc/aliases
```

「# Person who should get root's mail」の下にある「root:」の値を変更します。

```bash
root: hoge@example.com
```

設定を反映させます。

```bash
$ postalias /etc/aliases
```

## Postfix のメールをGmail経由で送信する

2 重認証の設定を行っている場合は、予めアプリ用パスワードを発行しておきます。

```bash
$ yum -y install cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5 && \
systemctl enable saslauthd && \
systemctl start saslauthd &&\
echo [smtp.gmail.com]:587 accountname@gmail.com:apppassword > /etc/postfix/sasl_gmail &&\
chmod 600 /etc/postfix/sasl_gmail &&\
postmap /etc/postfix/sasl_gmail &&\
vi /etc/postfix/main.cf
```

以下を末尾に追加します。

```
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_gmail
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt
```

Postfix を再起動させます。

```bash
$ systemctl restart postfix
```

テスト送信を行い、Gmail 経由でメールが送信されているのを確認します。

```bash
$ echo test | mail root
```

## TCP カーネルパラメータを変更する

ipv6 が不要であれば、その辺りは各々調節してください。

```bash
sysctl -w kernel.exec-shield=2
sysctl -w vm.swappiness=0 && \
sysctl -w net.ipv4.ip_local_port_range="18000 65535" && \
sysctl -w net.ipv4.tcp_fastopen=3 &&\
sysctl -w net.ipv4.tcp_tw_reuse=1 && \
sysctl -w net.ipv4.tcp_fin_timeout=10 && \
sysctl -w net.ipv4.tcp_max_syn_backlog=1024 && \
sysctl -w net.core.somaxconn=65535 && \
sysctl -w net.ipv6.conf.all.disable_ipv6=0 && \
sysctl -w net.ipv6.conf.default.disable_ipv6=0 && \
sysctl -w net.ipv6.conf.lo.disable_ipv6=0
```

設定ファイルの編集します。

```bash
$ vi /usr/lib/sysctl.d/10-custom.conf
```

下記をペーストします。

```
kernel.exec-shield = 2
vm.swappiness = 0
net.ipv4.ip_local_port_range = 18000 65535
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 65535
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
```

変更した設定を反映させます。

```bash
$ sysctl -p
```

**参考**
[Nginxのパフォーマンスを極限にするための考察](http://qiita.com/iwai/items/1e29adbdd269380167d2)
[ローカルポートを食いつぶしていた話](http://d.hatena.ne.jp/download_takeshi/20091013/1255443592)
[Linuxカーネルパラメータ一覧・標準設定（CentOS 6）](http://hesonogoma.com/linux/kernel_parameter_list_centos6.html)

## ファイルディスクリプタの上限を変更する

```bash
$ vi /etc/security/limits.conf 
```

以下を追加。

```
* soft nofile 65536
* hard nofile 65536
```

再起動にも反映されるように


```bash
$ vi /etc/sysconfig/init
```

以下を末尾に追加します。

```
ulimit -n 65536
```

## 再起動させる

再起動させないと設定が反映されない項目があるため、CentOSを再起動させます。

```bash
$ reboot
```

## ライブラリやソフトウェアを諸々インストールする

### yum install でインストール可能なライブラリやソフトウェア群

```bash
$ yum -y install \
cpp gcc-c++ gcc psmisc numactl m4 automake bison \
{binutils,boost,bison,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,pcre,perl,GeoIP,gd,zlib,fribidi,numactl}-devel \
lib{xslt,event,yaml,vpx,png,zip,icu,memcached,cap,dwarf,jpeg-turbo}-devel \
mariadb mariadb-server {unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,ffi}-devel \
libjpeg-turbo ocaml gperf libjpeg-turbo-static libjpeg-turbo-utils optipng \
make libtool libssh ruby ruby-devel dialog augeas-libs environment-modules compat-openldap
```

```bash
$ yum -y --enablerepo=epel install \
xsel glib fastlz double-conversion inotify-tools zeromq enca gifsicle gperftools lib{uv,mcrypt} \
{double-conversion,jemalloc,lz4,libc-client,fastlz,glib,inotify-tools,zeromq,libuv,glog,oniguruma,libmcrypt,gperftools}-devel
```

### 作業ディレクトリを作成

```bash
$ mkdir -p /tmp/dev/ && \
mkdir -m 750 -p /var/log/h2o/ && \
chown -R h2o:h2o /var/log/h2o/ && \
mkdir -m 750 -p /var/log/hhvm/ && \
chown -R hhvm:hhvm /var/log/hhvm/ && \
mkdir -m 770 -p /var/www/public_html/ && \
chmod 2770 /var/www/public_html/ && \
chown -R nginx:nginx /var/www/vhosts/
```

### OpenSSL をインストールする

```bash
$ cd /tmp/dev && \
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1o.tar.gz -O openssl.tar.gz && \
mkdir ./openssl && \
tar -zxvf openssl.tar.gz -C ./openssl --strip-components=1 && \
rm -rf openssl.tar.gz && \
cd ./openssl && \
./config --prefix=/usr/local/openssl/1_1_1o --openssldir=/usr/local/openssl shared zlib
make depend && \
make && \
make install
```

シンボリックリンクを作成

```bash
$ ln -s /usr/local/openssl/1_1_1o/bin/c_rehash /usr/local/bin/ && \
ln -s /usr/local/openssl/1_1_1o/bin/openssl /usr/local/bin/ && \
ln -s /usr/local/openssl/1_1_1o/include/openssl /usr/local/include/ && \
ln -s /usr/local/openssl/1_1_1o/lib/engines /usr/local/lib/ && \
ln -s /usr/local/openssl/1_1_1o/lib/libcrypto.a /usr/local/lib/  && \
ln -s /usr/local/openssl/1_1_1o/lib/libcrypto.so /usr/local/lib/ && \
ln -s /usr/local/openssl/1_1_1o/lib/libcrypto.so.1.1 /usr/local/lib/ && \
ln -s /usr/local/openssl/1_1_1o/lib/libssl.a /usr/local/lib/ && \
ln -s /usr/local/openssl/1_1_1o/lib/libssl.so /usr/local/lib/ && \
ln -s /usr/local/openssl/1_1_1o/lib/libssl.so.1.1 /usr/local/lib/ && \
ln -s /usr/local/openssl/1_1_1o/lib/pkgconfig/libcrypto.pc /usr/local/lib/pkgconfig/ && \
ln -s /usr/local/openssl/1_1_1o/lib/pkgconfig/libssl.pc /usr/local/lib/pkgconfig/ && \
ln -s /usr/local/openssl/1_1_1o/lib/pkgconfig/openssl.pc /usr/local/lib/pkgconfig/
```

### Git のインストール

```
$ cd /tmp/dev && \
yum -y remove git && \
wget https://github.com/git/git/archive/v2.36.1.tar.gz -O git.tar.gz && \
mkdir git && \
tar -zxvf git.tar.gz -C /tmp/dev/git --strip-components=1 && \
rm -rf git.tar.gz && \
cd ./git && \
make configure && \
./configure --prefix=/usr/local --with-openssl=/usr/local/ssl/lib/ && \
make all && \
make install && \
git --version
```

### CMake のインストール

```
$ cd /tmp/dev && \
wget https://cmake.org/files/v3.23/cmake-3.23.2.tar.gz -O cmake.tar.gz && \
mkdir cmake && \
tar -zxvf cmake.tar.gz -C /tmp/dev/cmake --strip-components=1 && \
rm -rf cmake.tar.gz && \
cd ./cmake && \
./configure && \
make && \
make install
```

### libuv のインストール

```
$ cd /tmp/dev && \
git clone https://github.com/libuv/libuv.git --depth=1 && \
cd ./libuv && \
sh autogen.sh && \
./configure && \
make && \
make install
```

### libre2 のインストール

```
$ cd /tmp/dev && \
git clone https://github.com/google/re2.git --depth=1 && \
cd ./re2 && \
make && \
make install
```

### libiconv のインストール

```
$ cd /tmp/dev && \
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz -O libiconv.tar.gz && \
mkdir ./libiconv && \
tar -zxvf libiconv.tar.gz -C ./libiconv --strip-components=1 && \
cd ./libiconv && \
wget http://apolloron.org/software/libiconv-1.14-ja/libiconv-1.14-ja-2.patch && \
patch -p1 < ./libiconv-1.14-ja-2.patch && \
./configure && \
make && \
make install
```

### libmruby のインストール

```
$ cd /usr/local/src && \
wget https://github.com/mruby/mruby/archive/3.1.0.tar.gz -O mruby.tar.gz && \
mkdir ./mruby && \
tar -zxvf mruby.tar.gz -C ./mruby --strip-components=1 && \
rm -rf mruby.tar.gz && \
cd ./mruby && \
./minirake
```

libmruby.pc 作成。

```
$ cat <<EOD>$PWD/build/host/lib/libmruby.pc
prefix=$PWD
libdir=\${prefix}/build/host/lib/
includedir=\${prefix}/include

Name: libmruby
Description: mruby libraries
Version: 3.1.0
Libs: -L\${libdir} -lmruby
Cflags: -I\${includedir}
EOD
```

### Ruby のライブラリのインストール

```
$ gem install rake --remote
```

### 不要ファイルの削除などの後始末

```bash
$ rm -rf /tmp/dev
```

これで、CentOS の設定は完了です。

## セキュリティ関連

### パーミッション

|                     |設定する値       |一般的な値（参考）|
|---------------------|-----------------|------------------|
|ディレクトリ         |750 ( rwxr-x--- )|755 ( rwxr-xr-x ) |
|.html / .php / .jpg  |640 ( rw-r----- )|644 ( rw-r--r-- ) |
|.cgi / .pl           |700 ( rwx------ )|755 ( rwxr-xr-x ) |
|.text / .dat / .log  |600 ( rw------- )|666 ( rw-rw-rw- ) |
|.htaccess / .htpasswd|640 ( rw-r----- )|644 ( rw-r--r-- ) |

#### public_html 以下のファイルを一括で750へ変更する

```bash
$ find /var/www/public_html -type d -print | xargs chmod 750
```

#### public_html 以下のファイルを一括で640へ変更する

```bash
$ find /var/www/public_html -type f -print | xargs chmod 640
```

#### public_html 以下の特定の拡張子のファイルを640へ変更する

```bash
$ find /var/www/public_html -type f -regex ".*\.\(php\|html|css|js|jpg|jpeg|pnh|gif|svg\)" -print | xargs chmod 640
```

### OpenSSH のローミング機能をオフにする

```bash
$ echo -e 'UseRoaming no' | sudo tee -a /etc/ssh/ssh_config && \
systemctl restart sshd
```

### ウイルスの検出

[Clam AntiVirus の設定（ウィルス対策ソフト）](#clam-antivirus-の設定ウィルス対策ソフト) をご覧ください。

### Rootkit の検出

[RKHunter の設定（Rootkit 検出ツール）](#rkhunter-の設定rootkit-検出ツール) をご覧ください。

### ログを監視する

[Logwatch の設定（ログ監視ツール）](#logwatch-の設定ログ監視ツール) をご覧ください。

### SSH のブルートフォース攻撃に備える

[Denyhosts の設定（SSH のブルートフォース攻撃対策）](#denyhosts-の設定ssh-のブルートフォース攻撃対策) をご覧ください。

## 参考サイト
* [ConoHa ブログ](https://www.conoha.jp/blog)
* [あぱーブログ](https://blog.apar.jp)
* [Webセキュリティの小部屋](http://www.websec-room.com/)
* [dogmap.jp](http://dogmap.jp/)
* [レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/)
* [Linux標準教科書](http://www.lpi.or.jp/linuxtext/text.shtml)
* [評判のさくらのVPSを使うときに最初にやっておきたいこと(CentOS編)](http://server-setting.info/blog/sakura_vps_centos_first_setup.html)
* [さくらのVPSを使うときに最初にやっておきたいこと(CentOS 7編)](http://server-setting.info/blog/sakura_vps_centos7_first_setup.html)
* [CentOS 7 をインストールしてみた](http://server-setting.info/centos/centos-7-install.html)
* [CentOS7 インストール後の初期設定](https://www.jdbc.tokyo/2014/10/centos7-init/)
* [CentOS7 でのロケール確認・設定コマンド](http://zero-config.com/centos/changelocale-002.html)
* [RHEL7/CentOS7でipコマンドをマスター](http://enakai00.hatenablog.com/entry/20140712/1405139841)
* [CentOS 7.0 - ファイアウォール設定](http://www.mk-mode.com/octopress/2014/08/09/centos-7-0-setting-of-firewall/)
* [CentOS 7 で sshd のポートを変更する(firewalld, SELinuxの設定)](http://lovepeers.org/2014/11/21/centos7-sshd/)
* [サーバの構成をCentOS7+H2O+php-fpm(PHP7)にしてみた](https://blog.sus-happy.net/h2o_php7)
* [H2O Wiki](https://github.com/h2o/h2o/wiki)
* [とにかく速いWordPress @IT](http://www.atmarkit.co.jp/ait/series/2117/index.html)
* [ツールがなくてもサーバー構築でたじろがない！ 一撃シェルスクリプト道場](https://codezine.jp/article/corner/573)
* [Vimの使い方 基本操作まとめ](http://motw.mods.jp/Vim/command.html)
* [yum-cronによる自動アップデート](https://www.pochio.net/blog/2016/02/19/yum-cron-niyoruzi-dong-atupudeto/)
* [Postfix+ClamAV+Amavisd-newによるウイルス対策](https://web.archive.org/web/20201004032018/http://park1.wakwak.com/~ima/centos4_postfix0006.html)
* [CentOS 7 ウィルススキャンの導入(ClamAV)](https://www.infocircus.jp/2019/10/05/centos-7-virusscan-clamav/)
* [ClamAV がメモリを大量消費する（Out of Memory）](https://blog.kamata-net.com/archives/12891.html)
* [h2o systemd service file作った | うま味がない](https://web.archive.org/web/20210615195739/https://negima.mobi/2015/10/2092/h2o-systemd-service-file%E4%BD%9C%E3%81%A3%E3%81%9F/)