VPSでCentOS7の初期設定と、Docker&Docker Composeのインストールまで

VPSにインストールされたCentOS7の初期設定と、DockerとDocker Composeが動くところまでを自分用メモとして残しておきます。
ConoHa VPSを契約して操作していますが、さくらなど他のVPSでもだいたい一緒だと思います。


## VPS契約してCentOS7をインストールする
ConoHaコントロールパネルを操作。CentOSの最新版をインストールしました。
2017年3月時点で、バージョンは`7.3.1611`。


## SSHでログインする
サーバーの設定をやっていきます。最初に設定したrootパスワードを入力してログイン。

```
$ ssh root@[VPSのIPアドレス]
```


## 作業用のユーザーを追加
rootで何でもかんでもやるのはまずいので、作業用のユーザーを作成します。
僕の名前にちなんで`ryo`というユーザーを作成することにしよう。

```
// ユーザー作成
$ adduser ryo
```
```
// パスワードの設定
$ passwd ryo
```


## rootになれるユーザーを限定する
`su`でrootになって作業することができますが、どのユーザーもrootになれたら困るので、`wheel`というグループに入っているユーザーしかrootになれないように設定します。

```
// ryoをwheelに追加
$ usermod -G wheel ryo
```
```
// 設定ファイルを開く
$ vim /etc/pam.d/su

// 下記のコメントアウトを解除する
#auth       required     pam_wheel.so use_uid
↓
auth       required     pam_wheel.so use_uid
```

ところで、いきなりvimがインストールされてたんですけど、CentOS7だから？ConoHaだから？分かりません。


## 一旦ログアウト
```
$ exit
```

ここからはローカルで作業します。


## 公開鍵と秘密鍵の作成と、VPSへ公開鍵の転送
サーバーをいじるたびに`ssh ryo@[VPSのIPアドレス]`と打って、パスワードを入力するのは面倒だし、セキュリティ的にもよくありませんので、公開鍵と秘密鍵を作り、公開鍵認証でログインできるようにします。ついでにパスワードの入力ではログインできないようにしたりします。

```
// 公開鍵と秘密鍵の作成
$ ssh-keygen -t rsa
```
僕は`conohavps_rsa`という名前にしました。`.ssh`に`conohavps_rsa`と`conohavps_rsa.pub`というファイルが生成されればオッケー。

```
// VPSに公開鍵を転送する
$ scp ~/.ssh/conohavps_rsa.pub ryo@[VPSのIPアドレス]:~
```
VPSの`/home/ryo`(ryoのホームディレクトリのトップ)に`conohavps_rsa.pub`が転送されました。


## VPSに再度ログインする
またVPSにSSHログインして、VPS上で作業します。
```
$ ssh ryo@[VPSのIPアドレス]
```


## 公開鍵の設置
現在自分がいる場所は`~/`、つまり`/home/ryo`です。
ここに`.ssh`ディレクトリを作り、公開鍵を設置します。ついでにパーミッションも変更します。

```
// .sshディレクトリの作成
$ mkdir .ssh
```
```
// .sshディレクトリのパーミッションを変更
$ chmod 700 .ssh
```
```
// conohavps_rsa.pubを.sshに移動
$ mv conohavps_rsa.pub .ssh
```
```
// conohavps_rsa.pubのパーミッションも変更
$ chmod 600 .ssh/conohavps_rsa.pub
```

ちなみにパーミッションの700と600は、

* 700: 自分だけが読み書きと実行ができる
* 600: 自分だけが読み書きできる

です。


## SSHの設定を変更
`sshd_config`という設定ファイルを変更します。

設定ファイルをいじる時はroot権限じゃないと基本的にダメなんですが、rootで作業すると、ryoに戻ることを忘れて危険なので、`sudo`を先頭につけてコマンドを実行していきます。

```
// SSHの設定ファイルを開く
$ sudo vim /etc/ssh/sshd_config
```
```
// 以下を探して変更して、保存

// rootでSSHログインできないようにする
PermitRootLogin no

// 鍵認証を有効化
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/conohavps_rsa.pub

// パスワード認証を無効化する
PasswordAuthentication no
```
```
// sshdを再起動
$ sudo systemctl restart sshd
```

CentOS6の時は`service sshd restart`でいけたんですが、CentOS7になったら書き方が変わってました。


## またログアウト
```
$ exit
```


## ローカルのSSHの設定を変更する
またローカルで作業です。`ssh conohavps`と打つだけで、パスワード不要でVPSにログインできるようにします。

```
// 設定ファイルを開く
$ vim ~/.ssh/config
```
```
// 以下を入力して、保存

Host conohavps
  HostName [VPSのIPアドレス]
  User ryo
  Port 22
  IdentityFile ~/.ssh/conohavps_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```


## 早速SSHでログインしてみる
```
$ ssh conohavps
```

これでログインできればオッケーです。

### 秘密鍵なくしたらアカンで！！！！
ローカルに保存してある秘密鍵をなくすとVPSにログインできなくなり、VPSの再構築(初期化)をするはめになり、上記の設定が完全におしゃかになってしまうので、頑張って管理しましょう！
セキュリティ的にどうかはわからないけど、僕はDropboxにコピーしておきました。


## iptablesのインストールと、firewalldの無効化
ファイアウォールであるiptablesの設定をしていきます。
CentOS7からfirewalldというものに変わったらしいですが、よく分からないので、CentOS6に引き続きiptablesを使っていきます。

