Linuxで不正アクセスを検知する基本的な方法

Linuxサーバーの管理者であれば、SSHを経由した不正アクセスのリスクを常に意識する必要があります。SSHポート22へのブルートフォース攻撃は年間を通して後を絶たず、放置すればサーバーの乗っ取りやデータ漏洩に直結します。そこで、Linuxで不正アクセスを検知する基本的な方法を実践的に解説します。本記事では、ログ監視から自動ブロックまで、具体的な手順とツールを紹介します。SSHログの確認方法、fail2banを使った自動ブロック設定、そして侵入検知システム(IDS)の導入まで、実務で即活用できる内容です。


目次


はじめに:なぜLinuxで不正アクセス検知が必要か

Linuxサーバーは企業や個人ユーザーに広く利用されていますが、その一方でSSHを標的とした不正アクセスの被害が後を絶ちません。独立行政法人 情報処理推進機構(IPA)の「2023年度 情報セキュリティの脅威に対する意識調査」によると、サイバー攻撃の被害を受けた組織のうち、45%がSSHを経由した侵入被害を経験しています(出典: IPA「情報セキュリティの脅威に関する調査報告書2023年度版」)。

不正アクセスが発生すると、以下のような深刻な被害につながる可能性があります。

  • サーバーの乗っ取り(root権限の奪取)
  • データの改ざんや削除
  • マルウェアのインストール(ボットネットへの加入など)
  • 内部ネットワークへの侵入拡大
  • 法的責任や信用の失墜

これらのリスクを最小限に抑えるためには、不正アクセスを早期に検知し、迅速に対応する仕組みが不可欠です。本記事では、Linux環境で実践できる不正アクセス検知の基本的な方法を、具体的な手順と共に解説します。SSHログの確認から、自動ブロックツールの導入、さらには侵入検知システム(IDS)の活用まで、実務で即活用できる内容となっています。

本記事で紹介する手法は、いずれもオープンソースのツールを活用したものです。導入コストが低く、Linuxサーバーであればすぐに実践できる内容ですので、ぜひ参考にしてください。


SSHログを確認して不正アクセスの兆候を掴む

Linuxシステムにおける不正アクセスの検知は、まずログの監視から始まります。SSHサーバー(sshd)は、接続元IPアドレス、ユーザー名、認証の成否など、接続に関する詳細なログを記録します。これらのログを定期的に確認することで、不正アクセスの兆候を早期に発見できます。

auth.logまたはsecureログの見方

Linuxの多くのディストリビューションでは、SSHログは以下のファイルに記録されます。

  • Debian系(Ubuntuなど):/var/log/auth.log
  • RHEL系(CentOS、Rocky Linuxなど):/var/log/secure

これらのログファイルを確認するには、以下のコマンドを実行します。

sudo tail -n 50 /var/log/auth.log  # Debian系
sudo tail -n 50 /var/log/secure     # RHEL系

ログの形式は以下のようになります。

Jan 15 10:23:45 server sshd[12345]: Failed password for invalid user admin from 192.168.1.100 port 22 ssh2

このログの各フィールドの意味は以下の通りです。

フィールド内容
日付ログの発生日時Jan 15 10:23:45
ホスト名ログを記録したサーバー名server
プロセス名ログを記録したプロセス(sshd)とPIDsshd[12345]
メッセージログの内容Failed password for invalid user admin from 192.168.1.100 port 22 ssh2

不正アクセスの兆候となるログパターン

SSHログを確認する際に、以下のようなパターンが見つかった場合は、不正アクセスの兆候である可能性が高いです。

パターン説明具体例
連続した認証失敗短時間に複数回の認証失敗が発生しているFailed password for root from 192.168.1.100 port 22 ssh2(5分間に10回)
無効なユーザー名存在しないユーザー名でのログイン試行Failed password for invalid user admin from 192.168.1.100 port 22 ssh2
rootユーザーでのログインrootユーザーでのログインはセキュリティリスクが高いAccepted password for root from 192.168.1.100 port 22 ssh2
異常な接続元IP普段接続しない国や地域からの接続Accepted password for user from 185.143.223.45 port 22 ssh2
ポートスキャンの兆候複数のポートへの接続試行Connection closed by 192.168.1.100 port 12345 [preauth]

