こんにちは!インフラやセキュリティの世界へようこそ。
初めてサーバーに触れるとき、「何から手をつけていいかわからない」「セキュリティ対策って言われても、専門用語ばかりで難しそう……」と不安になりますよね。
でも、大丈夫です!一歩ずつ、身近な例えから一緒に学んでいきましょう。
今回は、Linuxサーバーの安全性をグッと高めるための基本テクニック、「 /tmp および /var/tmp の noexec マウント」について、わかりやすくお話ししていきますね。
—
1. 家の防犯に例えて考えてみよう
突然ですが、みなさんのご自宅の玄関を思い浮かべてみてください。
普段は鍵をしっかり閉めて、泥棒が入らないように備えていますよね。
では、もし家の外に「誰でも自由に使える大きな物置」があったとしたらどうでしょう?
「荷物を一時的に置いておく場所だから、鍵はかけなくていいか」と、誰でも自由に出し入れできる状態にしていたとします。
もし、その物置の中に、悪い人がこっそり忍び込んで「開かずの金庫を開けるための工具」を隠し持ってきたら……? そして、その工具を使って、いつの間にか家の中に侵入してしまったら……大変ですよね!
Linuxサーバーにおける /tmp や /var/tmp というディレクトリ(フォルダ)は、まさにこの「誰でも自由に使える物置」のような場所なのです。
—
2. 攻撃者は /tmp のどこを狙うのか?
Linuxサーバーを運営していると、さまざまなプログラムが「ちょっとしたメモ用紙」や「一時的な荷物」を置く場所として、この /tmp や /var/tmp を利用します。システム全体で共有する便利な作業スペースなんですね。
だからこそ、OSのルールとして「誰でも書き込める(ファイルを置ける)」という優しい設定になっています。
ここに、攻撃者の狙いがあります。
1. Webサイトのセキュリティの隙をついて、サーバーの中に侵入する。
2. 侵入した攻撃者は、自分がやりたい放題するための「悪いプログラム(ペイロード)」をサーバーの外からダウンロードしてくる。
3. そのプログラムを、誰でも書き込める /tmp ディレクトリにこっそり保存する。
4. 保存したプログラムをその場で実行し、サーバーを乗っ取る!
これが、サーバーがハッキングされるときの定番のシナリオの一つです。
つまり、攻撃者にとって /tmp は、「こっそり持ち込んだ道具を置いて、さらに動かすための秘密基地」になってしまうわけですね。
—
3. 解決策:「noexec」という名の厳重なルール
ここで登場するのが、今回の主役である noexec(ノーエグゼック) というマウントオプションです。
先ほどの「誰でも使える物置」の例えに戻りましょう。
「物置に荷物を置くのは自由にしていいけれど、『この物置の中で、電動ノコギリやピッキングツールなどの危険な道具を使う(実行する)ことは絶対に禁止!』というルールを作ったらどうでしょう?」
例え物置の中にこっそり危険な工具を持ち込まれたとしても、その場所で「使うこと」さえできなければ、被害を防ぐことができますよね。
noexec とは、まさにこれと同じ仕組みです。
「 /tmp や /var/tmp の中にあるファイルは、中身がどんなプログラムであっても、この場所から直接実行することを禁止する!」という強いブレーキをかける設定になります。
これをしておくだけで、攻撃者が侵入してファイルを置いたとしても、「実行して動かす」という一番危ないステップで必ず失敗させることができるのです。
—
4. 実設定:実際にサーバーで設定してみよう
それでは、実際にLinuxサーバー(CentOSやUbuntuなど)で、この noexec の設定をどのように行うのかを見ていきましょう。
サーバーのディスクの設定は、 /etc/fstab という大切なファイルで管理されています。
※設定を間違えると最悪の場合サーバーが起動しなくなるため、必ずバックアップを取り、慎重に作業してくださいね。
ステップ1:現在の設定を確認する
まずは、今どうなっているかを見てみましょう。端末(ターミナル)で以下のコマンドを入力します。
# 現在マウントされているファイルシステムの一覧から tmp を探す
mount | grep -E '/tmp|/var/tmp'
ステップ2:/etc/fstab を編集して noexec を追加する
設定ファイルを開いて、マウントオプションに noexec(および安全のための nosuid や nodev)を追加します。
# 設定ファイルをテキストエディタで開く(例として vi を使用)
sudo vi /etc/fstab
ファイルの中身は、環境によって異なりますが、以下のような行を探して(あるいは新しく追記して)編集します。
# 変更前(例)
# /dev/sdb1 /tmp ext4 defaults 0 2
# 変更後:defaults の後ろに noexec,nosuid,nodev を追加する
/dev/sdb1 /tmp ext4 defaults,noexec,nosuid,nodev 0 2
> 💡 ここがポイント!
> オプションの解説:
> – noexec: ファイルの実行を禁止する(今回のテーマ!)
> – nosuid: 特権昇格攻撃を防ぐためのオプション
> – nodev: デバイスファイルを解釈させないためのオプション
> この3つは、セキュリティの現場では「セットで固めておこうね」と言われる鉄板の組み合わせです。
ステップ3:設定を反映させる
ファイルを保存したら、設定をシステムに反映させます。
パーティション構成によっては、サーバーを再起動するか、一度アンマウントして再マウントする必要があります。
# 再マウントして設定を即座に適用する(※環境によって異なります)
sudo mount -o remount /tmp
これで設定は完了です!
—
5. 設定後の確認と、開発時の注意点
設定がうまくいったかどうかは、実際に簡単なテストをしてみると確実です。
例えば、 /tmp の中に適当なシェルスクリプトやプログラムを置いて実行しようとしてみてください。
noexec が効いている環境であれば、以下のようなエラーメッセージが返ってきて、実行がブロックされます。
# noexec が有効な環境でスクリプトを実行しようとした場合のイメージ
$ ./test_script.sh
bash: ./test_script: 許可されていない操作です (Permission denied)
「おっ、ちゃんとブロックできたぞ!」と確認できたら大成功です。
⚠️ 開発者の方へのちょっとした注意点
「お、じゃあサーバーの安全のために全部のディレクトリを noexec にしちゃえば最強じゃん!」と思われるかもしれませんが、少しだけ注意が必要です。
アプリケーションの中には、動作の途中で /tmp の中に一時的なプログラムを書き込んで、それを「あえて実行する」ような正当な仕組みを持っているソフトウェアも稀に存在します。
もしサーバーを要塞化した後に「なんだか動かなくなったアプリがあるぞ?」という場合は、この noexec が原因でプログラムの実行が弾かれている可能性があります。その場合は、アプリの動作仕様を確認しつつ、適切な一時ディレクトリの割り当てを再検討していきましょう。
—
まとめ
今回は、サーバーOSの要塞化の第一歩として、/tmp および /var/tmp の noexec マウントについて解説しました。
/tmpは誰でも書き込める便利な物置だが、攻撃者に悪用されやすい。noexecオプションをつければ、「物置の中でのプログラムの実行」をピタリと止められる。/etc/fstabを正しく設定して、安全なサーバー環境を作ろう!
セキュリティ対策と聞くと身構えてしまいますが、一つひとつの設定は「家の防犯の仕組み」と同じように、とても理にかなったシンプルなものです。
焦らず、一歩ずつ、安全で強いサーバー環境を一緒に作っていきましょう!それではまた次回の記事でお会いしましょう。
コメント