1ヵ月くらい前から書こう書こうと思ったまま放置してたので書きます。主にもう一回作業するときの自分向けメモ。SSHと、そのついでに関連するファイアウォールの設定について。

前提


クラウドやリモート(AWS等)にsshで接続して作業する前提で記載。従って、ミスって接続できなくならないような手順で書いてるつもりです(が、絶対そうならないとは言いきれないです…)

なお、Ubuntu 16.04 です。

追記 2016/10/19

以下、ごたごたとファイアウォールのポートの設定をやってますが、そういえばFirewalledでサービス指定(今回の場合はSSH)できたので、ufwでもできるんじゃないかと思ったら、やっぱりできた。

1
sudo ufw allow ssh

参考はこちら

簡単に使えるファイアウォール UFWの紹介

ファイアウォール


まず、対象のサーバーにsshで接続し、おもむろにファイアウォールの設定をします。

以下、ファイアウォールが稼働していない状態で作業しているものとします。ファイアウォールがすでに稼働している場合は、SSHで接続できてる時点でちゃんとSSHのポートが開いているハズなのでこの項目はどうでもいいはず。

Ubuntuではufwというファイアウォールを使用します。ちなみに、これはiptablesを使用しやすくするためのラッパー的なものらしいです。なので、実際は裏ではiptablesが動いてるそうです。たぶん最初から入ってますが、入ってなければ次のコマンドでインストールします。

1
sudo apt-get install ufw

IPV6をOff

1
2
sudo vi /etc/default/ufw
IPV6=no

デフォルト拒否にする

デフォルトを拒否にすることで、明示的に許可していないポート以外は拒否されます。

1
sudo ufw default deny

SSHのデフォルトポートを許可する

22番ポート(SSH)のデフォルトポートを許可します。

1
sudo ufw allow 22

ファイアウォールを有効にする

ファイアウォールを有効にします。

1
2
3
4
5
6
7
8
9
10
11
# 有効にする
sudo ufw enable

# 確認
sudo ufw status

Status: active

To Action From
-- ------ ----
22 ALLOW Anywhere

接続確認

ここで、22ポートでSSH接続できるか確認します。
この時、まあ、あり得ないんですが接続できなくなったら困るので、別のターミナルを立ち上げてそちらで接続するようにします。 別のターミナル上げてようが、接続切れると思います。というかそういう警告がでる。

1
ssh -i 秘密鍵 ユーザー@ホスト -p 22

SSHの設定


ここで、ファイアウォールは置いておいてSSHの設定に移ります。

設定ファイル変更

SSHの設定は/etc/ssh/sshd_configを変更して行います。

1
sudo vi /etc/ssh/sshd_config

下記の個所を変更します。ポートはデフォルトの22から変更することで攻撃の可能性を大きく下げることができるそうです。サンプルは22222に変更します。あくまでサンプルなので適当に変えてください。

下記のように記載することで複数のポートでssh接続できるようになります。追加の22222ポートで接続できることを確認した後に、デフォルトの22を削除するという手順をとります。(いきなり22消して接続できなくなったら困るので。)

1
2
Port 22
Port 22222

残りの項目は下記のように設定します。なければ追記します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ssh2だけ許可
Protpcol 2

# 接続できるユーザーを限定
AllowUsers $username

# ログイン猶予時間(デフォルト120は長い気がするので)
LoginGraceTime 30

# rootがsshでログインできるかどうか
PermitRootLogin no

# 空のパスワードを許可しない
PermitEmptyPasswords no

# パスワードによるアクセスを許可するか
PasswordAuthentication no

その他の項目は下記のサイトとかを参考に設定するとよいと思います。

SSH サーバの設定

設定反映

変更した設定を反映します。

1
sudo service sshd restart

追加したSSH用のポートをファイアウォールで許可する

sshd_configに追加したポート22222をファイアウォールで許可します。

1
sudo ufw allow 22222

有効にして確認します。

1
2
3
4
5
6
7
8
9
10
11
12
# 有効にする
sudo ufw enable

# 確認
sudo ufw status

Status: active

To Action From
-- ------ ----
22 ALLOW Anywhere
22222 ALLOW Anywhere

接続確認

sshd_configに追加した22222で接続できることを確認します。

1
ssh -i 秘密鍵 ユーザー@ホスト -p 22222

また、rootで接続できないことを確認します。

1
ssh -i 秘密鍵 root@ホスト -p 22222

デフォルトポートを無効にする


最後にデフォルトの22ポートを無効にします。

SSHを無効にする

/etc/ssh/sshd_configPort 22を削除します。

接続不可確認

22ポートで接続できないことを確認します。

1
2
3
ssh -i 秘密鍵 ユーザー@ホスト -p 22

ssh: connect to host ***.***.***.*** port 22: Connection refused

ファイアウォールの22ポートを削除する

この時点で22ポートでSSH接続できないですが、最後にファイアウォールの22を削除します。

1
sudo ufw delete allow 22

許可ポート確認

許可ポートを確認します。

1
2
3
4
5
6
7
sudo ufw status

Status: active

To Action From
-- ------ ----
22222 LIMIT Anywhere

仕上げ


下記のような設定もやっておくといいと思います。30秒間に6回以上の接続を試みたIPを拒否する設定です。(復帰は…何分間か放置したら再度接続可能になると思うんですが…調べた限り見当たらなかった…)

1
sudo ufw limit 22222

その他


AWSとか使ってるとき

インバウンドルールも変更することを忘れない。

ログの場所

UbuntuだとSSHの認証ログは下記に出力されます。ディストリビューションによって違うのでCentOSとかだと違ったと思います。

1
/var/log/auth.log

参考


ufwについての参考

Uncomplicated Firewall