Ubuntu Server 16.04構築時のオススメ環境設定

# はじめに

自分用にメモしていましたが、改めて「構築時のオススメ環境設定をまとめておこう」という記事です。
オススメと言いつつ、最低限必要な設定のような気もします。。

# 前提条件

本記事は下記環境を前提とします。
（前提以外の環境でも出来る内容だとは思いますが。。）

- Ubuntu Server 16.04
- DMZなど外部に晒される環境のサーバである
- ソフトウェアの選択で最小限構成である「Standard System Utilities」のみを選択している
- 日本語インストーラでインストールしてしまった

最後のはデフォルト設定でインストールしていれば防げたような気もしますが、
インストールし直しが面倒だったので、対策を打ちました。

# オススメ設定一覧

オススメ設定リストを示します。
自宅サーバをセキュアに運用したいのであれば、必要な設定だと思います。

- tty日本語文字化け対応(*1)
- ssh有効化
- sshポート番号変更
- ssh鍵認証設定
- ファイアウォール(ufw)の設定
- ウィルススキャンソフトのインストール(*2)

<!--
リカバリモード文字化け対応(*1)
-->

*(*1)は前提条件にも記載した通り、日本語インストーラでインストールしてしまったからかもしれません。
後で言語パックを設定した方は不要かもしれませんので、参考まで。*
*(*2)はお好みで。デスクトップPCであれば必要かもしれませんが、サーバではそれほど重要ではないかもしれません。*

# 設定手順

## 準備

`sudo apt-get update`にて、aptを最新状態にしておきます。

・・・それだけです。

## tty日本語文字化け対応(*1)

サーバ側コンソールで、日本語メッセージが文字化けします。
具体的には下記のような表示が・・・
`◆　◆　◆　◆　◆　◆　◆　・・・・`

そこで`.bashrc`に次のcase文を記述します

```bash
case $TERM in
    linux) LANG=c;;
    *) LANG=ja_JP.UTF-8;;
esac
```

こうすると、サーバ側コンソールでログインした時は`LANG=C`となり英語表示になるため、文字化けしなくなります。
リモート接続側は日本語表示のままですので、ご安心を。

<!--
## リカバリモード文字化け対応(*1)

NotImplementedException
-->

## ssh有効化＆sshポート番号変更

サーバなので、通常はリモートから接続して作業するでしょう。
なので、ssh接続ができるようにしておきます。

```bash
$ sudo apt-get install openssh-server
$ sudo service ssh status
```

ただ、このままだとデフォルトポート：22を使用することになります。
これでは攻撃を受け放題なので、ポート番号を変更しておきましょう。

```bash
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
$ sudo vi /etc/ssh/sshd_config
```

ポート番号は未使用のポートに変更します。（任意のポート番号）
PermitRootLoginはrootユーザでのログインを許可するかどうか。です。
こちらも許可しない＝noにしておきましょう。

- Port 22 -> Port xxxxx
- PermitRootLogin yes -> PermitRootLogin no

設定が完了したら、サービスを再起動して反映して完了です。

```bash
$ sudo service ssh restart
```

## ssh鍵認証設定

sshはパスワード認証ではなく、鍵認証にしてさらにセキュアにしておくと良いと思います。
まずは鍵ファイルの生成からです。
ここでは鍵ファイルは`/home/user_name/.ssh`に配置するものとします。
パスフレーズは設定しておくと尚セキュアですが、ここでは簡略化します。

```bash:サーバ側
$ ssh-keygen -t rsa
※パスフレーズは空のままEnter
$　mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$　chmod 600 ~/.ssh/authorized_keys
```
次はサーバに接続するクライアント側の設定です。
クライアント側にサーバの秘密鍵を転送しておきます。
sshのポート番号は先ほど変更しているので、「-P」オプションで指定して実行してください。

```bash:クライアント側
$ scp -P xxxxx user_name@xxx.xxx.xxx.xxx:/home/user_name/.ssh/id_rsa ~/.ssh/id_rsa.hostname
```

これで、クライアント側からパスワード入力なしにssh接続できれば完了です。
接続確認後はパスワードでのログインを制限しておきましょう。

```bash:サーバ側
$ sudo vi /etc/ssh/sshd_config

PasswordAuthentication yes -> PasswordAuthentication no

$ sudo service ssh restart
```

## ファイアウォール(ufw)の設定

サーバへのアクセス制御はもちろんファイアウォールです。
ubuntuではufwという簡単に設定できるコマンドがありますので、これを利用します。
インストールされていない場合は`sudo apt-get install -y ufw`でインストールしましょう。

基本はポート番号の制御です。
ここでは、念のため２２番ポートにアクセスが出来ないようにし、sshで使用するポート番号へのアクセスを許可します。
これは内部ネットワークからのアクセスに制限しておきましょう。
大抵はWebサーバとして構築していると思いますので、80番、443番ポートはあけておきましょう。

```bash:/bin/bash
$ sudo service ufw status
● ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
   Active: active (exited) since yyyyMMdd HHmmss; Xmin ago
$ sudo ufw status verbose
状態: 非アクティブ
※ufw自体は動作している（active）が、無効化（disable）された状態であることを確認する。
$ sudo ufw deny 22
$ sudo ufw limit from 192.168.xxx.xxx/24 to any port xxxxx
$ sudo ufw allow 80
$ sudo ufw allow 443

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
※これでファイアウォールが有効化されました。

$ sudo ufw status verbose
状態: アクティブ
ロギング: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
新しいプロファイル: skip

To                         Action      From
--                         ------      ----
22                         DENY IN     Anywhere                  
xxxxx                      LIMIT IN    192.168.xxx.xxx/24                  
80                         ALLOW IN    Anywhere                  
443                        ALLOW IN    Anywhere

※このような表示になればOKです。
```

実際に稼働されているかは`/var/log/ufw.log`にて確認できるので、確認してみてください。

## ウィルススキャンソフトのインストール(*2)

自分はSophosのAntivirus for Linuxを選択しましたが、無償版のメジャーどころだとClamAVでしょうか。
Sophosにしたい！という方は、下記記事をどうぞ。
[Ubuntu Server 16.04にSophos Antivirus for Linuxをインストールする](http://qiita.com/ayuri/items/342a0ddbd861ab1f5134)

# 終わりに

サーバを公開してから/var/log/syslogを覗くと、早速たくさんの方の訪問（攻撃目的）を確認できると思います。
なるべくセキュアに運用するのが得策だと思いますので、参考にしてみてください。

尚、手順は自環境のみの確認ですので、記載内容に誤りがあればコメントください。
よろしくお願いいたします。