/dev/shmの要塞化:サーバーのRAMに潜むマルウェアを阻止する

Security tutorial - IT technology blog
Security tutorial - IT technology blog

攻撃者が共有メモリを好む理由

数年前、私のサーバーの1台が、一晩で5万回以上のSSHブルートフォース攻撃にさらされました。その経験から私は重要な教訓を学びました。攻撃者は単に侵入経路を求めているだけでなく、潜伏場所を求めているのです。足がかりを得ると、彼らはツールを隠すための静かな隅を探します。Linuxシステムで最も見落とされがちな隠れ場所の1つが、/dev/shmです。

デフォルトでは、/dev/shm(共有メモリ)は、完全にRAM上に存在する一時的なファイルストレージシステム(tmpfs)です。プロセス間の高速な通信のために構築されています。しかし、通常は誰でも書き込み可能(world-writable)であり、デフォルトで実行が許可されています。これが大きなセキュリティギャップを生みます。攻撃者は悪意のあるバイナリをダウンロードし、メモリから直接実行して、即座にファイルを削除することができます。これにより、従来のフォレンジックツールが物理ディスク上で追跡できる痕跡はゼロになります。

今でも、このディレクトリを無防備なままにしているシステム管理者を多く見かけます。今すぐマウントオプションを強化して、メモリから不正なコードが実行されないように修正しましょう。

5分でできる要塞化ガイド

パーティションをすぐに保護する必要がある場合は、次の3つのステップに従ってください。この方法は、Ubuntu、Debian、RHEL、およびほとんどの最新のディストリビューションで標準的です。

ステップ1:現在のマウント状態を確認する

次のコマンドを使用して、システムが現在共有メモリをどのように処理しているかを確認します。

mount | grep /dev/shm

ほとんどのデフォルト設定では (rw,nosuid,nodev) が返されます。もし noexec フラグがない場合、あなたのシステムは脆弱です。そのフォルダに置かれたスクリプトやバイナリを何でも実行してしまいます。

ステップ2:永続化のために /etc/fstab を更新する

再起動後もセキュリティ設定を有効にするには、ファイルシステムテーブルを編集する必要があります。お好みのエディタでファイルを開いてください:

sudo nano /etc/fstab

/dev/shm の行を探します。もしなければ、ファイルの最後に次の行を追加します:

tmpfs   /dev/shm   tmpfs   defaults,noexec,nosuid,nodev   0   0

ステップ3:変更を即座に適用する

サーバーを再起動する必要はありません。パーティションを再マウントするだけで新しいルールが適用されます:

sudo mount -o remount /dev/shm

もう一度 mount | grep /dev/shm を実行してください。オプションリストに noexec が表示されているはずです。今後、ここからファイルを実行しようとすると、「Permission denied(許可がありません)」エラーが発生します。

セキュリティフラグの背後にある論理

大規模なクラスターを初めて管理したとき、私はなぜこれらのフラグが重要なのかを正確に知りたいと思いました。各フラグは、異なるエクスプロイト手法に対する特定の障壁として機能します。

「noexec」フラグ

これが主要な防御策です。/dev/shm 内のいかなるファイルもプログラムとして実行されるのを防ぎます。たとえハッカーがスクリプトに chmod 777 を設定したとしても、カーネルは実行を拒否します。これにより、一時的な実行スペースに依存する自動エクスプロイトキットの約90%を効果的に無効化できます。

「nosuid」フラグ

SUID(Set User ID)ビットは、プログラムをファイル所有者(通常はroot)の権限で実行することを可能にします。攻撃者はこれらのビットを利用して、標準ユーザーから特権ユーザーへと権限を昇格させようとします。nosuid を設定すると、カーネルはこのパーティション上のこれらのビットを完全に無視するようになります。

「nodev」フラグ

これは、特殊なキャラクターデバイスやブロックデバイスの作成を防ぎます。/dev/shm はメモリ共有専用であるため、ハードウェアデバイスノードが含まれる正当な理由はありません。これをブロックすることで、攻撃者が偽造されたデバイスファイルを介してカーネルやハードウェアと対話しようとするのを防ぎます。

セキュリティ設定によってアプリが動作しなくなる場合

/dev/shm をロックダウンすると、稀に特定のソフトウェアで問題が発生することがあります。私は、古い Oracle データベースや、ヘッドレス Docker コンテナで実行されている Chromium ベースのブラウザ(デフォルトで共有メモリがわずか64MBに制限されていることが多い)でこれに遭遇したことがあります。

/dev/shm のサイズ変更

権限ではなく、容量不足でアプリケーションがクラッシュする場合は、/etc/fstab でサイズを増やすことができます。2GBに増やすには、次の構文を使用します:

tmpfs   /dev/shm   tmpfs   defaults,noexec,nosuid,nodev,size=2G   0   0

ブロックされた実行を監査する方法

もし noexec がサービスを停止させている疑いがある場合は、システムログを確認してください。ほとんどの最新のディストリビューションは、これらのイベントを記録します。また、strace を使用して、共有メモリパスをターゲットにした execve システムコールの失敗を探すこともできます。

# カーネルレベルの実行ブロックを確認する
sudo journalctl -k | grep -i "resizing"

プロアクティブなメンテナンスのヒント

マウントの強化は素晴らしいスタートですが、セキュリティは継続的なプロセスです。私が環境を長期にわたってクリーンに保つ方法は次のとおりです。

ファイルの蓄積を監視する

/dev/shm がいっぱいになり始めたときにアラートを出す簡単な cron ジョブを設定します。通常、ここには PulseAudio や PostgreSQL などのサービスからの小さなファイルのみが含まれるはずです。名前が奇妙で大きなバイナリが見つかった場合は、すぐに調査してください。

# 不審な隠しファイルを素早くチェックする
ls -lhA /dev/shm

Ansible で自動化する

すべてのサーバーを手動で設定しないでください。Ansible タスクを使用して、新しいノードがプロビジョニングされた瞬間に保護されるようにします。半年後にこれらの手順を思い出そうとするよりも、はるかに安全です。

- name: /dev/shmマウントを保護する
  mount:
    path: /dev/shm
    fstype: tmpfs
    src: tmpfs
    opts: "defaults,noexec,nosuid,nodev"
    state: mounted

制限事項を理解する

noexec は強力ですが、完璧な盾ではありません。決意の固い攻撃者は、python3 /dev/shm/malware.py のように、スクリプトを直接インタープリタに渡すことで実行できてしまいます。そのため、/tmp/var/tmp にも同様の強化原則を適用する必要があります。真のセキュリティは多層防御に依存します。/dev/shm を強化することで、攻撃者の最も簡単な経路を排除し、システムを侵害するためにより多くの労力を強いることができます。

Share: