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>