セキュリティ業界に転身するための方法 — パーツ3:コンピュータの基礎知識

セキュリティを勉強するには・・・まずコンピュータの基礎知識が必要

セキュリティはまだかよ – あなた

まだっすね。

「セキュリティ」といってもコンピュータの上で行われる「何か」ですので、 当然コンピュータの基礎知識が必要です。

下記勉強するといいと(勝手に)思っている基礎知識のブループリントです。

警告

改めてですが、黄金の道ではないし、必ずしもこれを徹底的に守る必要があると言いませんが、 僕の場合は助かりました。


目次は以下の通りです。 小から大へ、つまり根本からどんどん広げていくような形で書いているつもりです。

  1. パソコンとは?パソコンを分解してハードウェアの中身までを知ろう
  2. パソコンを管理者側から見る: IT オペレーションやサポート業務で行うシステム管理について
  3. 複数のパソコンを繋ごう!ネットワークの基礎知識
  4. パソコンを動かす力:開発・スクリプティングを身につける

目次をみてあれこれを勉強して「いつからセキュリティやるねん」と思うかもしれませんが、 基礎を先にきちんと抑えるのは後々セキュリティを勉強し始めるときに役立ちます。 また、様々な物事に目を向けると、 自分の好き嫌いが分かり、専門化するときに役立ちます。

情報

見ての通り事前知識が必要で、お勉強が、まぁあ、ありますね。

前回でも書きましたが、 僕はぜんぜんお勉強が得意なわけではありません。

まず「お勉強の勉強の仕方」を学ばなければなりませんでした。 そこで Barbara Oakley 先生の「Learning how to learn」はとても勉強になりましたのでおすすめします。

また、勉強したことを後から参照したり、 知識を思い出させるためノートをとることも意義深いです。 ノートのとり方はいくらでもありますが、 僕は Zettelkasten (ツェッテルカステン)作成方法を採用しました(僕が公開しているノートをここでご覧なれます)。


それぞれのテーマをどのぐらい詳しく勉強すれば望ましいかは、難しい質問ですが、 表面よりも「勉強し過ぎ」に偏った方が安全です。なぜなら、「最低限ちょうどいい」の知識がすぐに「足りない!」となってしまうからです。

とはいえ、人生はそう簡単に曲げられないもので、 人生の都合とゴールや、外部に期限が定まられて、 いつまでも徹底的に身につける程勉強をして次のステップを遅らせることができませんので、 慧眼を持って判断しましょう。

例えば、僕はネットワークと暗号化関連の知識が苦手で、時間をかけてみたところ、 大差がなかったので、細かいところは飛ばしました。

でもそれでいいんです。

自分で決めればいいんです。

自分の自生は自分で掴みます。

片言の日本語で書くフランス人に自分の人生を左右されるなんておかしいんです。

さて、始めよう!

1. パソコンとは?パソコンを分解してハードウェアの中身までを知ろう

一番根本的なところから始まります。

「やりすぎじゃね?」かと思われるかもしれませんが、 セキュリティやサイバー攻撃はバキュームにおけるもののわけではなくて、 なんらかの端末上で起きているわけです。

特にデジタルネイティブちゃんたちは、常時持参している「パソコン」ごとが「スマートフォン」のみが多くて、 技術が完全に隠れており、動作は魔法と区別がつかない方が多いのではないでしょうか。

その「魔法」を知ってれば知るほど、「魔法」ではなくなります。 それを目指したいです。

その第一歩は「パソコンとは?」である。

金銭的な余裕があれば、パソコンのパーツごとを勉強して、 安い中古品を手に入れて自分でパソコンを組み立てていい経験になりと思います。

私は Crash Courses のCrash Course Computer Scienceという YouTube シリーズが分かりやすかった1と思います。 とりあえず、ビデオ12までおすすめします。 時間の余裕があまれば、残りも面白いので見て損はしません。

パソコンの歴史や、電子の根本的なところを細かく説明されていて、 セキュリティとなんの関係があるんだと考えられるかもしれませんが、 有意義なものです。

