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

目次

  1. 前提
    1. 追記 2016/10/19
  • ファイアウォール
    1. IPV6をOff
    2. デフォルト拒否にする
    3. SSHのデフォルトポートを許可する
    4. ファイアウォールを有効にする
    5. 接続確認
  • SSHの設定
    1. 設定ファイル変更
    2. 設定反映
    3. 追加したSSH用のポートをファイアウォールで許可する
    4. 接続確認
  • デフォルトポートを無効にする
    1. SSHを無効にする
    2. 接続不可確認
    3. ファイアウォールの22ポートを削除する
    4. 許可ポート確認
  • 仕上げ
  • その他
    1. AWSとか使ってるとき
    2. ログの場所
  • 参考
  • 前提


    クラウドやリモート(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