Ubuntuサーバーのインストールでまずしておきたいこと

#Ubuntuのサーバーでまずしておきたいこと
Ubuntu Serverを初めてインストールしました。
そこで、まずした事をメモしておきます。
主にセキュリティ関連が多いです。
設定ファイルはほぼdiff形式で記しています。

##ソフトウェア類のアップデート
```lang:
sudo apt-get update
sudo apt-get upgrade
```
apt-get updateでリストを入手します。
そして、upgradeで実際のアップデートです。
いきなりアップデートのyumと比較して、こちらの方が現時点のバージョン関係を
各ソフトウェア間で保持できるのがいいかなと思いました。

##SSH関係
秘密鍵形式にします。下記参考。
http://qiita.com/kite_999/items/aa03870eb071683a8feb

設定を変更します。
ポート、猶予時間やパスワード形式でのログインなどを禁止しています。

```lang:/etc/ssh/sshd_config
5c5
< Port 22
---
> Port 18021
27,28c27,29
< LoginGraceTime 120
< PermitRootLogin prohibit-password
---
> LoginGraceTime 60
> #PermitRootLogin prohibit-password
> PermitRootLogin no
52c53
< #PasswordAuthentication yes
---
> PasswordAuthentication no
88a90,92
>
> MaxAuthTries 3
> UseDNS no
```

##.bashrcの変更
crontab -rの予防の為、必ず確認を入れ、
historyの行数を増やしたり時間を表示できるようにします。

既にいるユーザに対しては

```lang:各ユーザのホームディレクトリ/.bashrc
19,20c19,21
< HISTSIZE=1000
< HISTFILESIZE=2000
---
> HISTSIZE=1000000
> HISTFILESIZE=2000000
> HISTTIMEFORMAT='%Y/%m/%d %H:%M:%S '
93a95
> alias crontab='crontab -i'
```

今後追加するユーザのために
/etc/skel/.bashrc
上記ファイルも同時に修正しておきます。

##rootになれるユーザを制限
wheelグループに入っているユーザ以外のsuを禁止します。

```lang:/etc/pam.d/su
15c15
< # auth       required   pam_wheel.so
---
> auth       required   pam_wheel.so
```

```lang:wheelグループの追加とメンバーの追加
sudo addgroup --gid 11 wheel
sudo usermod -aG wheel hogeuser
```

##logの期間を調整する
syslogはデフォルトのままでは4週間しか残らないので3年間は残すようにする。
月ごとのローテートで36カ月
ログの量によっては週ごとにしてローテート数を増やしてもよい。

```lang:/etc/logrotate.conf
3c3,4
< weekly
---
> #weekly
> monthly
10c11,12
< rotate 4
---
> #rotate 4
> rotate 36
```

##dhcpではなく固定IPにする
固定IPにします。最下部2行のfirewall関連の所はあとで記載します。
サーバーは192.168.20.31
192.168.20.10がゲートウェイ、DNSを兼ねています。

```lang:/etc/network/interfaces
12c12,20
< iface enp0s31f6 inet dhcp
---
> #iface enp0s31f6 inet dhcp
> iface enp0s31f6 inet static
> address 192.168.20.31
> netmask 255.255.255.0
> network 192.168.20.0
> broadcast 192.168.20.255
> gateway 192.168.20.10
> pre-up iptables-restore < /etc/iptables.rules
> pre-up ip6tables-restore < /etc/ip6tables.rules
```

```lang:/etc/resolvconf/resolv.conf.d/base
nameserver 192.168.20.10
```

```lang:下記コマンドでDNS設定反映
sudo resolvconf -u
```

##ipv6を無効にする
今の所ipv6を使用する予定はないので無効にしておきます。

```lang:/etc/sysctl.conf
> net.ipv6.conf.all.disable_ipv6=1
> net.ipv6.conf.default.disable_ipv6=1
```

##/etc/sysctl.confの編集
・SYN FOOD攻撃対策
・Smurf攻撃対策
・ICMP Redirectパケットを拒否
・ソースルーティングオプションが付加されたパケットを許可しない

```lang:/etc/sysctl.conf
25c25
< #net.ipv4.tcp_syncookies=1
---
> net.ipv4.tcp_syncookies=1
44c44
< #net.ipv4.conf.all.accept_redirects = 0
---
> net.ipv4.conf.all.accept_redirects = 0
55c55
< #net.ipv4.conf.all.accept_source_route = 0
---
> net.ipv4.conf.all.accept_source_route = 0
60a61,64
> net.ipv6.conf.all.disable_ipv6=1
> net.ipv6.conf.default.disable_ipv6=1
>
> net.ipv4.icmp_echo_ignore_broadcasts=1
```