```
// firewalldを停止
$ sudo systemctl stop firewalld
```
```
// firewalldの自動起動をオフ
$ sudo systemctl disable firewalld
```
```
// iptablesのインストール
$ sudo yum -y install iptables-services
```
```
// iptablesの起動
$ sudo systemctl start iptables
```
```
// iptablesの自動起動をオン
$ sudo systemctl enable iptables
```


## iptablesの設定
ConoHa VPSだけど、さくらVPSの設定を参考にしてやっていきます。
[iptablesの設定方法 – さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206208121)

```
// データを持たないパケットの接続を破棄
$ sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

// SYNflood攻撃と思われる接続を破棄
$ sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

// ステルススキャンと思われる接続を破棄
$ iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

// ポートを開ける
// 今回は、ssh/http/httpsのポートを開けます
$ sudo iptables -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
$ sudo iptables -A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
$ sudo iptables -A IN_public_allow -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

// 確立済みの通信を許可
$ sudo iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

// 許可した通信以外のサーバに受信するパケットを拒否し、サーバから送信するパケットを許可
$ sudo iptables -P INPUT DROP
$ sudo iptables -P OUTPUT ACCEPT
```

上記が完了したら、設定を保存します。

```
// iptablesの設定を保存する
$ sudo service iptables save
```
```
// iptablesを再起動
$ sudo systemctl restart iptables
```


## CentOSのシステムを最新にアップデート
CentOSを最新の状態にしておきます。

```
// 最新にする
$ sudo yum -y update
```


## Dockerのインストール
DockerとDocker Composeをインストールしていきます。Dockerは自動起動の設定もしておきます。
Dockerは`docker-engine`や`docker-io`などがありますが、公式ドキュメントにある通りに`docker-ce`(Docker Community Edition)をインストールしてみようと思います。

[Get Docker for CentOS \- Docker Documentation](https://docs.docker.com/engine/installation/linux/centos/#install-docker)

```
// yum-utilsをインストール
$ sudo yum install -y yum-utils
```
```
// リポジトリの追加
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
```
```
// yumパッケージのアップデート
$ sudo yum makecache fast
```
```
// Docker CEのインストール
$ sudo yum install docker-ce
```
```
// Docker起動
$ sudo service docker start
```
```
// 自動起動の設定
$ sudo systemctl enable docker
```


## Docker Composeのインストール
Docker Composeは、下記を参考にしながらインストールしていきます。
[Get Docker for CentOS \- Docker Documentation](https://docs.docker.com/engine/installation/linux/centos/)

```
// Docker Composeのインストール
$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
```
// パーミッションの変更
$ chmod +x /usr/local/bin/docker-compose
```

その時のDockerのバージョンによって`curl`のURLが変わってくるので、リンク先を参照するようにしましょう。


## sudoなしでDockerを使う
Dockerをインストールしただけだと、`sudo`をつけないとコマンドが実行できません。
以下の公式ドキュメントを参考にしながらやっていきます。

[Post\-installation steps for Linux \- Docker Documentation](https://docs.docker.com/engine/installation/linux/linux-postinstall/)

```
// sudoつけないとこんな感じで実行できない
$ docker ps
↓
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

現在のグループ一覧から`docker`という名前のものを抜き出してみます。

```
$ cat /etc/group | grep docker
↓
docker:x:991:
```

この`docker`というグループにユーザーを追加すれば、`sudo`なしでDockerを使うことができるようになります。

```
// ryoというユーザーをdockerグループに追加
$ $ sudo usermod -aG docker ryo
```
```
// docker再起動
$ sudo systemctl restart docker
```

もう一回`docker ps`を実行してみて、以下のように出力されればオッケーです。

```
// もう一回やってみる
$ docker ps
↓
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                      NAMES
```


## 以上
以上、CentOS7の初期設定と、DockerとDocker Composeのインストールでした。あとは別途ドメインの設定など。
CentOS6とCentOS7では、`service/chkconfig`が`systemctl`になっていたりと若干の違いがあるので、ググる時によく分からなくなったりして少し大変でした。

上記の作業は、こうしてまとめてしまうとそこまで大変でもないですが、できればここも自動化して設定をgit管理したいなぁと思うし、次はAnsible辺りを試してみたいと思います。


## 参考
* [さくらのVPS借りた \- /](http://memo.brdr.jp/post/97200662606/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps%E5%80%9F%E3%82%8A%E3%81%9F)
* [さくらVPSでiptablesとかSFTPの設定とかした \- /](http://memo.brdr.jp/post/98778368946/%E3%81%95%E3%81%8F%E3%82%89vps%E3%81%A7iptables%E3%81%A8%E3%81%8Bsftp%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%81%8B%E3%81%97%E3%81%9F)
* [ConoHa と CentOS7 でサーバー構築 \- Qiita](http://qiita.com/nanocloudx/items/e393dead67b8a48ba6a6)
* [CentOS7でのiptablesの設定忘れるのでメモ \- Qiita](http://qiita.com/miosee/items/0599baa3a01301265a43#iptables%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%A8%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A)
* [CentOS7でsudoなしでdockerを利用するちょっとした工夫 \- Qiita](http://qiita.com/tubone/items/9c1b3d807197b7162fd9)