sshdとは
SSHデーモン (sshd) は、Linuxシステムにおいて安全なリモートアクセスを提供するためのプログラムです。SSH (Secure Shell) プロトコルに基づいて動作し、ネットワークを介した接続でデータの交換を暗号化しています。これにより、悪意のある者がデータを傍受したり、中間者攻撃を行うことを防ぐことができます。
主な特徴
- 暗号化: すべての通信は暗号化され、盗聴や中間者攻撃から保護されます。
- 認証: パスワード認証や鍵認証を用いてユーザーを識別します。
- ファイル転送: SCPおよびSFTPを利用して、安全にファイルを転送できます。
- ポートフォワーディング: リモートサーバー上のポートをクライアント側に転送することができます。
- コマンド実行: シェルアクセスを提供することで、リモートでコマンドを実行できます。
設定ファイル
/etc/ssh/sshd_config
ファイルは、SSHデーモンの設定をカスタマイズするための主要なファイルです。このファイルには、ポート番号、認証メソッド、接続制限などが含まれており、システム管理者が適切なセキュリティ設定を行う際に重要です。
セキュリティ対策
- ポート変更: デフォルト(通常はポート22)以外のポートを使用して、ランダムなスキャンや自動攻撃からの被害を低減できます。
- 鍵認証: パスワード認証よりも安全な鍵認証を利用し、パスワード推測攻撃を防ぐことができます。
- rootログイン禁止: 直接的なrootアクセスを拒否し、特権昇格を制御された形で行います。
- 接続制限: 特定のIPアドレスやユーザー名だけを許可する等、アクセス制限を適用します。
- 監査: SSHサーバーへのすべての操作をロギングし、不正アクセスに見られるパターンを迅速に検出できるようにします。
これらの要素と機能を使用して、SSHデーモンはLinuxシステムにおける堅牢なリモートアクセスソリューションを提供します。
fail2ban とは
Fail2Ban は、Linux システム上で不正アクセスを検出し防ぐためのオープンソースツールです。ログファイルを監視し、特定のパターン(エラーや失敗したログイン試行など)に基づいて、攻撃者の IP アドレスを一定期間ブロックします。
主な特徴
- ログ監視: Fail2Ban は、SSH, FTP, SMTP, Apache など各種サービスのログファイルを監視します。
- フィルタリング: 正規表現を使用して、悪意のあるアクティビティを検出するためのパターンを設定します。
- 自動ブロック: 特定の回数以上ログインに失敗したり、悪意のある行為が検出された場合、そのIPアドレスを自動的にファイアウォールでブロックします。
- 一時的なブロック: ブロックは一定時間(例: 10分、1時間、24時間)だけ適用され、その後自動的に解除されます。
- 通知機能: 管理者に対して、問題のある行為やブロックされたIPアドレスの情報をメールで送信します。
設定ファイル
Fail2Ban の設定は主に以下の 3 つのタイプのファイルで構成されています。
fail2ban.conf
: Fail2Ban 自体の基本的な設定が含まれています(ログレベルやログファイルの場所など)。jail.conf
: 監視するサービス、フィルタリング条件、ブロック期間や通知設定などが記述されています。filter.d/*.conf
: 各種サービスのログファイル内で検出すべきパターンに関する正規表現が定義されています。
セキュリティ対策
- 複数サービスを保護: SSH, FTP, SMTP, Apache など、さまざまなサービスに対して同時に保護を適用できます。
- カスタムフィルター: 特定のアプリケーションや独自のサービスに対応するために、独自の正規表現やブロックルールを追加できます。
- ホワイトリスト: 特定の IP アドレスを信頼済みとして指定し、ブロック対象から除外できます。
- 攻撃対策: 失敗した認証試行や悪意のあるリクエストなど、さまざまな攻撃を自動的に防ぐことができます。
Fail2Ban を適切に設定し運用することで、Linux システムに対する不正アクセスを効果的に防ぐことが可能です。
sshd の設定
SSHポートの変更
セキュリティー向上のため、sshの接続ポートをデフォルト(通常はポート22)から20022に変更します。これを実施するだけで、sshdを狙ったランダムな攻撃をかなり抑えることができます。
※ポート番号は推測されにく任意の番号で
/etc/ssh/sshd_config 設定ファイルを編集します。
sudo vi /etc/ssh/sshd_config
設定ファイル内で、以下の行を見つけて、ポート番号を20022に変更します。
#Port 22
Port 20022
鍵ペアの生成
SSH は鍵ペア(公開鍵と秘密鍵)を利用した認証方式をサポートしており、これはパスワード認証に比べてセキュリティが高い方法です。
ssh-keygen
コマンドを使用して、SSH 用の鍵ペア(公開鍵と秘密鍵)を生成できます。以下のコマンドを実行し、必要に応じて適切なオプションやファイル名を指定します。
ssh-keygen -t rsa -b 4096
このコマンドは、-t
オプションで暗号化アルゴリズム(この例では RSA)を指定し、-b
オプションで鍵長(この例では 4096 ビット)を指定しています。
生成される鍵ペアは、通常、次のディレクトリに配置されます。
- 秘密鍵:
~/.ssh/id_rsa
- 公開鍵:
~/.ssh/id_rsa.pub
生成された公開鍵をサーバーにコピーします。your_username
とyour_domain
は適切なものに置き換えてください。
scp ~/.ssh/id_rsa.pub your_username@your_domain:/tmp
サーバー上で、 公開鍵を ~/.ssh/authorized_keys
ファイルに追加します。
鍵認証の設定
sshd_config
ファイルを編集して鍵認証のみに変更します。
sudo vi /etc/ssh/sshd_config
必要に応じて、パスワード認証を無効化し、キーペア認証のみに制限することができます。SSH 接続が正常に機能することを確認した後、/etc/ssh/sshd_config
で次の設定を変更します。
以下の行のコメントを外し、必要な場合は値を yes
または no
に変更します。
PubkeyAuthentication yes
PasswordAuthentication no
これらの手順を実行して鍵ペアを使った認証を設定することで、より安全なリモート接続が可能になります。
SSHデーモンの再起動
変更内容を反映するために、SSHデーモンを再起動します。
sudo systemctl restart sshd
firewalldの設定
最後に、firewalldで新しいポートを開放します。まず、firewalldが有効かどうかを確認します。
sudo systemctl status firewalld
無効の場合は、有効化します。
sudo systemctl enable --now firewalld
新しいSSHポートを開放します。
sudo firewall-cmd --add-port=20022/tcp --permanent
sudo firewall-cmd --reload
これで、SSH設定が完了し、標準ポートが20022に変更され、鍵認証でログインができるようになりました。
fail2ban の導入
必要なパッケージのインストール
まず、EPELリポジトリとfail2banパッケージをインストールします。
sudo yum install epel-release -y
sudo yum install fail2ban -y
fail2banの設定
Fail2Banの設定ファイルは、主に以下の2つに分かれています。jail.conf
または jail.local
filter.d/*.conf
jail.conf(または、カスタム設定のために使用されるjail.local
)は、監視対象となるサービスやアプリケーションと、それらに関連するアクションを定義します。以下は一般的なパラメータです
ignoreip
: Fail2BanがブロックすべきではないIPアドレスを指定します。bantime
: IPアドレスがブロックされる時間(秒単位)を指定します。findtime
: この期間内に指定した回数以上の失敗があった場合にIPアドレスをブロックします(秒単位で指定)。maxretry
:findtime
で指定した期間内に許容される最大失敗回数を指定します。backend
: 使用するログ監視バックエンドを指定します(例:auto
,polling
,systemd
など)。usedns
: DNS解決を使ってホスト名からIPアドレスを検出するかどうかを設定します。enabled
: 対象となるサービスやアプリケーションのjailを有効化するかどうかを設定します(true
またはfalse
)。filter
: 対象となるサービスやアプリケーションに関連するフィルター設定ファイルを指定します。logpath
: 監視対象のログファイルへのパスを指定します。action
: イベント発生時に実行されるアクションを指定します。アクションは、action.d
ディレクトリ内の設定ファイルで定義されています。
filter.d/*.conf
は、それぞれの監視対象サービスやアプリケーションに合わせた検出用の正規表現が定義されているファイルです。これらの正規表現を使って、ログファイルから不正なアクセスや攻撃を検出します。
以上のパラメータを適切に設定することで、Fail2Banはシステムやアプリケーションのログファイルを監視し、不正アクセスや攻撃を検出してブロックすることができます。
ローカル設定ファイルの作成
新しいローカル設定ファイル jail.local
を作成します。
sudo vi /etc/fail2ban/jail.local
ssh用の fail2ban設定内容の追加
/etc/fail2ban/jail.local
ファイルを編集して、新しい [sshd]
セクションを追加します。
この例では、ポート20022が使用されていることを前提としています。 (ご自身で設定したポート番号に置き換えてください)
sudo vi /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.1.0/24
#bantime = 3600
#findtime = 300
#maxretry = 3
#backend = systemd
#banaction = firewallcmd-ipset
[sshd]
enabled = true
bantime = 86400
findtime = 600
maxretry = 5
主な設定内容
ignoreip
: ブロックされないIPアドレス範囲bantime
: ブロックする期間(秒)findtime
: maxretry回の試行が許容される時間範囲(秒)maxretry
: 何回のログイン失敗でブロックするかbackend
: ログ収集方法をsystemdに設定banaction
: ブロックアクションをfirewalldとipsetに設定[sshd]
セクションで、SSH用のjailが有効化されており、ポート番号を20022に変更しています。
sasl用の fail2ban設定内容の追加
/etc/fail2ban/jail.local
ファイルを編集して、新しい [postfix-sasl]
セクションを追加します。
sudo vi /etc/fail2ban/jail.local
[postfix-sasl]
enabled = true
filter = postfix_sasl
#filter = postfix[mode=auth]
port = smtp,465,submission,imap,imaps,pop3,pop3s
logpath = %(postfix_log)s
backend = %(postfix_backend)s
action = iptables-allports[name=postfix, port="pop3,pop3s,imap,imaps,submission,465"]
maxretry = 3
findtime = 86400
bantime = 3600
postfix_sasl
用のフィルターファイルを作成します。
sudo vi /etc/fail2ban/filter.d/postfix_sasl.conf
[INCLUDES]
before = common.conf
[Definition]
_daemon = postfix/(submission/)?smtp(d|s)
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
ignoreregex =
[Init]
journalmatch = _SYSTEMD_UNIT=postfix.service
これにより、ポート 587 (submission) と 465 (smtps) での認証失敗が検出されます。
fail2banの起動と自動起動の設定
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo systemctl status fail2ban
fail2ban の動作確認
以下のコマンドでfail2banが正しく機能しているか確認できます。
sshd
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 1
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 6
|- Total banned: 6
`- Banned IP list: ***.65.249.79 ***.234.66.133 ***.92.0.17 ***.92.0.23 ***.92.0.31 ***.177.172.185
以上で、fail2banを導入し、SSHへのアクセスをブロックする設定が完了しました。ポート番号は適切な値に変更して適用してください。
sasl
sudo fail2ban-client status postfix-sasl
Status for the jail: postfix-sasl
|- Filter
| |- Currently failed: 39
| |- Total failed: 3102
| `- Journal matches: _SYSTEMD_UNIT=postfix.service
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
[root@sv1 ~]# fail2ban-client status postfix-sasl
Status for the jail: postfix-sasl
|- Filter
| |- Currently failed: 34
| |- Total failed: 4490
| `- Journal matches: _SYSTEMD_UNIT=postfix.service
`- Actions
|- Currently banned: 48
|- Total banned: 48
`- Banned IP list: ***.148.40.120 ***.94.95.242 ***.208.139.64 ...以下略
ジェイル postfix-sasl
の現在の状況が表示されます。この情報には、アクティブな状態、監視中のポート、キック数、およびBAN回数が含まれます。
以上で、PostfixのSASLをFail2Banに設定し、適用されているかどうかを確認できます。
誤って登録されたIPアドレスをFail2Banから解除する
誤って登録されたIPアドレスをFail2Banから解除するには、以下のコマンドを使用します。<JAIL>
は対象のjail名(例:postfix-sasl
)で、<IP_ADDRESS>
は解除したいIPアドレスです。
sudo fail2ban-client set <JAIL> unbanip <IP_ADDRESS>
例えば、postfix-sasl
ジェイルから 192.168.1.100
というIPアドレスを解除したい場合、次のコマンドを実行します。
sudo fail2ban-client set postfix-sasl unbanip 192.168.1.100
このコマンドを実行すると、指定されたIPアドレスがjailから解除されます。