出来るだけコピペでCentOS7minimalの環境を作りたい

随分前に書いておいてお蔵入りになってたんですが、少し書き直して上げました。

- Linux CentOS7のminimal（最小構成）をイントラネット内に設置する。
- SSH接続して出来るだけコピペで楽して設定したい。
- せっかくなので何か設置したい。そうだ。[Crowi](http://site.crowi.wiki)を設置しよう
- あとPostgresも設置しよう

## 予定は未定

今回は基本的な設定のみ。

### 出来るだけコピペシリーズで他に書いた記事

出来るだけコピペでウィルスチェックしたい
https://qiita.com/mm_sys/items/8cbe7019183c26fcd228

出来るだけコピペで[Crowi](http://site.crowi.wiki)環境を作りたい
https://qiita.com/mm_sys/items/4e94050fe85a3c6b54f0

### まだ未記載

- Crowiのバックアップと復元
- ~~Postgresの設置。~~　世の中にはたくさん記事があったので書かないことにしました。

## 今回の前提

- 実際に使う前にVMWare等（[MacならVMware Fusion（有料）](https://www.vmware.com/jp/products/fusion.html)、[Winなら非営利利用なら無料のVMware Workstation 11.0](https://my.vmware.com/jp/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation/11_0)）の仮想OSで十分に実験することを強く推奨。
- SELinuxの設定は十分に検証出来ていないのでPermissiveの状態に。
- 「要変更箇所」の記載部分は適宜元の内容からカスタマイズしてください。
- こちらの[スーパーユーザー権限が必要なファイルにcatコマンドでテキストを書き込む。](http://blog.katty.in/3922)という方法を使って書き込んでます。

## 用意しておくもの

- PC端末
- インターネットに接続出来る環境
- CentOS7minimalのisoイメージ
> [Download CentOS](https://www.centos.org/download/)

![0.qcpb9fyn6i8.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/74850904-d27e-8a4c-7add-f39482311c72.jpeg)

## Serverの基本設定

> 有名なこちらを参考にしています。内容が豊富かつ的確。
> https://www.server-world.info

### インストールの設定等

#### 仮想OSを使う場合

##### VMWare Fusionでの設定

カスタム仮想マシンを作成->Linux->CentOS(64ビット)
仮想ディスクオプションを選択：新しいディスクを作成

<img width="219" alt="r33k7p22hdo8yqfr.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/e093e1bd-651b-0d9d-611d-082da8737017.png">

設定->CD/DVD(IDE)
で、ディスクイメージを選択して起動

<img width="370" alt="q3ruuwmyvhgs0pb9.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/260597b8-437d-2983-1503-27ace365bee1.png">

### CentOS7をインストール

言語は日本語の設定、「インストール先」をクリックして、そのまま完了をクリック。
「ネットワークとホスト名」をクリックして、イーサネットをONにして完了してインストール開始。
ネットワークはVMWareの設定で適宜変更。今回は直接接続。

<img width="233" alt="pgk31gam52l3ow29.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/a163b5e4-b053-b297-0971-ce12d67d465f.png">

ルートパスワードとユーザを設定しておく。（今回はuserというユーザを作成）
あとはインストール完了するまで一休み。

<img width="454" alt="vkk5wcvfmm4sfw29.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/88bddd6a-b977-3263-216a-61427dac4d1c.png">

あとでユーザーを追加する場合

[CentOS 7 : 初期設定 : ユーザー追加 : Server World](https://www.server-world.info/query?os=CentOS_7&p=initial_conf&f=)

### とりあえずSSH

まずはSSHが使えるようになるまで我慢して、ひたすら手打ちで作業。
以下は**ルート権限で**作業。

```linux:command
localhost login: root
```

SSHのセキュリティ設定が終わるまで出来ればネットワークに繋がない状態で作業。

##### 要変更場所

|行|記載内容|変更例|補足|
|---|---|---|---|
|9|AllowUsers user|AllowUsers admin|作ったユーザ名に変更|

```commandline
# viでsshd_configを設定
vi /etc/ssh/sshd_config
# :set numberを入力して行数表示可能
# 38行目(環境によっては49行目)：コメント解除し変更 ( rootログイン禁止 )
PermitRootLogin no
# 64行目(78行目)：コメント解除(空パスワード禁止)
PermitEmptyPasswords no
# 末尾に追記。「user」以外ではsshを使えないようにする。
AllowUsers user
# 保存してvi終了
:wq
# ファイアウォールの設定
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
# SSH再起動
systemctl restart sshd
```
### 現在のIPを確認。

`ip a`コマンドを実行して現在のIPを確認。（昔ながらのifconfigの方が良いという人は`yum install net-tools`をインストールすると幸せになれます。）

### SUDO

「user」ユーザのコマンドにルート権限を与える。

> https://www.server-world.info/query?os=CentOS_7&p=initial_conf&f=8

```commandline
visudo
# 最終行に追記。
user ALL=(ALL) ALL
# 30分の間再度パスワードを入れなくて良い（一部を除く）
Defaults timestamp_timeout = 30
```

## SSHで接続して作業

お疲れ様でした。ここからはWindowsならTera TermやMacならTerminalを使っての作業になり、コピーペーストが使えるのでだいぶ楽になります。
例えばMacのターミナルなら例えば`ssh user@XXX.XXX.XXX.XXX`で接続
https://ttssh2.osdn.jp
SSHに関しての詳しい説明は省略。

#### SELinuxをPermissiveの状態（ログだけとっておく状態）にして一旦再起動

SSH接続して下記コマンドを入力して/etc/selinux/configファイルの
SELINUX=enforcingをSELINUX=permissiveに変えてSELinuxの設定を変えてみる。

```commandline
# 念のため古いファイルは残す（古いファイルは日付付きにする）
sudo cp /etc/selinux/config /etc/selinux/config_`date "+%Y%m%d_%H%M%S"`
# /etc/selinux/configの内容を書き換え
sudo sed -ri 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
## 設定変更のため一旦再起動
sudo reboot
```

再起動したら、**再度同じようにSSH接続**をして`getenforce`で状態確認してみて、PermissiveになってたらOK

### 他の設定

#### しておいたほうが良い設定

> https://www.websec-room.com/2014/02/09/1822

##### SSHのアクセス制限

この設定をすると、外部からのアクセスが制限されて、接続出来ない状態が発生します。
実際に行う場合は本当に必要かどうかを検討して実行すること。

> http://qiita.com/wwwaltz/items/db774fda77cb2d6c6922
> http://qiita.com/mokemokechicken/items/d9b35c29d6ed4d60b63c
> http://te2u.hatenablog.jp/entry/2015/07/01/224505
> https://www.ipa.go.jp/security/fy14/contents/soho/html/chap3/freebsd/remote.html

```commandline
# 元の設定ファイルを残しておいて/etc/hosts.denyと/etc/hosts.allowファイルに追記する。このときSSHで入れなくならないように注意。セキュリティが気になるなら公開鍵使ったりホスト、ゲストを固定IPにして、つながるようにしたりしましょう。

sudo cp /etc/hosts.deny /etc/hosts.deny_`date "+%Y%m%d_%H%M%S"`
sudo cat << '_EOT_' | sudo tee -a /etc/hosts.deny
sshd : all
_EOT_

# 古い設定をコピーして残す
sudo cp /etc/hosts.allow /etc/hosts.allow_`date "+%Y%m%d_%H%M%S"`

# 接続側の制限を追記。_EOT_まで一気にコピペ
sudo cat << '_EOT_' | sudo tee -a /etc/hosts.allow
# 192.168.XX.XXのIPは許可する
sshd : 192.168.
# 172.16-31.XX.XXのIPは許可する
sshd : 172.16.0.0/12
# 10.XX.XX.XXのIPは許可する
sshd : 10.
_EOT_

# SSH再起動
sudo systemctl restart sshd
```

##### ポート番号を変更する場合のみ

SSHのポートを22以外にする場合。

|行|記載内容|変更例|補足|
|---|---|---|---|
|1|#Port 22|Port 10022|変更例では22ポートにしているが、22ポートは攻撃対象になりやすいので、<br>それ以外のポート番号にして防衛する。<br>空きのポートを探して設定しよう。|

```
sudo sed -ri 's/^#Port 22/Port 10022/' /etc/ssh/sshd_config
sudo firewall-cmd --zone=public --add-port=10022/tcp --permanent
sudo firewall-cmd --reload
# SSH再起動
sudo systemctl restart sshd
```

これ以降はSSH接続するときは`ssh user@192.168.XX.XX -p 10022`のようにポート番号を指定しないとssh接続出来ないので要注意。

##### ウィルス対策

長いので別途記事を掲載予定。

#### してもしなくても良い設定

VMWareを使ってる場合、open-vm-toolsを入れておく。

> https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2074713

```commandline
# open-vm-tools
sudo yum install open-vm-tools -y
sudo systemctl enable vmtoolsd.service
sudo systemctl start vmtoolsd.service
# バージョンと動作の確認
ps -ef | grep vmtools
systemctl status vmtoolsd.service
```

##### SSL

ドメイン名を持っている人はサーバ証明書を発行して設定しておくべきでしょう。

> https://letsencrypt.jp/
> https://www.websec-room.com/2016/10/01/2698

### 「必要に応じて」リポジトリ追加

特に必要がなければ入れなくても良いと思います。

> https://www.server-world.info/query?os=CentOS_7&p=initial_conf&f=6

```commandline
yum -y install yum-plugin-priorities
sed -i -e "s/\]$/\]\npriority=1/g" /etc/yum.repos.d/CentOS-Base.repo
yum -y install epel-release
sed -i -e "s/\]$/\]\npriority=5/g" /etc/yum.repos.d/epel.repo
yum -y install centos-release-scl-rh centos-release-scl
sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo
sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sed -i -e "s/\]$/\]\npriority=11/g" /etc/yum.repos.d/remi-safe.repo
```

### 固定IPによるネットワーク設定

CentOS7ではコマンド上で`nmtui`と入力すると、GUIのようなものでネットワークの設定変更が出来ます。

<img width="558" alt="0.w0wkk4hodw.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/0ebbf01d-3157-dd18-e8b3-4a899d65ab43.png">

でも以前の通りファイルに書き込んでネットワーク設定します。

##### 要変更箇所

|行|記載内容|変更例|補足|
|---|---|---|---|
|5|...ifcfg-ensXX|...ifcfg-ens33|環境に合わせたネットワーク名に変更|
|12<br>13<br>14<br>15<br>|IPADDR="192.168.XX.XX"<br>NETMASK="255.255.255.0"<br>DNS1="192.168.X.XX"<br>GATEWAY="192.168.X.XX"|IPADDR="192.168.0.1"<br>NETMASK="255.255.255.0"<br>DNS1="192.168.1.1"<br>GATEWAY="192.168.1.2"|環境に合わせて変更|

```commandline
# ネットワークを設定しているファイルを検索
ls /etc/sysconfig/network-scripts/ifcfg-*
# ネットワークインターフェースの一覧（さっきのファイル一覧から照らし合わせて現在使っているファイルを推測）
nmcli device

# 固定IPの設定を使う場合の書き換え。
# ifcfg-ensXXの部分は先程検索したファイル名に書き換え
sudo sed -i -e "s/^BOOTPROTO=\"dhcp\"/BOOTPROTO=\"none\"/" /etc/sysconfig/network-scripts/ifcfg-ensXX

# 環境毎に変更すること。
sudo cat << '_EOT_' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ensXX
IPADDR="192.168.XX.XX"
NETMASK="255.255.255.0"
DNS1="192.168.X.XX"
GATEWAY="192.168.X.XX"
_EOT_

# ネットワーク再起動
sudo systemctl restart network

# GUIっぽく変更する場合はこちらを実行
# nmtui
```

状態を確認(ensXXの部分は適宜変更)

```
nmcli device show ensXX
```

### ネットワークの状態監視

種類が多いのでお好みで。
[Linuxでネットワークの監視を行えるモニタリングコマンド20選 | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2014/09/linuxでネットワークの監視を行えるモニタリングコ/)

### 最後にシステム最適化

```commandline
sudo yum clean all && sudo yum -y update
```

とりあえず今回はここまで