サーバーを運用していると、数万ものファイルの中から特定の条件を満たすファイルを見つけ出す必要がある場合があります。単に名前で探すだけでなく、「誰が実行できるのか」、「セキュリティ上危険な設定になっていないか」、「容量の大きいファイルだけを選んでバックアップするか」といった複雑な要件を処理しなければなりません。
このとき、Linux管理者の「十徳ナイフ」となるツールがfindです。今日は、実務で頻繁に使われるものの、正確な原理を知らずに使うと危険な場合もある3つの主要なコマンドパターンを非常に詳しく見ていきましょう。

🔍 最初のミッション:実行可能なファイルを探せ
find . -perm -100
開発サーバーやウェブサーバーを管理していると、「権限(Permission)」の問題に頻繁に遭遇します。特に、スクリプトファイルが実行されなかったり、逆に実行されるべきではないファイルが実行権限を持っていてセキュリティホールになったりすることもあります。
このときに使用するコマンドが-permオプションです。
find . -perm -100
この短いコマンドには、ビットマスク(Bitmask)の原理が隠されています。一つずつ分解してみましょう。
1. -permの3つの構文(これを知っているだけで上位1%)
多くの方が混乱するのが、権限の前の記号です。
- 100 (記号なし): 正確に一致するファイルのみを探します。つまり、所有者のみに実行権限があり、その他の権限(読み取り、書き込みなど)が全くない(–x——)ファイルのみを探します。実務ではあまり使われません。
- -100 (ハイフン、重要!): 「少なくともこの権限を持っている」ファイルを探します。実行権限(1)だけがあれば、読み取り(4)や書き込み(2)権限が追加であってもすべて検索対象です。(AND条件)
- /100 (スラッシュ): 指定したビットのうちいずれか一つでもオンになっていれば探します。(OR条件)
2. 数字100の秘密(8進数)
Linuxの権限は3桁の数字で表現されます。(例:755, 644)
100を桁ごとに解釈すると次のようになります。
- 最初の桁 (1): User(所有者)領域です。
- 4 (Read) + 2 (Write) + 1 (Execute)
- つまり、「所有者の実行権限」を意味します。
- 2番目の桁 (0): Group(グループ)領域です。検査しません。
- 3番目の桁 (0): Other(その他のユーザー)領域です。検査しません。
💡 要約
意味: 「現在のディレクトリ(.)以下で他の権限は気にせず、
ファイル所有者が実行できる(x)権限がオンになっているすべてのファイルを探してください。」
🛡️ 2番目のミッション:潜在的なバックドアを削除せよ (SetUID)
find /opt/findme/ -type f -perm -4000 -exec rm {} ;
このコマンドは、システムエンジニアやセキュリティ担当者がサーバー点検時に最も注目すべきパターンです。誤って使うとシステムを破壊する可能性があり、正しく使えばハッキングの脅威を取り除くことができます。
1. 4000とSetUIDの危険性
権限が4桁(4000)に増えました。先頭の桁は特殊権限を意味します。
- 4 (SetUID): このファイルが実行されるとき、実行した人ではなくファイル所有者の権限(ID)で実行されます。
- 2 (SetGID): グループ権限で実行されます。
- 1 (Sticky Bit): 共有ディレクトリで自分のファイルのみ削除可能にします。
なぜ危険なのでしょうか? 💀
もしハッカーが侵入して/home/hacker/shファイルを作成し、このファイルの所有者をrootに変更した後、SetUID(4000)を設定したと仮定してみましょう。
後でハッカーが一般ユーザーとしてログインしてこのshファイルを実行すると、その瞬間にルート(Root)権限のシェルを獲得します。これが典型的なバックドア(Backdoor)の手法です。
2. コマンド詳細解剖
- -type f: ディレクトリは触らず、一般ファイルのみを対象とします。
- -perm -4000: 権限が何であれ、SetUIDビットがオンになっているファイルを探します。
- -exec rm {} ;:
- findがファイルを見つけるたびにrmコマンドを呼び出します。
- {}は見つかったファイルのパスに置換されます。
- ;はコマンドの終わりを示します。
⚠️ 致命的な注意事項
このコマンドは確認なしに削除(rm)します。
しかし、Linuxシステムにはpasswd、ping、sudoなど、正常にSetUIDが必要なファイルが存在します。このコマンドを誤って/usr/bin/のような場所で実行すると、システムの主要機能が麻痺する可能性があります。
[安全な実務のヒント]
削除する前に必ず目で確認してください!
# ステップ1: まずリストと権限を確認 (ls -l)
find /opt/findme/ -type f -perm -4000 -exec ls -l {} ;
# ステップ2: 確認後、不審なファイルのみ削除
# (手動で削除するか、検証済みのパスでのみexec rmを使用)
📦 3番目のミッション:特定の容量以上のファイルをバックアップする
find /opt/findme/ -size +1k -type f -exec cp {} /opt/ ;
ログファイル管理やディスク整理に便利なコマンドです。しかし、このコマンドには初心者が必ず経験する「データ損失」の罠が隠されています。
1. -sizeオプションの詳細
- +1k: 1KBを超える(GreaterThan)ファイルです。
- もし-1kなら? 1KB未満です。
- ただの1kなら? 正確に1KB(四捨五入適用)のファイルです。
- 単位:
- c: バイト (Bytes)
- k: キロバイト (KiB)
- M: メガバイト (MiB)
- G: ギガバイト (GiB)
2. cpとフラットコピーの罠(データ損失注意!)
このコマンドは、見つかったファイルを/opt/という単一のディレクトリにコピーします。ここで問題が発生します。
状況例:
- /opt/findme/projectA/config.xml (サイズ 5KB)
- /opt/findme/projectB/config.xml (サイズ 10KB)
findは上記の2つのファイルを両方見つけ出します。そして順番に/opt/にコピーを試みます。
- projectA/config.xmlを/opt/config.xmlにコピー。
- projectB/config.xmlを/opt/config.xmlにコピー。(上書き発生!)
結果として、/opt/ディレクトリには最後にコピーされたファイルが1つだけ残ります。これは、元のディレクトリ構造(projectA, projectB)が無視されるためです。
🚀 解決策:ディレクトリ構造を維持してコピー (–parents)
この問題を解決するには、cpコマンドに–parentsオプションを追加する必要があります。
find /opt/findme/ -size +1k -type f -exec cp --parents {} /opt/ ;
このようにすると、コピー先のパスに元のパス構造(例:/opt/opt/findme/projectA/…)がそのまま作成され、上書き問題を完全に防ぐことができます。
📝 まとめ
findコマンドは、Linuxという広大な海で目的の魚を釣り上げる釣り竿のようなものです。
- -perm -100: 所有者実行権限のあるファイルを探すとき(スクリプト点検)
- -perm -4000: SetUID設定されたファイルを探すとき(セキュリティ点検 – 削除注意!)
- -size +1k: 容量ベースの検索とコピー(上書き注意!)
これら3つのパターンを確実に理解していれば、ファイル管理自動化スクリプトの作成やセキュリティ監査を行う際に、より自信を持ってターミナルを操作できるようになるでしょう。
今日説明したコマンドをテストサーバーで直接入力してみて、感覚を掴んでみてください!小さなミスが大きな事故を防ぐ経験になります。
コメントを残す