例えば、世の中に案外に非安全な作りのもの(例えば、メール)に対して、「なぜこうなっている?」という質問を、 だいたい技術の歴史を辿ればそこに回答があります。 とりあえず頭の片隅に入れておいてください。

Crash Courses はザ・根本を教えてくれますが、 加えて実際的な知力をを要しますね。

ゼロから必要な知識を選定して目次を作ることは迷い未来しか見えませんので、 網羅的にそれを考えられた人たちに任せた方がいいと思います。

それは CompTIA という資格会社のカリキュラムを転用して勉強します。

情報

これからも IT とセキュリティの認定資格をいくつか紹介します。 必ずしも受からなければならないと思っていません。

どちらかというと、その認定資格が受かるために必要とされている知識が重要だと考えています。 なぜなら、世間に評価されている(であろう)トピックをプロによって選定され、カリキュラムが作られたわけです。

認定資格のカリキュラムを見て、勉強素材を使って知識を身につくことに意味があります。

なお、特に IT・セキュリティ業界には資格が山ほどあります(←このサイトをブックマークしておきましょう)。

僕が紹介する認定資格は

  1. カリキュラムがロクなもの
  2. 受かったら評価されるもの

のみです(※ 投稿時に限る。推奨した資格が将来にどうなるか知らんので)

認定資格をポケモンのように集めて履歴書に書いた方がいいのかという話は長くなるので割愛しますが、 前提知識がない人は書類選考を合格しやすくなるし、受けたい方はぜひ受けてください。 それも個人の自由です。


コンピュターの基礎を学ぶためは CompTIA A+ という認定資格があります。 ハードウェア・ソフトウェアに限らず、モバイルデバイス、ネットワークやセキュリティ、 幅広いエントリーレベルの資格です。

僕は PluralSight というのビデオ講座を見てほとんどの勉強をしていますが、 日本語のリソースがなく、字幕の自動翻訳は微妙です。

ただ、 CompTIA は有名な認定資格のため、他のウェブサイトやリソースがあるでしょう2Udemy に日本語の講座があるようです。

A+ を通して、パソコンとモバイルデバイス、ハードウェア・ソフトウェアのトラブル・シューティング、 クラウド、 IT 業務、簡単なネットワークとセキュリティ等々、幅広い知識を身につけられます。

あらゆるテーマの中で、これから仕事でそれらを全て使うかどうかは分かりませんが、 いろんなところに手を付けることでどの分野に専門化するかの判断には役に立つでしょう。

情報

CompTIA A+ は IT サポート業務に必要なスキルをカバーします。

が、概念と用語は概ねしか説明しません。

A+ を勉強し初めて、やはりよく分からないと思ったら、 一旦とめて、 CompTIA IT Fundamentals を勉強してみてください。

CompTIA ITF+ は、ITの概念と用語、インフラストラクチャ、 サイバーセキュリティ、データベースの基礎、ソフトウェア開発などの基礎をカバーしています。


なお、 CompTIA A+ は IT ヘルプデスク(サポート)業務のための資格です。

世間でその業務をナメる人が多い(「ハイっ、こちらIT課!」というシットコムがそのいい例)ですが、 その業務からセキュリティへ飛び込むのは決して可笑しくないし、 パソコン知識の広さだけではなく、 パソコンの利用者が抱いている問題を解決することができるので他人に羨ましいがられます。

有名なセキュリティ専門家の SwiftOnSecurity は元 IT サポートで、 今の自分がいるのはその仕事のおかげとよく言っています。

#### システム管理

ほとんどの人はパソコンを「ユーザ」として使用しています(当たり前)。

この項では、パソコンを「管理者」として体験することを目的としています。

やり始めると終わりがないものですので、 スコープをセキュリティの人が活かせそうな知識に絞ります。

企業に侵入する人はみんな「Active Directory」を目指します。