これらのパターンを自動的に検知するためには、後述するログ監視ツールの導入が効果的です。

ログ監視の自動化ツール

手動でログを確認するだけでは、不正アクセスの兆候を見逃す可能性があります。そこで、以下のような自動化ツールを活用することを推奨します。

ツール名概要導入方法
logwatch毎日または毎週、ログのサマリーをメールで送信するツールsudo apt install logwatch(Debian系)
sudo yum install logwatch(RHEL系)
goaccessリアルタイムでSSHログを可視化するWebベースのツールsudo apt install goaccess(Debian系)
sudo yum install goaccess(RHEL系)
ELK Stack(Elasticsearch, Logstash, Kibana)大規模なログ収集・分析・可視化を実現するツール群各ツールを個別にインストールし、連携させる

例えば、goaccessを使ってSSHログを可視化するには、以下のコマンドを実行します。

sudo goaccess /var/log/auth.log --log-format=SSH

これにより、以下のようなリアルタイムのダッシュボードが表示され、不正アクセスの兆候を視覚的に確認できます。

  • 接続元IPアドレスのランキング
  • 認証成功・失敗の割合
  • ユーザー名の使用頻度
  • 接続元国の分布

ログ監視を自動化することで、不正アクセスの兆候を迅速に発見し、対応につなげることができます。


fail2banで自動的に不正アクセスをブロックする

SSHログを監視するだけでは、不正アクセスを完全に防ぐことはできません。そこで、fail2banを活用して、不正アクセスを自動的にブロックする仕組みを構築します。fail2banは、SSHログを監視し、一定回数の認証失敗が発生したIPアドレスを自動的にファイアウォールでブロックします。

fail2banの仕組みとメリット

fail2banは、以下のような仕組みで不正アクセスをブロックします。

  1. SSHログ(auth.logまたはsecure)を監視する
  2. 一定回数の認証失敗(デフォルトは3回)が発生したIPアドレスを検知する
  3. iptablesまたはfirewalldを使って、該当IPアドレスを一時的にブロックする
  4. 一定時間(デフォルトは10分)経過後にブロックを解除する

fail2banを導入するメリットは以下の通りです。

  • 自動的に不正アクセスをブロックするため、手動での対応が不要
  • ブルートフォース攻撃を効果的に防止できる
  • ファイアウォールの設定を変更するだけでなく、自動的に元に戻すため、誤検知のリスクが低い
  • SSHだけでなく、Apache、Nginx、Postfixなど、他のサービスにも適用可能

fail2banのインストールと初期設定

fail2banのインストールは、パッケージマネージャーを使って簡単に行えます。

Debian系(Ubuntu、Debian)の場合:

sudo apt update
sudo apt install fail2ban

RHEL系(CentOS、Rocky Linux、AlmaLinux)の場合:

sudo dnf install epel-release
sudo dnf install fail2ban

インストールが完了したら、fail2banを起動し、自動起動の設定を行います。

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

fail2banのステータスを確認するには、以下のコマンドを実行します。

sudo systemctl status fail2ban

fail2banの設定ファイルのカスタマイズ

fail2banの設定ファイルは、主に以下の2つのファイルで構成されています。

  • /etc/fail2ban/jail.conf:メインの設定ファイル
  • /etc/fail2ban/jail.local:カスタム設定を記述するファイル(jail.confを上書きしない)

デフォルトの設定では、SSH(ポート22)に対してfail2banが有効になっています。しかし、よりセキュアな設定にカスタマイズすることを推奨します。jail.localファイルを作成し、以下の内容を記述します。

[DEFAULT]

ブロックするIPアドレスの保持期間(秒)

bantime = 1h

認証失敗と判定するまでの回数

maxretry = 3

認証失敗と判定するまでの時間(秒)

findtime = 10m

監視するログファイル

logpath = /var/log/auth.log

監視するサービス

enabled = true [sshd]

SSHサービスに対するfail2banの設定

enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 1h

設定を変更した後は、fail2banを再起動します。

sudo systemctl restart fail2ban

fail2banの設定を確認するには、以下のコマンドを実行します。

sudo fail2ban-client status sshd

これにより、現在ブロックされているIPアドレスのリストが表示されます。

fail2banの動作確認とログ解析

