さくらのVPSのOSをいったんリセットした。新しく Ubuntu 16.04 をインストールしたのでそのメモ。

Ubuntu 16.04 のインストール

  1. コントロールパネルの “各種設定” -> “OSインストール” -> “標準OSインストール” を選択
  2. インストールOSは “Ubuntu 16.04 amd64” を選択し、管理ユーザのパスワードを設定
  3. “設定内容を確認する” -> “インストールを実行する” をクリック
  4. ステータスが “稼働中” になるまで待機

作業ユーザーを作成

デフォルトの管理ユーザーは ubuntu となるので、自分が使いやすいユーザーを登録する。

  1. adduser myuser とし、パスワードを設定
  2. sudo が使用できるように sudo gpasswd -a myuser sudo を実行
  3. ログアウトし、作成したユーザーでログインする

初回アップデート

% sudo apt update
% sudo apt upgrade

SSH

公開鍵をコピー

$ scp .ssh/id_rsa.pub user@host:~/

.ssh の設定

$ ssh user@host
% mkdir .ssh
% cat id_rsa.pub >> .ssh/authorized_keys
% chmod 600 .ssh/authorized_keys
% chmod 700 .ssh
% exit

秘密鍵でログインできるか確認

$ ssh host

rootログインとパスワードでの認証を禁止する

% sudo vi /etc/ssh/sshd_config

root ログイン禁止

-PermitRootLogin prohibit-password
+PermitRootLogin no

パスワード認証禁止

-PasswordAuthentication yes
+PasswordAuthentication no

ssh の再起動

% sudo service ssh restart

確認

$ ssh root@host
permission denied (publickey). # ログイン不可

使用するポートを変更する

sshd_config を変更する

% sudo vi /etc/ssh/sshd_config
-Port 22
+Port 12345

services の設定も変更する

% sudo vi /etc/services
-ssh             22/tcp                               # SSH Remote Login Protocol
-ssh             22/udp
+ssh             12345/tcp                               # SSH Remote Login Protocol
+ssh             12345/udp

iptables の設定

ポートの設定は変更したが、デフォルトでは iptables により 22 番ポートでの接続しか許可されていないので上書きする。

# iptables-persistent をインストール
# このとき現在の設定から rules.v4, rules.v6 が作成される
% sudo apt install iptables-persistent

# 設定スクリプトを作成
% sudo vi /etc/iptables/iptables.sh

# 設定スクリプトを実行
% sudo sh /etc/iptables/iptables.sh

# 正しく設定されているかを確認
% sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  10.0.0.0/8           anywhere
DROP       all  --  172.16.0.0/12        anywhere
DROP       all  --  192.168.0.0/16       anywhere
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:12345
LOG        all  --  anywhere             anywhere             limit: avg 1/sec burst 5 LOG level warning prefix "[IPTABLES INPUT] : "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy DROP)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             limit: avg 1/sec burst 5 LOG level warning prefix "[IPTABLES FORWARD] : "
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

# rules.v4 が更新されているかを確認
% sudo cat /etc/iptables/rules.v4
# Generated by iptables-save v1.4.21 on Sun Jun 11 15:24:04 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 10.0.0.0/8 -j DROP
-A INPUT -s 172.16.0.0/12 -j DROP
-A INPUT -s 192.168.0.0/16 -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 12345 -j ACCEPT
-A INPUT -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES INPUT] : "
-A INPUT -j DROP
-A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES FORWARD] : "
-A FORWARD -j DROP
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sun Jun 11 15:24:04 2017

# 現在の設定を永続化する
# ここは ipatables-persistent ではなく netfilter-persistent となるのに注意
% sudo service netfilter-persistent start

ちなみに iptables.sh の中身

#!/bin/sh

# Initialize table
/sbin/iptables -F
# Delete declaration chain
/sbin/iptables -X

# Set default rules
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP

# Allow access from localhost
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

# Destroy access from private ip addresses
/sbin/iptables -A INPUT -s 10.0.0.0/8 -j DROP
/sbin/iptables -A INPUT -s 172.16.0.0/12 -j DROP
/sbin/iptables -A INPUT -s 192.168.0.0/16 -j DROP

# Allow ping
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Allow reply to external that is done from internal
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Destroy access from dropped ip addresses
if [ -s /etc/iptables/drop_ip ]; then
  for ip in `cat /etc/iptables/drop_ip`
  do
    /sbin/iptables -I INPUT -s $ip -j DROP
  done
fi

# Allow accesses from defined services.
# HTTP
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ssh
/sbin/iptables -A INPUT -p tcp --dport 12345 -j ACCEPT

# Destroy unmatched accesses with logging
/sbin/iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
/sbin/iptables -A INPUT -j DROP
/sbin/iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
/sbin/iptables -A FORWARD -j DROP

# Save rule
/sbin/iptables-save > /etc/iptables/rules.v4

確認

$ ssh host
#=> エラーとなる

$ ssh host -p 12345
#=> ログインできる

ホスト名を変更

以前のホスト名設定のままになっていたので、修正する

```bash % sudo vi /etc/hostname


ファイル内容を新しいホスト名に変更

```bash
% sudo vi /etc/hosts

古いホスト名を新しいホスト名に変更

新しいホスト名はピリオドを含むのでプロンプトにフルホスト名を表示するように変更

% sudo vi .bashrc
-PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+PS1='${debian_chroot:+($debian_chroot)}\u@\H:\w\$ '

とりあえず今日はここまで。