そのため、 Active Directory と何か、どう設定するか、そしてセキュリティをどう保つかを知るといいです。


ウェブサイトにアクセスしてウェブページを返しているくれる役割の端末はサーバと呼ぶのですが、 ネット上のほとんどのサーバは Linux という OS 上で稼働しています。

Linux はあらゆる理由で多くのセキュリティ専門家が使いますので、 必ず身につける必要があります。

Linux Foundation Certified System Administrator (LFCS)」という認定資格のカリキュラムは基礎を抑えられるのでおすすめです。

警告

初めて Linux を使って、かつ、マウス操作ではなくてキーボード操作はいきなり難しいかもしれません。

今一度以下のコマンドライン(CLI)を読んでから Linux のことを臨んでみましょう。


2. ネットワーキングの基礎

パソコンとは何かを理解して次のステップはパソコンとパソコン(或いはパソコンとその他)をどう接続するかを理解しましょう。

多くのサイバー攻撃はインターネット(つまりネットワークのネットワーク)を通して行われますので、 ネットワークは欠かせない知識です。

ネットワーキングの基礎も、 CompTIA にお世話になれます。 CompTIA Network + ではネットワークの基礎や管理、 有線と無線の違い、ネットワークにおけるセキュリティについて学べます。

クラウド

はじめにネットワークの知識のみで充分と思う派ですが、 クラウドがあんなに普及して無視できません。 僕は当時、勉強していませんでしたが、 今の仕事でクラウドしかありません。 クラウド特有のセキュリティはネットワーキング知識が土台ですので、 どちらも勉強する時間がなかったらまずはネットワーキングの基礎をきちんと押さえておきましょう。

これはプラスアルファと思ってください。

カリキュラムに関して、頼りの CompTIA は Cloud+ を出しています。

3. 開発、メタ開発とスクリプティング(任意)

警告

この項目に対して争論が多いです。

セキュリティ専門家は必ずしも開発を勉強する必要があると思いません。

が、しかし、サイバーセキュリティはパソコン上で行われ、パソコンは開発された命令(コード)で動いているため、そのコードを理解した方がためになるでしょう。

開発者を目指さなくても、繰返し作業を素早くパソコンにやらせることができる程度の簡単なスクリプトを書けることを目指しましょう。


開発

どのセキュリティの人間が、業務上ではおそらく「開発者」という人たちと関わることがあります。

彼女ら・彼らはあなたの仕事を天国、あるいは地獄にすることができる不思議な存在ですので、 仲良しした方が良いです(笑)

同レベルで話ができるように、開発者が使う開発言語だけではなく、どういうふうに仕事をされているのか、 一日の流れ等々を知っておいた方がいいでしょう。

「開発とは」を検索すれば、情報はいくらでもありますが、 Bloomberg 誌の Paul Ford 氏の「WHAT IS CODE?」という記事を推奨します。

「WHAT IS CODE?」という記事ほど、開発者と IT 業界の本質を掴む記事は他に読んだことがありません。

小説くらいの長さ、かつ、英語(自動翻訳の質はどうかしら?)ですので、 読むのは任意ですが、読めたら読んだ方が絶対にいいです。

開発言語

開発の初心者は言語の数を見て「こんなにあるの?」と心が折れることが多いので、少し整理をします。

まず、セキュリティ・エンジニアを目指さなければ、どの言語でも熱心で覚える必要がありません。 あらためて、プログラミング(「スクリプティング」の方が正しい言葉かも)は自分の仕事を加速するためです。

どういうことかを例で例えましょう。

とあるページの一部の内容の変更の有無を確認したいとします。

毎日、ブラウザを開いて、ページを開いて、確認したい部分が変わったかどうかを目視して・・・ という行動をとるのは可能ですが、大変無駄です。

それに対して、3分(2分半は BeautifulSoup の使い方を調べるため)で書いた下記スクリプトを毎日実行すれば完了です。 (さらに、毎日の実行も自動化できる)

import requests
from bs4 import BeautifulSoup