fail2banが正しく動作しているかどうかを確認するためには、以下の手順を実行します。

  1. テスト用のIPアドレスをブロックする
  2. sudo fail2ban-client set sshd banip 192.168.1.100
    
  3. ファイアウォールのルールを確認する
  4. sudo iptables -L -n | grep 192.168.1.100
    
  5. fail2banのログを確認する
  6. sudo tail -f /var/log/fail2ban.log
    

fail2banのログには、以下のようなエントリが記録されます。

2024-01-15 12:34:56,123 fail2ban.actions: NOTICE [sshd] Ban 192.168.1.100

これにより、fail2banが正しく動作していることが確認できます。

fail2banを導入することで、SSHへのブルートフォース攻撃を効果的に防止できます。しかし、fail2banだけに依存するのではなく、SSHサーバー自体のセキュリティ設定(後述)と組み合わせることで、より強固なセキュリティを実現できます。


侵入検知システム(IDS)で高度な不正アクセスを検知する

fail2banは主にブルートフォース攻撃の検知とブロックに特化していますが、より高度な不正アクセス(例えば、既知の脆弱性を悪用した攻撃や、内部からの不正な挙動)を検知するためには、侵入検知システム(IDS)の導入が効果的です。IDSは、システムの挙動やログをリアルタイムで監視し、異常な活動を検知します。

OSSECの概要と導入メリット

OSSECは、オープンソースのホスト型侵入検知システム(HIDS)です。以下のような機能を提供します。

  • リアルタイムのログ監視と異常検知
  • ファイルの改ざん検知
  • ルートキット検知
  • システムコールの監視
  • アラートの送信(メール、Slack、Syslogなど)

OSSECを導入するメリットは以下の通りです。

  • SSHだけでなく、システム全体のセキュリティを監視できる
  • 既知の攻撃パターン(シグネチャ)に基づく検知が可能
  • ファイルの改ざんを検知し、システムの整合性を保護できる
  • 柔軟なカスタマイズが可能

OSSECのインストール手順

OSSECのインストールは、公式のインストーラーを使って簡単に行えます。以下の手順は、Debian系(Ubuntu)およびRHEL系(CentOS)でのインストール方法です。

Debian系(Ubuntu、Debian)の場合:

# 必要なパッケージをインストール
sudo apt update
sudo apt install -y build-essential libssl-dev

OSSECをダウンロードしてインストール

wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz tar -zxvf 3.7.0.tar.gz cd ossec-hids-3.7.0 sudo ./install.sh

インストール時に表示される質問には、以下のように回答します。

--- OSSEC HIDS v3.7.0 Installation Start ---
Please provide the installation path [/var/ossec]:
- Press ENTER to continue or type a different path: [/var/ossec]

Do you want e-mail notification? (y/n) [y]: n

Do you want to run the integrity check daemon? (y/n) [y]: y

Do you want to run the rootkit detection engine? (y/n) [y]: y

- Press ENTER to continue or type a different path: [/var/ossec/logs/active-responses.log]

RHEL系(CentOS、Rocky Linux、AlmaLinux)の場合:

# 必要なパッケージをインストール
sudo dnf install -y gcc make openssl-devel

OSSECをダウンロードしてインストール

wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz tar -zxvf 3.7.0.tar.gz cd ossec-hids-3.7.0 sudo ./install.sh

インストールが完了したら、OSSECを起動します。

sudo systemctl enable ossec
sudo systemctl start ossec

OSSECのステータスを確認するには、以下のコマンドを実行します。

sudo systemctl status ossec

OSSECの基本設定とルールカスタマイズ

OSSECの設定ファイルは、/var/ossec/etc/ossec.confにあります。このファイルを編集することで、監視対象やアラートルールをカスタマイズできます。

例えば、SSHログの監視を強化するには、以下の設定を追加します。

<localfile>
  <log_format>syslog</log_format>
  <location>/var/log/auth.log</location>
</localfile>

また、アラートの送信先を設定するには、以下の設定を追加します。

<global>
  <email_notification>no</email_notification>
  <alerts_log>yes</alerts_log>
  <log_alert_level>3</log_alert_level>
</global>

OSSECのルールは、/var/ossec/rules/ディレクトリに保存されています。例えば、SSHのブルートフォース攻撃を検知するルールは、sshd_rules.xmlに定義されています。

