August 11, 2020

CentOS8のSSH Bastion設定

CentOS8をSSH Bastionとして使う際の設定。
これで充分と思わず、よりセキュアな設定を探し続けること。


dnf-automatic

パッケージを自動更新させる。
CentOS7のyum-cronに相当。
CentOS8でyumからdnfに変わったので、yum-cronもdnf-automaticに変わった。

インストール

sudo dnf install dnf-automatic -y

設定ファイル修正

sudo vi /etc/dnf/automatic.conf

変更箇所

# ダウンロードだけでなく更新も実行する
apply_updates = yes

自動起動有効化と起動

sudo systemctl enable dnf-automatic.timer
sudo systemctl start dnf-automatic.timer

自動再起動

dnf-automaticで再起動が必要なパッケージの更新をした場合、月曜の朝5時に再起動する。
再起動まで3分間待ってやる。

crontab修正

sudo crontab -e

追加内容

0 5 * * 1 /usr/bin/dnf needs-restarting -r > /dev/null || /usr/sbin/shutdown -r 3

sshd

設定ファイル修正

sudo vi /etc/ssh/sshd_config

変更箇所

# Rootログイン禁止
PermitRootLogin no
# パスワード認証禁止
PasswordAuthentication no
# 認証完了を待つ時間を減らす
LoginGraceTime 10
# SSHプロトコルのバージョン1をやめ、バージョン2のみにする
Protocol 2
# 特定グループに所属するユーザーにのみログインを許可する
AllowGroups hogehoge

設定反映

sudo systemctl restart sshd

fail2ban

AWS セキュリティグループやオンプレのファイアウォール等、別の方法で接続元のホワイトリストを制限するなら不要
接続元の制限はかけないけど、ログイン失敗したらそのIPアドレスを拒否したい場合に有効
AWSのAMIではfirewalldが入っていないはずなので別途インストールが必要?

インストール

sudo dnf install epel-release -y
sudo dnf install fail2ban -y

設定

/etc/fail2ban/jail.conf は直接編集せず、jail.localを作成してオーバーライドする。

sudo vi /etc/fail2ban/jail.local
[DEFAULT]
maxretry = 3
bantime  = 1h
findtime  = 1h
banaction = firewallcmd-multiport
banaction_allports = firewallcmd-allports

[sshd]
# sshdでfail2banを有効にする
enabled = true

[recidive]
# 再犯者のより長いBANを有効にする
enabled = true

firewalldのアクションを拒否から破棄に変える

sudo vi /etc/fail2ban/action.d/firewallcmd-common.local

dropでオーバーライドする

[Init]

blocktype = DROP
rich-blocktype = drop

起動

自動起動有効化と起動

sudo systemctl enable firewalld
sudo systemctl enable fail2ban
sudo systemctl start firewalld
sudo systemctl start fail2ban

確認

sudo firewall-cmd --list-all
sudo fail2ban-client status
sudo fail2ban-client status sshd

BANの手動解除は以下

sudo fail2ban-client set sshd unbanip <IP>

© 2020 nissy-lab.com