source = requests.get("https://amzn.asia/d/5u5ry0L").text
soup = BeautifulSoup(source, "lxml")

price = soup.find(
    "span", {"class": "a-price a-text-price a-size-medium apexPriceToPay"}
)

print(price.text)

こんな出鱈目なコードで僕の開発時代の先輩におそらく叱られます(笑)が、 スクリプティングはエンジニア同レベルのコードを求めていません。

なお、開発言語はおおざっぱに2種類があります。

  1. コンパイラ言語
  2. インタプリタ言語

迅速にスクリプトを動かす目的において、後者インタプリタ言語の方が向いています。

型システム、強い型付けと弱い型付け等々、 言語によって色んな違いがありますので、 少し調べても損がありませんが、 細かい話は一旦忘れてもいいと思います。

(セキュリティエンジニアやセキュアコーディングに興味があるなら話は別ですが)

争論を呼ぶテーマですが、僕のブログなので勝手に選定して、以下のどれかをおすすめします。

  • Python: セキュア業界の定番。様々なライブラリがあり、セキュリティのために使う素材が多い
  • Ruby: 「日本の Python」と言われる。初めての言語としては一番簡単に学べる気がする(個人的な意見)
  • Go: Web 技術に向いている。最近セキュリティ業界に人気で、 Go を使ってハッキングする素材が増えてる。(コンパイラ言語だが、簡単なスクリプトならインタプリタ言語のように扱える)
  • JavaScript: Web の技術(ウェブページの動的な部分は JavaScript)。書き方が不思議で、初めての言語としては微妙だと思いますが、どの道いつかは覚える必要があると思っています。世間的に Python の代行者となりつつある(気がする)
  • C/C++: ザ・開発言語。いきなりはおすすめしないが、低レイヤーやエンベデッドシステム(IoT を含む)に興味ある人は欠かせない

