CentOS6.5インストール・設定メモ


##インストール

インストール情報はたくさんありますのでここでは割愛します。
ここでは、VMWare Fusion上にCentOS6.5をMinimalインストールしたことを前提に進めます。

###VMWare Fusionの問題１
特に注意点はないが、VMWare Fusionにminimalインストールするとネットワークが有効にならないので、インストールの途中でネットワークが自動起動するように設定しておくと手間が無い。
もし、忘れた場合は、手動でeth0を設定する。

![centos](http://www.bluecode.jp/qiita/cs65_001.png)

###VMWare Fusionの問題２

VMWare FusionでVMをコピーし、MACアドレスを再生成、起動したら、なぜかeth0が認識されません。
代わりにeth1やeth2が認識され、かつ、使用できません。

下記のようにやると解決できるようです。

####/etc/udev/rules.d/70-persistent-net.rulesの編集

/etc/udev/rules.d/70-persistent-net.rulesをviで開き、今認識されているインターフェース以外の記述行を削除します。
認識されているインターフェース名をeth0に書き換えます。この時、MACアドレスを控えておきます。

####/etc/sysconfig/network-scripts/ifcfg-eth0の編集
ここのMACアドレスを上記で控えたものに書き換えます。

再起動すればeth0を認識しています。[参考](http://d.hatena.ne.jp/komiyak/20130519/1368948737)。


##基本設定１

基本設定１としては、

* SELinuxの解除
* 必要ツールのインストール
* ユーザーの追加
	* sudo設定
* sshのログイン設定

を行う。

なお、以下の操作は特に注意が無い限りルート権限で行うものとします。

###SELinuxの解除

SELinuxがON(enforcing)になっていると設定等がきかないことが起こるので、OFFにしておく。

```bash
vi /etc/selinux/config
```

とし、

```diff
-SELINUX=enforcing
+SELINUX=disabled
```
とする。

```bash
getenforce
```
でDisabledとでればOKです。

###必要ツールのインストール

Minimalインストールでは以降の手順で必要なツールがインスイトールされていません。
個別にインストールしてもいいのですが、Development toolsをインストールしておけば問題ないので、そうします。

```bash
yum groupinstall 'Development tools'
```

###一般ユーザーの追加

####ユーザーの追加

必要な一般ユーザーを作成しておきます。

```bash
useradd hoge
passwd hoge
```

####sudo権限の付与

一般ユーザーで設定作業ができるように追加したユーザーにsudoが可能な権限を与えておきます。
まず、wheelグループへのsudo許可を有効にます。

```bash
visudo
```

として、設定ファイルを起動し、

```diff
-# %wheel        ALL=(ALL)       ALL
+ %wheel        ALL=(ALL)       ALL
```

wheelに関する行をコメントインします。
完了したら、今度はsudo権限を与えたいユーザーをwheelグループに参加させます。

```bash
gpasswd -a hoge wheel
```

適当なコマンドでsudoできるかチェックして下さい。正しく設定したのにsudo出来ない場合は、一度ログアウトして再ログインして見てください。

###SSHログイン設定（証明書のみでのログインを許可）

CentOS6.5はMinialインストールでもsshは許可状態になっていますが、パスワードによるログイン、およびルートログインが許可された状態なので、証明書を利用したsshログインのみを許可する設定にします。

・鍵の生成

ローカル環境がMacだということを前提に進めます。
homeディレクトリに.sshを作成し、その中で鍵を生成します。

```bash
mkdir ~/.ssh
chmod 700 .ssh
cd .ssh
keygen -t rsa
```
標準設定のままEnterを押せばいいでしょう。パスフレーズは空でも設定してもいいです。
設定が完了すると、.sshの中に

* id_rsa（秘密鍵）
* id_rsa.pub（公開鍵）

の2つのファイルができます。この内、公開鍵をサーバに転送します。
転送の前に、両鍵に正しいパーミッション設定をしておきます。

```bash
chmod 600 ~/.ssh/*
```
鍵を保存するフォルダ、ファイルに正しいパーミッションを設定していないと接続時にエラーになります。

・鍵の転送

転送に先立ち、サーバ側で保存先を作成し、パーミッションを設定しておきます。

```bash
mkdir ~/.ssh
chmod 700 .ssh
```

sshが使える状態なので、scpにてサーバに鍵を転送します。

```bash
scp ~/.ssh/id_rsa.pub username@192.168.0.100:~/.ssh/authorized_keys
```
usernameやIP（サーバ名）は適宜変更して下さい。
転送が完了したら、ログインのテストを行って下さい。標準のまま鍵を転送し、かつ、ユーザー名がローカルと一致している場合は、

```bash
ssh 192.168.0.100
```
とするだけでOKです。
ポート名、鍵の場所（名前）、ユーザー名が違う場合は、

```bash
ssh -p 6666 -i ~/.ssh/hoge_id_rsa hoge@192.168.0.100
```
などとします。

・鍵以外のログインの禁止

sshdの設定を変更して、鍵以外、ルートログインを禁止します。
そのためには/etc/ssh/sshd_configを編集します。変更点は、

* PasswordAuthentication no
* PermitRootlogin no

とする感じです。Portも必要に応じて変えてもいいです。
変更したら、sshdを再起動します。

```bash
service sshd restart
```
ssh root@192.168.0.111などとし、拒否されることを確認して下さい。

##基本設定２

基本設定２では、Firewallであるiptablesの設定をしてみたいと思います。
また、そのテストのためにhttpd(Apache)だけインストールしてみます。

###iptablesの有効/無効化

問題の切り分け時に一時的にFirewallをOFFにしたい時があります。その場合は、

```bash
service iptables stop
```
でOKです。恒久的にOFFにする場合は、

```bash
chkconfig iptables off
```
とします。

###設定内容の確認
設定内容は、/etc/sysconfig/iptablesを見ればいいのですが、

```bash
iptables -L -v --line-number
```
とするのが私の好みです。

* -Lは表示。
* --line-numberは行番号を表示（追加、削除の際に使う）。
* -v インターフェースとかも表示したいので。

初期状態では、下記のようになっている模様。

```
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       35  3092 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
3        0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
4        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
5       66 13068 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 20 packets, 2680 bytes)
num   pkts bytes target     prot opt in     out     source               destination
```

普通にWebサーバとかを立てて外部からのアクセスをコントロールしたい場合は、INPUT Chainだけ気にしていればいい。

###ルールの追加（80番ポート許可）

では、httpdをインストールして、外部からのアクセスを許可してみたい。

####httpdのインストール（と起動、永続化）

以下の操作をルートで行う。

```bash
yum install httpd
service httpd start
chkconfig httpd on
```

http//hostname or ip/

でApacheの画面が見えないことを確認する。

####iptablesの設定

いつもは/etc/sysconfig/iptablesを直接編集してましたが、ここではコマンドを使ってみます。

```bash
iptables -I INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
```
意味は、

* -Iは最上位に追加、-Aだと末尾に追加となる。
* 標準で、INPUT chainの末尾には全拒否が付与されているので、その上に追加しないと適用されない。
* -m stateは--state NEWを使用するためにstateモジュールを読み込んでいる。
* --state NEWは、新規接続の判断。

>iptableでは上の記述ほど優先度が高い。上からマッチしたものが適用される。

###内容の保存と再起動

```bash
service iptables save
service iptables restart
```

Apacheの画面が見えるか確認します。

###ルールの削除

番号で行うのが一番早い。（削除前に--line-numberで番号を確認する）。
そして、iptables -D <chain> <num>で指定する。

```bash
iptables -D INPUT 1
```

####MySQLの許可
レプリケーション時等にMySQLのポートも開けておく必要がある。その場合は、

```bash
iptables -I INPUT -m state --state NEW -p tcp --dport 3306 -j ACCEPT
```
とする。
レプリケーションの場合-sで、接続元（スレーブ）のみを許可した方がいいでしょう。

```bash
iptables -I INPUT -s 192.168.0.100 -m state --state NEW -p tcp --dport 3306 -j ACCEPT
```

####全ルールのリセット

```bash
iptables -F
```

で全ルールをリセットできるようです。

##サーバ類のインストール

###Apache

####インストール

既に説明しましたが、

```bash
yum install httpd
service start http
chkconfig httpd on
```
とするだけです。

####設定

/etc/httpd/conf/http.confはいじればきりがないですが、

* IndexesのOFF
* .htaccessの許可

くらいはやっておいたほうが後のトラブルが少ないでしょう。
設定反映にはhttpdを再起動して下さい。

###PHP

####インストール

標準のPHP5.3.3でよければ、

```bash
yum install php php-devel php-mysql php-mbstring php-gd
```

という感じでいいと思います。あとはお好みで。

####設定

/etc/php.iniの設定としては、

* date.timezone=Asia/Tokyo
* display_errors=On

とておいた方が何かといいでしょう。設定変更後は、httpdの再起動をお忘れなく。

###MySQL

CentOS6.x系ではMySQL5.1.x系です（CentOS7からはMariaDB5.5.x系のようです）。

####インストール

```bash
yum install mysql-server
service start mysqld
chkconfig mysqld on
```
となります。ユーティリティーやらクライアントやらもありますが、とりあえずはサーバーのみ。

####設定

通常私がしたいDBの基本設定は、

* 文字コードをUTF-8に。
* 標準DBはInnoDBに。
* DB毎にファイルを作成。

あたりで、かつPHPアプリ等からの文字化けを防ぐために、

* skip-character-set-client-handshakeの追加
* [client]にdefault-character-set=utf8の追加

を行います。

```diff
[mysqld]

+character-set-server=utf8
+default-storage-engine=InnoDB
+innodb_file_per_table
+skip-character-set-client-handshake

+[client]
+default-character-set=utf8
```
5.5.3から、[mysqld]でdefault-character-set=utf8は使えなくなったようです。
逆に、5.1.x系でもcharacter-set-server=utf8は使えるようです。

必要に応じて

```bash
[mysqld]
server-id=101
log-bin=mysql-bin
set-variable=expire_logs_days=3

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8
```
なども設定します。