CentOS7初期設定

# はじめに
CentOS 7 で初めにすることを記載します（以下前提）

* VPS
* 公開サーバ
* rootユーザでの操作


## OS・パッケージのアップデート
OS・カーネル・パッケージをアップデートします
OSやカーネルをアップデートしたくない場合は /etc/yum.conf を修正します（今回は省略します）

```
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
```
以下を実行します（数分掛かります）

```
# yum -y update
Loaded plugins: fastestmirror
:
Complete!
```
```
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
```

## ロケールの設定
地域や言語を日本にします
まずは現在の設定を確認

```
# localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp
      X11 Layout: jp,us
     X11 Variant: ,
```
ロケールを変更します

```
# localectl set-locale LANG=ja_JP.utf8
```
```
# localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp
      X11 Layout: jp,us
     X11 Variant: ,
```
/etc/locale.conf を安全に書き換えてくれるようです

```:/etc/locale.conf
LANG=ja_JP.utf8
```
現在のログインの環境変数には未反映のようです

```
# env | grep LANG
LANG=en_US.UTF-8
```
反映するには再度ログインするか、以下を実行します

```
# . /etc/locale.conf
```

## rootユーザのパスワード変更
コンソールからログインする時に使用するパスワードを設定します

```
# passwd
ユーザー root のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
パスワードが一致しません。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
```
## 不要なサービスを停止（必要に応じて）
あらかじめインストールされた有効なものを確認します

```
# systemctl list-unit-files --state=enabled --type=service
UNIT FILE                                   STATE
acpid.service                               enabled
auditd.service                              enabled
autovt@.service                             enabled
chronyd.service                             enabled
crond.service                               enabled
:
32 unit files listed.
```
サービスを停止します

```
# systemctl stop サービス名
```
サービスを自動起動を無効にします

```
# systemctl disable サービス名
```
サービスを起動不可にします

```
# systemctl mask サービス名
```

## ホスト名の設定
ホスト名を設定します

```
# hostnamectl set-hostname www.example.com
```
/etc/hostname を安全に書き換えてくれるようです

```:/etc/hostname
www.example.com
```
CentOS 6 では /etc/sysconfig/network の編集により変更可能でした
また、# による行コメントアウトも可能でしたが、
CentOS 7 で同様なことをしてしまうと、ホスト名の設定がおかしくなります

プロンプトに表示されるホスト名はログインし直すと反映されます

```
[root@www ~]#
```

## DNSの設定
VPS提供者のDNSサーバが利用できない場合、公開DNSサーバを利用します

```:/etc/resolve.conf
# Generated by NetworkManager
search example.com
nameserver 8.8.8.8
nameserver 8.8.4.4
```
CentOS 7 では、設定ファイルを直接編集せずに、nmcli コマンドを使用することになっています
search はホスト名の設定によりドメイン部分が自動設定されるようです
nameserver は /etc/sysconfig/network-scripts/ifcfg-eth0 の DNS が自動設定されるようです

## SSH のポート変更
既定のポートのままだと攻撃されやすいので変更します
SELinuxが有効になっているとそのままではポートを変更できませんので今回はSELinuxを無効化します
無効化するには、SELinuxの設定ファイルを編集します

```
# vi /etc/selinux/config
```
```:/etc/selinux/config
:
#SELINUX=enforcing
SELINUX=disabled
:
```
SELinuxの変更を反映するには再起動をします

```
# shutdown -r now
```

ここからSSHの設定です
まずはsshdの設定ファイルを編集します

```
# vi /etc/ssh/sshd_config
```
```:/etc/ssh/sshd_config
:
Port 22222
:
```

SSHのサービスを再起動します

```
# systemctl restart sshd
```

あわせてファイアウォールの設定も変更します
これをやらないとSSH接続できなくなります
firewalld の既定の設定ファイルをコピーして独自の設定ファイル作成します

```
# cp -p /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
# vi /etc/firewalld/services/ssh.xml
```
ポート番号を変更します

```:/etc/firewalld/services/ssh.xml
:
  <port protocol="tcp" port="22222"/>
</service>
```
ファイアウォールの変更を反映します

```
# firewall-cmd --reload
success
```

## ファイアウォールの設定
公開するサービスのポートを許可します
まずは現在のファイアウォールの設定を確認します

```
# firewall-cmd --list-all
public (active)
:
  services: dhcpv6-client ssh
:
```
例として、Webサービス（http、https）への接続を許可します

```
# firewall-cmd --zone=public --add-service=http --permanent
success
# firewall-cmd --zone=public --add-service=https --permanent
success
```
変更を反映します

```
# firewall-cmd --reload
success
```
```
# firewall-cmd --list-all
public (active)
:
  services: dhcpv6-client http https ssh
:
```
もう一つの例として、特定のIPアドレスからのすべての接続を許可します
既定の public ゾーンの他に、trusted ゾーンを追加します

```
# firewall-cmd --add-source=XXX.XXX.XXX.XXX --zone=trusted --permanent
success
```
変更を反映します

```
# firewall-cmd --reload
success
```
変更を確認します

```
# firewall-cmd --get-active-zones
public
  interfaces: eth0
trusted
  sources: XXX.XXX.XXX.XXX
```
```
#  firewall-cmd --list-all --zone=trusted
trusted (active)
:
  sources: XXX.XXX.XXX.XXX
  services:
:
```