まあ、いろいろ試してみて自分にあったものを自身で選定した方がマシだと思います。(テキトー

容易なスクリプティング

この項を書く必要があるかどうか迷いましたが、、、

きちんと学ぶ程必要がありませんが、(Linux の場合)Bash と(Windows の場合)PowerShell の存在を知って、 何に使うかを知るといいでしょう。

どちらも開発に向いてなくて、どちらかというとスクリプティングのために使うのが正しいと思います。

いつ開発言語を使えばいいか、いつ上記スクリプティング言語を使えばいいかは、 正確な回答ではありませんが、数行の容易なタスクの自動化レベルであれば Bash/PowerShell でよくて、 コードに配列や多少複雑な処理が必要になったら、上に紹介した言語で書き直した方が楽でしょう。

データベース

開発言語で情報を整理したり、計算したりして、その結果をどこかに保存すべきですね。 それはデータベースの役割です。

データベースとはデータ(バイナリ以外)を整理された形で保管するシステムです。

サイトに登録するときに、ユーザのアカウント情報(メール、パスワード、名前、生年月日等々)は全部そのサイトのデータベースに保管されます。

悪意ある人が欲しがるデータは保存されているとても大切な場所ですので、 言うまでもないですが、保護せねばなりません。

データベースにおいてまず知りたい知識は以下の通り

  • RDBMS(リレーショナルデータベース管理システム): リレーショナル DB を管理するソフトウェア3。構造化データとも呼ぶ
    • 例:SQLite, Microsoft SQL Server, PostgreSQL, MySQL(最後のどれかについて少し調べればいい)
  • Structured Query Language (SQL): RDBMS の操作を行うための言語
  • SQL テーブル、コラム: データを整理するための形

さて、上までは開発においての最低限の知識です。 次の項目はコンピュタ利用者の人生を楽にするためのものです。

いわゆるプロユーザが何を使っているかを見てみましょう。

コンピューティング・エコシステム・リテラシー

めっちゃカタカナ・タイトル(笑)

コンピュータ基礎でよく欠かしている知識としてはそのエコシステムのリテラシーです。

簡単に説明すると、パソコンはでかい電卓です。 なお、電卓よりは物凄いことができます。 普通に使ってすでに速いし、便利ですが、 もっと速いし便利ができます!

それは、エコシステムのリテラシーを学習すれば手に入れる力です。 すなわち、パソコンのツールを使いこなすことです。

以下の3点に時間を割くと後が楽です。

  • コマンドライン、シェル、プロンプト、ターミナル(いわゆるコマンドライン・インタフェース または CLI)
  • バージョン管理(Git)
  • 仮想環境
コマンドライン(CLI)

コマンドラインは「黒い背景に白い文字」という怖い画面です。 ハッカーの映画でよく、めっちゃ速くタイピングするやつのステレオタイプです。

初めて見る人は戸惑うかもしれませんが、そんなに怖くないものです。 また、使いこなすと逆に GUI(グラフィカルユーザインタフェース)に戻りたくないかもしれません。

僕はこのオンライン本は初心者に分かりやすいと思います。 自動翻訳が変ではないと思います。

情報

Launch School のオンライン本は無料、かつ、分かりやすいため、いくつか紹介します。 英語ですが簡単な文章のため自動翻訳で問題ないでしょう。

一覧を見てもし興味があるものがあればぜひご一読ください。


バージョン管理(Git)

コマンドラインを学んでこられて早速に使いましょう!

バージョン管理の概念は初めての人にとってとても複雑で、 なれるまでに時間を要しては可笑しくありません。

バージョン管理の良さを理解するためにはその必要性を説明します。

ソースコードは一度書いて終わりなものではありません。 バグを修正したり、新規機能を追加したりして、 がらっと変わる可能性があります。

その変化を、ステップ・バイ・ステップで記録すれば、 なぜ今のコードに至るかが分かりやすくなるでしょう。

また、複数人でコードを書くとき、誰が何を取り入れたとか、 複数人が同じコードを変更して、 どの記述を優先したらいいかを管理した方が楽ですね。

また、管理だけではなくて、 簡単にソースコードあるいは(主に)テキストベースのものを他人と共有するための道具として、 バージョン管理を用いられています。

バージョン管理のツールは複数ありますが、 多くの場合は Git が採用されています。

CLI と同じく、Launch School の超入門がおすすめです。

Launch School の本は超入門のため、先に読むべきですが、 より詳細な学習材として Git Pro(日本語) のチャプター1〜5までおすすめです。 チャプター6は GitHub という、ソースコードの保管、共有・コラボレーションにあたってよく使われているウェブサイトについて書いてあって、早めに使い方になれて損がありません。 残りのチャプターは細かすぎてスキップしてもいいと思います。

今後、コードを書かなくても、自分で構築するオープンソースのセキュリティツールをダウンロードする方法として Git と GitHub が採用されることがほとんどですので、早めになれましょう。

仮想環境

仮想環境とは、自分のパソコンの中に「異なるパソコン」4をたてることです。

脆弱性を再現したり、様々な実験をしたりするのは仮想環境で行った方がマシです。

理由は、隔離した環境で、問題を起こせば自分のパソコンには影響がなく、且つ、 一クリックで問題を起こす前の状態に戻すことができます。

使いみちの例としては、

  • 例えば脆弱性診断者は意図的に脆弱性だらけの環境を感想環境として構築し、撃す
  • ペネトレーションテスト業務範囲でターゲットしている会社のネットワークを再現し、手口を探ったり、ラテラルムーブメント(横方向への移動)を試したりする
  • マルウェア解析者は遮断された仮想環境を使って、自分のパソコンがマルウェアに感染せず研究する
危険!

マルウェア解析に興味ある方へ

マルウェア解析用の仮想環境の使用は、特に仮想環境のネットワーク周りの知識を熱心で勉強してからです。

設定を間違ってマルウェアが物理パソコン、 ネットワークを介して第三者のパソコンに感染したら法的な責任を追わなければなりません。


仮想環境を構築するためにはハイパーバイザ(仮想化ソフトウェアパッケージ)というソフトウェアがあります。 初めての場合は VirtualBox をおすすめします。

全ての設定を紹介しきれないので、個人的に重視すべきネットワーク設定だけ説明します。

ハイパーバイザはデフォルトの設定が用意されており、そのまま使用できますが、 僕は自分で設定し直します5

(この時点でネットワークについて勉強していると思いますので、細かいことは略愛しますね)

  • NAT: DHCP サーバ標準搭載のルータのような形で、ハイパーバイザーは、 自分の DHCP サーバから IP アドレスをゲストマシンに割り当てる ゲスト・マシンがインターネットに接続するとき、 ハイパーバイザーが NAT 機能を使用してゲスト・マシンの IP アドレスを変換し、 インターネットにアクセスできるようにする
  • Bridged: ハイパーバイザーはホスト・マシンのネットワークドライバを直接使用する設定。 つまり、ゲスト・マシンからホスト・マシンのネットワークドライバに直接トラフィックを注入。 これは、ゲスト VM が物理的にネットワークに接続されているように見せたい場合や、 Wireshark などのパケットスニッファを使用してゲスト VM のパケットをチェックする場合に便利。
  • Host-Only: ホストマシン上にゲスト仮想マシンに接続するためのインターフェースが用意されるが、 VM 自体は外部インターネットに接続不可(すなわち、一方向の接続)
  • Internal: ゲスト VM 同士は会話できるが、外部インターネットとは通信できない。 ゲスト・マシンを分離する必要がある場合に有効

最初によく使うのは NAT(容易にインターネットに接続可)と Host-Only(インターネットに接続不可)です。 「攻撃者の VM」と「ターゲットの VM」が必要で、インターネットに接続する必要がない時は Internal が望ましいです(診断の勉強に便利なセットアップ)。

それらを自ら設定してみて遊んでみましょう。

知識を深めるため

2022 年に生きててラッキーなのは、誰もが(僕みたいに)学校で寝たとして、 インターネットのおかげで MIT の授業に無料で参加できます。 その上に、和訳があります!!

注意点として、 MIT 学生向けのためのコンピュータ・サイエンスの授業に参加している(或いは相当の知識を持っている)前提がある生徒のためですので、 先生は暗示していることが多くたまには分かりにくいかもしれません。

まず、別の入門をご覧になって、本リソースは知識を深める程度の考え方で見れば良いと思います。 開発者はどんなシステムを使うかがわかれば充分です。


  1. 初心者向けという理由で様々なショートカットをとるので、ベテランの方が見ればたまには「ん?」と思っちゃうかもしれません。 ↩︎

  2. PluralSight はビデオの質がとてもよく、値段もそこまでしませんが、日本語のコンテンツがなくて、字幕の自動翻訳しかありません。オンラインビデオ受講の業界で Udemy が有名で、日本語コンテンツも充実ですが、ビデオによって質がかなり違ってくると感じました。他に Udacity と Coursera がありますが、 Plurasight と同じく日本語のコンテンツは少ないです。僕が勧めている認定資格が載っている別のオンラインビデオ受講のサイトがあれば是非教えてください。 ↩︎

  3. 非リレーショナルデータベース(例:MongoDB)も存在しますがいったん無視します。 ↩︎

  4. 厳密にはハードウェアをシェアするため、「異なる OS」の方が正しいですが、イメージとして異なるパソコンの方がピンと来ます。 ↩︎

  5. 既存設定を覗いて理解したり、変更したり、試したりすることは仮想環境に限らず一般的に望ましい考え方です。一つの理由としては、中身がどうなっているかを理解するためです。もう一つの理由としては、初期設定がセキュアではないことが多いです。そういったところに興味を示して、探ることこそがハッカーの探究心である。最近のトレンドで「セキュア・バイ・デフォルト」(初期設定で安全な状態)がありますが、盲信してはいけませんし、状況によって自分の場合は適用できないかもしれません。 ↩︎