私はノートから始めた。テキストエディタでもMarkdownファイルでもなく、理解もしていないコマンドで埋め尽くされた、スパイラル綴じの紙のノートだ。lsgrepfindchmodnmap と書き留めた。Linuxやサイバーセキュリティを単なる単語テストのように扱い、構文をページごとに積み上げていった。まるで、他人よりも多くのフラグを知っていれば、自分が有能になれるかのように。構文を流暢にコピーすることはできた。しかし、あるコマンドがなぜ特定の結果を返したのか説明してくれと言われれば、私は黙り込んでしまった。その沈黙こそが問題だったのだ。

ノートの罠

ノートは進歩しているように見えた。ページをめくるたびにインクが増えていった。find / -name "*.conf"nmap -sV、パイプと正規表現を使った grep。チュートリアルでは、この手法はうまくいっているように見える。プレゼンターがコマンドを入力し、画面に期待通りの出力が表示される。あなたはそれに頷く。自分のターミナルが相手と全く同じであるため、自分には能力があるように感じる。しかし、その能力は借り物だ。それは、チュートリアルの道筋を設計した人のものなのだ。

実環境はスクリプト通りにはいかない。ポートが開いているにもかかわらず、サーバーがSSH接続を拒否することもある。chmod +x を実行した直後に、スクリプトが「permission denied」で失敗することもある。スキャン結果で、ポートが「open」ではなく「filtered」と報告されたとき、それがファイアウォールのルールなのか、ホストベースの制御なのか、あるいは侵入防止システム(IPS)が静かにプローブを破棄しているのかを判断しなければならない。そのような瞬間、構文の暗記は役に立たない。なぜなら、問題は「忘れたコマンド」にあるのではなく、「理解していないシステム」にあるからだ。

コピーは学習ではない

チュートリアルに従うことと、問題を解決することの間には違いがある。コピーをしているとき、あなたは他人が作った地図の上でステップAからステップBへと移動しているに過ぎない。何かがそこから外れたとき、あなたのメンタルモデルは空っぽであるため、立ち往生してしまう。chmod 755 が権限を変更することは知っていても、ファイルが noexec フラグが付いたマウントポイントにある場合に、なぜシステムが依然としてアクセスをブロックするのかを説明できない。nmap がポートスキャンを行えることは知っていても、ステートフル・インスペクションが関与している場合に、なぜSYNスキャンがコネクトスキャンとは異なる結果を返すのかを解釈できない。

あなたはLinuxやネットワークを学んでいたのではない。模倣することを学んでいたのだ。

問いを変える

私はあることを変えた。「どのコマンドを使えばこれを直せるか?」と問うのをやめ、「システムは実際に何をしているのか?」と問い始めた。この転換は、作業スピードが落ちるため、居心地の悪いものだった。しかし、それは定着した。

ファイル権限を例に挙げよう。chmod は魔法の数字を唱える祈りではない。それは、カーネルがいかにしてinodeへのアクセスを仲介するかという仕組みの表面的な層に過ぎない。オペレーティングシステムが、ファイルの所有者、グループ、その他のユーザーに対して、あなたの実効ユーザーID(effective user ID)を照合しているのだと理解すれば、数字の意味が見えてくる。ディレクトリの権限が、パスを辿れるか(traverse)あるいは内容をリストできるかを制御しているのだと学べば、「ファイルは読めるのに、そこに辿り着けないのはなぜか」と悩むことはなくなる。ディレクトリの実行権限は、プログラムを実行するためのものではなく、その中にあるinodeにアクセスすることを許可するためのものだと気づくのだ。突然、chmod は暗記の対象ではなくなり、文脈(コンテキスト)の対象となる。

ネットワークの基礎も、nmap において同様のことをもたらす。ポートスキャンは「開いているドアのリスト」ではなく、パケットによる「対話」である。TCPの3ウェイ・ハンドシェイクを把握すれば、なぜSYNスキャンにrawソケットの権限が必要なのか、なぜクローズされたポートはRSTを返し、フィルタリングされたポートは何の応答も返さないことがあるのかが理解できる。フラグの組み合わせを暗記するのをやめ、自分がどのようなパケットを送信しているのか、そして「沈黙」や「ノイズ」が何を意味するのかを論理的に考えるようになる。

HTTPを理解すれば、Burp Suiteのようなアプリケーション層のツールも腑に落ちる。それは単に、あなたとウェブサーバーの間に位置するプロキシに過ぎない。HTTPメソッド、ヘッダー、ステータスコード、そしてリクエストがどのようにサーバー側のロジックにマッピングされるかを理解していなければ、Burp Suiteはボタンが並んだだけの混乱を招くダッシュボードになってしまう。リクエストがどのように伝わり、サーバーがどのようにレスポンスを構築するかを知れば、そのツールの使い方は明白になる。あなたはBurp Suiteを学んでいるのではない。Burp Suiteを使ってHTTPを検査しているのだ。

基礎を築く

これから始めるなら、チートシートを集めたいという衝動を抑えてほしい。時代に左右されない、以下の3つの領域に集中することだ。

Linuxの基礎については、カーネルがいかにプロセスをスケジューリングするか、シェルがいかにコマンドを解析するか、そして環境変数がプログラムの動作にどのように影響するかを学ぼう。stdinstdoutstderr を単なる豆知識としてではなく、パイプを機能させるための「配管(plumbing)」として理解することだ。

ネットワークプロトコルについては、急がずにTCP/IPスタックを学習しよう。