##firewall
iptablesを使用しますが、毎回同じように設定できるよう設定ファイルを吐き出す
スクリプトを用意しておきます。このスクリプトを流すと定義ファイルを作成し、iptablesを起動してくれます。
また、OS起動時は定義ファイルからiptablesを自動起動します。
https://centossrv.com/iptables.shtmlを参考にしました。

```lang:
#!/bin/bash

#---------------------------------------#
# 設定開始                              #
#---------------------------------------#

# 内部ネットワークアドレス定義
LOCALNET=192.168.20.0/24

#---------------------------------------#
# 設定終了                              #
#---------------------------------------#

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
IPTABLES_CONFIG=`mktemp`
echo "*filter" >> $IPTABLES_CONFIG
echo ":INPUT DROP [0:0]" >> $IPTABLES_CONFIG       # 受信はすべて破棄
echo ":FORWARD DROP [0:0]" >> $IPTABLES_CONFIG     # 通過はすべて破棄
echo ":OUTPUT ACCEPT [0:0]" >> $IPTABLES_CONFIG    # 送信はすべて許可
echo ":LOG_PINGDEATH - [0:0]" >> $IPTABLES_CONFIG  # Ping of Death攻撃はログを記録して破棄

# 自ホストからのアクセスをすべて許可
echo "-A INPUT -i lo -j ACCEPT" >> $IPTABLES_CONFIG

# 内部からのアクセスをすべて許可
echo "-A INPUT -s $LOCALNET -j ACCEPT" >> $IPTABLES_CONFIG

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
echo "-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT" >> $IPTABLES_CONFIG

# フラグメント化されたパケットはログを記録して破棄
echo "-A INPUT -f -j LOG --log-prefix \"[IPTABLES FRAGMENT] : \"" >> $IPTABLES_CONFIG
echo "-A INPUT -f -j DROP" >> $IPTABLES_CONFIG

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
echo "-A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
echo "-A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
echo "-A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
echo "-A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
echo "-A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT" >> $IPTABLES_CONFIG
echo "-A LOG_PINGDEATH -j LOG --log-prefix \"[IPTABLES PINGDEATH] : \"" >> $IPTABLES_CONFIG
echo "-A LOG_PINGDEATH -j DROP" >> $IPTABLES_CONFIG
echo "-A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH" >> $IPTABLES_CONFIG

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
echo "-A INPUT -d 255.255.255.255 -j DROP" >> $IPTABLES_CONFIG
echo "-A INPUT -d 224.0.0.1 -j DROP" >> $IPTABLES_CONFIG

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
echo "-A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset" >> $IPTABLES_CONFIG

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから)               #
#----------------------------------------------------------#

# 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可
# ※SSHサーバーを公開する場合のみ
echo "-A INPUT -p tcp --dport 22 -j ACCEPT" >> $IPTABLES_CONFIG

# 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可
# ※外部向けDNSサーバーを運用する場合のみ
#echo "-A INPUT -p tcp --dport 53 -j ACCEPT" >> $IPTABLES_CONFIG
#echo "-A INPUT -p udp --dport 53 -j ACCEPT" >> $IPTABLES_CONFIG

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで)               #
#----------------------------------------------------------#

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        echo "-I INPUT -s $ip -j DROP" >> $IPTABLES_CONFIG
    done
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
echo "-A INPUT -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES INPUT] : \"" >> $IPTABLES_CONFIG
echo "-A INPUT -j DROP" >> $IPTABLES_CONFIG
echo "-A FORWARD -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES FORWARD] : \"" >> $IPTABLES_CONFIG
echo "-A FORWARD -j DROP" >> $IPTABLES_CONFIG

# ファイアウォール設定反映
echo "COMMIT" >> $IPTABLES_CONFIG
cat $IPTABLES_CONFIG > /etc/iptables.rules

/sbin/iptables-restore < /etc/iptables.rules

rm -f $IPTABLES_CONFIG
```
`sudo chmod 700 /opt/sh/iptables.sh`

###ipv6は全止めしておきます。
```lang:
sudo ip6tables -P INPUT  DROP
sudo ip6tables -P OUTPUT  DROP
sudo ip6tables -P FORWARD  DROP
sudo ip6tables-save | sudo tee /etc/ip6tables.rules
```

起動時は下記設定で自動起動されます。

```lang:/etc/network/interfaces
pre-up iptables-restore < /etc/iptables.rules
pre-up ip6tables-restore < /etc/ip6tables.rules
```

以上