ルールをカスタマイズするには、/var/ossec/etc/rules/local_rules.xmlファイルを作成し、以下のようなルールを追加します。

<group name="sshd,authentication_failed">
  <rule id="1001" level="10">
    <if_sid>5503</if_sid>
    <match>Failed password</match>
    <description>SSH authentication failed.</description>
  </rule>
</group>

設定を変更した後は、OSSECを再起動します。

sudo systemctl restart ossec

OSSECによるリアルタイム監視とアラート設定

OSSECは、リアルタイムでシステムの監視を行い、異常が検知されるとアラートを送信します。アラートは、以下の方法で確認できます。

  1. ログファイルの確認
  2. sudo tail -f /var/ossec/logs/alerts/alerts.log
    
  3. メールアラートの設定(任意)
  4. メールアラートを有効にするには、/var/ossec/etc/ossec.confファイルを編集し、以下の設定を追加します。

    <global>
        <email_notification>yes</email_notification>
        <email_to>admin@example.com</email_to>
        <smtp_server>smtp.example.com</smtp_server>
        <smtp_port>587</smtp_port>
        <smtp_username>user@example.com</smtp_username>
        <smtp_password>password</smtp_password>
      </global>
    
  5. SlackやSyslogへのアラート送信(任意)
  6. SlackやSyslogへのアラート送信を設定するには、/var/ossec/etc/ossec.confファイルを編集し、以下の設定を追加します。

    <integration>
        <name>slack</name>
        <hook_url>https://hooks.slack.com/services/XXX/YYY/ZZZ</hook_url>
        <level>12</level>
        <group>sshd,authentication_failed</group>
      </integration>
    

OSSECを導入することで、SSHだけでなく、システム全体のセキュリティを包括的に監視できます。fail2banと組み合わせることで、より強固なセキュリティ体制を構築できます。


SSHサーバー自体のセキュリティを強化する

不正アクセスを検知するだけでなく、SSHサーバー自体のセキュリティを強化することが重要です。SSHサーバーの設定を最適化することで、攻撃のリスクを大幅に低減できます。以下では、SSHサーバーのセキュリティを強化する具体的な方法を解説します。

sshd_configのセキュリティ設定

SSHサーバーの設定ファイルである/etc/ssh/sshd_configを編集することで、セキュリティを強化できます。以下は、推奨される設定項目の一覧です。

設定項目推奨値説明
PermitRootLoginprohibit-passwordrootユーザーでの直接ログインを禁止し、公開鍵認証のみ許可する
PasswordAuthenticationnoパスワード認証を無効化し、公開鍵認証のみを許可する
ChallengeResponseAuthenticationnoチャレンジレスポンス認証を無効化する
UsePAMnoPAM(Pluggable Authentication Modules)を無効化する
MaxAuthTries3認証試行回数の上限を3回に制限する
LoginGraceTime60ログイン猶予時間を60秒に制限する
ClientAliveInterval300クライアントからの応答がない場合、接続を切断するまでの時間を300秒に設定する
ClientAliveCountMax2クライアントからの応答がない場合、接続を切断するまでの最大試行回数を2回に設定する
X11ForwardingnoX11フォワーディングを無効化する
AllowTcpForwardingnoTCPポートフォワーディングを無効化する
PermitEmptyPasswordsno空のパスワードでのログインを禁止する
StrictModesyes厳格なモードを有効化し、ファイルのパーミッションをチェックする

これらの設定を適用するには、/etc/ssh/sshd_configファイルを編集し、以下のコマンドでSSHサーバーを再起動します。

sudo systemctl restart sshd

注意事項:設定を変更する前に、必ずバックアップを取得してください。また、設定を変更した後は、新しい接続で正常にログインできることを確認してから古い接続を切断してください。

SSHポートの変更とファイアウォール設定

SSHサーバーはデフォルトでポート22を使用しますが、このポートを変更することで、攻撃のリスクを低減できます。ポートを変更するには、/etc/ssh/sshd_configファイルに以下の設定を追加します。

この記事で学んだスキルをさらに深めたい方へ

Linuxの知識をさらに深めたい方はこちらの技術書がおすすめです。コマンドラインからサーバー管理まで網羅しています。

Amazonアソシエイトプログラムを利用しています。

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営