Linuxサーバーを立てたとき、ファイアウォールの設定やSSH鍵認証の有効化は真っ先に行うものですが、マウントオプションまで意識して設定できているエンジニアは意外と少ないものです。「デフォルトのままで困ったことがない」という感覚は理解できますが、攻撃者の視点では /tmp や /home のマウントオプションが緩い環境は格好の足場になります。
この記事では、Linuxのマウントオプション(noexec・nosuid・nodev)がセキュリティ上なぜ重要なのかを攻撃者の視点から解説し、/etc/fstab への具体的な設定手順と動作確認方法を紹介します。設定変更は数行で完結するため、情シス1人体制の環境でも今日中に着手できます。
マウントオプションとは?なぜセキュリティに関係するのか
Linuxでは、ディスクパーティションやファイルシステムを /etc/fstab に記述して起動時に自動マウントしています。このとき各ファイルシステムに「オプション」を指定することで、そのパーティション上で許可する操作を細かく制御できます。
マウントオプションの記述例を見てみましょう。
# /etc/fstab の記述例 # デバイス マウントポイント FS種別 オプション dump pass /dev/sda2 /tmp ext4 defaults,noexec,nosuid,nodev 0 2
この defaults,noexec,nosuid,nodev の部分がマウントオプションです。セキュリティ上特に重要な3つのオプションを整理しておきます。
・noexec: そのファイルシステム上のバイナリ(実行ファイル)の直接実行を禁止します。攻撃者が /tmp にシェルスクリプトを置いても起動できなくなります。
・nosuid: そのファイルシステム上のSUID/SGIDビットを無効化します。SUID(Set User ID)は「ファイルの所有者の権限で実行する」仕組みで、悪用されると一般ユーザーがroot権限を得る経路になります。
・nodev: そのファイルシステム上でキャラクタデバイス・ブロックデバイスファイルの使用を禁止します。攻撃者が /tmp 以下にデバイスファイルを作成してカーネルメモリにアクセスしようとする手法を防ぎます。
この3つを組み合わせることで、攻撃者が侵入後に「足場を作る」段階で取れる行動を大幅に制限できます。
攻撃者が狙う3つのポイント(敵を知る)
マウントオプションが緩い環境でどのような攻撃が成立するのか、防御目的で確認しておきましょう。
1. /tmpへのシェル実行(noexecなし環境)
Webアプリの脆弱性やFTPの設定ミスを悪用してファイルアップロードに成功した攻撃者は、最初に /tmp を利用しようとします。/tmp は全ユーザーが書き込めるため、攻撃者にとって非常に都合のよい場所です。
noexec が設定されていない環境では、以下のような手順で侵入が深刻化します(概念レベルの説明です)。
① Webアプリの脆弱性を経由して /tmp にリバースシェルスクリプトを書き込む
② chmod +x /tmp/shell.sh で実行権限を付与する
③ /tmp/shell.sh を実行すると、攻撃者のサーバーにシェルが接続される
noexec が設定されていれば、③の時点で「Permission denied」となり、実行が阻止されます。
2. SUIDビット悪用による権限昇格(nosuidなし環境)
SUID(Set User ID)ビットは、ファイルを実行した際に「ファイル所有者の権限で動作する」機能です。/usr/bin/passwd のように、一般ユーザーがroot管理領域のファイルを更新するために正当に使われますが、悪意あるバイナリに設定されると権限昇格の踏み台になります。
攻撃者が /tmp などの書き込み可能なディレクトリにSUIDビット付きのrootシェルバイナリを置いた場合、nosuid が設定されていない環境ではそのSUIDビットが有効化されてしまいます。結果として、一般ユーザーがrootシェルを取得できる状態になります。
nosuid を /tmp に設定しておくだけで、このクラスの攻撃を無効化できます。
3. デバイスファイルを使った特権操作(nodevなし環境)
Linuxでは /dev/mem や /dev/kmem といったデバイスファイルを通じてメモリに直接アクセスできます。攻撃者がこれらに似たデバイスファイルを書き込み可能なディレクトリに作成した場合、nodev が設定されていない環境ではカーネルメモリの読み書きや特権操作が可能になるリスクがあります。
通常の運用で /tmp にデバイスファイルが置かれることは想定されないため、nodev を設定してもシステムへの影響はほぼありません。
覚えておくべきセキュリティ関連マウントオプション一覧
noexec・nosuid・nodev 以外にも、知っておきたいオプションがいくつかあります。
| オプション | 効果 | 主な用途 |
|---|---|---|
| noexec | 実行ファイルの直接実行を禁止 | /tmp、/home、/var への適用 |
| nosuid | SUID/SGIDビットを無効化 | /tmp、/home、/var への適用 |
| nodev | デバイスファイルの使用を禁止 | /(ルート)以外の大半のパーティション |
| ro | 読み取り専用でマウント | /boot(アップデート時のみ一時的に rw へ変更) |
| defaults | rw, suid, dev, exec, auto, nouser, async の組み合わせ | デフォルト設定(セキュリティ強化には不十分) |
defaults の中には suid・dev・exec が含まれています。noexec・nosuid・nodev を明示的に追加すると、defaults の中の対応する設定を上書きできます。
/etc/fstabへの設定追加手順
実際に設定を進めましょう。作業は以下の流れで行います。
1. 現在のマウント状況を確認する
まず現在の状況を把握します。
# マウントされているファイルシステムのオプションを一覧表示する mount | grep -E "^/dev|tmpfs" # findmnt でより見やすく表示する(オプション列も確認可能) findmnt -t ext4,xfs,btrfs,tmpfs
出力のオプション列に nosuid・noexec・nodev が含まれていなければ設定が必要です。
2. /etc/fstabのバックアップを取る
/etc/fstab はシステム起動に直結する重要ファイルです。編集ミスで起動不能になるリスクを避けるため、必ずバックアップを取ってから作業してください。
# バックアップを作成する(日付付き) sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d) # バックアップの確認 ls -la /etc/fstab*
3. /etc/fstabを編集する
バックアップが取れたら、fstabを編集します。以下に設定前後の例を示します。
設定前(CentOS/RHEL系の例):
# 変更前の /etc/fstab 抜粋 UUID=aaaa-1111 /tmp ext4 defaults 0 2 UUID=bbbb-2222 /home ext4 defaults 0 2 UUID=cccc-3333 /var ext4 defaults 0 2
設定後:
# 変更後の /etc/fstab 抜粋 UUID=aaaa-1111 /tmp ext4 defaults,noexec,nosuid,nodev 0 2 UUID=bbbb-2222 /home ext4 defaults,noexec,nosuid,nodev 0 2 # /var は noexec を付けると一部パッケージスクリプトが動かなくなる場合がある UUID=cccc-3333 /var ext4 defaults,nosuid,nodev 0 2
/var に noexec を付けると、パッケージマネージャーが展開するスクリプトや一部のサービスに影響が出ることがあります。まず /tmp と /home から適用し、動作確認後に /var へ展開するのが安全な進め方です。
4. オプションを即時適用して確認する
/etc/fstab を編集したら、再起動せずに mount -o remount コマンドで即時適用できます。
# /tmp を即時再マウントして設定を反映させる sudo mount -o remount /tmp # オプションが反映されているか確認する mount | grep " /tmp " # 出力例: /dev/sda2 on /tmp type ext4 (rw,nosuid,noexec,nodev,relatime) # /home も同様に適用する sudo mount -o remount /home mount | grep " /home "
5. noexecの動作を検証する
設定が正しく機能しているか確認しましょう。
# /tmp にシェルスクリプトを作成して実行を試みる echo '#!/bin/bash' > /tmp/test_noexec.sh echo 'echo "実行されてしまいました"' >> /tmp/test_noexec.sh chmod +x /tmp/test_noexec.sh /tmp/test_noexec.sh # noexec が有効な場合の出力: # bash: /tmp/test_noexec.sh: Permission denied # テストファイルを削除する rm /tmp/test_noexec.sh
「Permission denied」と表示されれば、noexecが正しく機能しています。
ディレクトリ別の推奨マウントオプション設定
一般的なLinuxサーバーのディレクトリ構成に対して、推奨オプションをまとめます。
| ディレクトリ | 推奨オプション | 理由・注意点 |
|---|---|---|
| /tmp | noexec, nosuid, nodev | 最優先で設定。攻撃者が最も悪用しやすい書き込み可能ディレクトリ |
| /home | noexec, nosuid, nodev | 一般ユーザーの作業領域。悪意あるバイナリの置き場にされやすい |
| /var | nosuid, nodev(noexecは慎重に) | ログ・スプールを格納。パッケージスクリプトが動く場合があり noexec は慎重に判断する |
| /boot | ro または noexec, nosuid, nodev | カーネルイメージ格納。通常書き込みは不要なため読み取り専用が理想 |
| /(ルート) | 変更しない | システム全体が依存するため noexec を付けるとOSが起動しなくなる |
中小企業でも今日からできること
マウントオプションの設定変更は、オンプレミスサーバーでもVPS・クラウドインスタンスでも同様に有効です。追加費用はかかりません。
最初の一手として最もお勧めするのは、/tmp への noexec・nosuid・nodev の追加です。影響範囲が最も限定的で、かつ攻撃者が最初に悪用しようとする場所を塞ぐ効果が高いためです。
・ステップ1: mount | grep /tmp で現在のオプションを確認する
・ステップ2: sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d) でバックアップを取る
・ステップ3: /etc/fstab の /tmp 行に noexec,nosuid,nodev を追加する
・ステップ4: sudo mount -o remount /tmp で即時適用する
・ステップ5: テストスクリプトで noexec が機能していることを確認する
・ステップ6: 問題なければ /home にも同じオプションを展開する
AWS EC2・さくらVPS・ConoHa VPSなどでOSを新規インストールした場合、/tmp が独立したパーティションではなくルートパーティションの一部になっていることがあります。その場合は tmpfs を使って明示的にマウントすることで同等のセキュリティ効果を得られます。
# /tmp が独立パーティションでない場合の代替設定 # /etc/fstab に以下の行を追加する(size は環境に応じて調整) tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=512m 0 0 # 設定を即時適用する sudo mount -o remount /tmp
Linuxのファイル権限管理(chmod・chown・umask)の基礎については、姉妹サイトLinuxMaster.JPでも詳しく解説しています。マウントオプションと権限管理を組み合わせることで、Linuxサーバーの堅牢化がさらに深まります。
よくある誤解と注意点
【注意】ルートパーティション(/)にnoexecは設定しない
ルートパーティション(/)に noexec を付けると、/bin/bash・/usr/bin/python3 をはじめとするほぼすべてのシステムコマンドが実行不能になり、OSが正常に動作しなくなります。/ へのnoexec設定は絶対に避けてください。
【注意】noexecはインタープリタ経由の実行を防げない
noexec は、ファイルをパスで直接実行することを防ぎますが、別パーティションにあるインタープリタを経由した実行は防げません。
# noexec があっても以下の方法では実行されてしまう # /usr/bin/bash や /usr/bin/python3 は noexec 対象外のパーティションにある bash /tmp/evil.sh python3 /tmp/evil.py
そのため noexec はあくまで「防御の一層」として扱い、SELinuxによるアクセス制御・WAFによるアップロード制限・ファイルアップロード機能の権限設計などと組み合わせて使うことが重要です。
【注意】/var/tmpも設定対象に含める
/var/tmp は /tmp と同様に一時ファイルの置き場として使われますが、システムによっては独立したパーティションになっています。/tmp を設定した後、/var/tmp の設定も必ず確認してください。
# /var/tmp が独立パーティションかどうか確認する findmnt /var/tmp # /tmp と同じオプションを設定する場合は /etc/fstab に追記して remount する sudo mount -o remount /var/tmp
【注意】CIS Benchmarkと照合して組織基準を確認する
Center for Internet Security(CIS)が公開しているCIS Benchmarkには、/tmp・/home・/boot のマウントオプションに関する具体的なチェック項目が含まれています。組織のセキュリティ基準としてCIS Benchmarkを参照している場合は、本記事の設定値とCIS Benchmarkの推奨値を照合しながら設定することをお勧めします。
本記事のまとめ
| ディレクトリ | 設定するオプション | 優先度 |
|---|---|---|
| /tmp | noexec, nosuid, nodev | 最優先(今すぐできる) |
| /home | noexec, nosuid, nodev | 高(/tmp の次に設定) |
| /var | nosuid, nodev(noexecは慎重に) | 中(動作確認が必要) |
| /boot | ro または noexec, nosuid, nodev | 中(更新運用の設計が必要) |
マウントオプションの設定は、一度行ってしまえば継続的な運用コストが発生しない堅牢化施策です。ファイアウォール・SSH鍵認証・SELinuxと並んで、Linuxサーバーの基本的なセキュリティ設定の一つとして押さえておきましょう。
まずは /tmp から始めて、段階的に他のパーティションへ展開していくのが無理なく進められる方法です。
サーバー堅牢化の次の一手、どこから手をつけるか迷っていませんか?
マウントオプションの設定はLinuxサーバー堅牢化の入口です。SELinux・firewalld・fail2ban・sudoersの設定まで、現場で使えるセキュリティ対策を体系的に学べるコンテンツをメルマガでお届けしています。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
